Do not fail on circular dependencies + better message

This commit is contained in:
Andrey Breslav
2013-05-29 21:07:54 +04:00
parent 68d8716ba8
commit 6465abe7eb
7 changed files with 80 additions and 3 deletions
@@ -16,6 +16,8 @@
package org.jetbrains.jet.jps.build;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation;
@@ -29,19 +31,27 @@ import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor;
import org.jetbrains.jps.incremental.*;
import org.jetbrains.jps.incremental.messages.BuildMessage;
import org.jetbrains.jps.incremental.messages.CompilerMessage;
import org.jetbrains.jps.model.module.JpsModule;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR;
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.EXCEPTION;
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.WARNING;
public class KotlinBuilder extends ModuleLevelBuilder {
private static final String KOTLIN_BUILDER_NAME = "Kotlin Builder";
private static final Function<JpsModule,String> MODULE_NAME = new Function<JpsModule, String>() {
@Override
public String fun(JpsModule module) {
return module.getName();
}
};
protected KotlinBuilder() {
super(BuilderCategory.SOURCE_PROCESSOR);
}
@@ -63,10 +73,14 @@ public class KotlinBuilder extends ModuleLevelBuilder {
MessageCollector messageCollector = new MessageCollectorAdapter(context);
if (chunk.getModules().size() > 1) {
// We do not support circular dependencies, but if they are present, we should not break the build,
// so we simply yield a warning and report NOTHING_DONE
messageCollector.report(
ERROR, "Circular dependencies are not supported: " + chunk.getModules(),
WARNING, "Circular dependencies are not supported. " +
"The following modules depend on each other: " + StringUtil.join(chunk.getModules(), MODULE_NAME, ", ") + ". " +
"Kotlin is not compiled for these modules",
CompilerMessageLocation.NO_LOCATION);
return ExitCode.ABORT;
return ExitCode.NOTHING_DONE;
}
ModuleBuildTarget representativeTarget = chunk.representativeTarget();
@@ -82,6 +82,10 @@ public class KotlinJpsBuildTestCase extends AbstractKotlinJpsBuildTestCase {
doTestWithRuntime();
}
public void testCircularDependenciesNoKotlinFiles() {
doTest();
}
public void testTestDependencyLibrary() throws Throwable {
initProject();
addKotlinRuntimeDependency(JpsJavaDependencyScope.TEST);
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="IDEA_JDK" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinRuntime" level="project" />
<orderEntry type="module" module-name="module2" />
</component>
</module>
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<option name="DEFAULT_COMPILER" value="Javac" />
</component>
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/kotlinProject.iml" filepath="$PROJECT_DIR$/kotlinProject.iml" />
<module fileurl="file://$PROJECT_DIR$/module2/module2.iml" filepath="$PROJECT_DIR$/module2/module2.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="IDEA_JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="IDEA_JDK" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="kotlinProject" />
<orderEntry type="library" name="KotlinRuntime" level="project" />
</component>
</module>
@@ -0,0 +1,5 @@
public class JSecond {
public static void main(String[] args) {
new JFirst().foo();
}
}
@@ -0,0 +1,11 @@
public class JFirst {
JSecond s = null;
public void foo() {
}
public static void main(String[] args) {
System.out.println(1);
}
}