OpenJDKツールjavacのソースコード¶
langtools/src/jdk.compiler
の下にあるのがjavacのソースコード
エントリポイント(mainのソースファイル)¶
langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/Main.java
ここから、com.sun.tools.javac.main.Mainクラスをnewしてその@compile(String[])
メソッドを呼んでいます。
com.sun.tools.javac.Main#main com.sun.tools.javac.Main#compile com.sun.tools.javac.main.Main#Main com.sun.tools.javac.main.Main#compile(String[]) com.sun.tools.javac.main.Main#compile(String[], Context) com.sun.tools.javac.main.CommandLine#parse com.sun.tools.javac.main.Arguments#instance com.sun.tools.javac.main.Arguments#init com.sun.tools.javac.main.Options#instance :
コマンドラインオプションの処理¶
ソースファイルの指定¶
- Option.java
public enum Option {
:
// Standalone positional argument: source file or type name.
SOURCEFILE("sourcefile", null, HIDDEN, INFO) {
:
public void process(OptionHelper helper, String option) throws InvalidValueException {
if (option.endsWith(".java") ) {
Path p = Paths.get(option);
if (!Files.exists(p)) {
throw helper.newInvalidValueException("err.file.not.found", p);
}
if (!Files.isRegularFile(p)) {
throw helper.newInvalidValueException("err.file.not.file", p);
}
helper.addFile(p);
} else {
helper.addClassName(option);
}
}
javacのコマンドライン引数で指定されたソースファイル名について、末尾が".java"となっており、ソースファイル名をPaths.getでPathオブジェクトを生成し、ファイルが実在するかでエラーチェックをしています。
- Arguments.java
while (argIter.hasNext()) {
String arg = argIter.next();
Option option = null;
// first, check the provided set of javac options
if (arg.startsWith("-")) {
option = Option.lookup(arg, allowableOpts);
} else if (allowOperands && Option.SOURCEFILE.matches(arg)) {
option = Option.SOURCEFILE;
}
if (option != null) {
try {
option.handleOption(helper, arg, argIter);
コマンドラインオプションをイテレートして、ハイフンで開始されていたら対応するOptionオブジェクトを検索し、それ以外であればOption.SOURCEFILEとして処理をするようになっています。