From 7eb8c94ca8281efc00d09d315bafa31a4e79fccf Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 23 Dec 2015 15:55:46 +0300 Subject: [PATCH] Recompile all class and member usages when flag and member are changed Original commit: e7f8d7103f32fba7c66e9c1d51ae916325a3c19a --- .../jps/incremental/IncrementalCacheImpl.kt | 22 +++---- .../jps/incremental/protoDifferenceUtils.kt | 63 +++++++------------ ...perimentalIncrementalJpsTestGenerated.java | 6 ++ .../AbstractProtoComparisonTest.kt | 22 ++++--- .../ProtoComparisonTestGenerated.java | 6 ++ .../classFlagsAndMembersChanged/new.kt | 5 ++ .../classFlagsAndMembersChanged/old.kt | 3 + .../classFlagsAndMembersChanged/result.out | 2 + .../result.out | 3 +- .../flagsAndMemberInSameClassChanged/A.kt | 3 + .../A.kt.new.1 | 3 + .../A.kt.new.2 | 3 + .../flagsAndMemberInSameClassChanged/B.kt | 1 + .../build.log | 56 +++++++++++++++++ .../flagsAndMemberInSameClassChanged/getA.kt | 1 + .../flagsAndMemberInSameClassChanged/getB.kt | 1 + .../flagsAndMemberInSameClassChanged/useA.kt | 3 + .../useA.kt.new.3 | 3 + .../flagsAndMemberInSameClassChanged/useB.kt | 3 + .../useB.kt.new.3 | 3 + 20 files changed, 153 insertions(+), 59 deletions(-) create mode 100644 jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/new.kt create mode 100644 jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/old.kt create mode 100644 jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/result.out create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.1 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.2 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/B.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/build.log create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getA.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getB.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt.new.3 create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt create mode 100644 jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt.new.3 diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt index 707b21fda68..ce0c8bb626e 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.jps.incremental import com.google.protobuf.MessageLite import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName +import com.intellij.util.SmartList import com.intellij.util.io.BooleanDataDescriptor import com.intellij.util.io.EnumeratorStringDescriptor import gnu.trove.THashSet @@ -371,20 +372,19 @@ class IncrementalCacheImpl( if (oldData == null || !checkChangesIsOpenPart) return CompilationResult(protoChanged = true) - val diff = difference(oldData, data) - - if (!IncrementalCompilation.isExperimental()) return CompilationResult(protoChanged = diff != DifferenceKind.NONE) - + val difference = difference(oldData, data) val fqName = if (isPackage) className.packageFqName else className.fqNameForClassNameWithoutDollars + val changeList = SmartList() - val changes = - when (diff) { - is DifferenceKind.NONE -> emptySequence() - is DifferenceKind.CLASS_SIGNATURE -> sequenceOf(ChangeInfo.SignatureChanged(fqName)) - is DifferenceKind.MEMBERS -> sequenceOf(ChangeInfo.MembersChanged(fqName, diff.names)) - } + if (difference.isClassSignatureChanged) { + changeList.add(ChangeInfo.SignatureChanged(fqName)) + } - return CompilationResult(protoChanged = diff != DifferenceKind.NONE, changes = changes) + if (difference.changedMembersNames.isNotEmpty()) { + changeList.add(ChangeInfo.MembersChanged(fqName, difference.changedMembersNames)) + } + + return CompilationResult(protoChanged = changeList.isNotEmpty(), changes = changeList.asSequence()) } operator fun contains(className: JvmClassName): Boolean = diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt index d92a0c2bc15..b24704e1ebc 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/protoDifferenceUtils.kt @@ -29,17 +29,21 @@ import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil import org.jetbrains.kotlin.utils.HashSetUtil import java.util.* -sealed class DifferenceKind() { - object NONE: DifferenceKind() - object CLASS_SIGNATURE: DifferenceKind() - class MEMBERS(val names: Collection): DifferenceKind() -} +data class Difference( + val isClassSignatureChanged: Boolean = false, + val changedMembersNames: Set = emptySet() +) -fun difference(oldData: ProtoMapValue, newData: ProtoMapValue): DifferenceKind { - if (oldData.isPackageFacade != newData.isPackageFacade) return DifferenceKind.CLASS_SIGNATURE +fun difference(oldData: ProtoMapValue, newData: ProtoMapValue): Difference { + if (oldData.isPackageFacade != newData.isPackageFacade) return Difference(isClassSignatureChanged = true) val differenceObject = - if (oldData.isPackageFacade) DifferenceCalculatorForPackageFacade(oldData, newData) else DifferenceCalculatorForClass(oldData, newData) + if (oldData.isPackageFacade) { + DifferenceCalculatorForPackageFacade(oldData, newData) + } + else { + DifferenceCalculatorForClass(oldData, newData) + } return differenceObject.difference() } @@ -70,9 +74,7 @@ private abstract class DifferenceCalculator() { protected val compareObject by lazy { ProtoCompareGenerated(oldNameResolver, newNameResolver) } - abstract fun difference(): DifferenceKind - - protected fun membersOrNone(names: Collection): DifferenceKind = if (names.isEmpty()) DifferenceKind.NONE else DifferenceKind.MEMBERS(names) + abstract fun difference(): Difference protected fun calcDifferenceForMembers(oldList: List, newList: List): Collection { val result = hashSetOf() @@ -172,15 +174,8 @@ private class DifferenceCalculatorForClass(oldData: ProtoMapValue, newData: Prot val diff = compareObject.difference(oldProto, newProto) - override fun difference(): DifferenceKind { - if (diff.isEmpty()) return DifferenceKind.NONE - - CLASS_SIGNATURE_ENUMS.forEach { if (it in diff) return DifferenceKind.CLASS_SIGNATURE } - - return membersOrNone(getChangedMembersNames()) - } - - private fun getChangedMembersNames(): Set { + override fun difference(): Difference { + var isClassSignatureChanged = false val names = hashSetOf() fun Int.oldToNames() = names.add(oldNameResolver.getString(this)) @@ -211,17 +206,14 @@ private class DifferenceCalculatorForClass(oldData: ProtoMapValue, newData: Prot ProtoBufClassKind.TYPE_TABLE -> { // TODO } - ProtoBufClassKind.FLAGS, - ProtoBufClassKind.FQ_NAME, - ProtoBufClassKind.TYPE_PARAMETER_LIST, - ProtoBufClassKind.SUPERTYPE_LIST, - ProtoBufClassKind.CLASS_ANNOTATION_LIST -> - throw IllegalArgumentException("Unexpected kind: $kind") - else -> - throw IllegalArgumentException("Unsupported kind: $kind") + in CLASS_SIGNATURE_ENUMS -> { + isClassSignatureChanged = true + } + else -> throw IllegalArgumentException("Unsupported kind: $kind") } } - return names + + return Difference(isClassSignatureChanged, names) } } @@ -237,13 +229,7 @@ private class DifferenceCalculatorForPackageFacade(oldData: ProtoMapValue, newDa val diff = compareObject.difference(oldProto, newProto) - override fun difference(): DifferenceKind { - if (diff.isEmpty()) return DifferenceKind.NONE - - return membersOrNone(getChangedMembersNames()) - } - - private fun getChangedMembersNames(): Set { + override fun difference(): Difference { val names = hashSetOf() fun calcDifferenceForNonPrivateMembers(members: (ProtoBuf.Package) -> List): Collection { @@ -261,11 +247,10 @@ private class DifferenceCalculatorForPackageFacade(oldData: ProtoMapValue, newDa ProtoBufPackageKind.TYPE_TABLE -> { // TODO } - else -> - throw IllegalArgumentException("Unsupported kind: $kind") + else -> throw IllegalArgumentException("Unsupported kind: $kind") } } - return names + return Difference(isClassSignatureChanged = false, changedMembersNames = names) } } diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index 53e2b965f60..9015aedd392 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -1081,6 +1081,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("flagsAndMemberInSameClassChanged") + public void testFlagsAndMemberInSameClassChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/"); + doTest(fileName); + } + @TestMetadata("jvmNameChanged") public void testJvmNameChanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/classHierarchyAffected/jvmNameChanged/"); diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt index 664765289c9..f9ae0e18edc 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.jps.incremental import com.intellij.openapi.util.io.FileUtil import com.intellij.testFramework.UsefulTestCase +import com.intellij.util.SmartList import org.jetbrains.kotlin.jps.incremental.storage.ProtoMapValue import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind import org.jetbrains.kotlin.load.kotlin.header.isCompatibleFileFacadeKind @@ -112,16 +113,21 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() { } } - val changes = when (diff) { - is DifferenceKind.NONE -> - "NONE" - is DifferenceKind.CLASS_SIGNATURE -> - "CLASS_SIGNATURE" - is DifferenceKind.MEMBERS -> - "MEMBERS\n ${diff.names.sorted()}" + val changes = SmartList() + + if (diff.isClassSignatureChanged) { + changes.add("CLASS_SIGNATURE") } - println("changes in ${oldLocalFileKotlinClass.classId}: $changes") + if (diff.changedMembersNames.isNotEmpty()) { + changes.add("MEMBERS\n ${diff.changedMembersNames.sorted()}") + } + + if (changes.isEmpty()) { + changes.add("NONE") + } + + println("changes in ${oldLocalFileKotlinClass.classId}: ${changes.joinToString()}") } private fun File.createSubDirectory(relativePath: String): File { diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java index 6a90f0cbdb7..9b74cd9d194 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java @@ -37,6 +37,12 @@ public class ProtoComparisonTestGenerated extends AbstractProtoComparisonTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/comparison/classSignatureChange"), Pattern.compile("^([^\\.]+)$"), true); } + @TestMetadata("classFlagsAndMembersChanged") + public void testClassFlagsAndMembersChanged() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/"); + doTest(fileName); + } + @TestMetadata("classFlagsChanged") public void testClassFlagsChanged() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/comparison/classSignatureChange/classFlagsChanged/"); diff --git a/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/new.kt b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/new.kt new file mode 100644 index 00000000000..5ea958883c3 --- /dev/null +++ b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/new.kt @@ -0,0 +1,5 @@ +package test + +open class A { + fun f() {} +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/old.kt b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/old.kt new file mode 100644 index 00000000000..926842376c9 --- /dev/null +++ b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/old.kt @@ -0,0 +1,3 @@ +package test + +class A \ No newline at end of file diff --git a/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/result.out b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/result.out new file mode 100644 index 00000000000..0050cf38d22 --- /dev/null +++ b/jps/jps-plugin/testData/comparison/classSignatureChange/classFlagsAndMembersChanged/result.out @@ -0,0 +1,2 @@ +changes in test/A: CLASS_SIGNATURE, MEMBERS + [f] diff --git a/jps/jps-plugin/testData/comparison/classSignatureChange/classWithClassAnnotationListChanged/result.out b/jps/jps-plugin/testData/comparison/classSignatureChange/classWithClassAnnotationListChanged/result.out index d447c5da3f9..557be9e6f1f 100644 --- a/jps/jps-plugin/testData/comparison/classSignatureChange/classWithClassAnnotationListChanged/result.out +++ b/jps/jps-plugin/testData/comparison/classSignatureChange/classWithClassAnnotationListChanged/result.out @@ -1 +1,2 @@ -changes in test/ClassWithClassAnnotationListChanged: CLASS_SIGNATURE +changes in test/ClassWithClassAnnotationListChanged: CLASS_SIGNATURE, MEMBERS + [] diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt new file mode 100644 index 00000000000..bf3e36a22e5 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt @@ -0,0 +1,3 @@ +open class A { + val x: Any = "A.x" +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.1 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.1 new file mode 100644 index 00000000000..ef7cdda34b6 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.1 @@ -0,0 +1,3 @@ +private open class A { + val x: Any? = null +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.2 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.2 new file mode 100644 index 00000000000..bcd2e047b17 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/A.kt.new.2 @@ -0,0 +1,3 @@ +open class A { + val x: Any? = null +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/B.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/B.kt new file mode 100644 index 00000000000..483784a19fb --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/B.kt @@ -0,0 +1 @@ +class B : A() \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/build.log b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/build.log new file mode 100644 index 00000000000..75a4ae57b32 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/build.log @@ -0,0 +1,56 @@ +Cleaning output files: +out/production/module/A.class +End of files +Compiling files: +src/A.kt +End of files +Cleaning output files: +out/production/module/B.class +out/production/module/GetAKt.class +out/production/module/GetBKt.class +out/production/module/META-INF/module.kotlin_module +out/production/module/UseAKt.class +out/production/module/UseBKt.class +End of files +Compiling files: +src/B.kt +src/getA.kt +src/getB.kt +src/useA.kt +src/useB.kt +End of files +COMPILATION FAILED +Cannot access 'A': it is 'private' in file +Subclass effective visibility 'public' should be the same or less permissive than its superclass effective visibility 'private' +Function effective visibility 'public' should be the same or less permissive than its return type effective visibility 'private' +Cannot access 'A': it is 'private' in file +Cannot access 'A': it is 'private' in file +Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.Any? +Cannot access 'x': it is 'invisible_fake' in 'B' +Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.Any? + + +Cleaning output files: +out/production/module/A.class +End of files +Compiling files: +src/A.kt +src/B.kt +src/getA.kt +src/getB.kt +src/useA.kt +src/useB.kt +End of files +COMPILATION FAILED +Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.Any? +Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type kotlin.Any? + + +Compiling files: +src/A.kt +src/B.kt +src/getA.kt +src/getB.kt +src/useA.kt +src/useB.kt +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getA.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getA.kt new file mode 100644 index 00000000000..bd04874b85b --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getA.kt @@ -0,0 +1 @@ +fun getA() = A() \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getB.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getB.kt new file mode 100644 index 00000000000..ff08b7154a6 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/getB.kt @@ -0,0 +1 @@ +fun getB() = B() \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt new file mode 100644 index 00000000000..efaa710f180 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt @@ -0,0 +1,3 @@ +fun useA() { + getA().x.hashCode() +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt.new.3 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt.new.3 new file mode 100644 index 00000000000..ee272ab8efb --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useA.kt.new.3 @@ -0,0 +1,3 @@ +fun useA() { + getA().x?.hashCode() +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt new file mode 100644 index 00000000000..0ecf492e57e --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt @@ -0,0 +1,3 @@ +fun useB() { + getB().x.hashCode() +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt.new.3 b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt.new.3 new file mode 100644 index 00000000000..906fb67e71d --- /dev/null +++ b/jps/jps-plugin/testData/incremental/classHierarchyAffected/flagsAndMemberInSameClassChanged/useB.kt.new.3 @@ -0,0 +1,3 @@ +fun useB() { + getB().x?.hashCode() +} \ No newline at end of file