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