< 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,52 ****
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.processing.Filer;
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;
--- 35,52 ----
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.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,174 ****
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.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;
}
enclosing = enclosing.getEnclosingElement();
}
if (enclosingPackage == null) {
processingEnv.getMessager().printMessage(Kind.ERROR, "Option field cannot be declared in the unnamed package", element);
--- 154,178 ----
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 || 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,256 ****
return;
}
}
String optionTypeName = getAnnotationValue(annotation, "type", VariableElement.class).getSimpleName().toString();
! info.options.add(new OptionInfo(optionName, optionTypeName, help, extraHelp, optionType, declaringClass, field));
}
! private void createFiles(OptionsInfo info) {
! String pkg = ((PackageElement) info.topDeclaringType.getEnclosingElement()).getQualifiedName().toString();
! Name topDeclaringClass = info.topDeclaringType.getSimpleName();
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);
Filer filer = processingEnv.getFiler();
! try (PrintWriter out = createSourceFile(pkg, optionsClassName, 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("");
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) + " {");
String desc = getSimpleName(OPTION_DESCRIPTOR_CLASS_NAME);
Collections.sort(info.options);
--- 223,253 ----
return;
}
}
String optionTypeName = getAnnotationValue(annotation, "type", VariableElement.class).getSimpleName().toString();
! info.options.add(new OptionInfo(optionName, optionTypeName, help, extraHelp, optionType, declaringClass, field.getSimpleName().toString()));
}
! public static void createOptionsDescriptorsFile(ProcessingEnvironment processingEnv, OptionsInfo info) {
Element[] originatingElements = info.originatingElements.toArray(new Element[info.originatingElements.size()]);
! String optionsDescriptorsClassName = info.className + "_" + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME);
Filer filer = processingEnv.getFiler();
! 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: " + 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 " + optionsDescriptorsClassName + " implements " + getSimpleName(OPTION_DESCRIPTORS_CLASS_NAME) + " {");
String desc = getSimpleName(OPTION_DESCRIPTOR_CLASS_NAME);
Collections.sort(info.options);
*** 258,280 ****
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();
! }
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();
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);
--- 255,272 ----
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 = 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;
! 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,330 ****
out.println(" }");
out.println("}");
}
}
! protected 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);
return new PrintWriter(sourceFile.openWriter()) {
@Override
public void println() {
print("\n");
--- 309,323 ----
out.println(" }");
out.println("}");
}
}
! 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
! String className = pkg + "." + relativeName;
! JavaFileObject sourceFile = filer.createSourceFile(className, originatingElements);
return new PrintWriter(sourceFile.openWriter()) {
@Override
public void println() {
print("\n");
*** 333,353 ****
} catch (IOException e) {
throw new RuntimeException(e);
}
}
! 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;
! OptionInfo(String name, String optionType, String help, List<String> extraHelp, String type, String declaringClass, VariableElement field) {
this.name = name;
this.optionType = optionType;
this.help = help;
this.extraHelp = extraHelp;
this.type = type;
--- 326,346 ----
} catch (IOException e) {
throw new RuntimeException(e);
}
}
! public static class OptionInfo implements Comparable<OptionInfo> {
! 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;
! 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,381 ****
public String toString() {
return declaringClass + "." + field;
}
}
! static class OptionsInfo {
! final Element topDeclaringType;
! final List<OptionInfo> options = new ArrayList<>();
! final Set<Element> originatingElements = new HashSet<>();
!
! OptionsInfo(Element topDeclaringType) {
! this.topDeclaringType = topDeclaringType;
}
}
private static Element topDeclaringType(Element element) {
Element enclosing = element.getEnclosingElement();
--- 357,376 ----
public String toString() {
return declaringClass + "." + field;
}
}
! public static class OptionsInfo {
! 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,395 ****
}
return topDeclaringType(enclosing);
}
@Override
! public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return true;
}
TypeElement optionTypeElement = getTypeElement(OPTION_CLASS_NAME);
--- 380,390 ----
}
return topDeclaringType(enclosing);
}
@Override
! public boolean doProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (roundEnv.processingOver()) {
return true;
}
TypeElement optionTypeElement = getTypeElement(OPTION_CLASS_NAME);
*** 402,412 ****
if (!processed.contains(element)) {
processed.add(element);
Element topDeclaringType = topDeclaringType(element);
OptionsInfo options = map.get(topDeclaringType);
if (options == null) {
! options = new OptionsInfo(topDeclaringType);
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());
}
--- 397,409 ----
if (!processed.contains(element)) {
processed.add(element);
Element topDeclaringType = topDeclaringType(element);
OptionsInfo options = map.get(topDeclaringType);
if (options == null) {
! 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,436 ****
}
}
boolean ok = true;
Map<String, OptionInfo> uniqueness = new HashMap<>();
! for (OptionsInfo info : map.values()) {
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);
ok = false;
}
}
}
if (ok) {
for (OptionsInfo info : map.values()) {
! createFiles(info);
}
}
return true;
}
--- 411,434 ----
}
}
boolean ok = true;
Map<String, OptionInfo> uniqueness = new HashMap<>();
! 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, e.getKey());
ok = false;
}
}
}
if (ok) {
for (OptionsInfo info : map.values()) {
! createOptionsDescriptorsFile(processingEnv, info);
}
}
return true;
}
< prev index next >