31 import java.util.Arrays; |
31 import java.util.Arrays; |
32 import java.util.List; |
32 import java.util.List; |
33 import java.util.Set; |
33 import java.util.Set; |
34 import java.util.concurrent.atomic.AtomicBoolean; |
34 import java.util.concurrent.atomic.AtomicBoolean; |
35 |
35 |
36 import javax.tools.JavaCompiler.CompilationTask; |
|
37 import javax.tools.JavaFileObject; |
36 import javax.tools.JavaFileObject; |
38 import javax.tools.StandardJavaFileManager; |
37 import javax.tools.StandardJavaFileManager; |
39 |
38 |
40 import com.sun.tools.javac.api.JavacTaskImpl; |
39 import com.sun.tools.javac.api.JavacTaskImpl; |
41 import com.sun.tools.javac.api.JavacTool; |
40 import com.sun.tools.javac.api.JavacTool; |
|
41 import com.sun.tools.javac.code.Symbol.PackageSymbol; |
42 import com.sun.tools.javac.util.Context; |
42 import com.sun.tools.javac.util.Context; |
43 import com.sun.tools.javac.util.ListBuffer; |
43 import com.sun.tools.javac.util.ListBuffer; |
44 import com.sun.tools.javac.util.Options; |
44 import com.sun.tools.javac.util.Options; |
|
45 import com.sun.tools.sjavac.Util; |
|
46 import com.sun.tools.sjavac.comp.dependencies.DependencyCollector; |
45 import com.sun.tools.sjavac.server.CompilationResult; |
47 import com.sun.tools.sjavac.server.CompilationResult; |
46 import com.sun.tools.sjavac.server.Sjavac; |
48 import com.sun.tools.sjavac.server.Sjavac; |
47 import com.sun.tools.sjavac.server.SysInfo; |
49 import com.sun.tools.sjavac.server.SysInfo; |
48 |
50 |
49 /** |
51 /** |
74 |
76 |
75 JavacTool compiler = JavacTool.create(); |
77 JavacTool compiler = JavacTool.create(); |
76 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); |
78 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); |
77 SmartFileManager smartFileManager = new SmartFileManager(fileManager); |
79 SmartFileManager smartFileManager = new SmartFileManager(fileManager); |
78 Context context = new Context(); |
80 Context context = new Context(); |
79 ResolveWithDeps.preRegister(context); |
|
80 AttrWithDeps.preRegister(context); |
|
81 JavaCompilerWithDeps.preRegister(context, new SjavacErrorHandler() { |
81 JavaCompilerWithDeps.preRegister(context, new SjavacErrorHandler() { |
82 @Override |
82 @Override |
83 public void logError(String msg) { |
83 public void logError(String msg) { |
84 forcedExit.set(true); |
84 forcedExit.set(true); |
85 } |
85 } |
100 } |
100 } |
101 for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(sourcesToCompileFiles)) { |
101 for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(sourcesToCompileFiles)) { |
102 compilationUnits.append(i); |
102 compilationUnits.append(i); |
103 } |
103 } |
104 forcedExit.set(false); |
104 forcedExit.set(false); |
|
105 |
|
106 |
105 // Create a new logger. |
107 // Create a new logger. |
106 StringWriter stdoutLog = new StringWriter(); |
108 StringWriter stdoutLog = new StringWriter(); |
107 StringWriter stderrLog = new StringWriter(); |
109 StringWriter stderrLog = new StringWriter(); |
108 PrintWriter stdout = new PrintWriter(stdoutLog); |
110 PrintWriter stdout = new PrintWriter(stdoutLog); |
109 PrintWriter stderr = new PrintWriter(stderrLog); |
111 PrintWriter stderr = new PrintWriter(stderrLog); |
110 com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK; |
112 com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK; |
|
113 DependencyCollector depsCollector = new DependencyCollector(); |
111 try { |
114 try { |
112 if (compilationUnits.size() > 0) { |
115 if (compilationUnits.size() > 0) { |
113 smartFileManager.setVisibleSources(visibleSources); |
116 smartFileManager.setVisibleSources(visibleSources); |
114 smartFileManager.cleanArtifacts(); |
117 smartFileManager.cleanArtifacts(); |
115 smartFileManager.setLog(stdout); |
118 smartFileManager.setLog(stdout); |
116 |
119 |
117 // Do the compilation! |
120 // Do the compilation! |
118 CompilationTask task = compiler.getTask(stderr, |
121 JavacTaskImpl task = |
119 smartFileManager, |
122 (JavacTaskImpl) compiler.getTask(stderr, |
120 null, |
123 smartFileManager, |
121 Arrays.asList(args), |
124 null, |
122 null, |
125 Arrays.asList(args), |
123 compilationUnits, |
126 null, |
124 context); |
127 compilationUnits, |
|
128 context); |
125 smartFileManager.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file")); |
129 smartFileManager.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file")); |
126 rc = ((JavacTaskImpl) task).doCall(); |
130 task.addTaskListener(depsCollector); |
|
131 rc = task.doCall(); |
127 smartFileManager.flush(); |
132 smartFileManager.flush(); |
128 } |
133 } |
129 } catch (Exception e) { |
134 } catch (Exception e) { |
130 stderrLog.append(e.getMessage()); |
135 stderrLog.append(Util.getStackTrace(e)); |
131 forcedExit.set(true); |
136 forcedExit.set(true); |
132 } |
137 } |
133 |
138 |
134 compilationResult.packageArtifacts = smartFileManager.getPackageArtifacts(); |
139 compilationResult.packageArtifacts = smartFileManager.getPackageArtifacts(); |
135 |
140 |
136 Dependencies deps = Dependencies.instance(context); |
141 Dependencies deps = Dependencies.instance(context); |
|
142 for (PackageSymbol from : depsCollector.getSourcePackages()) { |
|
143 for (PackageSymbol to : depsCollector.getDependenciesForPkg(from)) |
|
144 deps.collect(from.fullname, to.fullname); |
|
145 } |
|
146 |
137 compilationResult.packageDependencies = deps.getDependencies(); |
147 compilationResult.packageDependencies = deps.getDependencies(); |
138 compilationResult.packagePubapis = deps.getPubapis(); |
148 compilationResult.packagePubapis = deps.getPubapis(); |
139 |
149 |
140 compilationResult.stdout = stdoutLog.toString(); |
150 compilationResult.stdout = stdoutLog.toString(); |
141 compilationResult.stderr = stderrLog.toString(); |
151 compilationResult.stderr = stderrLog.toString(); |