diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleDescription.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleDescription.java index f28bd6ac662..f92dce5b5ab 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleDescription.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleDescription.java @@ -29,6 +29,9 @@ public interface ModuleDescription { @NotNull String getModuleName(); + @NotNull + String getOutputDir(); + @NotNull List getSourceFiles(); @@ -41,6 +44,7 @@ public interface ModuleDescription { class Impl implements ModuleDescription { private String name; + private String outputDir; private final List sources = new SmartList(); private final List classpath = new SmartList(); private final List annotations = new SmartList(); @@ -49,6 +53,10 @@ public interface ModuleDescription { this.name = name; } + public void setOutputDir(String outputDir) { + this.outputDir = outputDir; + } + public void addSourcePath(String path) { sources.add(path); } @@ -67,6 +75,12 @@ public interface ModuleDescription { return name; } + @NotNull + @Override + public String getOutputDir() { + return outputDir; + } + @NotNull @Override public List getSourceFiles() { @@ -87,7 +101,11 @@ public interface ModuleDescription { @Override public String toString() { - return name + "\n\tsources=" + sources + "\n\tclasspath=" + classpath + "\n\tannotations=" + annotations; + return name + + "\n\toutputDir=" + outputDir + + "\n\tsources=" + sources + + "\n\tclasspath=" + classpath + + "\n\tannotations=" + annotations; } } } diff --git a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleXmlParser.java b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleXmlParser.java index 0ce0e521768..adfa1a0fbd8 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleXmlParser.java +++ b/compiler/cli/cli-common/src/org/jetbrains/jet/cli/common/modules/ModuleXmlParser.java @@ -39,6 +39,7 @@ public class ModuleXmlParser { public static final String MODULES = "modules"; public static final String MODULE = "module"; public static final String NAME = "name"; + public static final String OUTPUT_DIR = "outputDir"; public static final String SOURCES = "sources"; public static final String PATH = "path"; public static final String CLASSPATH = "classpath"; @@ -116,7 +117,7 @@ public class ModuleXmlParser { throw createError(qName); } - setCurrentState(new InsideModule(getAttribute(attributes, NAME, qName))); + setCurrentState(new InsideModule(getAttribute(attributes, NAME, qName), getAttribute(attributes, OUTPUT_DIR, qName))); } @Override @@ -130,9 +131,10 @@ public class ModuleXmlParser { private class InsideModule extends DefaultHandler { private final ModuleDescription.Impl moduleDescription; - private InsideModule(String name) { + private InsideModule(String name, String outputDir) { this.moduleDescription = new ModuleDescription.Impl(); this.moduleDescription.setName(name); + this.moduleDescription.setOutputDir(outputDir); result.add(moduleDescription); } diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java index 64636be3c0d..68d0c4339b2 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/CompileEnvironmentUtil.java @@ -267,6 +267,11 @@ public class CompileEnvironmentUtil { return description.getModuleName(); } + @Override + public String getOutputDirectory() { + return description.getOutputDir(); + } + @Override public List getSourceFiles() { return description.getSourceFiles(); diff --git a/compiler/testData/compiler/smoke/Smoke.kts b/compiler/testData/compiler/smoke/Smoke.kts index 179d700646e..bf9aea6b44c 100644 --- a/compiler/testData/compiler/smoke/Smoke.kts +++ b/compiler/testData/compiler/smoke/Smoke.kts @@ -1,7 +1,7 @@ import kotlin.modules.* fun project() { - module("smoke") { + module("smoke", ".") { sources += "Smoke.kt" } } diff --git a/compiler/testData/modules.xml/allOnce.txt b/compiler/testData/modules.xml/allOnce.txt index eff45bdf1a6..231963fc373 100644 --- a/compiler/testData/modules.xml/allOnce.txt +++ b/compiler/testData/modules.xml/allOnce.txt @@ -1,4 +1,5 @@ name + outputDir=out sources=[foo] classpath=[bar] annotations=[baz] diff --git a/compiler/testData/modules.xml/allOnce.xml b/compiler/testData/modules.xml/allOnce.xml index c6aa8435b6b..b6a96ba2299 100644 --- a/compiler/testData/modules.xml/allOnce.xml +++ b/compiler/testData/modules.xml/allOnce.xml @@ -1,5 +1,5 @@ - + diff --git a/compiler/testData/modules.xml/comments.txt b/compiler/testData/modules.xml/comments.txt index c787f635a11..f4b4c196ffd 100644 --- a/compiler/testData/modules.xml/comments.txt +++ b/compiler/testData/modules.xml/comments.txt @@ -1,4 +1,5 @@ name + outputDir=out sources=[foo, foo1, foo2] classpath=[bar1, bar2] annotations=[baz, baz1, baz2] diff --git a/compiler/testData/modules.xml/comments.xml b/compiler/testData/modules.xml/comments.xml index 3d40d4ebd58..22fb6f6fe59 100644 --- a/compiler/testData/modules.xml/comments.xml +++ b/compiler/testData/modules.xml/comments.xml @@ -1,5 +1,5 @@ - + diff --git a/compiler/testData/modules.xml/emptyModule.txt b/compiler/testData/modules.xml/emptyModule.txt index d8a25da9ed9..b4f8d590376 100644 --- a/compiler/testData/modules.xml/emptyModule.txt +++ b/compiler/testData/modules.xml/emptyModule.txt @@ -1,4 +1,5 @@ name + outputDir=out sources=[] classpath=[] annotations=[] diff --git a/compiler/testData/modules.xml/emptyModule.xml b/compiler/testData/modules.xml/emptyModule.xml index a6f8c3f8f61..b51b8c22e89 100644 --- a/compiler/testData/modules.xml/emptyModule.xml +++ b/compiler/testData/modules.xml/emptyModule.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/compiler/testData/modules.xml/manyTimes.txt b/compiler/testData/modules.xml/manyTimes.txt index 095cbf36f71..1ef4faf3440 100644 --- a/compiler/testData/modules.xml/manyTimes.txt +++ b/compiler/testData/modules.xml/manyTimes.txt @@ -1,4 +1,5 @@ name + outputDir=out sources=[foo, foo1, foo2] classpath=[bar, bar1, bar2] annotations=[baz, baz1, baz2] diff --git a/compiler/testData/modules.xml/manyTimes.xml b/compiler/testData/modules.xml/manyTimes.xml index 551691dad0b..833c18fb775 100644 --- a/compiler/testData/modules.xml/manyTimes.xml +++ b/compiler/testData/modules.xml/manyTimes.xml @@ -1,5 +1,5 @@ - + diff --git a/compiler/testData/modules.xml/onlySources.txt b/compiler/testData/modules.xml/onlySources.txt index 14fe55ba9c6..f1d54734816 100644 --- a/compiler/testData/modules.xml/onlySources.txt +++ b/compiler/testData/modules.xml/onlySources.txt @@ -1,4 +1,5 @@ name + outputDir=out sources=[foo] classpath=[] annotations=[] diff --git a/compiler/testData/modules.xml/onlySources.xml b/compiler/testData/modules.xml/onlySources.xml index 7b205f3bfa7..4ebe1df47c8 100644 --- a/compiler/testData/modules.xml/onlySources.xml +++ b/compiler/testData/modules.xml/onlySources.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/compiler/testData/modules.xml/twoModules.txt b/compiler/testData/modules.xml/twoModules.txt index 01635bfa581..0fa9e2cfff3 100644 --- a/compiler/testData/modules.xml/twoModules.txt +++ b/compiler/testData/modules.xml/twoModules.txt @@ -1,8 +1,10 @@ name + outputDir=out sources=[foo, foo1, foo2] classpath=[bar, bar1, bar2] annotations=[baz, baz1, baz2] name2 + outputDir=out2 sources=[2foo, 2foo1, 2foo2] classpath=[2bar, 2bar1, 2bar2] annotations=[2baz, 2baz1, 2baz2] diff --git a/compiler/testData/modules.xml/twoModules.xml b/compiler/testData/modules.xml/twoModules.xml index 1e905696ccd..9b23938c5f4 100644 --- a/compiler/testData/modules.xml/twoModules.xml +++ b/compiler/testData/modules.xml/twoModules.xml @@ -1,5 +1,5 @@ - + @@ -10,7 +10,7 @@ - + diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java index f50b50a13a6..7119ce9a452 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleDescriptionGenerator.java @@ -26,6 +26,7 @@ import java.util.Set; public interface KotlinModuleDescriptionGenerator { CharSequence generateModuleScript( String moduleName, + String outputDir, DependencyProvider dependencyProvider, List sourceFiles, boolean tests, diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java index 0af46da7aa1..be7fcfec1ef 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleScriptGenerator.java @@ -34,7 +34,7 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener @Override public CharSequence generateModuleScript( String moduleName, - DependencyProvider dependencyProvider, + String outputDir, DependencyProvider dependencyProvider, List sourceFiles, boolean tests, final Set directoriesToFilterOut @@ -50,7 +50,7 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener script.append("import kotlin.modules.*\n"); script.append("fun project() {\n"); - script.append(" module(\"" + moduleName + "\") {\n"); + script.append(" module(\"" + moduleName + "\", outputDir = \"" + toSystemIndependentName(outputDir) + "\") {\n"); for (File sourceFile : sourceFiles) { script.append(" sources += \"" + toSystemIndependentName(sourceFile.getPath()) + "\"\n"); diff --git a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java index 35515414340..5f9dec940f7 100644 --- a/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java +++ b/ide-compiler-runner/src/org/jetbrains/jet/compiler/runner/KotlinModuleXmlGenerator.java @@ -37,7 +37,7 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato @Override public CharSequence generateModuleScript( String moduleName, - DependencyProvider dependencyProvider, + String outputDir, DependencyProvider dependencyProvider, List sourceFiles, boolean tests, final Set directoriesToFilterOut @@ -54,7 +54,9 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato p.println(""); } - p.println("<", MODULE, " ", NAME, "=\"", escapeXml(moduleName), "\">"); + p.println("<", MODULE, " ", + NAME, "=\"", escapeXml(moduleName), "\" ", + OUTPUT_DIR, "=\"", getEscapedPath(new File(outputDir)), "\">"); p.pushIndent(); for (File sourceFile : sourceFiles) { diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java index 9bf2dbc44ee..a4e0d3f049d 100644 --- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java +++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java @@ -159,6 +159,7 @@ public class JetCompiler implements TranslatingCompiler { } CharSequence script = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript( moduleName, + moduleOutputDirectory.getAbsolutePath(), getDependencyProvider(chunk, tests, mainOutput), sourceFiles, tests, diff --git a/idea/testData/modules.xml/basic.xml b/idea/testData/modules.xml/basic.xml index b44ef43d69f..340cb84d589 100644 --- a/idea/testData/modules.xml/basic.xml +++ b/idea/testData/modules.xml/basic.xml @@ -1,6 +1,6 @@ - + diff --git a/idea/testData/modules.xml/filtered.xml b/idea/testData/modules.xml/filtered.xml index 9c16c84f538..e7ed7eb1982 100644 --- a/idea/testData/modules.xml/filtered.xml +++ b/idea/testData/modules.xml/filtered.xml @@ -1,6 +1,6 @@ - + diff --git a/idea/tests/org/jetbrains/jet/modules/xml/KotlinModuleXmlGeneratorTest.java b/idea/tests/org/jetbrains/jet/modules/xml/KotlinModuleXmlGeneratorTest.java index 03f528a2bb3..d6c9d76d871 100644 --- a/idea/tests/org/jetbrains/jet/modules/xml/KotlinModuleXmlGeneratorTest.java +++ b/idea/tests/org/jetbrains/jet/modules/xml/KotlinModuleXmlGeneratorTest.java @@ -31,6 +31,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { public void testBasic() throws Exception { String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript( "name", + "output", new KotlinModuleDescriptionGenerator.DependencyProvider() { @Override public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) { @@ -40,8 +41,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { }, Arrays.asList(new File("s1"), new File("s2")), false, - Collections.emptySet() - ).toString(); + Collections.emptySet()).toString(); String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/basic.xml")); UsefulTestCase.assertSameLines(expected, actual); } @@ -49,6 +49,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { public void testFiltered() throws Exception { String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript( "name", + "output", new KotlinModuleDescriptionGenerator.DependencyProvider() { @Override public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) { @@ -58,8 +59,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase { }, Arrays.asList(new File("s1"), new File("s2")), false, - Collections.singleton(new File("cp1")) - ).toString(); + Collections.singleton(new File("cp1"))).toString(); String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/filtered.xml")); UsefulTestCase.assertSameLines(expected, actual); } diff --git a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java index f5da7b33997..810fbe7633b 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java +++ b/jps-plugin/src/org/jetbrains/jet/jps/build/KotlinBuilderModuleScriptGenerator.java @@ -52,16 +52,22 @@ public class KotlinBuilderModuleScriptGenerator { public static File generateModuleDescription(CompileContext context, ModuleBuildTarget target, List sourceFiles) throws IOException { + File outputDir = target.getOutputDir(); + if (outputDir == null) { + throw new IllegalStateException("No output directory found for " + target); + + } CharSequence moduleScriptText = GENERATOR.generateModuleScript( target.getId(), + outputDir.getAbsolutePath(), getKotlinModuleDependencies(context, target), sourceFiles, target.isTests(), // this excludes the output directory from the class path, to be removed for true incremental compilation - Collections.singleton(target.getOutputDir()) + Collections.singleton(outputDir) ); - File scriptFile = new File(target.getOutputDir(), "script." + GENERATOR.getFileExtension()); + File scriptFile = new File(outputDir, "script." + GENERATOR.getFileExtension()); writeScriptToFile(context, moduleScriptText, scriptFile); diff --git a/libraries/stdlib/src/kotlin/modules/ModuleBuilder.kt b/libraries/stdlib/src/kotlin/modules/ModuleBuilder.kt index 7c3032251d2..53c3021718d 100644 --- a/libraries/stdlib/src/kotlin/modules/ModuleBuilder.kt +++ b/libraries/stdlib/src/kotlin/modules/ModuleBuilder.kt @@ -3,8 +3,8 @@ package kotlin.modules import java.util.* import jet.modules.* -public fun module(name: String, callback: ModuleBuilder.() -> Unit) { - val builder = ModuleBuilder(name) +public fun module(name: String, outputDir: String, callback: ModuleBuilder.() -> Unit) { + val builder = ModuleBuilder(name, outputDir) builder.callback() AllModules.modules.get()?.add(builder) } @@ -27,7 +27,7 @@ class AnnotationsPathBuilder(val parent: ModuleBuilder) { } } -open class ModuleBuilder(val name: String): Module { +open class ModuleBuilder(val name: String, val outputDir: String): Module { // http://youtrack.jetbrains.net/issue/KT-904 private val sourceFiles0 = ArrayList() private val classpathRoots0 = ArrayList() @@ -54,6 +54,7 @@ open class ModuleBuilder(val name: String): Module { annotationsRoots0.add(name) } + public override fun getOutputDirectory(): String = outputDir public override fun getSourceFiles(): List = sourceFiles0 public override fun getClasspathRoots(): List = classpathRoots0 public override fun getAnnotationsRoots(): List = annotationsRoots0 diff --git a/runtime/src/jet/modules/Module.java b/runtime/src/jet/modules/Module.java index 96ab0cf85a0..257888f3a40 100644 --- a/runtime/src/jet/modules/Module.java +++ b/runtime/src/jet/modules/Module.java @@ -24,6 +24,9 @@ public interface Module { @KotlinSignature("fun getModuleName(): String") String getModuleName(); + @KotlinSignature("fun getOutputDirectory(): String") + String getOutputDirectory(); + @KotlinSignature("fun getSourceFiles(): List") List getSourceFiles();