Support circular dependencies

We generate a module script with information on all modules in the chunk, then build the whole chunk as "one big module"
This commit is contained in:
Andrey Breslav
2013-10-09 22:13:39 +04:00
parent d5b08d4f1c
commit 60425b15e6
20 changed files with 599 additions and 321 deletions
@@ -157,14 +157,14 @@ public class JetCompiler implements TranslatingCompiler {
if (!tests) {
outputDirectoriesToFilter.add(moduleOutputDirectory);
}
CharSequence script = KotlinModuleScriptGenerator.INSTANCE.generateModuleScript(
CharSequence script = KotlinModuleScriptBuilderFactory.INSTANCE.create().addModule(
moduleName,
moduleOutputDirectory.getAbsolutePath(),
getDependencyProvider(chunk, tests, mainOutput),
sourceFiles,
tests,
outputDirectoriesToFilter
);
).asText();
File scriptFile = new File(outputDir, "script.kts");
try {
@@ -177,14 +177,14 @@ public class JetCompiler implements TranslatingCompiler {
return scriptFile;
}
private static KotlinModuleDescriptionGenerator.DependencyProvider getDependencyProvider(
private static KotlinModuleDescriptionBuilder.DependencyProvider getDependencyProvider(
final ModuleChunk chunk,
final boolean tests,
final VirtualFile mainOutputPath
) {
return new KotlinModuleDescriptionGenerator.DependencyProvider() {
return new KotlinModuleDescriptionBuilder.DependencyProvider() {
@Override
public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) {
public void processClassPath(@NotNull KotlinModuleDescriptionBuilder.DependencyProcessor processor) {
// TODO: have a bootclasspath in script API
processor.processClassPathSection("Boot classpath", ioFiles(chunk.getCompilationBootClasspathFiles()));
+30
View File
@@ -0,0 +1,30 @@
<modules>
<!-- Module script for production -->
<module name="name" outputDir="output">
<sources path="s1"/>
<sources path="s2"/>
<!-- External annotations -->
<externalAnnotations path= "a1/f1"/>
<externalAnnotations path= "a2"/>
<!-- s1 -->
<!-- Output directory, commented out -->
<!--
<classpath path="cp1"/>
-->
<classpath path="cp2"/>
</module>
<!-- Module script for tests -->
<module name="name2" outputDir="output2">
<sources path="s12"/>
<sources path="s22"/>
<!-- External annotations -->
<externalAnnotations path= "a12/f12"/>
<externalAnnotations path= "a22"/>
<!-- s12 -->
<!-- Output directory, commented out -->
<!--
<classpath path="cp12"/>
-->
<classpath path="cp22"/>
</module>
</modules>
@@ -20,8 +20,9 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.testFramework.UsefulTestCase;
import junit.framework.TestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionGenerator;
import org.jetbrains.jet.compiler.runner.KotlinModuleXmlGenerator;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.compiler.runner.KotlinModuleDescriptionBuilder;
import org.jetbrains.jet.compiler.runner.KotlinModuleXmlBuilderFactory;
import java.io.File;
import java.util.Arrays;
@@ -29,38 +30,70 @@ import java.util.Collections;
public class KotlinModuleXmlGeneratorTest extends TestCase {
public void testBasic() throws Exception {
String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript(
String actual = KotlinModuleXmlBuilderFactory.INSTANCE.create().addModule(
"name",
"output",
new KotlinModuleDescriptionGenerator.DependencyProvider() {
new KotlinModuleDescriptionBuilder.DependencyProvider() {
@Override
public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) {
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")),
false,
Collections.<File>emptySet()).toString();
Collections.<File>emptySet()).asText().toString();
String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/basic.xml"));
UsefulTestCase.assertSameLines(expected, actual);
}
public void testFiltered() throws Exception {
String actual = KotlinModuleXmlGenerator.INSTANCE.generateModuleScript(
String actual = KotlinModuleXmlBuilderFactory.INSTANCE.create().addModule(
"name",
"output",
new KotlinModuleDescriptionGenerator.DependencyProvider() {
new KotlinModuleDescriptionBuilder.DependencyProvider() {
@Override
public void processClassPath(@NotNull KotlinModuleDescriptionGenerator.DependencyProcessor processor) {
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")),
false,
Collections.singleton(new File("cp1"))).toString();
Collections.singleton(new File("cp1"))).asText().toString();
String expected = FileUtil.loadFile(new File("idea/testData/modules.xml/filtered.xml"));
UsefulTestCase.assertSameLines(expected, actual);
}
public void testMultiple() throws Exception {
KotlinModuleDescriptionBuilder builder = KotlinModuleXmlBuilderFactory.INSTANCE.create();
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")),
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")),
true,
Collections.singleton(new File("cp12")));
String actual = builder.asText().toString();
JetTestUtils.assertEqualsToFile(new File("idea/testData/modules.xml/multiple.xml"), actual);
}
}