src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java
Print this page
rev 2819 : imported patch my-classpath-deps-00
@@ -27,26 +27,24 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
-import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
-import com.sun.source.tree.CompilationUnitTree;
import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.api.JavacTool;
-import com.sun.tools.javac.code.Symbol.ClassSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Options;
+import com.sun.tools.sjavac.Log;
import com.sun.tools.sjavac.Util;
import com.sun.tools.sjavac.comp.dependencies.DependencyCollector;
import com.sun.tools.sjavac.comp.dependencies.PublicApiCollector;
import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
@@ -60,11 +58,11 @@
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class SjavacImpl implements Sjavac {
-
+static Object lock = new Object();
@Override
public SysInfo getSysInfo() {
return new SysInfo(Runtime.getRuntime().availableProcessors(),
Runtime.getRuntime().maxMemory());
}
@@ -74,90 +72,82 @@
String invocationId,
String[] args,
List<File> explicitSources,
Set<URI> sourcesToCompile,
Set<URI> visibleSources) {
- JavacTool compiler = JavacTool.create();
- try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
- SmartFileManager smartFileManager = new SmartFileManager(fileManager);
+
+ JavacTool compiler = (JavacTool) ToolProvider.getSystemJavaCompiler();
+ try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+ SmartFileManager sfm = new SmartFileManager(fm);
Context context = new Context();
- // Now setup the actual compilation....
+ // Now setup the actual compilation
CompilationResult compilationResult = new CompilationResult(0);
- // First deal with explicit source files on cmdline and in at file.
- ListBuffer<JavaFileObject> compilationUnits = new ListBuffer<>();
- for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(explicitSources)) {
- compilationUnits.append(i);
+ // First deal with explicit source files on cmdline and in at file
+ ListBuffer<JavaFileObject> explicitJFOs = new ListBuffer<>();
+ for (JavaFileObject i : fm.getJavaFileObjectsFromFiles(explicitSources)) {
+ explicitJFOs.append(i);
}
- // Now deal with sources supplied as source_to_compile.
+ // Now deal with sources supplied as source_to_compile
ListBuffer<File> sourcesToCompileFiles = new ListBuffer<>();
- for (URI u : sourcesToCompile) {
+ for (URI u : sourcesToCompile)
sourcesToCompileFiles.append(new File(u));
- }
- for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(sourcesToCompileFiles)) {
- compilationUnits.append(i);
- }
- // Create a new logger.
+ for (JavaFileObject i : fm.getJavaFileObjectsFromFiles(sourcesToCompileFiles))
+ explicitJFOs.append(i);
+
+ // Create a new logger
StringWriter stdoutLog = new StringWriter();
StringWriter stderrLog = new StringWriter();
PrintWriter stdout = new PrintWriter(stdoutLog);
PrintWriter stderr = new PrintWriter(stderrLog);
com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK;
- DependencyCollector depsCollector = new DependencyCollector();
- PublicApiCollector pubApiCollector = new PublicApiCollector();
+ DependencyCollector depsCollector = new DependencyCollector(context);
+ PublicApiCollector pubApiCollector = new PublicApiCollector(context);
PathAndPackageVerifier papVerifier = new PathAndPackageVerifier();
try {
- if (compilationUnits.size() > 0) {
- smartFileManager.setVisibleSources(visibleSources);
- smartFileManager.cleanArtifacts();
- smartFileManager.setLog(stdout);
+ if (explicitJFOs.size() > 0) {
+ sfm.setVisibleSources(visibleSources);
+ sfm.cleanArtifacts();
+ sfm.setLog(stdout);
// Do the compilation!
JavacTaskImpl task =
(JavacTaskImpl) compiler.getTask(stderr,
- smartFileManager,
+ sfm,
null,
Arrays.asList(args),
null,
- compilationUnits,
+ explicitJFOs,
context);
- smartFileManager.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
+ sfm.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
task.addTaskListener(depsCollector);
task.addTaskListener(pubApiCollector);
task.addTaskListener(papVerifier);
+ Log.debug("Invoking javac with args");
+ Arrays.asList(args).forEach(arg -> Log.debug(" " + arg));
rc = task.doCall();
- smartFileManager.flush();
+ Log.debug("javac returned with code " + rc);
+ sfm.flush();
}
} catch (Exception e) {
+ Log.error(Util.getStackTrace(e));
stderrLog.append(Util.getStackTrace(e));
rc = com.sun.tools.javac.main.Main.Result.ERROR;
}
- compilationResult.packageArtifacts = smartFileManager.getPackageArtifacts();
-
- Dependencies deps = Dependencies.instance(context);
- for (PackageSymbol from : depsCollector.getSourcePackages()) {
- for (PackageSymbol to : depsCollector.getDependenciesForPkg(from))
- deps.collect(from.fullname, to.fullname);
- }
-
- for (ClassSymbol cs : pubApiCollector.getClassSymbols())
- deps.visitPubapi(cs);
+ compilationResult.packageArtifacts = sfm.getPackageArtifacts();
- if (papVerifier.getMisplacedCompilationUnits().size() > 0) {
- for (CompilationUnitTree cu : papVerifier.getMisplacedCompilationUnits()) {
- System.err.println("Misplaced compilation unit.");
- System.err.println(" Directory: " + Paths.get(cu.getSourceFile().toUri()).getParent());
- System.err.println(" Package: " + cu.getPackageName());
- }
+ if (papVerifier.errorsDiscovered())
rc = com.sun.tools.javac.main.Main.Result.ERROR;
- }
- compilationResult.packageDependencies = deps.getDependencies();
- compilationResult.packagePubapis = deps.getPubapis();
+ Dependencies deps = Dependencies.instance(context);
+ compilationResult.packageDependencies = deps.getDependencies(explicitJFOs);
+ compilationResult.packageCpDependencies = deps.getCpDependencies(explicitJFOs);
+ compilationResult.packagePubapis = deps.getPubapis(explicitJFOs, true);
+ compilationResult.dependencyPubapis = deps.getPubapis(explicitJFOs, false);
compilationResult.stdout = stdoutLog.toString();
compilationResult.stderr = stderrLog.toString();
compilationResult.returnCode = rc.exitCode;
return compilationResult;