8015145: Smartjavac needs more flexibility with linking to sources
Reviewed-by: jjg, ohrstrom
--- a/langtools/src/share/classes/com/sun/tools/sjavac/JavacState.java Wed Aug 14 21:44:51 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/JavacState.java Thu Aug 15 17:24:35 2013 +0200
@@ -808,7 +808,10 @@
// Create a set of filenames with full paths.
for (Source s : now.sources().values()) {
- calculatedSources.add(s.file().getPath());
+ // Don't include link only sources when comparing sources to compile
+ if (!s.isLinkedOnly()) {
+ calculatedSources.add(s.file().getPath());
+ }
}
// Read in the file and create another set of filenames with full paths.
try {
--- a/langtools/src/share/classes/com/sun/tools/sjavac/Main.java Wed Aug 14 21:44:51 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/Main.java Thu Aug 15 17:24:35 2013 +0200
@@ -249,16 +249,19 @@
return -1;
}
- // Find all source files allowable for linking.
+ // Create a map of all source files that are available for linking. Both -src and
+ // -sourcepath point to such files. It is possible to specify multiple
+ // -sourcepath options to enable different filtering rules. If the
+ // filters are the same for multiple sourcepaths, they may be concatenated
+ // using :(;). Before sending the list of sourcepaths to javac, they are
+ // all concatenated. The list created here is used by the SmartFileWrapper to
+ // make sure only the correct sources are actually available.
// We might find more modules here as well.
Map<String,Source> sources_to_link_to = new HashMap<String,Source>();
- // Always reuse -src for linking as well! This means that we might
- // get two -sourcepath on the commandline after the rewrite, which is
- // fine. We can have as many as we like. You need to have separate -src/-sourcepath/-classpath
- // if you need different filtering rules for different roots. If you have the same filtering
- // rules for all sourcepath roots, you can concatenate them using :(;) as before.
- rewriteOptions(args, "-src", "-sourcepath");
+ findFiles(args, "-src", Util.set(".java"), sources_to_link_to, modules, current_module, true);
findFiles(args, "-sourcepath", Util.set(".java"), sources_to_link_to, modules, current_module, true);
+ // Rewrite the -src option to make it through to the javac instances.
+ rewriteOptions(args, "-src", "-sourcepath");
// Find all class files allowable for linking.
// And pickup knowledge of all modules found here.
--- a/langtools/test/tools/sjavac/SJavac.java Wed Aug 14 21:44:51 2013 -0700
+++ b/langtools/test/tools/sjavac/SJavac.java Thu Aug 15 17:24:35 2013 +0200
@@ -21,6 +21,11 @@
* questions.
*/
+/*
+ * @test
+ * @summary Tests sjavac basic functionality
+ */
+
import java.util.*;
import java.io.*;
import java.net.*;
@@ -82,11 +87,13 @@
compileWithOverrideSource();
compileWithInvisibleSources();
compileCircularSources();
+ compileExcludingDependency();
delete(gensrc);
delete(gensrc2);
delete(gensrc3);
delete(bin);
+ delete(headers);
}
void initialCompile() throws Exception {
@@ -381,6 +388,33 @@
delete(bin);
}
+ /**
+ * Tests compiling class A that depends on class B without compiling class B
+ * @throws Exception If test fails
+ */
+ void compileExcludingDependency() throws Exception {
+ System.out.println("\nVerify that excluding classes from compilation but not from linking works.");
+ System.out.println("---------------------------------------------------------------------------");
+
+ delete(gensrc);
+ delete(bin);
+ previous_bin_state = collectState(bin);
+
+ populate(gensrc,
+ "alfa/A.java",
+ "package alfa; public class A { beta.B b; }",
+ "beta/B.java",
+ "package beta; public class B { }");
+
+ compile("-x", "beta", "-src", "gensrc", "-x", "alfa", "-sourcepath", "gensrc",
+ "-d", "bin", "--server:portfile=testserver,background=false");
+
+ Map<String,Long> new_bin_state = collectState(bin);
+ verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
+ "bin/alfa/A.class",
+ "bin/javac_state");
+ }
+
void removeFrom(Path dir, String... args) throws IOException {
for (String filename : args) {
Path p = dir.resolve(filename);
@@ -405,7 +439,7 @@
}
}
- void delete(Path root) throws IOException {
+ void delete(final Path root) throws IOException {
if (!Files.exists(root)) return;
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
@Override