src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.options.processor/src/org/graalvm/compiler/options/processor/OptionProcessor.java
changeset 49873 26ebfe8ce852
parent 47798 9fe9292f5931
child 50330 2cbc42a5764b
equal deleted inserted replaced
49872:0798eab12791 49873:26ebfe8ce852
    59 
    59 
    60 import org.graalvm.compiler.options.Option;
    60 import org.graalvm.compiler.options.Option;
    61 import org.graalvm.compiler.options.OptionDescriptor;
    61 import org.graalvm.compiler.options.OptionDescriptor;
    62 import org.graalvm.compiler.options.OptionDescriptors;
    62 import org.graalvm.compiler.options.OptionDescriptors;
    63 import org.graalvm.compiler.options.OptionKey;
    63 import org.graalvm.compiler.options.OptionKey;
       
    64 import org.graalvm.compiler.options.OptionType;
    64 
    65 
    65 /**
    66 /**
    66  * Processes static fields annotated with {@link Option}. An {@link OptionDescriptors}
    67  * Processes static fields annotated with {@link Option}. An {@link OptionDescriptors}
    67  * implementation is generated for each top level class containing at least one such field. The name
    68  * implementation is generated for each top level class containing at least one such field. The name
    68  * of the generated class for top level class {@code com.foo.Bar} is
    69  * of the generated class for top level class {@code com.foo.Bar} is
   216                 processingEnv.getMessager().printMessage(Kind.ERROR, "Option help text must start with an upper case letter", element);
   217                 processingEnv.getMessager().printMessage(Kind.ERROR, "Option help text must start with an upper case letter", element);
   217                 return;
   218                 return;
   218             }
   219             }
   219         }
   220         }
   220 
   221 
   221         info.options.add(new OptionInfo(optionName, help, extraHelp, optionType, declaringClass, field));
   222         info.options.add(new OptionInfo(optionName, annotation.type(), help, extraHelp, optionType, declaringClass, field));
   222     }
   223     }
   223 
   224 
   224     private void createFiles(OptionsInfo info) {
   225     private void createFiles(OptionsInfo info) {
   225         String pkg = ((PackageElement) info.topDeclaringType.getEnclosingElement()).getQualifiedName().toString();
   226         String pkg = ((PackageElement) info.topDeclaringType.getEnclosingElement()).getQualifiedName().toString();
   226         Name topDeclaringClass = info.topDeclaringType.getSimpleName();
   227         Name topDeclaringClass = info.topDeclaringType.getSimpleName();
   241             out.println("// Source: " + topDeclaringClass + ".java");
   242             out.println("// Source: " + topDeclaringClass + ".java");
   242             out.println("package " + pkg + ";");
   243             out.println("package " + pkg + ";");
   243             out.println("");
   244             out.println("");
   244             out.println("import java.util.*;");
   245             out.println("import java.util.*;");
   245             out.println("import " + OptionDescriptors.class.getPackage().getName() + ".*;");
   246             out.println("import " + OptionDescriptors.class.getPackage().getName() + ".*;");
       
   247             out.println("import " + OptionType.class.getName() + ";");
   246             out.println("");
   248             out.println("");
   247             out.println("public class " + optionsClassName + " implements " + OptionDescriptors.class.getSimpleName() + " {");
   249             out.println("public class " + optionsClassName + " implements " + OptionDescriptors.class.getSimpleName() + " {");
   248 
   250 
   249             String desc = OptionDescriptor.class.getSimpleName();
   251             String desc = OptionDescriptor.class.getSimpleName();
   250 
   252 
   261                     throw new InternalError();
   263                     throw new InternalError();
   262                 } else {
   264                 } else {
   263                     optionField = option.declaringClass + "." + option.field.getSimpleName();
   265                     optionField = option.declaringClass + "." + option.field.getSimpleName();
   264                 }
   266                 }
   265                 out.println("        case \"" + name + "\": {");
   267                 out.println("        case \"" + name + "\": {");
       
   268                 OptionType optionType = option.optionType;
   266                 String type = option.type;
   269                 String type = option.type;
   267                 String help = option.help;
   270                 String help = option.help;
   268                 String[] extraHelp = option.extraHelp;
   271                 String[] extraHelp = option.extraHelp;
   269                 String declaringClass = option.declaringClass;
   272                 String declaringClass = option.declaringClass;
   270                 Name fieldName = option.field.getSimpleName();
   273                 Name fieldName = option.field.getSimpleName();
   271                 out.printf("            return " + desc + ".create(\n");
   274                 out.printf("            return " + desc + ".create(\n");
   272                 out.printf("                /*name*/ \"%s\",\n", name);
   275                 out.printf("                /*name*/ \"%s\",\n", name);
   273                 out.printf("                /*type*/ %s.class,\n", type);
   276                 out.printf("                /*optionType*/ %s.%s,\n", optionType.getDeclaringClass().getSimpleName(), optionType.name());
       
   277                 out.printf("                /*optionValueType*/ %s.class,\n", type);
   274                 out.printf("                /*help*/ \"%s\",\n", help);
   278                 out.printf("                /*help*/ \"%s\",\n", help);
   275                 if (extraHelp.length != 0) {
   279                 if (extraHelp.length != 0) {
   276                     out.printf("                /*extraHelp*/ new String[] {\n");
   280                     out.printf("                /*extraHelp*/ new String[] {\n");
   277                     for (String line : extraHelp) {
   281                     for (String line : extraHelp) {
   278                         out.printf("                         \"%s\",\n", line.replace("\\", "\\\\").replace("\"", "\\\""));
   282                         out.printf("                         \"%s\",\n", line.replace("\\", "\\\\").replace("\"", "\\\""));
   330     }
   334     }
   331 
   335 
   332     static class OptionInfo implements Comparable<OptionInfo> {
   336     static class OptionInfo implements Comparable<OptionInfo> {
   333 
   337 
   334         final String name;
   338         final String name;
       
   339         final OptionType optionType;
   335         final String help;
   340         final String help;
   336         final String[] extraHelp;
   341         final String[] extraHelp;
   337         final String type;
   342         final String type;
   338         final String declaringClass;
   343         final String declaringClass;
   339         final VariableElement field;
   344         final VariableElement field;
   340 
   345 
   341         OptionInfo(String name, String help, String[] extraHelp, String type, String declaringClass, VariableElement field) {
   346         OptionInfo(String name, OptionType optionType, String help, String[] extraHelp, String type, String declaringClass, VariableElement field) {
   342             this.name = name;
   347             this.name = name;
       
   348             this.optionType = optionType;
   343             this.help = help;
   349             this.help = help;
   344             this.extraHelp = extraHelp;
   350             this.extraHelp = extraHelp;
   345             this.type = type;
   351             this.type = type;
   346             this.declaringClass = declaringClass;
   352             this.declaringClass = declaringClass;
   347             this.field = field;
   353             this.field = field;