From ce38b4c43f81c057deca32932a11ede4aac5fcf3 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 14 Feb 2015 03:27:05 +0300 Subject: [PATCH] Serialize descriptors for local/anonymous classes on JVM Reflection needs this information to work for local classes and anonymous objects Original commit: 6ce8d6bd2ea46426cdd5885e9e650248e27a5027 --- .../jps/incremental/IncrementalCacheImpl.kt | 61 ++++++++----------- .../build/IncrementalJpsTestGenerated.java | 6 ++ .../pureKotlin/anonymousObjectChanged/a.kt | 5 ++ .../anonymousObjectChanged/a.kt.new | 6 ++ .../anonymousObjectChanged/build.log | 15 +++++ .../anonymousObjectChanged/usage.kt | 5 ++ 6 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/usage.kt 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 273806777cf..a45bc64f8ad 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 @@ -30,11 +30,9 @@ import org.jetbrains.org.objectweb.asm.* import com.intellij.util.io.EnumeratorStringDescriptor import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.resolve.jvm.JvmClassName -import java.util.HashSet import org.jetbrains.kotlin.load.kotlin.incremental.cache.IncrementalCache import java.util.HashMap import org.jetbrains.kotlin.load.kotlin.PackageClassUtils -import com.intellij.openapi.util.io.FileUtil import java.security.MessageDigest import org.jetbrains.jps.incremental.storage.StorageOwner import org.jetbrains.jps.builders.storage.StorageProvider @@ -137,41 +135,34 @@ public class IncrementalCacheImpl(targetDataRoot: File) : StorageOwner, Incremen dirtyOutputClassesMap.notDirty(className.getInternalName()) sourceFiles.forEach { sourceToClassesMap.addSourceToClass(it, className) } - val annotationDataEncoded = header.annotationData - if (annotationDataEncoded != null) { - val data = BitEncoding.decodeBytes(annotationDataEncoded) - return when { - header.isCompatiblePackageFacadeKind() -> - getRecompilationDecision( - protoChanged = protoMap.put(className, data), - constantsChanged = false, - inlinesChanged = false - ) - header.isCompatibleClassKind() -> - getRecompilationDecision( - protoChanged = protoMap.put(className, data), - constantsChanged = constantsMap.process(className, fileBytes), - inlinesChanged = inlineFunctionsMap.process(className, fileBytes) - ) - else -> { - throw IllegalStateException("Unexpected kind with annotationData: ${header.kind}, isCompatible: ${header.isCompatibleAbiVersion}") - } + return when { + header.isCompatiblePackageFacadeKind() -> + getRecompilationDecision( + protoChanged = protoMap.put(className, BitEncoding.decodeBytes(header.annotationData)), + constantsChanged = false, + inlinesChanged = false + ) + header.isCompatibleClassKind() -> + getRecompilationDecision( + protoChanged = protoMap.put(className, BitEncoding.decodeBytes(header.annotationData)), + constantsChanged = constantsMap.process(className, fileBytes), + inlinesChanged = inlineFunctionsMap.process(className, fileBytes) + ) + header.syntheticClassKind == JvmAnnotationNames.KotlinSyntheticClass.Kind.PACKAGE_PART -> { + assert(sourceFiles.size() == 1) { "Package part from several source files: $sourceFiles" } + + packagePartMap.addPackagePart(className) + + getRecompilationDecision( + protoChanged = false, + constantsChanged = constantsMap.process(className, fileBytes), + inlinesChanged = inlineFunctionsMap.process(className, fileBytes) + ) + } + else -> { + DO_NOTHING } } - - if (header.syntheticClassKind == JvmAnnotationNames.KotlinSyntheticClass.Kind.PACKAGE_PART) { - assert(sourceFiles.size() == 1) { "Package part from several source files: $sourceFiles" } - - packagePartMap.addPackagePart(className) - - return getRecompilationDecision( - protoChanged = false, - constantsChanged = constantsMap.process(className, fileBytes), - inlinesChanged = inlineFunctionsMap.process(className, fileBytes) - ) - } - - return DO_NOTHING } public fun clearCacheForRemovedClasses(): RecompilationDecision { diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 061b7694af7..a8e6b201fb0 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -135,6 +135,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("anonymousObjectChanged") + public void testAnonymousObjectChanged() throws Exception { + String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/"); + doTest(fileName); + } + @TestMetadata("classInlineFunctionChanged") public void testClassInlineFunctionChanged() throws Exception { String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/classInlineFunctionChanged/"); diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt new file mode 100644 index 00000000000..842232877de --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt @@ -0,0 +1,5 @@ +package a + +fun foo() = object { + fun bar() = ":(" +} diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new new file mode 100644 index 00000000000..6255f915194 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/a.kt.new @@ -0,0 +1,6 @@ +package a + +// Signatures in the class "...$main$1" have changed, thus we need to recompile the whole module +fun foo() = object { + fun baz() = ":)" +} diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log new file mode 100644 index 00000000000..d2598525c01 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/build.log @@ -0,0 +1,15 @@ +Cleaning output files: +out/production/module/a/APackage$a$*$foo$1.class +out/production/module/a/APackage$a$*.class +out/production/module/a/APackage.class +End of files +Compiling files: +src/a.kt +End of files +Cleaning output files: +out/production/module/usage/UsagePackage$usage$*.class +out/production/module/usage/UsagePackage.class +End of files +Compiling files: +src/usage.kt +End of files \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/usage.kt b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/usage.kt new file mode 100644 index 00000000000..acc1e2b0f5a --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/anonymousObjectChanged/usage.kt @@ -0,0 +1,5 @@ +package usage + +import a.foo + +fun bar() = foo()