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;