/**
* @param out the writer to use for diagnostic output
*/
public static Option[] getAll(final OptionHelper helper) {
return new Option[]{
new Option(G, "opt.g"),
new Option(G_NONE, "opt.g.none") {
public boolean process(Options options, String option) {
options.put("-g:", "none");
return false;
}
},
new Option(G_CUSTOM, "opt.g.lines.vars.source") {
public boolean matches(String s) {
return s.startsWith("-g:");
}
public boolean process(Options options, String option) {
/*例子:
option=-g:lines,vars,source
suboptions=lines,vars,source
tok=lines
opt=-g:lines
tok=vars
opt=-g:vars
tok=source
opt=-g:source
最后一共在options加进了4对
(-g: lines,vars,source)
(-g:lines -g:lines)
(-g:vars -g:vars)
(-g:source -g:source)
*/
String suboptions = option.substring(3);
//DEBUG.P("suboptions="+suboptions);
//DEBUG.P("option="+option);
options.put("-g:", suboptions);
// enter all the -g suboptions as "-g:suboption"
for (StringTokenizer t = new StringTokenizer(suboptions, ","); t.hasMoreTokens(); ) {
String tok = t.nextToken();
String opt = "-g:" + tok;
//DEBUG.P("tok="+tok);
//DEBUG.P("opt="+opt);
options.put(opt, opt);
}
return false;
}
},
new XOption(XLINT, "opt.Xlint"),
new XOption(XLINT_CUSTOM, "opt.Xlint.suboptlist") {
public boolean matches(String s) {
return s.startsWith("-Xlint:");
}
//处理方式与G_CUSTOM相同
public boolean process(Options options, String option) {
String suboptions = option.substring(7);
options.put("-Xlint:", suboptions);
// enter all the -Xlint suboptions as "-Xlint:suboption"
for (StringTokenizer t = new StringTokenizer(suboptions, ","); t.hasMoreTokens(); ) {
String tok = t.nextToken();
String opt = "-Xlint:" + tok;
options.put(opt, opt);
}
return false;
}
},
// -nowarn is retained for command-line backward compatibility
//“-nowarn”选项只是为了向后兼容而保留下来的,
//“-nowarn”与“-Xlint:none”等价
new Option(NOWARN, "opt.nowarn") {
public boolean process(Options options, String option) {
options.put("-Xlint:none", option);
return false;
}
},
new Option(VERBOSE, "opt.verbose"),
// -deprecation is retained for command-line backward compatibility
//“-deprecation”选项只是为了向后兼容而保留下来的,
//“-deprecation”与“-Xlint:deprecation”等价
new Option(DEPRECATION, "opt.deprecation") {
public boolean process(Options options, String option) {
options.put("-Xlint:deprecation", option);
return false;
}
},
new Option(CLASSPATH, "opt.arg.path", "opt.classpath"),
new Option(CP, "opt.arg.path", "opt.classpath") {
public boolean process(Options options, String option, String arg) {
return super.process(options, "-classpath", arg);
}
},
new Option(SOURCEPATH, "opt.arg.path", "opt.sourcepath"),
new Option(BOOTCLASSPATH, "opt.arg.path", "opt.bootclasspath") {
public boolean process(Options options, String option, String arg) {
options.remove("-Xbootclasspath/p:");
options.remove("-Xbootclasspath/a:");
return super.process(options, option, arg);
}
},
new XOption(XBOOTCLASSPATH_PREPEND,"opt.arg.path", "opt.Xbootclasspath.p"),
new XOption(XBOOTCLASSPATH_APPEND, "opt.arg.path", "opt.Xbootclasspath.a"),
//选项“-Xbootclasspath:<路径>”与“-bootclasspath <路径>”等价
//从这个例子说明了非标准选项(或称扩展选项)在运用成熟后会转换成标准选项
new XOption(XBOOTCLASSPATH, "opt.arg.path", "opt.bootclasspath") {
public boolean process(Options options, String option, String arg) {
options.remove("-Xbootclasspath/p:");
options.remove("-Xbootclasspath/a:");
return super.process(options, "-bootclasspath", arg);
}
},
new Option(EXTDIRS, "opt.arg.dirs", "opt.extdirs"),
new XOption(DJAVA_EXT_DIRS, "opt.arg.dirs", "opt.extdirs") {
public boolean process(Options options, String option, String arg) {
return super.process(options, "-extdirs", arg);
}
},
new Option(ENDORSEDDIRS, "opt.arg.dirs", "opt.endorseddirs"),
new XOption(DJAVA_ENDORSED_DIRS, "opt.arg.dirs", "opt.endorseddirs") {
public boolean process(Options options, String option, String arg) {
return super.process(options, "-endorseddirs", arg);
}
},
new Option(PROC_CUSTOM, "opt.proc.none.only") {
public boolean matches(String s) {
return s.equals("-proc:none") || s.equals("-proc:only");
}
//"-proc:none"与"-proc:only"同时出现在命令行选项中时,只取其中之一
public boolean process(Options options, String option) {
if (option.equals("-proc:none")) {
options.remove("-proc:only");
} else {
options.remove("-proc:none");
}
options.put(option, option);
return false;
}
},
new Option(PROCESSOR, "opt.arg.class.list", "opt.processor"),
new Option(PROCESSORPATH, "opt.arg.path", "opt.processorpath"),
new Option(D, "opt.arg.directory", "opt.d"),
new Option(S, "opt.arg.directory", "opt.sourceDest"),
//IMPLICIT: 1.7新增标准选项,指定是否为隐式引用文件生成类文件
new Option(IMPLICIT, "opt.implicit") {
public boolean matches(String s) {
return s.equals("-implicit:none") || s.equals("-implicit:class");
}
public boolean process(Options options, String option, String operand) {
int sep = option.indexOf(":");
options.put(option.substring(0, sep), option.substring(sep+1));
options.put(option,option);
/*例子:java -classpath bin\classes com.sun.tools.javac.Main -implicit:none -implicit:class
打印:
option=-implicit:none
option.substring(0, sep)=-implicit
option.substring(sep+1)=none
option=-implicit:class
option.substring(0, sep)=-implicit
option.substring(sep+1)=class
options.keySet()=[-implicit, -implicit:none, -implicit:class]
*/
/*
DEBUG.P("option="+option);
DEBUG.P("option.substring(0, sep)="+option.substring(0, sep));
DEBUG.P("option.substring(sep+1)="+option.substring(sep+1));
DEBUG.P("options.keySet()="+options.keySet());
*/
return false;
}
},
new Option(ENCODING, "opt.arg.encoding", "opt.encoding"),
new Option(SOURCE, "opt.arg.release", "opt.source") {
public boolean process(Options options, String option, String operand) {
//指com.sun.tools.javac.code.Source类
//只能是-source 1.2 到 -source 1.7
Source source = Source.lookup(operand);
if (source == null) {
/*如指定 -source 1.1 选项参数时,报错如下:
javac: 无效的源版本: 1.1
用法: javac <options> <source files>
-help 用于列出可能的选项
错误提示“key”与内容在下面的文件中:
com\sun\tools\javac\resources\javac.properties(分国际化版本)
*/
helper.error("err.invalid.source", operand);
return true;
}
return super.process(options, option, operand);
}
},
new Option(TARGET, "opt.arg.release", "opt.target") {
public boolean process(Options options, String option, String operand) {
/*
指com.sun.tools.javac.jvm.Target类
只能是下列格式之一:
-target 1.1、-target 1.2、
-target 1.3、-target 1.4、-target jsr14、-target 1.4.1、-target 1.4.2
-target 1.5、-target 1.6、-target 1.7、
-target 5 、-target 6 、-target 7
*/
Target target = Target.lookup(operand);
if (target == null) {
//与SOURCE选项类似
helper.error("err.invalid.target", operand);
return true;
}
return super.process(options, option, operand);
}
},
new Option(VERSION, "opt.version") {
public boolean process(Options options, String option) {
helper.printVersion();
return super.process(options, option);
}
},
new HiddenOption(FULLVERSION) {
public boolean process(Options options, String option) {
helper.printFullVersion();
return super.process(options, option);
}
},
new Option(HELP, "opt.help") {
//当处理命令行选项时(在Main类的processArgs()方法中处理),
//如果有"-help"选项,则在这里直接调用printHelp()打印标准选项信息
//(调用printHelp()会间接调用Main类的help()方法)
public boolean process(Options options, String option) {
helper.printHelp();
return super.process(options, option);
}
},
new Option(A, "opt.arg.key.equals.value","opt.A") {
String helpSynopsis() {
hasSuffix = true;
return super.helpSynopsis();
}
public boolean matches(String arg) {
return arg.startsWith("-A");
}
public boolean hasArg() {
return false;
}
// Mapping for processor options created in
// JavacProcessingEnvironment
public boolean process(Options options, String option) {
//在com.sun.tools.javac.main.Main===>processArgs(1)方法中会先
//调用matches()方法,若返回true后,再调用hasArg()方法,
//hasArg()方法总是返回false,接着转到这里,
//参数option一定是以“-A”开头的
int argLength = option.length();
if (argLength == 2) {
//-A 需要一个参数;使用 '-Akey' 或 '-Akey=value'
helper.error("err.empty.A.argument");
return true;
}
int sepIndex = option.indexOf('=');
String key = option.substring(2, (sepIndex != -1 ? sepIndex : argLength) );
if (!JavacProcessingEnvironment.isValidOptionName(key)) {
helper.error("err.invalid.A.key", option);
return true;
}
return process(options, option, option);
}
},
new Option(X, "opt.X") {
//当处理命令行选项时(在Main类的processArgs()方法中处理),
//如果有"-X"选项,则在这里直接调用printXhelp()打印扩展选项信息
//(调用printXhelp()会间接调用Main类的xhelp()方法)
public boolean process(Options options, String option) {
helper.printXhelp();
return super.process(options, option);
}
},
// This option exists only for the purpose of documenting itself.
// It's actually implemented by the launcher.
new Option(J, "opt.arg.flag", "opt.J") {
String helpSynopsis() {
hasSuffix = true;
return super.helpSynopsis();
}
//要是这样运行:java -classpath bin\classes com.sun.tools.javac.Main -help -J