diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java index 5a7a280ec60..6d8b95f2418 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegen.java @@ -25,6 +25,7 @@ import com.intellij.util.ArrayUtil; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.Mutable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -248,7 +249,7 @@ public class PackageCodegen { } bindings.add(v.getSerializationBindings()); - writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings)); + writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings), tasks.keySet()); } private void generateKotlinPackageReflectionField() { @@ -260,7 +261,10 @@ public class PackageCodegen { FunctionCodegen.endVisit(mv, "package facade static initializer", null); } - private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) { + private void writeKotlinPackageAnnotationIfNeeded( + @NotNull JvmSerializationBindings bindings, + @NotNull final Collection relevantCallables + ) { if (state.getClassBuilderMode() != ClassBuilderMode.FULL) { return; } @@ -274,7 +278,12 @@ public class PackageCodegen { Collection packageFragments = Lists.newArrayList(); ContainerUtil.addIfNotNull(packageFragments, packageFragment); ContainerUtil.addIfNotNull(packageFragments, compiledPackageFragment); - ProtoBuf.Package packageProto = serializer.packageProto(packageFragments).build(); + ProtoBuf.Package packageProto = serializer.packageProto(packageFragments, new Function1() { + @Override + public Boolean invoke(DeclarationDescriptor descriptor) { + return !(descriptor instanceof CallableMemberDescriptor && relevantCallables.contains(descriptor)); + } + }).build(); if (packageProto.getMemberCount() == 0) return; diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 5b7d3b434ea..af9f1e8ce99 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -43,6 +43,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("circularDependencySamePackageUnchanged") + public void testCircularDependencySamePackageUnchanged() throws Exception { + String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/"); + doTest(fileName); + } + @TestMetadata("circularDependencyTopLevelFunctions") public void testCircularDependencyTopLevelFunctions() throws Exception { String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/circularDependencyTopLevelFunctions/"); diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/build.log b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/build.log new file mode 100644 index 00000000000..d51f6f61402 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/build.log @@ -0,0 +1,7 @@ +Cleaning output files: +out/production/module1/test/TestPackage$module1_a$*.class +out/production/module1/test/TestPackage.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/dependencies.txt b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/dependencies.txt new file mode 100644 index 00000000000..02d5c8ca1a7 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/dependencies.txt @@ -0,0 +1,2 @@ +module1->module2 +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt new file mode 100644 index 00000000000..8311da66012 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt @@ -0,0 +1,7 @@ +package test + +fun a() { + +} + +val a = "" diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt.new new file mode 100644 index 00000000000..8311da66012 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module1_a.kt.new @@ -0,0 +1,7 @@ +package test + +fun a() { + +} + +val a = "" diff --git a/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module2_b.kt b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module2_b.kt new file mode 100644 index 00000000000..b04c387135d --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/circularDependencySamePackageUnchanged/module2_b.kt @@ -0,0 +1,7 @@ +package test + +fun b() { + +} + +var b = b()