# HG changeset patch # User Doug Simon # Date 1409582819 -7200 # Node ID 9716891b73421c92bd83b6fc3a1c1d14dd6243ee # Parent 5d16da2ca0c869e237d88b1f7bb8008e1ba305b7 improved error reporting by @NodeInfo annotation processor diff -r 5d16da2ca0c8 -r 9716891b7342 graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeGenerator.java --- 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; } diff -r 5d16da2ca0c8 -r 9716891b7342 graal/com.oracle.graal.nodeinfo.processor/src/com/oracle/graal/nodeinfo/processor/GraphNodeProcessor.java --- 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 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 Bug 367599. @@ -166,9 +181,9 @@ return true; } } - if (t.getCause() != null) { - return isBug367599(t.getCause()); - } + } + if (t.getCause() != null) { + return isBug367599(t.getCause()); } return false; }