changeset 17002:9716891b7342

improved error reporting by @NodeInfo annotation processor
author Doug Simon <doug.simon@oracle.com>
date Mon, 01 Sep 2014 16:46:59 +0200
parents 5d16da2ca0c8
children 8fd42ea95f64 81c9a1fc9072
files graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeProcessor.java
diffstat 2 files changed, 74 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Fri Aug 29 15:21:39 2014 -0700
+++ b/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java	Mon Sep 01 16:46:59 2014 +0200
@@ -278,15 +278,15 @@
         Successors;
     }
 
-    CodeCompilationUnit process(TypeElement node) {
+    CodeCompilationUnit process(TypeElement node, boolean constructorsOnly) {
         try {
-            return process0(node);
+            return process0(node, constructorsOnly);
         } finally {
             reset();
         }
     }
 
-    private CodeCompilationUnit process0(TypeElement node) {
+    private CodeCompilationUnit process0(TypeElement node, boolean constructorsOnly) {
 
         CodeCompilationUnit compilationUnit = new CodeCompilationUnit();
 
@@ -308,55 +308,56 @@
             genClass.add(subConstructor);
         }
 
-        DeclaredType generatedNode = (DeclaredType) getType(GeneratedNode.class);
-        CodeAnnotationMirror generatedNodeMirror = new CodeAnnotationMirror(generatedNode);
-        generatedNodeMirror.setElementValue(generatedNodeMirror.findExecutableElement("value"), new CodeAnnotationValue(node.asType()));
-        genClass.getAnnotationMirrors().add(generatedNodeMirror);
+        if (!constructorsOnly) {
+            DeclaredType generatedNode = (DeclaredType) getType(GeneratedNode.class);
+            CodeAnnotationMirror generatedNodeMirror = new CodeAnnotationMirror(generatedNode);
+            generatedNodeMirror.setElementValue(generatedNodeMirror.findExecutableElement("value"), new CodeAnnotationValue(node.asType()));
+            genClass.getAnnotationMirrors().add(generatedNodeMirror);
+
+            scanFields(node);
 
-        scanFields(node);
+            boolean hasInputs = !inputFields.isEmpty() || !inputListFields.isEmpty();
+            boolean hasSuccessors = !successorFields.isEmpty() || !successorListFields.isEmpty();
 
-        boolean hasInputs = !inputFields.isEmpty() || !inputListFields.isEmpty();
-        boolean hasSuccessors = !successorFields.isEmpty() || !successorListFields.isEmpty();
+            if (hasInputs || hasSuccessors) {
+                createGetNodeAtMethod();
+                createGetInputTypeAtMethod();
+                createGetNameOfMethod();
+                createUpdateOrInitializeNodeAtMethod(false);
+                createUpdateOrInitializeNodeAtMethod(true);
+                createIsLeafNodeMethod(genClass);
 
-        if (hasInputs || hasSuccessors) {
-            createGetNodeAtMethod();
-            createGetInputTypeAtMethod();
-            createGetNameOfMethod();
-            createUpdateOrInitializeNodeAtMethod(false);
-            createUpdateOrInitializeNodeAtMethod(true);
-            createIsLeafNodeMethod(genClass);
+                if (!inputListFields.isEmpty() || !successorListFields.isEmpty()) {
+                    createGetNodeListAtMethod();
+                    createSetNodeListAtMethod();
+                }
+            }
+
+            if (hasInputs) {
+                createIsOptionalInputAtMethod();
+                createGetFirstLevelPositionsMethod(Inputs, inputFields, inputListFields);
+
+                createContainsMethod(Inputs, inputFields, inputListFields);
+                createIterableMethod(Inputs);
 
-            if (!inputListFields.isEmpty() || !successorListFields.isEmpty()) {
-                createGetNodeListAtMethod();
-                createSetNodeListAtMethod();
+                CodeTypeElement inputsIteratorClass = createIteratorClass(Inputs, packageElement, inputFields, inputListFields);
+                createAllIteratorClass(Inputs, inputsIteratorClass.asType(), packageElement, inputFields, inputListFields);
+                createWithModCountIteratorClass(Inputs, inputsIteratorClass.asType(), packageElement);
+                createIterableClass(Inputs, packageElement);
+            }
+
+            if (hasSuccessors) {
+                createGetFirstLevelPositionsMethod(Successors, successorFields, successorListFields);
+
+                createContainsMethod(Successors, successorFields, successorListFields);
+                createIterableMethod(Successors);
+
+                CodeTypeElement successorsIteratorClass = createIteratorClass(Successors, packageElement, successorFields, successorListFields);
+                createAllIteratorClass(Successors, successorsIteratorClass.asType(), packageElement, successorFields, successorListFields);
+                createWithModCountIteratorClass(Successors, successorsIteratorClass.asType(), packageElement);
+                createIterableClass(Successors, packageElement);
             }
         }
-
-        if (hasInputs) {
-            createIsOptionalInputAtMethod();
-            createGetFirstLevelPositionsMethod(Inputs, inputFields, inputListFields);
-
-            createContainsMethod(Inputs, inputFields, inputListFields);
-            createIterableMethod(Inputs);
-
-            CodeTypeElement inputsIteratorClass = createIteratorClass(Inputs, packageElement, inputFields, inputListFields);
-            createAllIteratorClass(Inputs, inputsIteratorClass.asType(), packageElement, inputFields, inputListFields);
-            createWithModCountIteratorClass(Inputs, inputsIteratorClass.asType(), packageElement);
-            createIterableClass(Inputs, packageElement);
-        }
-
-        if (hasSuccessors) {
-            createGetFirstLevelPositionsMethod(Successors, successorFields, successorListFields);
-
-            createContainsMethod(Successors, successorFields, successorListFields);
-            createIterableMethod(Successors);
-
-            CodeTypeElement successorsIteratorClass = createIteratorClass(Successors, packageElement, successorFields, successorListFields);
-            createAllIteratorClass(Successors, successorsIteratorClass.asType(), packageElement, successorFields, successorListFields);
-            createWithModCountIteratorClass(Successors, successorsIteratorClass.asType(), packageElement);
-            createIterableClass(Successors, packageElement);
-        }
-
         compilationUnit.add(genClass);
         return compilationUnit;
     }
--- a/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeProcessor.java	Fri Aug 29 15:21:39 2014 -0700
+++ b/graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeProcessor.java	Mon Sep 01 16:46:59 2014 +0200
@@ -23,6 +23,7 @@
 package com.oracle.graal.nodeinfo.processor;
 
 import static com.oracle.truffle.dsl.processor.java.ElementUtils.*;
+import static java.util.Collections.*;
 
 import java.io.*;
 import java.util.*;
@@ -66,7 +67,9 @@
     void message(Kind kind, Element element, String format, Object... args) {
         if (scope != null && !isEnclosedIn(element, scope)) {
             // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=428357#c1
-            String loc = getElementHierarchy(element).stream().map(Object::toString).collect(Collectors.joining("."));
+            List<Element> elementHierarchy = getElementHierarchy(element);
+            reverse(elementHierarchy);
+            String loc = elementHierarchy.stream().filter(e -> e.getKind() != ElementKind.PACKAGE).map(Object::toString).collect(Collectors.joining("."));
             processingEnv.getMessager().printMessage(kind, String.format(loc + ": " + format, args), scope);
         } else {
             processingEnv.getMessager().printMessage(kind, String.format(format, args), element);
@@ -134,14 +137,16 @@
                 }
 
                 if (!typeElement.equals(gen.Node) && !typeElement.getModifiers().contains(Modifier.ABSTRACT)) {
-                    CodeCompilationUnit unit = gen.process(typeElement);
-                    unit.setGeneratorElement(typeElement);
-
-                    DeclaredType overrideType = (DeclaredType) ElementUtils.getType(processingEnv, Override.class);
-                    DeclaredType unusedType = (DeclaredType) ElementUtils.getType(processingEnv, SuppressWarnings.class);
-                    unit.accept(new GenerateOverrideVisitor(overrideType), null);
-                    unit.accept(new FixWarningsVisitor(processingEnv, unusedType, overrideType), null);
-                    unit.accept(new CodeWriter(processingEnv, typeElement), null);
+                    try {
+                        CodeCompilationUnit unit = gen.process(typeElement, false);
+                        emitCode(typeElement, unit);
+                    } catch (ElementException ee) {
+                        // Try to generate the class with just the constructors so that
+                        // spurious errors related to a missing class are not emitted
+                        CodeCompilationUnit unit = gen.process(typeElement, true);
+                        emitCode(typeElement, unit);
+                        throw ee;
+                    }
                 }
             } catch (ElementException ee) {
                 errorMessage(ee.element, ee.getMessage());
@@ -154,6 +159,16 @@
         return false;
     }
 
+    private void emitCode(TypeElement typeElement, CodeCompilationUnit unit) {
+        unit.setGeneratorElement(typeElement);
+
+        DeclaredType overrideType = (DeclaredType) ElementUtils.getType(processingEnv, Override.class);
+        DeclaredType unusedType = (DeclaredType) ElementUtils.getType(processingEnv, SuppressWarnings.class);
+        unit.accept(new GenerateOverrideVisitor(overrideType), null);
+        unit.accept(new FixWarningsVisitor(processingEnv, unusedType, overrideType), null);
+        unit.accept(new CodeWriter(processingEnv, typeElement), null);
+    }
+
     /**
      * 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>.
@@ -166,9 +181,9 @@
                     return true;
                 }
             }
-            if (t.getCause() != null) {
-                return isBug367599(t.getCause());
-            }
+        }
+        if (t.getCause() != null) {
+            return isBug367599(t.getCause());
         }
         return false;
     }