From 981d471ebe1621b37aeaada029e35a7438f9ec9f Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 5 Nov 2015 20:48:33 +0300 Subject: [PATCH] fix KT-9843 Bug in incremental compilation: module is not recompiled when optional parameter added and KT-8434 Removing parameter with default value from function in different module breaks incremental compilation #KT-9843 Fixed #KT-8434 Fixed --- .../kotlin/codegen/FunctionCodegen.java | 2 +- .../withDefaultArguments/funInClass.kt | 7 +++++ .../withDefaultArguments/funInClassObject.kt | 9 +++++++ .../withDefaultArguments/topLevelFun.kt | 5 ++++ .../flags/WriteFlagsTestGenerated.java | 27 +++++++++++++++++++ .../build/IncrementalJpsTestGenerated.java | 24 +++++++++++++++++ .../defaultParameterAdded/build.log | 13 +++++++++ .../defaultParameterAdded/dependencies.txt | 2 ++ .../defaultParameterAdded/module1_a.kt | 6 +++++ .../defaultParameterAdded/module1_a.kt.new | 5 ++++ .../defaultParameterAdded/module2_usage.kt | 7 +++++ .../build.log | 14 ++++++++++ .../dependencies.txt | 2 ++ .../module1_a.kt | 3 +++ .../module1_a.kt.new | 3 +++ .../module2_usage.kt | 5 ++++ .../defaultParameterRemoved/build.log | 13 +++++++++ .../defaultParameterRemoved/dependencies.txt | 2 ++ .../defaultParameterRemoved/module1_a.kt | 6 +++++ .../defaultParameterRemoved/module1_a.kt.new | 7 +++++ .../defaultParameterRemoved/module2_usage.kt | 6 +++++ .../build.log | 14 ++++++++++ .../dependencies.txt | 2 ++ .../module1_a.kt | 3 +++ .../module1_a.kt.new | 3 +++ .../module2_usage.kt | 5 ++++ 26 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/writeFlags/function/withDefaultArguments/funInClass.kt create mode 100644 compiler/testData/writeFlags/function/withDefaultArguments/funInClassObject.kt create mode 100644 compiler/testData/writeFlags/function/withDefaultArguments/topLevelFun.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAdded/build.log create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAdded/dependencies.txt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt.new create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module2_usage.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/build.log create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/dependencies.txt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt.new create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module2_usage.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/build.log create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/dependencies.txt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt.new create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module2_usage.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/build.log create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/dependencies.txt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt.new create mode 100644 jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module2_usage.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index d29318a17de..b0e898740f3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -669,7 +669,7 @@ public class FunctionCodegen { getDeprecatedAccessFlag(functionDescriptor) | ACC_SYNTHETIC; if (!(functionDescriptor instanceof ConstructorDescriptor)) { - flags |= ACC_STATIC; + flags |= ACC_STATIC | ACC_BRIDGE; } // $default methods are never private to be accessible from other class files (e.g. inner) without the need of synthetic accessors flags &= ~ACC_PRIVATE; diff --git a/compiler/testData/writeFlags/function/withDefaultArguments/funInClass.kt b/compiler/testData/writeFlags/function/withDefaultArguments/funInClass.kt new file mode 100644 index 00000000000..4bbadfb4483 --- /dev/null +++ b/compiler/testData/writeFlags/function/withDefaultArguments/funInClass.kt @@ -0,0 +1,7 @@ +class MyClass() { + fun test(s: String = "") {} +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: MyClass, test$default +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/function/withDefaultArguments/funInClassObject.kt b/compiler/testData/writeFlags/function/withDefaultArguments/funInClassObject.kt new file mode 100644 index 00000000000..86126468c3f --- /dev/null +++ b/compiler/testData/writeFlags/function/withDefaultArguments/funInClassObject.kt @@ -0,0 +1,9 @@ +class MyClass() { + companion object { + fun test(s: String, x:Int = 10) {} + } +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: MyClass$Companion, test$default +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/function/withDefaultArguments/topLevelFun.kt b/compiler/testData/writeFlags/function/withDefaultArguments/topLevelFun.kt new file mode 100644 index 00000000000..1672055c51b --- /dev/null +++ b/compiler/testData/writeFlags/function/withDefaultArguments/topLevelFun.kt @@ -0,0 +1,5 @@ +fun test(s: String = "") {} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: TopLevelFunKt, test$default +// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_BRIDGE, ACC_SYNTHETIC diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 447154ffae2..5afafa20ba1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -516,6 +516,33 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { doTest(fileName); } } + + @TestMetadata("compiler/testData/writeFlags/function/withDefaultArguments") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class WithDefaultArguments extends AbstractWriteFlagsTest { + public void testAllFilesPresentInWithDefaultArguments() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/writeFlags/function/withDefaultArguments"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("funInClass.kt") + public void testFunInClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/function/withDefaultArguments/funInClass.kt"); + doTest(fileName); + } + + @TestMetadata("funInClassObject.kt") + public void testFunInClassObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/function/withDefaultArguments/funInClassObject.kt"); + doTest(fileName); + } + + @TestMetadata("topLevelFun.kt") + public void testTopLevelFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/writeFlags/function/withDefaultArguments/topLevelFun.kt"); + doTest(fileName); + } + } } @TestMetadata("compiler/testData/writeFlags/hidden") 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 72c7dff31e4..bd0218cefb6 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -61,6 +61,30 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("defaultParameterAdded") + public void testDefaultParameterAdded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/defaultParameterAdded/"); + doTest(fileName); + } + + @TestMetadata("defaultParameterAddedForTopLevelFun") + public void testDefaultParameterAddedForTopLevelFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/"); + doTest(fileName); + } + + @TestMetadata("defaultParameterRemoved") + public void testDefaultParameterRemoved() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/"); + doTest(fileName); + } + + @TestMetadata("defaultParameterRemovedForTopLevelFun") + public void testDefaultParameterRemovedForTopLevelFun() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/"); + doTest(fileName); + } + @TestMetadata("inlineFunctionInlined") public void testInlineFunctionInlined() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/inlineFunctionInlined/"); diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/build.log b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/build.log new file mode 100644 index 00000000000..16518f5f414 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/build.log @@ -0,0 +1,13 @@ +Cleaning output files: +out/production/module1/a/A.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files +Cleaning output files: +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/usage/Module2_usageKt.class +End of files +Compiling files: +module2/src/module2_usage.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/dependencies.txt b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/dependencies.txt new file mode 100644 index 00000000000..827bf04cc58 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt new file mode 100644 index 00000000000..0d3a95d2ad1 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt @@ -0,0 +1,6 @@ +package a + +class A { + fun foo(s: String, x: Int = 10) { + } +} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt.new new file mode 100644 index 00000000000..b0f678a5175 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module1_a.kt.new @@ -0,0 +1,5 @@ +package a + +class A { + fun foo(s: String, x: Int = 10, y:Int = 20) {} +} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module2_usage.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module2_usage.kt new file mode 100644 index 00000000000..4eb0fae8143 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAdded/module2_usage.kt @@ -0,0 +1,7 @@ +package usage + +import a.A + +fun main(args: Array) { + A().foo("") +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/build.log b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/build.log new file mode 100644 index 00000000000..b25e93d2f74 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/build.log @@ -0,0 +1,14 @@ +Cleaning output files: +out/production/module1/META-INF/module1.kotlin_module +out/production/module1/a/Module1_aKt.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files +Cleaning output files: +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/usage/Module2_usageKt.class +End of files +Compiling files: +module2/src/module2_usage.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/dependencies.txt b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/dependencies.txt new file mode 100644 index 00000000000..827bf04cc58 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt new file mode 100644 index 00000000000..642e76de376 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt @@ -0,0 +1,3 @@ +package a + +fun foo(s: String, x: Int = 10) {} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt.new new file mode 100644 index 00000000000..d496f7777f7 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module1_a.kt.new @@ -0,0 +1,3 @@ +package a + +fun foo(s: String, x: Int = 10, y:Int = 20) {} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module2_usage.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module2_usage.kt new file mode 100644 index 00000000000..c739a83b15e --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterAddedForTopLevelFun/module2_usage.kt @@ -0,0 +1,5 @@ +package usage + +fun main(args: Array) { + a.foo("") +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/build.log b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/build.log new file mode 100644 index 00000000000..16518f5f414 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/build.log @@ -0,0 +1,13 @@ +Cleaning output files: +out/production/module1/a/A.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files +Cleaning output files: +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/usage/Module2_usageKt.class +End of files +Compiling files: +module2/src/module2_usage.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/dependencies.txt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/dependencies.txt new file mode 100644 index 00000000000..827bf04cc58 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt new file mode 100644 index 00000000000..1d902152567 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt @@ -0,0 +1,6 @@ +package a + +class A { + fun foo(x:Int = 10) { + } +} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt.new new file mode 100644 index 00000000000..ecefb7d1c19 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module1_a.kt.new @@ -0,0 +1,7 @@ +package a + +class A { + fun foo() { + } +} + diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module2_usage.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module2_usage.kt new file mode 100644 index 00000000000..7c3eb527bdc --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemoved/module2_usage.kt @@ -0,0 +1,6 @@ +package usage + +fun b(param: a.A) { + param.foo() +} + diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/build.log b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/build.log new file mode 100644 index 00000000000..b25e93d2f74 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/build.log @@ -0,0 +1,14 @@ +Cleaning output files: +out/production/module1/META-INF/module1.kotlin_module +out/production/module1/a/Module1_aKt.class +End of files +Compiling files: +module1/src/module1_a.kt +End of files +Cleaning output files: +out/production/module2/META-INF/module2.kotlin_module +out/production/module2/usage/Module2_usageKt.class +End of files +Compiling files: +module2/src/module2_usage.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/dependencies.txt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/dependencies.txt new file mode 100644 index 00000000000..827bf04cc58 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt new file mode 100644 index 00000000000..6678dd7608c --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt @@ -0,0 +1,3 @@ +package a + +fun foo(x: Int = 10) {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt.new b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt.new new file mode 100644 index 00000000000..ae5ee652ccc --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module1_a.kt.new @@ -0,0 +1,3 @@ +package a + +fun foo() {} diff --git a/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module2_usage.kt b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module2_usage.kt new file mode 100644 index 00000000000..5c991459597 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/defaultParameterRemovedForTopLevelFun/module2_usage.kt @@ -0,0 +1,5 @@ +package usage + +fun main(args: Array) { + a.foo() +}