Each module carries its output directory

This commit is contained in:
Andrey Breslav
2013-10-09 18:26:54 +04:00
parent 4d482f2f14
commit d4a89d04d7
26 changed files with 72 additions and 26 deletions
@@ -29,6 +29,9 @@ public interface ModuleDescription {
@NotNull @NotNull
String getModuleName(); String getModuleName();
@NotNull
String getOutputDir();
@NotNull @NotNull
List<String> getSourceFiles(); List<String> getSourceFiles();
@@ -41,6 +44,7 @@ public interface ModuleDescription {
class Impl implements ModuleDescription { class Impl implements ModuleDescription {
private String name; private String name;
private String outputDir;
private final List<String> sources = new SmartList<String>(); private final List<String> sources = new SmartList<String>();
private final List<String> classpath = new SmartList<String>(); private final List<String> classpath = new SmartList<String>();
private final List<String> annotations = new SmartList<String>(); private final List<String> annotations = new SmartList<String>();
@@ -49,6 +53,10 @@ public interface ModuleDescription {
this.name = name; this.name = name;
} }
public void setOutputDir(String outputDir) {
this.outputDir = outputDir;
}
public void addSourcePath(String path) { public void addSourcePath(String path) {
sources.add(path); sources.add(path);
} }
@@ -67,6 +75,12 @@ public interface ModuleDescription {
return name; return name;
} }
@NotNull
@Override
public String getOutputDir() {
return outputDir;
}
@NotNull @NotNull
@Override @Override
public List<String> getSourceFiles() { public List<String> getSourceFiles() {
@@ -87,7 +101,11 @@ public interface ModuleDescription {
@Override @Override
public String toString() { 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;
} }
} }
} }
@@ -39,6 +39,7 @@ public class ModuleXmlParser {
public static final String MODULES = "modules"; public static final String MODULES = "modules";
public static final String MODULE = "module"; public static final String MODULE = "module";
public static final String NAME = "name"; public static final String NAME = "name";
public static final String OUTPUT_DIR = "outputDir";
public static final String SOURCES = "sources"; public static final String SOURCES = "sources";
public static final String PATH = "path"; public static final String PATH = "path";
public static final String CLASSPATH = "classpath"; public static final String CLASSPATH = "classpath";
@@ -116,7 +117,7 @@ public class ModuleXmlParser {
throw createError(qName); throw createError(qName);
} }
setCurrentState(new InsideModule(getAttribute(attributes, NAME, qName))); setCurrentState(new InsideModule(getAttribute(attributes, NAME, qName), getAttribute(attributes, OUTPUT_DIR, qName)));
} }
@Override @Override
@@ -130,9 +131,10 @@ public class ModuleXmlParser {
private class InsideModule extends DefaultHandler { private class InsideModule extends DefaultHandler {
private final ModuleDescription.Impl moduleDescription; private final ModuleDescription.Impl moduleDescription;
private InsideModule(String name) { private InsideModule(String name, String outputDir) {
this.moduleDescription = new ModuleDescription.Impl(); this.moduleDescription = new ModuleDescription.Impl();
this.moduleDescription.setName(name); this.moduleDescription.setName(name);
this.moduleDescription.setOutputDir(outputDir);
result.add(moduleDescription); result.add(moduleDescription);
} }
@@ -267,6 +267,11 @@ public class CompileEnvironmentUtil {
return description.getModuleName(); return description.getModuleName();
} }
@Override
public String getOutputDirectory() {
return description.getOutputDir();
}
@Override @Override
public List<String> getSourceFiles() { public List<String> getSourceFiles() {
return description.getSourceFiles(); return description.getSourceFiles();
+1 -1
View File
@@ -1,7 +1,7 @@
import kotlin.modules.* import kotlin.modules.*
fun project() { fun project() {
module("smoke") { module("smoke", ".") {
sources += "Smoke.kt" sources += "Smoke.kt"
} }
} }
@@ -1,4 +1,5 @@
name name
outputDir=out
sources=[foo] sources=[foo]
classpath=[bar] classpath=[bar]
annotations=[baz] annotations=[baz]
+1 -1
View File
@@ -1,5 +1,5 @@
<modules> <modules>
<module name="name"> <module name="name" outputDir="out">
<sources path="foo"/> <sources path="foo"/>
<classpath path="bar"/> <classpath path="bar"/>
<externalAnnotations path="baz"/> <externalAnnotations path="baz"/>
@@ -1,4 +1,5 @@
name name
outputDir=out
sources=[foo, foo1, foo2] sources=[foo, foo1, foo2]
classpath=[bar1, bar2] classpath=[bar1, bar2]
annotations=[baz, baz1, baz2] annotations=[baz, baz1, baz2]
+1 -1
View File
@@ -1,5 +1,5 @@
<modules> <modules>
<module name="name"> <module name="name" outputDir="out">
<sources path="foo"/> <sources path="foo"/>
<sources path="foo1"/> <sources path="foo1"/>
<sources path="foo2"/> <sources path="foo2"/>
@@ -1,4 +1,5 @@
name name
outputDir=out
sources=[] sources=[]
classpath=[] classpath=[]
annotations=[] annotations=[]
@@ -1,3 +1,3 @@
<modules> <modules>
<module name="name"/> <module name="name" outputDir="out"/>
</modules> </modules>
@@ -1,4 +1,5 @@
name name
outputDir=out
sources=[foo, foo1, foo2] sources=[foo, foo1, foo2]
classpath=[bar, bar1, bar2] classpath=[bar, bar1, bar2]
annotations=[baz, baz1, baz2] annotations=[baz, baz1, baz2]
+1 -1
View File
@@ -1,5 +1,5 @@
<modules> <modules>
<module name="name"> <module name="name" outputDir="out">
<sources path="foo"/> <sources path="foo"/>
<sources path="foo1"/> <sources path="foo1"/>
<sources path="foo2"/> <sources path="foo2"/>
@@ -1,4 +1,5 @@
name name
outputDir=out
sources=[foo] sources=[foo]
classpath=[] classpath=[]
annotations=[] annotations=[]
@@ -1,5 +1,5 @@
<modules> <modules>
<module name="name"> <module name="name" outputDir="out">
<sources path="foo"/> <sources path="foo"/>
</module> </module>
</modules> </modules>
@@ -1,8 +1,10 @@
name name
outputDir=out
sources=[foo, foo1, foo2] sources=[foo, foo1, foo2]
classpath=[bar, bar1, bar2] classpath=[bar, bar1, bar2]
annotations=[baz, baz1, baz2] annotations=[baz, baz1, baz2]
name2 name2
outputDir=out2
sources=[2foo, 2foo1, 2foo2] sources=[2foo, 2foo1, 2foo2]
classpath=[2bar, 2bar1, 2bar2] classpath=[2bar, 2bar1, 2bar2]
annotations=[2baz, 2baz1, 2baz2] annotations=[2baz, 2baz1, 2baz2]
+2 -2
View File
@@ -1,5 +1,5 @@
<modules> <modules>
<module name="name"> <module name="name" outputDir="out">
<sources path="foo"/> <sources path="foo"/>
<sources path="foo1"/> <sources path="foo1"/>
<sources path="foo2"/> <sources path="foo2"/>
@@ -10,7 +10,7 @@
<externalAnnotations path="baz1"/> <externalAnnotations path="baz1"/>
<externalAnnotations path="baz2"/> <externalAnnotations path="baz2"/>
</module> </module>
<module name="name2"> <module name="name2" outputDir="out2">
<sources path="2foo"/> <sources path="2foo"/>
<sources path="2foo1"/> <sources path="2foo1"/>
<sources path="2foo2"/> <sources path="2foo2"/>
@@ -26,6 +26,7 @@ import java.util.Set;
public interface KotlinModuleDescriptionGenerator { public interface KotlinModuleDescriptionGenerator {
CharSequence generateModuleScript( CharSequence generateModuleScript(
String moduleName, String moduleName,
String outputDir,
DependencyProvider dependencyProvider, DependencyProvider dependencyProvider,
List<File> sourceFiles, List<File> sourceFiles,
boolean tests, boolean tests,
@@ -34,7 +34,7 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener
@Override @Override
public CharSequence generateModuleScript( public CharSequence generateModuleScript(
String moduleName, String moduleName,
DependencyProvider dependencyProvider, String outputDir, DependencyProvider dependencyProvider,
List<File> sourceFiles, List<File> sourceFiles,
boolean tests, boolean tests,
final Set<File> directoriesToFilterOut final Set<File> directoriesToFilterOut
@@ -50,7 +50,7 @@ public class KotlinModuleScriptGenerator implements KotlinModuleDescriptionGener
script.append("import kotlin.modules.*\n"); script.append("import kotlin.modules.*\n");
script.append("fun project() {\n"); script.append("fun project() {\n");
script.append(" module(\"" + moduleName + "\") {\n"); script.append(" module(\"" + moduleName + "\", outputDir = \"" + toSystemIndependentName(outputDir) + "\") {\n");
for (File sourceFile : sourceFiles) { for (File sourceFile : sourceFiles) {
script.append(" sources += \"" + toSystemIndependentName(sourceFile.getPath()) + "\"\n"); script.append(" sources += \"" + toSystemIndependentName(sourceFile.getPath()) + "\"\n");
@@ -37,7 +37,7 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato
@Override @Override
public CharSequence generateModuleScript( public CharSequence generateModuleScript(
String moduleName, String moduleName,
DependencyProvider dependencyProvider, String outputDir, DependencyProvider dependencyProvider,
List<File> sourceFiles, List<File> sourceFiles,
boolean tests, boolean tests,
final Set<File> directoriesToFilterOut final Set<File> directoriesToFilterOut
@@ -54,7 +54,9 @@ public class KotlinModuleXmlGenerator implements KotlinModuleDescriptionGenerato
p.println("<!-- Module script for production -->"); p.println("<!-- Module script for production -->");
} }
p.println("<", MODULE, " ", NAME, "=\"", escapeXml(moduleName), "\">"); p.println("<", MODULE, " ",
NAME, "=\"", escapeXml(moduleName), "\" ",
OUTPUT_DIR, "=\"", getEscapedPath(new File(outputDir)), "\">");
p.pushIndent(); p.pushIndent();
for (File sourceFile : sourceFiles) { for (File sourceFile : sourceFiles) {
@@ -159,6 +159,7 @@ public class JetCompiler implements TranslatingCompiler {
} }
CharSequence script = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript( CharSequence script = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript(
moduleName, moduleName,
moduleOutputDirectory.getAbsolutePath(),
getDependencyProvider(chunk, tests, mainOutput), getDependencyProvider(chunk, tests, mainOutput),
sourceFiles, sourceFiles,
tests, tests,
+1 -1
View File
@@ -1,6 +1,6 @@
<modules> <modules>
<!-- Module script for production --> <!-- Module script for production -->
<module name="name"> <module name="name" outputDir="output">
<sources path="s1"/> <sources path="s1"/>
<sources path="s2"/> <sources path="s2"/>
<!-- External annotations --> <!-- External annotations -->
+1 -1
View File
@@ -1,6 +1,6 @@
<modules> <modules>
<!-- Module script for production --> <!-- Module script for production -->
<module name="name"> <module name="name" outputDir="output">
<sources path="s1"/> <sources path="s1"/>
<sources path="s2"/> <sources path="s2"/>
<!-- External annotations --> <!-- External annotations -->
@@ -31,6 +31,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
public void testBasic() throws Exception { public void testBasic() throws Exception {
String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript( String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript(
"name", "name",
"output",
new KotlinModuleDescriptionGenerator.DependencyProvider() { new KotlinModuleDescriptionGenerator.DependencyProvider() {
@Override @Override
public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) { public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) {
@@ -40,8 +41,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
}, },
Arrays.asList(new File("s1"), new File("s2")), Arrays.asList(new File("s1"), new File("s2")),
false, false,
Collections.<File>emptySet() Collections.<File>emptySet()).toString();
).toString();
String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/basic.xml")); String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/basic.xml"));
UsefulTestCase.assertSameLines(expected, actual); UsefulTestCase.assertSameLines(expected, actual);
} }
@@ -49,6 +49,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
public void testFiltered() throws Exception { public void testFiltered() throws Exception {
String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript( String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript(
"name", "name",
"output",
new KotlinModuleDescriptionGenerator.DependencyProvider() { new KotlinModuleDescriptionGenerator.DependencyProvider() {
@Override @Override
public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) { public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) {
@@ -58,8 +59,7 @@ public class KotlinModuleXmlGeneratorTest extends TestCase {
}, },
Arrays.asList(new File("s1"), new File("s2")), Arrays.asList(new File("s1"), new File("s2")),
false, false,
Collections.singleton(new File("cp1")) Collections.singleton(new File("cp1"))).toString();
).toString();
String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/filtered.xml")); String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/filtered.xml"));
UsefulTestCase.assertSameLines(expected, actual); UsefulTestCase.assertSameLines(expected, actual);
} }
@@ -52,16 +52,22 @@ public class KotlinBuilderModuleScriptGenerator {
public static File generateModuleDescription(CompileContext context, ModuleBuildTarget target, List<File> sourceFiles) public static File generateModuleDescription(CompileContext context, ModuleBuildTarget target, List<File> sourceFiles)
throws IOException throws IOException
{ {
File outputDir = target.getOutputDir();
if (outputDir == null) {
throw new IllegalStateException("No output directory found for " + target);
}
CharSequence moduleScriptText = GENERATOR.generateModuleScript( CharSequence moduleScriptText = GENERATOR.generateModuleScript(
target.getId(), target.getId(),
outputDir.getAbsolutePath(),
getKotlinModuleDependencies(context, target), getKotlinModuleDependencies(context, target),
sourceFiles, sourceFiles,
target.isTests(), target.isTests(),
// this excludes the output directory from the class path, to be removed for true incremental compilation // 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); writeScriptToFile(context, moduleScriptText, scriptFile);
@@ -3,8 +3,8 @@ package kotlin.modules
import java.util.* import java.util.*
import jet.modules.* import jet.modules.*
public fun module(name: String, callback: ModuleBuilder.() -> Unit) { public fun module(name: String, outputDir: String, callback: ModuleBuilder.() -> Unit) {
val builder = ModuleBuilder(name) val builder = ModuleBuilder(name, outputDir)
builder.callback() builder.callback()
AllModules.modules.get()?.add(builder) 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 // http://youtrack.jetbrains.net/issue/KT-904
private val sourceFiles0 = ArrayList<String>() private val sourceFiles0 = ArrayList<String>()
private val classpathRoots0 = ArrayList<String>() private val classpathRoots0 = ArrayList<String>()
@@ -54,6 +54,7 @@ open class ModuleBuilder(val name: String): Module {
annotationsRoots0.add(name) annotationsRoots0.add(name)
} }
public override fun getOutputDirectory(): String = outputDir
public override fun getSourceFiles(): List<String> = sourceFiles0 public override fun getSourceFiles(): List<String> = sourceFiles0
public override fun getClasspathRoots(): List<String> = classpathRoots0 public override fun getClasspathRoots(): List<String> = classpathRoots0
public override fun getAnnotationsRoots(): List<String> = annotationsRoots0 public override fun getAnnotationsRoots(): List<String> = annotationsRoots0
+3
View File
@@ -24,6 +24,9 @@ public interface Module {
@KotlinSignature("fun getModuleName(): String") @KotlinSignature("fun getModuleName(): String")
String getModuleName(); String getModuleName();
@KotlinSignature("fun getOutputDirectory(): String")
String getOutputDirectory();
@KotlinSignature("fun getSourceFiles(): List<String>") @KotlinSignature("fun getSourceFiles(): List<String>")
List<String> getSourceFiles(); List<String> getSourceFiles();