From acc9c80ea9b5252ab78195aa7a594e4b80d28e91 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 30 Dec 2015 17:02:55 +0300 Subject: [PATCH] Drop KotlinClassHeader#filePartClassNames, use 'data' instead Original commit: 661af854fa148ba92f62970afc4eda3dbfb56fa8 --- .../jps/incremental/IncrementalCacheImpl.kt | 6 +- .../classFilesComparison.kt | 2 +- .../AbstractProtoComparisonTest.kt | 60 ++++++++----------- 3 files changed, 28 insertions(+), 40 deletions(-) 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 afb9f5032c7..57192fdf139 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 @@ -158,7 +158,7 @@ open class IncrementalCacheImpl( additionalProcessChangedClass(kotlinClass, isPackage = true) } KotlinClassHeader.Kind.MULTIFILE_CLASS -> { - val partNames = kotlinClass.classHeader.filePartClassNames?.toList() + val partNames = kotlinClass.classHeader.data?.toList() ?: throw AssertionError("Multifile class has no parts: ${kotlinClass.className}") multifileClassFacadeMap.add(className, partNames) @@ -324,7 +324,7 @@ open class IncrementalCacheImpl( fun process(kotlinClass: LocalFileKotlinClass, isPackage: Boolean): CompilationResult { val header = kotlinClass.classHeader - val bytes = BitEncoding.decodeBytes(header.annotationData!!) + val bytes = BitEncoding.decodeBytes(header.data!!) return put(kotlinClass.className, bytes, header.strings!!, isPackage, checkChangesIsOpenPart = true) } @@ -498,7 +498,7 @@ open class IncrementalCacheImpl( private fun addToClassStorage(kotlinClass: LocalFileKotlinClass) { if (!IncrementalCompilation.isExperimental()) return - val classData = JvmProtoBufUtil.readClassDataFrom(kotlinClass.classHeader.annotationData!!, kotlinClass.classHeader.strings!!) + val classData = JvmProtoBufUtil.readClassDataFrom(kotlinClass.classHeader.data!!, kotlinClass.classHeader.strings!!) val supertypes = classData.classProto.supertypes(TypeTable(classData.classProto.typeTable)) val parents = supertypes.map { classData.nameResolver.getClassId(it.className).asSingleFqName() } .filter { it.asString() != "kotlin.Any" } diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt index a9e51f5b98d..ff1accafe69 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/classFilesComparison/classFilesComparison.kt @@ -132,7 +132,7 @@ fun classFileToString(classFile: File): String { val classHeader = LocalFileKotlinClass.create(classFile)?.classHeader - val annotationDataEncoded = classHeader?.annotationData + val annotationDataEncoded = classHeader?.data if (annotationDataEncoded != null) { ByteArrayInputStream(BitEncoding.decodeBytes(annotationDataEncoded)).use { input -> 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 77fdb5fc752..6193643825c 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 @@ -20,6 +20,7 @@ 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.KotlinJvmBinaryClass import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.serialization.jvm.BitEncoding import org.jetbrains.kotlin.test.KotlinTestUtils @@ -28,7 +29,6 @@ import org.jetbrains.kotlin.utils.Printer import java.io.File abstract class AbstractProtoComparisonTest : UsefulTestCase() { - fun doTest(testDataPath: String) { val testDir = KotlinTestUtils.tmpDir("testDirectory") @@ -77,43 +77,31 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() { } private fun Printer.printDifference(oldClassFile: File, newClassFile: File) { - val oldLocalFileKotlinClass = LocalFileKotlinClass.create(oldClassFile)!! - val newLocalFileKotlinClass = LocalFileKotlinClass.create(newClassFile)!! - - val oldClassHeader = oldLocalFileKotlinClass.classHeader - val newClassHeader = newLocalFileKotlinClass.classHeader - - if (oldClassHeader.annotationData == null || newClassHeader.annotationData == null) { - println("skip ${oldLocalFileKotlinClass.classId}") - return - } - - val oldProtoBytes = BitEncoding.decodeBytes(oldClassHeader.annotationData!!) - val newProtoBytes = BitEncoding.decodeBytes(newClassHeader.annotationData!!) - - assert(oldClassHeader.metadataVersion.isCompatible()) { "Incompatible class ($oldClassHeader): $oldClassFile" } - assert(newClassHeader.metadataVersion.isCompatible()) { "Incompatible class ($newClassHeader): $newClassFile" } - - val oldProto = ProtoMapValue( - oldClassHeader.kind == KotlinClassHeader.Kind.FILE_FACADE || - oldClassHeader.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, - oldProtoBytes, oldClassHeader.strings!! - ) - val newProto = ProtoMapValue( - newClassHeader.kind == KotlinClassHeader.Kind.FILE_FACADE || - newClassHeader.kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, - newProtoBytes, newClassHeader.strings!! - ) - - val diff = when (newClassHeader.kind) { - KotlinClassHeader.Kind.CLASS, KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> - difference(oldProto, newProto) - else -> { - println("ignore ${oldLocalFileKotlinClass.classId}") - return + fun KotlinJvmBinaryClass.readProto(): ProtoMapValue? { + assert(classHeader.metadataVersion.isCompatible()) { "Incompatible class ($classHeader): $location" } + return when (classHeader.kind) { + KotlinClassHeader.Kind.CLASS, KotlinClassHeader.Kind.FILE_FACADE, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART -> { + ProtoMapValue( + classHeader.kind != KotlinClassHeader.Kind.CLASS, + BitEncoding.decodeBytes(classHeader.data!!), + classHeader.strings!! + ) + } + else -> { + println("skip $classId") + return null + } } } + val oldClass = LocalFileKotlinClass.create(oldClassFile)!! + val newClass = LocalFileKotlinClass.create(newClassFile)!! + + val diff = difference( + oldClass.readProto() ?: return, + newClass.readProto() ?: return + ) + val changes = SmartList() if (diff.isClassSignatureChanged) { @@ -128,7 +116,7 @@ abstract class AbstractProtoComparisonTest : UsefulTestCase() { changes.add("NONE") } - println("changes in ${oldLocalFileKotlinClass.classId}: ${changes.joinToString()}") + println("changes in ${oldClass.classId}: ${changes.joinToString()}") } private fun File.createSubDirectory(relativePath: String): File {