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:
@@ -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()));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user