[klib] Fix serialization of missing annotations
^KT-42490 ^KT-44625
This commit is contained in:
committed by
Space Team
parent
90d702ed27
commit
17e9a6a781
+20
@@ -62,6 +62,11 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt
|
||||
for (annotation in descriptor.nonSourceAnnotations) {
|
||||
proto.addExtensionOrNull(protocol.functionAnnotation, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
protocol.functionExtensionReceiverAnnotation?.let { extension ->
|
||||
for (annotation in descriptor.extensionReceiverParameter?.nonSourceAnnotations.orEmpty()) {
|
||||
proto.addExtensionOrNull(extension, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun serializeProperty(
|
||||
@@ -79,6 +84,21 @@ abstract class KotlinSerializerExtensionBase(private val protocol: SerializerExt
|
||||
for (annotation in descriptor.setter?.nonSourceAnnotations.orEmpty()) {
|
||||
proto.addExtensionOrNull(protocol.propertySetterAnnotation, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
protocol.propertyExtensionReceiverAnnotation?.let { extension ->
|
||||
for (annotation in descriptor.extensionReceiverParameter?.nonSourceAnnotations.orEmpty()) {
|
||||
proto.addExtensionOrNull(extension, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
}
|
||||
protocol.propertyBackingFieldAnnotation?.let { extension ->
|
||||
for (annotation in descriptor.backingField?.nonSourceAnnotations.orEmpty()) {
|
||||
proto.addExtensionOrNull(extension, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
}
|
||||
protocol.propertyDelegatedFieldAnnotation?.let { extension ->
|
||||
for (annotation in descriptor.delegateField?.nonSourceAnnotations.orEmpty()) {
|
||||
proto.addExtensionOrNull(extension, annotationSerializer.serializeAnnotation(annotation))
|
||||
}
|
||||
}
|
||||
val constantInitializer = descriptor.compileTimeInitializer ?: return
|
||||
if (constantInitializer !is NullValue) {
|
||||
proto.setExtension(protocol.compileTimeValue, annotationSerializer.valueProto(constantInitializer).build())
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package test
|
||||
|
||||
annotation class Ann
|
||||
|
||||
@field:Ann
|
||||
var x: Int = 5
|
||||
@delegate:Ann
|
||||
var y: Int by ::x
|
||||
|
||||
class A {
|
||||
@field:Ann
|
||||
var x: Int = 5
|
||||
@delegate:Ann
|
||||
var y: Int by ::x
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package test
|
||||
|
||||
@field:test.Ann public var x: kotlin.Int
|
||||
@delegate:test.Ann public var y: kotlin.Int
|
||||
|
||||
public final class A {
|
||||
public constructor A()
|
||||
@field:test.Ann public final var x: kotlin.Int
|
||||
@delegate:test.Ann public final var y: kotlin.Int
|
||||
}
|
||||
|
||||
public final annotation class Ann : kotlin.Annotation {
|
||||
public constructor Ann()
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package test
|
||||
|
||||
annotation class Ann
|
||||
@Ann fun @receiver:Ann Int.foo(@Ann arg: Int) = 10
|
||||
@Ann val @receiver:Ann Int.bar
|
||||
get() = 5
|
||||
|
||||
class A {
|
||||
@Ann fun @receiver:Ann Int.foo(@Ann arg: Int) = 10
|
||||
@Ann val @receiver:Ann Int.bar
|
||||
get() = 5
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package test
|
||||
|
||||
@test.Ann public val @receiver:test.Ann kotlin.Int.bar: kotlin.Int
|
||||
@test.Ann public fun @receiver:test.Ann kotlin.Int.foo(/*0*/ @test.Ann arg: kotlin.Int): kotlin.Int
|
||||
|
||||
public final class A {
|
||||
public constructor A()
|
||||
@test.Ann public final val @receiver:test.Ann kotlin.Int.bar: kotlin.Int
|
||||
@test.Ann public final fun @receiver:test.Ann kotlin.Int.foo(/*0*/ @test.Ann arg: kotlin.Int): kotlin.Int
|
||||
}
|
||||
|
||||
public final annotation class Ann : kotlin.Annotation {
|
||||
public constructor Ann()
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright 2010-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.serialization.klib
|
||||
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices
|
||||
import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME
|
||||
import org.jetbrains.kotlin.resolve.CompilerEnvironment
|
||||
import org.jetbrains.kotlin.serialization.NonStableParameterNamesSerializationTest
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
|
||||
import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil.readModuleAsProto
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
import org.jetbrains.kotlin.test.KlibTestUtil
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
|
||||
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator
|
||||
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparatorAdaptor
|
||||
import org.jetbrains.kotlin.utils.JsMetadataVersion
|
||||
import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils
|
||||
import org.jetbrains.kotlin.utils.sure
|
||||
import java.io.File
|
||||
|
||||
class KotlinKlibSerializerTest : TestCaseWithTmpdir() {
|
||||
private val BASE_DIR = "compiler/testData/serialization"
|
||||
|
||||
private fun doTest(fileName: String) {
|
||||
val source = "$BASE_DIR/$fileName"
|
||||
val klibName = File(source).nameWithoutExtension
|
||||
val klibFile = File(tmpdir, "$klibName.klib")
|
||||
KlibTestUtil.compileCommonSourcesToKlib(listOf(File(source)), klibName, klibFile)
|
||||
|
||||
val module = KlibTestUtil.deserializeKlibToCommonModule(klibFile)
|
||||
|
||||
RecursiveDescriptorComparatorAdaptor.validateAndCompareDescriptorWithFile(
|
||||
module.getPackage(TEST_PACKAGE_FQNAME),
|
||||
RecursiveDescriptorComparator.DONT_INCLUDE_METHODS_OF_OBJECT,
|
||||
File(source.replace(".kt", ".txt"))
|
||||
)
|
||||
}
|
||||
|
||||
fun testSimple() {
|
||||
doTest("builtinsSerializer/simple.kt")
|
||||
}
|
||||
|
||||
fun testNestedClassesAndObjects() {
|
||||
doTest("builtinsSerializer/nestedClassesAndObjects.kt")
|
||||
}
|
||||
|
||||
fun testCompileTimeConstants() {
|
||||
doTest("builtinsSerializer/compileTimeConstants.kt")
|
||||
}
|
||||
|
||||
fun testAnnotationTargets() {
|
||||
doTest("builtinsSerializer/annotationTargets.kt")
|
||||
}
|
||||
|
||||
fun testAnnotatedEnumEntry() {
|
||||
doTest("builtinsSerializer/annotatedEnumEntry.kt")
|
||||
}
|
||||
|
||||
fun testPrimitives() {
|
||||
doTest("builtinsSerializer/annotationArguments/primitives.kt")
|
||||
}
|
||||
|
||||
fun testPrimitiveArrays() {
|
||||
doTest("builtinsSerializer/annotationArguments/primitiveArrays.kt")
|
||||
}
|
||||
|
||||
fun testString() {
|
||||
doTest("builtinsSerializer/annotationArguments/string.kt")
|
||||
}
|
||||
|
||||
fun testAnnotation() {
|
||||
doTest("builtinsSerializer/annotationArguments/annotation.kt")
|
||||
}
|
||||
|
||||
fun testEnum() {
|
||||
doTest("builtinsSerializer/annotationArguments/enum.kt")
|
||||
}
|
||||
|
||||
fun testPropertyAccessorAnnotations() {
|
||||
doTest("builtinsSerializer/propertyAccessorAnnotations.kt")
|
||||
}
|
||||
|
||||
fun testReceiverAnnotations() {
|
||||
doTest("klib/receiverAnnotations.kt")
|
||||
}
|
||||
|
||||
fun testFieldAnnotations() {
|
||||
doTest("klib/fieldAnnotations.kt")
|
||||
}
|
||||
}
|
||||
@@ -72,6 +72,7 @@ extend org.jetbrains.kotlin.metadata.Constructor {
|
||||
|
||||
extend org.jetbrains.kotlin.metadata.Function {
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation function_annotation = 170;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation function_extension_receiver_annotation = 171;
|
||||
optional int32 function_file = 172 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true];
|
||||
optional string function_kdoc = 174 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true];
|
||||
optional DescriptorUniqId function_uniq_id = 173;
|
||||
@@ -81,6 +82,9 @@ extend org.jetbrains.kotlin.metadata.Property {
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_annotation = 170;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_getter_annotation = 177;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_setter_annotation = 178;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_backing_field_annotation = 181;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_delegated_field_annotation = 182;
|
||||
repeated org.jetbrains.kotlin.metadata.Annotation property_extension_receiver_annotation = 183;
|
||||
optional org.jetbrains.kotlin.metadata.Annotation.Argument.Value compile_time_value = 173;
|
||||
optional int32 property_file = 176 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true];
|
||||
optional string property_kdoc = 180 [(org.jetbrains.kotlin.metadata.skip_in_comparison) = true];
|
||||
|
||||
+68
@@ -16,12 +16,16 @@ public final class KlibMetadataProtoBuf {
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.constructorKdoc);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.constructorUniqId);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionExtensionReceiverAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionFile);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionKdoc);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.functionUniqId);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyGetterAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertySetterAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyBackingFieldAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyDelegatedFieldAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyExtensionReceiverAnnotation);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.compileTimeValue);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyFile);
|
||||
registry.add(org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf.propertyKdoc);
|
||||
@@ -2661,6 +2665,22 @@ public final class KlibMetadataProtoBuf {
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int FUNCTION_EXTENSION_RECEIVER_ANNOTATION_FIELD_NUMBER = 171;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Function { ... }</code>
|
||||
*/
|
||||
public static final
|
||||
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Function,
|
||||
java.util.List<org.jetbrains.kotlin.metadata.ProtoBuf.Annotation>> functionExtensionReceiverAnnotation = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
.newRepeatedGeneratedExtension(
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Function.getDefaultInstance(),
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.getDefaultInstance(),
|
||||
null,
|
||||
171,
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int FUNCTION_FILE_FIELD_NUMBER = 172;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Function { ... }</code>
|
||||
@@ -2757,6 +2777,54 @@ public final class KlibMetadataProtoBuf {
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int PROPERTY_BACKING_FIELD_ANNOTATION_FIELD_NUMBER = 181;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Property { ... }</code>
|
||||
*/
|
||||
public static final
|
||||
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property,
|
||||
java.util.List<org.jetbrains.kotlin.metadata.ProtoBuf.Annotation>> propertyBackingFieldAnnotation = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
.newRepeatedGeneratedExtension(
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property.getDefaultInstance(),
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.getDefaultInstance(),
|
||||
null,
|
||||
181,
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int PROPERTY_DELEGATED_FIELD_ANNOTATION_FIELD_NUMBER = 182;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Property { ... }</code>
|
||||
*/
|
||||
public static final
|
||||
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property,
|
||||
java.util.List<org.jetbrains.kotlin.metadata.ProtoBuf.Annotation>> propertyDelegatedFieldAnnotation = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
.newRepeatedGeneratedExtension(
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property.getDefaultInstance(),
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.getDefaultInstance(),
|
||||
null,
|
||||
182,
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int PROPERTY_EXTENSION_RECEIVER_ANNOTATION_FIELD_NUMBER = 183;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Property { ... }</code>
|
||||
*/
|
||||
public static final
|
||||
org.jetbrains.kotlin.protobuf.GeneratedMessageLite.GeneratedExtension<
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property,
|
||||
java.util.List<org.jetbrains.kotlin.metadata.ProtoBuf.Annotation>> propertyExtensionReceiverAnnotation = org.jetbrains.kotlin.protobuf.GeneratedMessageLite
|
||||
.newRepeatedGeneratedExtension(
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Property.getDefaultInstance(),
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.getDefaultInstance(),
|
||||
null,
|
||||
183,
|
||||
org.jetbrains.kotlin.protobuf.WireFormat.FieldType.MESSAGE,
|
||||
false,
|
||||
org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.class);
|
||||
public static final int COMPILE_TIME_VALUE_FIELD_NUMBER = 173;
|
||||
/**
|
||||
* <code>extend .org.jetbrains.kotlin.metadata.Property { ... }</code>
|
||||
|
||||
+4
@@ -14,9 +14,13 @@ object KlibMetadataSerializerProtocol : SerializerExtensionProtocol(
|
||||
KlibMetadataProtoBuf.constructorAnnotation,
|
||||
KlibMetadataProtoBuf.classAnnotation,
|
||||
KlibMetadataProtoBuf.functionAnnotation,
|
||||
KlibMetadataProtoBuf.functionExtensionReceiverAnnotation,
|
||||
KlibMetadataProtoBuf.propertyAnnotation,
|
||||
KlibMetadataProtoBuf.propertyGetterAnnotation,
|
||||
KlibMetadataProtoBuf.propertySetterAnnotation,
|
||||
KlibMetadataProtoBuf.propertyExtensionReceiverAnnotation,
|
||||
KlibMetadataProtoBuf.propertyBackingFieldAnnotation,
|
||||
KlibMetadataProtoBuf.propertyDelegatedFieldAnnotation,
|
||||
KlibMetadataProtoBuf.enumEntryAnnotation,
|
||||
KlibMetadataProtoBuf.compileTimeValue,
|
||||
KlibMetadataProtoBuf.parameterAnnotation,
|
||||
|
||||
Reference in New Issue
Block a user