# HG changeset patch # User Doug Simon # Date 1408051526 -7200 # Node ID b3a60e14ec377f56108684bbdf8ce8c01b81f301 # Parent 21e0ab3c13951c38ae3be8966a511c1d88e1cc4c generated Node classes are prefixed with the names of classes enclosing the source classes diff -r 21e0ab3c1395 -r b3a60e14ec37 graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeGenerator.java --- a/graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeGenerator.java Thu Aug 14 17:10:53 2014 +0200 +++ b/graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeGenerator.java Thu Aug 14 23:25:26 2014 +0200 @@ -38,14 +38,35 @@ */ public class GraphNodeGenerator { - private final ProcessingEnvironment processingEnv; + private final GraphNodeProcessor processor; - public GraphNodeGenerator(ProcessingEnvironment processingEnv) { - this.processingEnv = processingEnv; + public GraphNodeGenerator(GraphNodeProcessor processor) { + this.processor = processor; } public ProcessingEnvironment getProcessingEnv() { - return processingEnv; + return processor.getProcessingEnv(); + } + + private String getGeneratedClassName(GraphNode node) { + + TypeElement typeElement = node.getDeclaration(); + + String newClassName = typeElement.getSimpleName().toString() + "Gen"; + Element enclosing = typeElement.getEnclosingElement(); + while (enclosing != null) { + if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE) { + if (enclosing.getModifiers().contains(Modifier.PRIVATE)) { + processor.errorMessage(enclosing, "%s %s cannot be private", enclosing.getKind().name().toLowerCase(), enclosing); + return null; + } + newClassName = enclosing.getSimpleName() + "$" + newClassName; + } else { + assert enclosing.getKind() == ElementKind.PACKAGE; + } + enclosing = enclosing.getEnclosingElement(); + } + return newClassName; } public CodeCompilationUnit process(GraphNode node) { @@ -54,7 +75,8 @@ TypeElement typeElement = node.getDeclaration(); PackageElement packageElement = ElementUtils.findPackageElement(node.getDeclaration()); - String newClassName = typeElement.getSimpleName().toString() + "Gen"; + String newClassName = getGeneratedClassName(node); + CodeTypeElement nodeGenElement = new CodeTypeElement(modifiers(), ElementKind.CLASS, packageElement, newClassName); if (typeElement.getModifiers().contains(Modifier.ABSTRACT)) { @@ -72,7 +94,7 @@ nodeGenElement.add(createSuperConstructor(nodeGenElement, constructor)); } - DeclaredType generatedNode = (DeclaredType) ElementUtils.getType(processingEnv, GeneratedNode.class); + DeclaredType generatedNode = (DeclaredType) ElementUtils.getType(getProcessingEnv(), GeneratedNode.class); CodeAnnotationMirror generatedByMirror = new CodeAnnotationMirror(generatedNode); generatedByMirror.setElementValue(generatedByMirror.findExecutableElement("value"), new CodeAnnotationValue(typeElement.asType())); nodeGenElement.getAnnotationMirrors().add(generatedByMirror); @@ -84,7 +106,7 @@ } private CodeExecutableElement createSuperConstructor(TypeElement type, ExecutableElement element) { - CodeExecutableElement executable = CodeExecutableElement.clone(processingEnv, element); + CodeExecutableElement executable = CodeExecutableElement.clone(getProcessingEnv(), element); // to create a constructor we have to set the return type to null.(TODO needs fix) executable.setReturnType(null); @@ -102,7 +124,7 @@ } public ExecutableElement createDummyExampleMethod() { - CodeExecutableElement method = new CodeExecutableElement(modifiers(Modifier.PROTECTED), ElementUtils.getType(processingEnv, int.class), "computeTheMeaningOfLife"); + CodeExecutableElement method = new CodeExecutableElement(modifiers(Modifier.PROTECTED), ElementUtils.getType(getProcessingEnv(), int.class), "computeTheMeaningOfLife"); CodeTreeBuilder builder = method.createBuilder(); builder.string("// this method got partially evaluated").newLine(); diff -r 21e0ab3c1395 -r b3a60e14ec37 graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeProcessor.java --- a/graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeProcessor.java Thu Aug 14 17:10:53 2014 +0200 +++ b/graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeProcessor.java Thu Aug 14 23:25:26 2014 +0200 @@ -46,7 +46,7 @@ return SourceVersion.latest(); } - private void errorMessage(Element element, String format, Object... args) { + void errorMessage(Element element, String format, Object... args) { processingEnv.getMessager().printMessage(Kind.ERROR, String.format(format, args), element); } @@ -61,13 +61,17 @@ errorMessage(element, "Exception thrown during processing: %s", buf.toString()); } + ProcessingEnvironment getProcessingEnv() { + return processingEnv; + } + @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { if (roundEnv.processingOver()) { return false; } - GraphNodeGenerator gen = new GraphNodeGenerator(processingEnv); + GraphNodeGenerator gen = new GraphNodeGenerator(this); Types types = processingEnv.getTypeUtils(); Elements elements = processingEnv.getElementUtils(); @@ -103,9 +107,28 @@ unit.accept(new FixWarningsVisitor(processingEnv, unusedType, overrideType), null); unit.accept(new CodeWriter(processingEnv, typeElement), null); } catch (Throwable t) { - reportException(element, t); + if (!isBug367599(t)) { + reportException(element, t); + } } } return false; } + + /** + * Determines if a given exception is (most likely) caused by Bug 367599. + */ + public static boolean isBug367599(Throwable t) { + for (StackTraceElement ste : t.getStackTrace()) { + if (ste.toString().contains("org.eclipse.jdt.internal.apt.pluggable.core.filer.IdeFilerImpl.create")) { + // See: https://bugs.eclipse.org/bugs/show_bug.cgi?id=367599 + return true; + } + } + if (t.getCause() != null) { + return isBug367599(t.getCause()); + } + return false; + } }