From 0cf2928761c692597087e7a227ecbe35ac22caae Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 23 Dec 2015 15:27:58 +0300 Subject: [PATCH] Recompile all enum usages when new entry is added --- .../jps/incremental/protoDifferenceUtils.kt | 5 ++-- ...perimentalIncrementalJpsTestGenerated.java | 12 +++++++++ .../classWitnEnumChanged/result.out | 3 +-- .../enumEntryAdded/Enum.kt | 4 +++ .../enumEntryAdded/Enum.kt.new.1 | 5 ++++ .../enumEntryAdded/build.log | 27 +++++++++++++++++++ .../enumEntryAdded/getRandomEnumEntry.kt | 6 +++++ .../enumEntryAdded/use.kt | 7 +++++ .../enumEntryAdded/use.kt.new.2 | 8 ++++++ .../enumEntryAdded/useEnumImplicitly.kt | 3 +++ .../enumMemberChanged/Enum.kt | 7 +++++ .../enumMemberChanged/Enum.kt.new.1 | 7 +++++ .../enumMemberChanged/build.log | 24 +++++++++++++++++ .../enumMemberChanged/useBecameNullable.kt | 5 ++++ .../useBecameNullable.kt.new.2 | 5 ++++ .../enumMemberChanged/useUnchanged.kt | 5 ++++ 16 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt.new.1 create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/build.log create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/getRandomEnumEntry.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt.new.2 create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/useEnumImplicitly.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt.new.1 create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/build.log create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt.new.2 create mode 100644 jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useUnchanged.kt diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt index b24704e1ebc..97183178c97 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt @@ -201,8 +201,9 @@ private class DifferenceCalculatorForClass(oldData: ProtoMapValue, newData: Prot names.addAll(calcDifferenceForNonPrivateMembers(ProtoBuf.Class::getFunctionList)) ProtoBufClassKind.PROPERTY_LIST -> names.addAll(calcDifferenceForNonPrivateMembers(ProtoBuf.Class::getPropertyList)) - ProtoBufClassKind.ENUM_ENTRY_LIST -> - names.addAll(calcDifferenceForNames(oldProto.enumEntryList.map { it.name }, newProto.enumEntryList.map { it.name })) + ProtoBufClassKind.ENUM_ENTRY_LIST -> { + isClassSignatureChanged = true + } ProtoBufClassKind.TYPE_TABLE -> { // TODO } diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index 9015aedd392..4ba99fa6da2 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -1075,6 +1075,18 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("enumEntryAdded") + public void testEnumEntryAdded() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/"); + doTest(fileName); + } + + @TestMetadata("enumMemberChanged") + public void testEnumMemberChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/"); + doTest(fileName); + } + @TestMetadata("flagsAndMemberInDifferentClassesChanged") public void testFlagsAndMemberInDifferentClassesChanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInDifferentClassesChanged/"); diff --git a/jps-plugin/testData/comparison/classMembersOnlyChanged/classWitnEnumChanged/result.out b/jps-plugin/testData/comparison/classMembersOnlyChanged/classWitnEnumChanged/result.out index 853c9c77070..e7108629fed 100644 --- a/jps-plugin/testData/comparison/classMembersOnlyChanged/classWitnEnumChanged/result.out +++ b/jps-plugin/testData/comparison/classMembersOnlyChanged/classWitnEnumChanged/result.out @@ -1,2 +1 @@ -changes in test/EnumClassWithChanges: MEMBERS - [CONST_2, CONST_3, CONST_4] +changes in test/EnumClassWithChanges: CLASS_SIGNATURE diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt new file mode 100644 index 00000000000..8e80c9708b0 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt @@ -0,0 +1,4 @@ +enum class Enum { + A, + B +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt.new.1 b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt.new.1 new file mode 100644 index 00000000000..d8b67e71746 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/Enum.kt.new.1 @@ -0,0 +1,5 @@ +enum class Enum { + A, + B, + C +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/build.log b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/build.log new file mode 100644 index 00000000000..834ee9a0d0e --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/build.log @@ -0,0 +1,27 @@ +Cleaning output files: +out/production/module/Enum.class +End of files +Compiling files: +src/Enum.kt +End of files +Cleaning output files: +out/production/module/GetRandomEnumEntryKt.class +out/production/module/META-INF/module.kotlin_module +out/production/module/UseKt.class +End of files +Compiling files: +src/getRandomEnumEntry.kt +src/use.kt +End of files +COMPILATION FAILED +'when' expression must be exhaustive or contain an 'else' branch + + +Cleaning output files: +out/production/module/Enum.class +End of files +Compiling files: +src/Enum.kt +src/getRandomEnumEntry.kt +src/use.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/getRandomEnumEntry.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/getRandomEnumEntry.kt new file mode 100644 index 00000000000..2845b19351c --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/getRandomEnumEntry.kt @@ -0,0 +1,6 @@ +import java.util.Random + +fun getRandomEnumEntry() = + with (Enum.values()) { + get(Random().nextInt(size)) + } \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt new file mode 100644 index 00000000000..14d2aa5be07 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt @@ -0,0 +1,7 @@ +import Enum.* + +fun use(e: Enum): String = + when (e) { + A -> "A" + B -> "B" + } \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt.new.2 b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt.new.2 new file mode 100644 index 00000000000..d64d3769328 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/use.kt.new.2 @@ -0,0 +1,8 @@ +import Enum.* + +fun use(e: Enum): String = + when (e) { + A -> "A" + B -> "B" + C -> "C" + } \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/useEnumImplicitly.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/useEnumImplicitly.kt new file mode 100644 index 00000000000..d5ad0b4c83a --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumEntryAdded/useEnumImplicitly.kt @@ -0,0 +1,3 @@ +fun useImplicit() { + println(use(getRandomEnumEntry())) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt new file mode 100644 index 00000000000..d969e3f0526 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt @@ -0,0 +1,7 @@ +enum class Enum(x: String) { + A("a"), + B("b"); + + val becameNullable: Any = x + val unchanged: Any = x +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt.new.1 b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt.new.1 new file mode 100644 index 00000000000..4f2e4fa3f45 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/Enum.kt.new.1 @@ -0,0 +1,7 @@ +enum class Enum(x: String) { + A("a"), + B("b"); + + val becameNullable: Any? = x + val unchanged: Any = x +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/build.log b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/build.log new file mode 100644 index 00000000000..77c41dc180d --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/build.log @@ -0,0 +1,24 @@ +Cleaning output files: +out/production/module/Enum.class +End of files +Compiling files: +src/Enum.kt +End of files +Cleaning output files: +out/production/module/META-INF/module.kotlin_module +out/production/module/UseBecameNullableKt.class +End of files +Compiling files: +src/useBecameNullable.kt +End of files +COMPILATION FAILED +Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.Any? + + +Cleaning output files: +out/production/module/Enum.class +End of files +Compiling files: +src/Enum.kt +src/useBecameNullable.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt new file mode 100644 index 00000000000..6e26c3c9fef --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt @@ -0,0 +1,5 @@ +import Enum.* + +fun useBecameNullable(e: Enum) { + println(e.becameNullable.hashCode()) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt.new.2 b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt.new.2 new file mode 100644 index 00000000000..3c4016a1df3 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useBecameNullable.kt.new.2 @@ -0,0 +1,5 @@ +import Enum.* + +fun useBecameNullable(e: Enum) { + println(e.becameNullable?.hashCode()) +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useUnchanged.kt b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useUnchanged.kt new file mode 100644 index 00000000000..fa6298a5064 --- /dev/null +++ b/jps-plugin/testData/incremental/classHierarchyAffected/enumMemberChanged/useUnchanged.kt @@ -0,0 +1,5 @@ +import Enum.* + +fun useUnchanged(e: Enum) { + println(e.unchanged.hashCode()) +} \ No newline at end of file