New IC: Add constants-in-companion-objects impact computation

When computing impacted symbols of changed symbols, previously we
considered only the supertypes-inheritors type of impact, which is the
most common type. This commit adds the constants-in-companion-objects
type of impact to address KT-53266.

We've also cleaned up impact computation to make it easier to add new
types of impact in the future.

^KT-53266 In progress
This commit is contained in:
Hung Nguyen
2022-08-05 14:57:15 +01:00
committed by Alexander Likhachev
parent 3f0a93d6dd
commit 2ad047340f
13 changed files with 462 additions and 172 deletions
@@ -217,6 +217,9 @@ class KotlinOnlyClasspathChangesComputerTest : ClasspathChangesComputerTest() {
val changes = computeClasspathChanges(File(testDataDir, "KotlinOnly/testConstantsAndInlineFunctions/src"), tmpDir)
Changes(
lookupSymbols = setOf(
LookupSymbol(name = "constantChangedType", scope = "com.example.SomeClass"),
LookupSymbol(name = "constantChangedValue", scope = "com.example.SomeClass"),
LookupSymbol(name = "constantChangedType", scope = "com.example.SomeClass.CompanionObject"),
LookupSymbol(name = "constantChangedValue", scope = "com.example.SomeClass.CompanionObject"),
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathSnapshotTestCommo
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathSnapshotTestCommon.CompileUtil.compile
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathSnapshotTestCommon.CompileUtil.compileAll
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathSnapshotTestCommon.SourceFile.KotlinSourceFile
import org.jetbrains.kotlin.incremental.storage.fromByteArray
import org.jetbrains.kotlin.incremental.storage.toByteArray
import org.jetbrains.kotlin.test.KotlinTestUtils
import org.junit.Rule
import org.junit.rules.TemporaryFolder
@@ -25,7 +27,11 @@ abstract class ClasspathSnapshotTestCommon {
// Use Gson to compare objects
private val gson by lazy { GsonBuilder().setPrettyPrinting().create() }
protected fun Any.toGson(): String = gson.toJson(this)
protected fun ClassSnapshot.toGson(): String = gson.toJson(
// Serialize and deserialize the object to unset lazy properties' values as they are not essential and can add noise when comparing
// objects
ClassSnapshotExternalizer.fromByteArray(ClassSnapshotExternalizer.toByteArray(this))
)
sealed class SourceFile(val baseDir: File, relativePath: String) {
val unixStyleRelativePath: String