diff -r 4822dfe0922b -r 3809292620c9 src/share/classes/com/sun/tools/javac/api/JavacTool.java --- a/src/share/classes/com/sun/tools/javac/api/JavacTool.java Mon Dec 12 08:15:32 2011 -0800 +++ b/src/share/classes/com/sun/tools/javac/api/JavacTool.java Tue Dec 13 11:21:28 2011 -0800 @@ -25,18 +25,15 @@ package com.sun.tools.javac.api; -import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import java.nio.charset.Charset; -import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.Iterator; -import java.util.List; import java.util.Locale; import java.util.Set; import javax.lang.model.SourceVersion; @@ -44,17 +41,15 @@ import com.sun.source.util.JavacTask; import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.main.JavacOption.OptionKind; -import com.sun.tools.javac.main.JavacOption; import com.sun.tools.javac.main.Main; -import com.sun.tools.javac.main.RecognizedOptions.GrumpyHelper; -import com.sun.tools.javac.main.RecognizedOptions; +import com.sun.tools.javac.main.Option; +import com.sun.tools.javac.main.OptionHelper; +import com.sun.tools.javac.main.OptionHelper.GrumpyHelper; import com.sun.tools.javac.util.ClientCodeException; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Log.PrefixKind; import com.sun.tools.javac.util.Options; -import com.sun.tools.javac.util.Pair; /** * TODO: describe com.sun.tools.javac.api.Tool @@ -67,23 +62,10 @@ * @author Peter von der Ah\u00e9 */ public final class JavacTool implements JavaCompiler { - private final List> options - = new ArrayList>(); - private final Context dummyContext = new Context(); - - private final PrintWriter silent = new PrintWriter(new OutputStream(){ - public void write(int b) {} - }); - - private final Main sharedCompiler = new Main("javac", silent); - { - sharedCompiler.setOptions(Options.instance(dummyContext)); - } - /** - * Constructor used by service provider mechanism. The correct way to - * obtain an instance of this class is using create or the service provider - * mechanism. + * Constructor used by service provider mechanism. The recommended way to + * obtain an instance of this class is by using {@link #create} or the + * service provider mechanism. * @see javax.tools.JavaCompilerTool * @see javax.tools.ToolProvider * @see #create @@ -99,49 +81,6 @@ return new JavacTool(); } - private String argsToString(Object... args) { - String newArgs = null; - if (args.length > 0) { - StringBuilder sb = new StringBuilder(); - String separator = ""; - for (Object arg : args) { - sb.append(separator).append(arg.toString()); - separator = File.pathSeparator; - } - newArgs = sb.toString(); - } - return newArgs; - } - - private void setOption1(String name, OptionKind kind, Object... args) { - String arg = argsToString(args); - JavacOption option = sharedCompiler.getOption(name); - if (option == null || !match(kind, option.getKind())) - throw new IllegalArgumentException(name); - if ((args.length != 0) != option.hasArg()) - throw new IllegalArgumentException(name); - if (option.hasArg()) { - if (option.process(null, name, arg)) // FIXME - throw new IllegalArgumentException(name); - } else { - if (option.process(null, name)) // FIXME - throw new IllegalArgumentException(name); - } - options.add(new Pair(name,arg)); - } - - public void setOption(String name, Object... args) { - setOption1(name, OptionKind.NORMAL, args); - } - - public void setExtendedOption(String name, Object... args) { - setOption1(name, OptionKind.EXTENDED, args); - } - - private static boolean match(OptionKind clientKind, OptionKind optionKind) { - return (clientKind == (optionKind == OptionKind.HIDDEN ? OptionKind.EXTENDED : optionKind)); - } - public JavacFileManager getStandardFileManager( DiagnosticListener diagnosticListener, Locale locale, @@ -209,7 +148,9 @@ if (fileManager == null) fileManager = getStandardFileManager(diagnosticListener, null, null); fileManager = ccw.wrap(fileManager); + context.put(JavaFileManager.class, fileManager); + processOptions(context, fileManager, options); Main compiler = new Main("javacTask", context.get(Log.outKey)); return new JavacTaskImpl(compiler, options, context, classes, compilationUnits); @@ -225,11 +166,28 @@ if (options == null) return; - Options optionTable = Options.instance(context); + final Options optionTable = Options.instance(context); Log log = Log.instance(context); - JavacOption[] recognizedOptions = - RecognizedOptions.getJavacToolOptions(new GrumpyHelper(log)); + Option[] recognizedOptions = + Option.getJavacToolOptions().toArray(new Option[0]); + OptionHelper optionHelper = new GrumpyHelper(log) { + @Override + public String get(Option option) { + return optionTable.get(option.getText()); + } + + @Override + public void put(String name, String value) { + optionTable.put(name, value); + } + + @Override + public void remove(String name) { + optionTable.remove(name); + } + }; + Iterator flags = options.iterator(); while (flags.hasNext()) { String flag = flags.next(); @@ -247,19 +205,19 @@ } } - JavacOption option = recognizedOptions[j]; + Option option = recognizedOptions[j]; if (option.hasArg()) { if (!flags.hasNext()) { String msg = log.localize(PrefixKind.JAVAC, "err.req.arg", flag); throw new IllegalArgumentException(msg); } String operand = flags.next(); - if (option.process(optionTable, flag, operand)) + if (option.process(optionHelper, flag, operand)) // should not happen as the GrumpyHelper will throw exceptions // in case of errors throw new IllegalArgumentException(flag + " " + operand); } else { - if (option.process(optionTable, flag)) + if (option.process(optionHelper, flag)) // should not happen as the GrumpyHelper will throw exceptions // in case of errors throw new IllegalArgumentException(flag); @@ -283,9 +241,8 @@ } public int isSupportedOption(String option) { - JavacOption[] recognizedOptions = - RecognizedOptions.getJavacToolOptions(new GrumpyHelper(null)); - for (JavacOption o : recognizedOptions) { + Set