< 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 >