changeset 16835:b3a60e14ec37

generated Node classes are prefixed with the names of classes enclosing the source classes
author Doug Simon <doug.simon@oracle.com>
date Thu, 14 Aug 2014 23:25:26 +0200
parents 21e0ab3c1395
children c47522db4c00
files graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeGenerator.java graal/com.oracle.graal.graph.processor/src/com/oracle/graal/graph/processor/GraphNodeProcessor.java
diffstat 2 files changed, 56 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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();
--- 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<? extends TypeElement> 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 <a
+     * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=367599">Bug 367599</a>.
+     */
+    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;
+    }
 }