プロジェクト

全般

プロフィール

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として処理をするようになっています。


ほぼ7年前に更新