// src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.javaprivateStringcompile(Path file,List<String> javacOpts,Context context)throwsFault{...JavacTool javaCompiler =JavacTool.create();...JavacTask t = javaCompiler.getTask(out, fm,null, javacOpts,null,List.of(fo));...Boolean ok = t.call();...}
// src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTool.java@Override@DefinedBy(Api.COMPILER)publicJavacTaskgetTask(Writer out,JavaFileManager fileManager,DiagnosticListener<?superJavaFileObject> diagnosticListener,Iterable<String> options,Iterable<String> classes,Iterable<?extendsJavaFileObject> compilationUnits){Context context =newContext();returngetTask(out, fileManager, diagnosticListener,
options, classes, compilationUnits,
context);}/* Internal version of getTask, allowing context to be provided. */publicJavacTaskgetTask(Writer out,JavaFileManager fileManager,DiagnosticListener<?superJavaFileObject> diagnosticListener,Iterable<String> options,Iterable<String> classes,Iterable<?extendsJavaFileObject> compilationUnits,Context context){...returnnewJavacTaskImpl(context);...}
3. 执行编译任务
// src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java@Override@DefinedBy(Api.COMPILER)publicBooleancall(){returndoCall().isOK();}/* Internal version of call exposing Main.Result. */publicMain.ResultdoCall(){...
compiler.compile(args.getFileObjects(), args.getClassNames(), processors, addModules);...}
4. 编译
// src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.javapublicvoidcompile(Collection<JavaFileObject> sourceFileObjects,Collection<String> classnames,Iterable<?extendsProcessor> processors,Collection<String> addModules){...// These method calls must be chained to avoid memory leaksprocessAnnotations(enterTrees(stopIfError(CompileState.ENTER,initModules(stopIfError(CompileState.ENTER,parseFiles(sourceFileObjects))))),
classnames
);...}
5. 解析源文件
// src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.javapublicList<JCCompilationUnit>parseFiles(Iterable<JavaFileObject> fileObjects){returnparseFiles(fileObjects,false);}publicList<JCCompilationUnit>parseFiles(Iterable<JavaFileObject> fileObjects,boolean force){...//parse all filesListBuffer<JCCompilationUnit> trees =newListBuffer<>();Set<JavaFileObject> filesSoFar =newHashSet<>();for(JavaFileObject fileObject : fileObjects){if(!filesSoFar.contains(fileObject)){
filesSoFar.add(fileObject);
trees.append(parse(fileObject));}}return trees.toList();}
6. 解析文件内容
// src/jdk.compiler/share/classes/com/sun/tools/javac/main/JavaCompiler.java/** Parse contents of file.
* @param filename The name of the file to be parsed.
*/publicJCTree.JCCompilationUnitparse(JavaFileObject filename){...JCTree.JCCompilationUnit t =parse(filename,readSource(filename));...return t;...}/** Try to open input stream with given name.
* Report an error if this fails.
* @param filename The file name of the input stream to be opened.
*/publicCharSequencereadSource(JavaFileObject filename){...
inputFiles.add(filename);return filename.getCharContent(false);...}/** Parse contents of input stream.
* @param filename The name of the file from which input stream comes.
* @param content The characters to be parsed.
*/protectedJCCompilationUnitparse(JavaFileObject filename,CharSequence content){...Parser parser = parserFactory.newParser(content,keepComments(), genEndPos,...
tree = parser.parseCompilationUnit();...return tree;}