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