diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/AbstractAnnotationDeserializerWithTypeAnnotations.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/AbstractAnnotationDeserializerWithTypeAnnotations.kt new file mode 100644 index 00000000000..b88af5341a2 --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/AbstractAnnotationDeserializerWithTypeAnnotations.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.session + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.metadata.ProtoBuf +import org.jetbrains.kotlin.metadata.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.SerializerExtensionProtocol + +open class AbstractAnnotationDeserializerWithTypeAnnotations( + session: FirSession, protocol: SerializerExtensionProtocol +) : AbstractAnnotationDeserializer(session, protocol) { + override fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List { + val annotations = typeProto.getExtension(protocol.typeAnnotation).orEmpty() + return annotations.map { deserializeAnnotation(it, nameResolver) } + } + + override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { + val annotations = typeParameterProto.getExtension(protocol.typeParameterAnnotation).orEmpty() + return annotations.map { deserializeAnnotation(it, nameResolver) } + } +} diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt index ffad8824828..1aabad28c79 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirCommonSessionFactory.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider -import org.jetbrains.kotlin.fir.java.deserialization.MetadataSymbolProvider import org.jetbrains.kotlin.fir.java.deserialization.OptionalAnnotationClassesProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt index cb5a4fb5ed8..9f54c9e97a0 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/KlibBasedAnnotationDeserializer.kt @@ -6,23 +6,7 @@ package org.jetbrains.kotlin.fir.session import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.deserialization.AbstractAnnotationDeserializer -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.KlibMetadataSerializerProtocol -import org.jetbrains.kotlin.metadata.ProtoBuf -import org.jetbrains.kotlin.metadata.deserialization.NameResolver -class KlibBasedAnnotationDeserializer( - session: FirSession -) : AbstractAnnotationDeserializer(session, KlibMetadataSerializerProtocol) { - override fun loadTypeAnnotations(typeProto: ProtoBuf.Type, nameResolver: NameResolver): List { - val annotations = typeProto.getExtension(KlibMetadataProtoBuf.typeAnnotation).orEmpty() - return annotations.map { deserializeAnnotation(it, nameResolver) } - } - - override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List { - val annotations = typeParameterProto.getExtension(KlibMetadataProtoBuf.typeParameterAnnotation).orEmpty() - return annotations.map { deserializeAnnotation(it, nameResolver) } - } -} \ No newline at end of file +class KlibBasedAnnotationDeserializer(session: FirSession) : + AbstractAnnotationDeserializerWithTypeAnnotations(session, KlibMetadataSerializerProtocol) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataBasedAnnotationDeserializer.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataBasedAnnotationDeserializer.kt new file mode 100644 index 00000000000..6743b891184 --- /dev/null +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataBasedAnnotationDeserializer.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.session + +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol + +class MetadataBasedAnnotationDeserializer(session: FirSession) : + AbstractAnnotationDeserializerWithTypeAnnotations(session, BuiltInSerializerProtocol) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/MetadataSymbolProvider.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataSymbolProvider.kt similarity index 93% rename from compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/MetadataSymbolProvider.kt rename to compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataSymbolProvider.kt index 5219379b9c1..944f29aec87 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/MetadataSymbolProvider.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/MetadataSymbolProvider.kt @@ -3,12 +3,13 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.fir.java.deserialization +package org.jetbrains.kotlin.fir.session import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.ThreadSafeMutableState import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.deserialization.* +import org.jetbrains.kotlin.fir.java.deserialization.KotlinBuiltins import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider import org.jetbrains.kotlin.metadata.ProtoBuf @@ -33,7 +34,7 @@ class MetadataSymbolProvider( ) { private val classDataFinder = MetadataClassDataFinder(kotlinClassFinder) - private val annotationDeserializer = FirBuiltinAnnotationDeserializer(session) + private val annotationDeserializer = MetadataBasedAnnotationDeserializer(session) private val constDeserializer = FirConstDeserializer(session, BuiltInSerializerProtocol) @@ -68,7 +69,7 @@ class MetadataSymbolProvider( return ClassMetadataFindResult.Metadata( classData.nameResolver, classData.classProto, - annotationDeserializer = null, + annotationDeserializer = annotationDeserializer, moduleDataProvider.allModuleData.last(), sourceElement = null, classPostProcessor = null diff --git a/compiler/testData/cli/metadata/lambdaWithReceiver.args b/compiler/testData/cli/metadata/lambdaWithReceiver.args new file mode 100644 index 00000000000..bb87c851e5d --- /dev/null +++ b/compiler/testData/cli/metadata/lambdaWithReceiver.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/lambdaWithReceiver.kt +-d +$TEMP_DIR$ +-cp +$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar diff --git a/compiler/testData/cli/metadata/lambdaWithReceiver.kt b/compiler/testData/cli/metadata/lambdaWithReceiver.kt new file mode 100644 index 00000000000..776010cd516 --- /dev/null +++ b/compiler/testData/cli/metadata/lambdaWithReceiver.kt @@ -0,0 +1,7 @@ +fun foo() { + "OK".apply { this } + "OK".apply2 { this } +} + + +inline fun String.apply2(f: String.() -> String) = this.f() diff --git a/compiler/testData/cli/metadata/lambdaWithReceiver.out b/compiler/testData/cli/metadata/lambdaWithReceiver.out new file mode 100644 index 00000000000..1e1da220cbf --- /dev/null +++ b/compiler/testData/cli/metadata/lambdaWithReceiver.out @@ -0,0 +1,4 @@ +compiler/testData/cli/metadata/lambdaWithReceiver.kt:2:18: warning: the expression is unused + "OK".apply { this } + ^ +OK diff --git a/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.args b/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.args new file mode 100644 index 00000000000..50b83534251 --- /dev/null +++ b/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.args @@ -0,0 +1,7 @@ +$TESTDATA_DIR$/lambdaWithReceiver.kt +-d +$TEMP_DIR$ +-cp +$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar +-language-version +2.0 diff --git a/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.out b/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.out new file mode 100644 index 00000000000..86ca0241885 --- /dev/null +++ b/compiler/testData/cli/metadata/lambdaWithReceiverWithFir.out @@ -0,0 +1,2 @@ +warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features +OK diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index 2cb1c8cd717..36e18688602 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -1511,6 +1511,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/metadata/kotlinPackageWithFir.args"); } + @TestMetadata("lambdaWithReceiver.args") + public void testLambdaWithReceiver() throws Exception { + runTest("compiler/testData/cli/metadata/lambdaWithReceiver.args"); + } + + @TestMetadata("lambdaWithReceiverWithFir.args") + public void testLambdaWithReceiverWithFir() throws Exception { + runTest("compiler/testData/cli/metadata/lambdaWithReceiverWithFir.args"); + } + @TestMetadata("moduleName.args") public void testModuleName() throws Exception { runTest("compiler/testData/cli/metadata/moduleName.args");