< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java

Print this page
rev 52509 : [mq]: graal

@@ -35,18 +35,18 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.processing.Filer;
+import javax.annotation.processing.ProcessingEnvironment;
 import javax.annotation.processing.RoundEnvironment;
 import javax.annotation.processing.SupportedAnnotationTypes;
 import javax.lang.model.SourceVersion;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.Modifier;
-import javax.lang.model.element.Name;
 import javax.lang.model.element.PackageElement;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.TypeKind;

@@ -154,21 +154,25 @@
         String separator = "";
         Set<Element> originatingElementsList = info.originatingElements;
         originatingElementsList.add(field);
         PackageElement enclosingPackage = null;
         while (enclosing != null) {
-            if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE) {
+            if (enclosing.getKind() == ElementKind.CLASS || enclosing.getKind() == ElementKind.INTERFACE || enclosing.getKind() == ElementKind.ENUM) {
                 if (enclosing.getModifiers().contains(Modifier.PRIVATE)) {
                     String msg = String.format("Option field cannot be declared in a private %s %s", enclosing.getKind().name().toLowerCase(), enclosing);
                     processingEnv.getMessager().printMessage(Kind.ERROR, msg, element);
                     return;
                 }
                 originatingElementsList.add(enclosing);
                 declaringClass = enclosing.getSimpleName() + separator + declaringClass;
                 separator = ".";
             } else if (enclosing.getKind() == ElementKind.PACKAGE) {
                 enclosingPackage = (PackageElement) enclosing;
+                break;
+            } else {
+                processingEnv.getMessager().printMessage(Kind.ERROR, "Unexpected enclosing element kind: " + enclosing.getKind(), element);
+                return;
             }
             enclosing = enclosing.getEnclosingElement();
         }
         if (enclosingPackage == null) {
             processingEnv.getMessager().printMessage(Kind.ERROR, "Option field cannot be declared in the unnamed package", element);

@@ -219,38 +223,31 @@
                 return;
             }
         }
 
         String optionTypeName = getAnnotationValue(annotation, "type", VariableElement.class).getSimpleName().toString();
-        info.options.add(new OptionInfo(optionName, optionTypeName, help, extraHelp, optionType, declaringClass, field));
+        info.options.add(new OptionInfo(optionName, optionTypeName, help, extraHelp, optionType, declaringClass, field.getSimpleName().toString()));
     }
 
-    private void createFiles(OptionsInfo info) {
-        String pkg = ((PackageElement) info.topDeclaringType.getEnclosingElement()).getQualifiedName().toString();
-        Name topDeclaringClass = info.topDeclaringType.getSimpleName();
+    public static void createOptionsDescriptorsFile(ProcessingEnvironment processingEnv, OptionsInfo info) {
         Element[] originatingElements = info.originatingElements.toArray(new Element[info.originatingElements.size()]);
-
-        createOptionsDescriptorsFile(info, pkg, topDeclaringClass, originatingElements);
-    }
-
-    private void createOptionsDescriptorsFile(OptionsInfo info, String pkg, Name topDeclaringClass, Element[] originatingElements) {
-        String optionsClassName = topDeclaringClass + "_" + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME);
+        String optionsDescriptorsClassName = info.className + "_" + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME);
 
         Filer filer = processingEnv.getFiler();
-        try (PrintWriter out = createSourceFile(pkg, optionsClassName, filer, originatingElements)) {
+        try (PrintWriter out = createSourceFile(info.packageName, optionsDescriptorsClassName, filer, originatingElements)) {
 
             out.println("// CheckStyle: stop header check");
             out.println("// CheckStyle: stop line length check");
             out.println("// GENERATED CONTENT - DO NOT EDIT");
-            out.println("// Source: " + topDeclaringClass + ".java");
-            out.println("package " + pkg + ";");
+            out.println("// Source: " + info.className + ".java");
+            out.println("package " + info.packageName + ";");
             out.println("");
             out.println("import java.util.*;");
             out.println("import " + getPackageName(OPTION_DESCRIPTORS_CLASS_NAME) + ".*;");
             out.println("import " + OPTION_TYPE_CLASS_NAME + ";");
             out.println("");
-            out.println("public class " + optionsClassName + " implements " + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME) + " {");
+            out.println("public class " + optionsDescriptorsClassName + " implements " + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME) + " {");
 
             String desc = getSimpleName(OPTION_DESCRIPTOR_CLASS_NAME);
 
             Collections.sort(info.options);
 

@@ -258,23 +255,18 @@
             out.println("    public OptionDescriptor get(String value) {");
             out.println("        switch (value) {");
             out.println("        // CheckStyle: stop line length check");
             for (OptionInfo option : info.options) {
                 String name = option.name;
-                String optionField;
-                if (option.field.getModifiers().contains(Modifier.PRIVATE)) {
-                    throw new InternalError();
-                } else {
-                    optionField = option.declaringClass + "." + option.field.getSimpleName();
-                }
+                String optionField = option.declaringClass + "." + option.field;
                 out.println("        case \"" + name + "\": {");
                 String optionType = option.optionType;
                 String type = option.type;
                 String help = option.help;
                 List<String> extraHelp = option.extraHelp;
                 String declaringClass = option.declaringClass;
-                Name fieldName = option.field.getSimpleName();
+                String fieldName = option.field;
                 out.printf("            return " + desc + ".create(\n");
                 out.printf("                /*name*/ \"%s\",\n", name);
                 out.printf("                /*optionType*/ %s.%s,\n", getSimpleName(OPTION_TYPE_CLASS_NAME), optionType);
                 out.printf("                /*optionValueType*/ %s.class,\n", type);
                 out.printf("                /*help*/ \"%s\",\n", help);

@@ -317,14 +309,15 @@
             out.println("    }");
             out.println("}");
         }
     }
 
