diff --git a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleDescriptionBuilder.java b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleDescriptionBuilder.java index f203d81809d..43722755430 100644 --- a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleDescriptionBuilder.java +++ b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleDescriptionBuilder.java @@ -25,21 +25,13 @@ public interface KotlinModuleDescriptionBuilder { KotlinModuleDescriptionBuilder addModule( String moduleName, String outputDir, - DependencyProvider dependencyProvider, List sourceFiles, List javaSourceRoots, + Collection classpathRoots, + List annotationRoots, boolean tests, Set directoriesToFilterOut ); CharSequence asText(); - - interface DependencyProvider { - void processClassPath(DependencyProcessor processor); - } - - interface DependencyProcessor { - void processClassPathSection(String sectionDescription, Collection files); - void processAnnotationRoots(List files); - } } diff --git a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleScriptBuilderFactory.java b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleScriptBuilderFactory.java index d7d48e07964..83b5ef59715 100644 --- a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleScriptBuilderFactory.java +++ b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleScriptBuilderFactory.java @@ -54,11 +54,12 @@ public class KotlinModuleScriptBuilderFactory implements KotlinModuleDescription public KotlinModuleDescriptionBuilder addModule( String moduleName, String outputDir, - DependencyProvider dependencyProvider, List sourceFiles, List javaSourceRoots, + Collection classpathRoots, + List annotationRoots, boolean tests, - final Set directoriesToFilterOut + Set directoriesToFilterOut ) { assert !done : "Already done"; @@ -75,41 +76,42 @@ public class KotlinModuleScriptBuilderFactory implements KotlinModuleDescription script.append(" sources += \"" + toSystemIndependentName(sourceFile.getPath()) + "\"\n"); } - DependencyProcessor processor = new DependencyProcessor() { - @Override - public void processClassPathSection(@NotNull String sectionDescription, @NotNull Collection files) { - script.append(" // " + sectionDescription + "\n"); - for (File file : files) { - if (directoriesToFilterOut.contains(file)) { - // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies - // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was - // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. - script.append(" // Output directory, commented out\n"); - script.append(" // "); - } - script.append(" classpath += \"" + toSystemIndependentName(file.getPath()) + "\"\n"); - } - } - - @Override - public void processAnnotationRoots(@NotNull List files) { - script.append(" // External annotations\n"); - for (File file : files) { - script.append(" annotationsPath += \"").append(toSystemIndependentName(file.getPath())).append("\"\n"); - } - } - }; - if (!javaSourceRoots.isEmpty()) { - processor.processClassPathSection("Java source roots", javaSourceRoots); + processClassPathSection("Java source roots", javaSourceRoots, directoriesToFilterOut); } - dependencyProvider.processClassPath(processor); + processClassPathSection("Classpath", classpathRoots, directoriesToFilterOut); + processAnnotationRoots(annotationRoots); script.append(" }\n"); return this; } + private void processClassPathSection( + @NotNull String sectionDescription, + @NotNull Collection files, + @NotNull Set directoriesToFilterOut + ) { + script.append(" // " + sectionDescription + "\n"); + for (File file : files) { + if (directoriesToFilterOut.contains(file)) { + // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies + // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was + // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. + script.append(" // Output directory, commented out\n"); + script.append(" // "); + } + script.append(" classpath += \"" + toSystemIndependentName(file.getPath()) + "\"\n"); + } + } + + private void processAnnotationRoots(@NotNull List files) { + script.append(" // External annotations\n"); + for (File file : files) { + script.append(" annotationsPath += \"").append(toSystemIndependentName(file.getPath())).append("\"\n"); + } + } + @Override public CharSequence asText() { if (!done) { @@ -120,5 +122,4 @@ public class KotlinModuleScriptBuilderFactory implements KotlinModuleDescription return script; } } - } diff --git a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilderFactory.java b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilderFactory.java index d11932c85a4..8ecbca258c3 100644 --- a/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilderFactory.java +++ b/ide-compiler-runner/src/org/jetbrains/kotlin/modules/KotlinModuleXmlBuilderFactory.java @@ -58,11 +58,12 @@ public class KotlinModuleXmlBuilderFactory implements KotlinModuleDescriptionBui public KotlinModuleDescriptionBuilder addModule( String moduleName, String outputDir, - DependencyProvider dependencyProvider, List sourceFiles, List javaSourceRoots, + Collection classpathRoots, + List annotationRoots, boolean tests, - final Set directoriesToFilterOut + Set directoriesToFilterOut ) { assert !done : "Already done"; @@ -83,49 +84,50 @@ public class KotlinModuleXmlBuilderFactory implements KotlinModuleDescriptionBui p.println("<", SOURCES, " ", PATH, "=\"", getEscapedPath(sourceFile), "\"/>"); } - DependencyProcessor processor = new DependencyProcessor() { - @Override - public void processClassPathSection(@NotNull String sectionDescription, @NotNull Collection files) { - p.println(""); - for (File file : files) { - boolean isOutput = directoriesToFilterOut.contains(file) && !IncrementalCompilation.ENABLED; - if (isOutput) { - // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies - // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was - // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. - p.println(""); - p.println(""); - } - } - } - - @Override - public void processAnnotationRoots(@NotNull List files) { - p.println(""); - for (File file : files) { - p.println("<", EXTERNAL_ANNOTATIONS, " ", PATH, "=\"", getEscapedPath(file), "\"/>"); - } - } - }; - if (!javaSourceRoots.isEmpty()) { - processor.processClassPathSection("Java source roots", javaSourceRoots); + processClassPathSection("Java source roots", javaSourceRoots, directoriesToFilterOut); } - dependencyProvider.processClassPath(processor); + processClassPathSection("Classpath", classpathRoots, directoriesToFilterOut); + processAnnotationRoots(annotationRoots); closeTag(p, MODULE); return this; } + private void processClassPathSection( + @NotNull String sectionDescription, + @NotNull Collection files, + @NotNull Set directoriesToFilterOut + ) { + p.println(""); + for (File file : files) { + boolean isOutput = directoriesToFilterOut.contains(file) && !IncrementalCompilation.ENABLED; + if (isOutput) { + // For IDEA's make (incremental compilation) purposes, output directories of the current module and its dependencies + // appear on the class path, so we are at risk of seeing the results of the previous build, i.e. if some class was + // removed in the sources, it may still be there in binaries. Thus, we delete these entries from the classpath. + p.println(""); + p.println(""); + } + } + } + + private void processAnnotationRoots(@NotNull List files) { + p.println(""); + for (File file : files) { + p.println("<", EXTERNAL_ANNOTATIONS, " ", PATH, "=\"", getEscapedPath(file), "\"/>"); + } + } + @Override public CharSequence asText() { if (!done) { diff --git a/idea/testData/modules.xml/basic.xml b/idea/testData/modules.xml/basic.xml index fff49604ea7..7b38256c6be 100644 --- a/idea/testData/modules.xml/basic.xml +++ b/idea/testData/modules.xml/basic.xml @@ -5,11 +5,11 @@ + + + - - - diff --git a/idea/testData/modules.xml/filtered.xml b/idea/testData/modules.xml/filtered.xml index 945d7da1c80..b13cdf5ac5d 100644 --- a/idea/testData/modules.xml/filtered.xml +++ b/idea/testData/modules.xml/filtered.xml @@ -3,14 +3,14 @@ - - - - + + + + diff --git a/idea/testData/modules.xml/multiple.xml b/idea/testData/modules.xml/multiple.xml index 1d7462d9989..3aa41ad0923 100644 --- a/idea/testData/modules.xml/multiple.xml +++ b/idea/testData/modules.xml/multiple.xml @@ -3,28 +3,28 @@ - - - - + + + + - - - - + + + + diff --git a/idea/tests/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java b/idea/tests/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java index c5045949787..e024e504827 100644 --- a/idea/tests/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java +++ b/idea/tests/org/jetbrains/kotlin/modules/KotlinModuleXmlGeneratorTest.java @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.modules; import junit.framework.TestCase; -import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.test.JetTestUtils; import java.io.File; @@ -29,15 +28,10 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { String actual = KotlinModuleXmlBuilderFactory.INSTANCE.create().addModule( "name", "output", - new KotlinModuleDescriptionBuilder.DependencyProvider() { - @Override - public void processClassPath(@NotNull KotlinModuleDescriptionBuilder.DependencyProcessor processor) { - processor.processAnnotationRoots(Arrays.asList(new File("a1/f1"), new File("a2"))); - processor.processClassPathSection("s1", Arrays.asList(new File("cp1"), new File("cp2"))); - } - }, Arrays.asList(new File("s1"), new File("s2")), Collections.singletonList(new File("java")), + Arrays.asList(new File("cp1"), new File("cp2")), + Arrays.asList(new File("a1/f1"), new File("a2")), false, Collections.emptySet() ).asText().toString(); @@ -48,15 +42,10 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { String actual = KotlinModuleXmlBuilderFactory.INSTANCE.create().addModule( "name", "output", - new KotlinModuleDescriptionBuilder.DependencyProvider() { - @Override - public void processClassPath(@NotNull KotlinModuleDescriptionBuilder.DependencyProcessor processor) { - processor.processAnnotationRoots(Arrays.asList(new File("a1/f1"), new File("a2"))); - processor.processClassPathSection("s1", Arrays.asList(new File("cp1"), new File("cp2"))); - } - }, Arrays.asList(new File("s1"), new File("s2")), Collections.emptyList(), + Arrays.asList(new File("cp1"), new File("cp2")), + Arrays.asList(new File("a1/f1"), new File("a2")), false, Collections.singleton(new File("cp1")) ).asText().toString(); @@ -68,30 +57,20 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { builder.addModule( "name", "output", - new KotlinModuleDescriptionBuilder.DependencyProvider() { - @Override - public void processClassPath(@NotNull KotlinModuleDescriptionBuilder.DependencyProcessor processor) { - processor.processAnnotationRoots(Arrays.asList(new File("a1/f1"), new File("a2"))); - processor.processClassPathSection("s1", Arrays.asList(new File("cp1"), new File("cp2"))); - } - }, Arrays.asList(new File("s1"), new File("s2")), Collections.emptyList(), + Arrays.asList(new File("cp1"), new File("cp2")), + Arrays.asList(new File("a1/f1"), new File("a2")), false, Collections.singleton(new File("cp1")) ); builder.addModule( "name2", "output2", - new KotlinModuleDescriptionBuilder.DependencyProvider() { - @Override - public void processClassPath(@NotNull KotlinModuleDescriptionBuilder.DependencyProcessor processor) { - processor.processAnnotationRoots(Arrays.asList(new File("a12/f12"), new File("a22"))); - processor.processClassPathSection("s12", Arrays.asList(new File("cp12"), new File("cp22"))); - } - }, Arrays.asList(new File("s12"), new File("s22")), Collections.emptyList(), + Arrays.asList(new File("cp12"), new File("cp22")), + Arrays.asList(new File("a12/f12"), new File("a22")), true, Collections.singleton(new File("cp12")) ); diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.java index 46b8b5828f5..de324ea1d05 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -47,8 +47,6 @@ import java.io.IOException; import java.util.*; import static org.jetbrains.kotlin.jps.build.JpsUtils.getAllDependencies; -import static org.jetbrains.kotlin.modules.KotlinModuleDescriptionBuilder.DependencyProcessor; -import static org.jetbrains.kotlin.modules.KotlinModuleDescriptionBuilder.DependencyProvider; public class KotlinBuilderModuleScriptGenerator { @@ -89,9 +87,10 @@ public class KotlinBuilderModuleScriptGenerator { builder.addModule( target.getId(), outputDir.getAbsolutePath(), - getKotlinModuleDependencies(target), moduleSources, findSourceRoots(context, target), + findClassPathRoots(target), + findAnnotationRoots(target), target.isTests(), // this excludes the output directories from the class path, to be removed for true incremental compilation outputDirs @@ -116,16 +115,6 @@ public class KotlinBuilderModuleScriptGenerator { return outputDir; } - private static DependencyProvider getKotlinModuleDependencies(final ModuleBuildTarget target) { - return new DependencyProvider() { - @Override - public void processClassPath(@NotNull DependencyProcessor processor) { - processor.processClassPathSection("Classpath", findClassPathRoots(target)); - processor.processAnnotationRoots(findAnnotationRoots(target)); - } - }; - } - @NotNull private static Collection findClassPathRoots(@NotNull ModuleBuildTarget target) { return getAllDependencies(target).classes().getRoots();