Mercurial > hg > truffle
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; + } }