From c4e167d7bc67b268e021f45261cb1abe34d33496 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 16 May 2014 23:06:46 +0400 Subject: [PATCH] Checking for changes in class proto. --- .../kotlin/incremental/IncrementalCache.kt | 53 +++++++++++-------- .../jet/jps/build/IncrementalJpsTest.kt | 6 ++- .../classSignatureChanged/build.log | 13 +++++ .../classSignatureChanged/class.kt | 5 ++ .../classSignatureChanged/class.kt.new | 5 ++ .../classSignatureChanged/usage.kt | 5 ++ 6 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 jps-plugin/testData/incremental/classSignatureChanged/build.log create mode 100644 jps-plugin/testData/incremental/classSignatureChanged/class.kt create mode 100644 jps-plugin/testData/incremental/classSignatureChanged/class.kt.new create mode 100644 jps-plugin/testData/incremental/classSignatureChanged/usage.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt index 793991eb7e9..76821d5f433 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt @@ -33,29 +33,29 @@ import java.util.Arrays public class IncrementalCache(baseDir: File) { class object { - val PACKAGE_MAP: String = "package.tab" + val PROTO_MAP: String = "proto.tab" } - private val packageFacadeData: PersistentMap + private val protoData: PersistentMap { - packageFacadeData = PersistentHashMap(File(baseDir, PACKAGE_MAP), object : KeyDescriptor { - override fun save(out: DataOutput, value: PackageFacadeId?) { + protoData = PersistentHashMap(File(baseDir, PROTO_MAP), object : KeyDescriptor { + override fun save(out: DataOutput, value: ClassOrPackageId?) { IOUtil.writeString(value!!.moduleId, out) IOUtil.writeString(value.fqName.asString(), out) } - override fun read(`in`: DataInput): PackageFacadeId { + override fun read(`in`: DataInput): ClassOrPackageId { val module = IOUtil.readString(`in`)!! val fqName = FqName(IOUtil.readString(`in`)!!) - return PackageFacadeId(module, fqName) + return ClassOrPackageId(module, fqName) } - override fun getHashCode(value: PackageFacadeId?): Int { + override fun getHashCode(value: ClassOrPackageId?): Int { return value?.hashCode() ?: -1 } - override fun isEqual(val1: PackageFacadeId?, val2: PackageFacadeId?): Boolean { + override fun isEqual(val1: ClassOrPackageId?, val2: ClassOrPackageId?): Boolean { return val1 == val2 } }, object : DataExternalizer { @@ -78,32 +78,41 @@ public class IncrementalCache(baseDir: File) { if (classNameAndHeader == null) return false val (className, header) = classNameAndHeader - if (header.kind == KotlinClassHeader.Kind.PACKAGE_FACADE) { - val fqName = className.getFqNameForClassNameWithoutDollars().parent() - val data = BitEncoding.decodeBytes(header.annotationData!!) - val oldData = getPackageData(moduleId, fqName) - if (Arrays.equals(data, oldData)) { - return false + val classFqName = className.getFqNameForClassNameWithoutDollars() + val annotationDataEncoded = header.annotationData + if (annotationDataEncoded != null) { + val data = BitEncoding.decodeBytes(annotationDataEncoded) + when (header.kind) { + KotlinClassHeader.Kind.PACKAGE_FACADE -> { + return putData(moduleId, classFqName.parent(), data) + } + KotlinClassHeader.Kind.CLASS -> { + return putData(moduleId, classFqName, data) + } } - putPackageData(moduleId, fqName, data) - return true } - // TODO Check class signatures, too! + return false } - private fun putPackageData(moduleId: String, fqName: FqName, data: ByteArray) { - packageFacadeData.put(PackageFacadeId(moduleId, fqName), data) + private fun putData(moduleId: String, fqName: FqName, data: ByteArray): Boolean { + val id = ClassOrPackageId(moduleId, fqName) + val oldData = protoData[id] + if (Arrays.equals(data, oldData)) { + return false + } + protoData.put(id, data) + return true } public fun getPackageData(moduleId: String, fqName: FqName): ByteArray? { - return packageFacadeData[PackageFacadeId(moduleId, fqName)] + return protoData[ClassOrPackageId(moduleId, fqName)] } public fun close() { - packageFacadeData.close() + protoData.close() } - private data class PackageFacadeId(val moduleId: String, val fqName: FqName) { + private data class ClassOrPackageId(val moduleId: String, val fqName: FqName) { } } diff --git a/jps-plugin/test/org/jetbrains/jet/jps/build/IncrementalJpsTest.kt b/jps-plugin/test/org/jetbrains/jet/jps/build/IncrementalJpsTest.kt index b456e666d29..6b47071ae27 100644 --- a/jps-plugin/test/org/jetbrains/jet/jps/build/IncrementalJpsTest.kt +++ b/jps-plugin/test/org/jetbrains/jet/jps/build/IncrementalJpsTest.kt @@ -116,6 +116,10 @@ public class IncrementalJpsTest : JpsBuildTestCase() { doTest() } + fun testClassSignatureChanged() { + doTest() + } + private class MyLogger(val rootPath: String) : ProjectBuilderLoggerBase() { private val logBuf = StringBuilder() public val log: String @@ -127,7 +131,7 @@ public class IncrementalJpsTest : JpsBuildTestCase() { fun String.replaceHashWithStar(): String { val lastHyphen = this.lastIndexOf('-') - if (lastHyphen != -1 && substring(lastHyphen + 1).matches("[0-9a-f]{8}\\.class")) { + if (lastHyphen != -1 && substring(lastHyphen + 1).matches("[0-9a-f]{1,8}\\.class")) { return substring(0, lastHyphen) + "-*.class" } return this diff --git a/jps-plugin/testData/incremental/classSignatureChanged/build.log b/jps-plugin/testData/incremental/classSignatureChanged/build.log new file mode 100644 index 00000000000..03df388cc2b --- /dev/null +++ b/jps-plugin/testData/incremental/classSignatureChanged/build.log @@ -0,0 +1,13 @@ +Cleaning output files: +out/production/module/test/Klass.class +End of files +Compiling files: +src/class.kt +End of files +Cleaning output files: +out/production/module/test/TestPackage-usage-*.class +out/production/module/test/TestPackage.class +End of files +Compiling files: +src/usage.kt +End of files \ No newline at end of file diff --git a/jps-plugin/testData/incremental/classSignatureChanged/class.kt b/jps-plugin/testData/incremental/classSignatureChanged/class.kt new file mode 100644 index 00000000000..207a0d6ff20 --- /dev/null +++ b/jps-plugin/testData/incremental/classSignatureChanged/class.kt @@ -0,0 +1,5 @@ +package test + +class Klass { + fun foo() = ":)" +} diff --git a/jps-plugin/testData/incremental/classSignatureChanged/class.kt.new b/jps-plugin/testData/incremental/classSignatureChanged/class.kt.new new file mode 100644 index 00000000000..7100d314c78 --- /dev/null +++ b/jps-plugin/testData/incremental/classSignatureChanged/class.kt.new @@ -0,0 +1,5 @@ +package test + +class Klass { + fun foo() = 123 +} diff --git a/jps-plugin/testData/incremental/classSignatureChanged/usage.kt b/jps-plugin/testData/incremental/classSignatureChanged/usage.kt new file mode 100644 index 00000000000..316732663ce --- /dev/null +++ b/jps-plugin/testData/incremental/classSignatureChanged/usage.kt @@ -0,0 +1,5 @@ +package test + +fun usage(a: Klass) { + a.foo() +}