-    protected PrintWriter createSourceFile(String pkg, String relativeName, Filer filer, Element... originatingElements) {
+    public static PrintWriter createSourceFile(String pkg, String relativeName, Filer filer, Element... originatingElements) {
         try {
             // Ensure Unix line endings to comply with code style guide checked by Checkstyle
-            JavaFileObject sourceFile = filer.createSourceFile(pkg + "." + relativeName, originatingElements);
+            String className = pkg + "." + relativeName;
+            JavaFileObject sourceFile = filer.createSourceFile(className, originatingElements);
             return new PrintWriter(sourceFile.openWriter()) {
 
                 @Override
                 public void println() {
                     print("\n");

@@ -333,21 +326,21 @@
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
-    static class OptionInfo implements Comparable<OptionInfo> {
+    public static class OptionInfo implements Comparable<OptionInfo> {
 
-        final String name;
-        final String optionType;
-        final String help;
-        final List<String> extraHelp;
-        final String type;
-        final String declaringClass;
-        final VariableElement field;
+        public final String name;
+        public final String optionType;
+        public final String help;
+        public final List<String> extraHelp;
+        public final String type;
+        public final String declaringClass;
+        public final String field;
 
-        OptionInfo(String name, String optionType, String help, List<String> extraHelp, String type, String declaringClass, VariableElement field) {
+        public OptionInfo(String name, String optionType, String help, List<String> extraHelp, String type, String declaringClass, String field) {
             this.name = name;
             this.optionType = optionType;
             this.help = help;
             this.extraHelp = extraHelp;
             this.type = type;

@@ -364,18 +357,20 @@
         public String toString() {
             return declaringClass + "." + field;
         }
     }
 
-    static class OptionsInfo {
+    public static class OptionsInfo {
 
-        final Element topDeclaringType;
-        final List<OptionInfo> options = new ArrayList<>();
-        final Set<Element> originatingElements = new HashSet<>();
-
-        OptionsInfo(Element topDeclaringType) {
-            this.topDeclaringType = topDeclaringType;
+        public final String packageName;
+        public final String className;
+        public final List<OptionInfo> options = new ArrayList<>();
+        public final Set<Element> originatingElements = new HashSet<>();
+
+        public OptionsInfo(String packageName, String className) {
+            this.packageName = packageName;
+            this.className = className;
         }
     }
 
     private static Element topDeclaringType(Element element) {
         Element enclosing = element.getEnclosingElement();

@@ -385,11 +380,11 @@
         }
         return topDeclaringType(enclosing);
     }
 
     @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+    public boolean doProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
         if (roundEnv.processingOver()) {
             return true;
         }
 
         TypeElement optionTypeElement = getTypeElement(OPTION_CLASS_NAME);

@@ -402,11 +397,13 @@
             if (!processed.contains(element)) {
                 processed.add(element);
                 Element topDeclaringType = topDeclaringType(element);
                 OptionsInfo options = map.get(topDeclaringType);
                 if (options == null) {
-                    options = new OptionsInfo(topDeclaringType);
+                    String pkg = ((PackageElement) topDeclaringType.getEnclosingElement()).getQualifiedName().toString();
+                    String topDeclaringClass = topDeclaringType.getSimpleName().toString();
+                    options = new OptionsInfo(pkg, topDeclaringClass);
                     map.put(topDeclaringType, options);
                 }
                 if (!element.getEnclosingElement().getSimpleName().toString().endsWith("Options")) {
                     processingEnv.getMessager().printMessage(Kind.ERROR, "Option declaring classes must have a name that ends with 'Options'", element.getEnclosingElement());
                 }

@@ -414,23 +411,24 @@
             }
         }
 
         boolean ok = true;
         Map<String, OptionInfo> uniqueness = new HashMap<>();
-        for (OptionsInfo info : map.values()) {
+        for (Map.Entry<Element, OptionsInfo> e : map.entrySet()) {
+            OptionsInfo info = e.getValue();
             for (OptionInfo option : info.options) {
                 OptionInfo conflict = uniqueness.put(option.name, option);
                 if (conflict != null) {
-                    processingEnv.getMessager().printMessage(Kind.ERROR, "Duplicate option names for " + option + " and " + conflict, option.field);
+                    processingEnv.getMessager().printMessage(Kind.ERROR, "Duplicate option names for " + option + " and " + conflict, e.getKey());
                     ok = false;
                 }
             }
         }
 
         if (ok) {
             for (OptionsInfo info : map.values()) {
-                createFiles(info);
+                createOptionsDescriptorsFile(processingEnv, info);
             }
         }
 
         return true;
     }
< prev index next >