[FIR] Introduce MetadataBasedAnnotationDeserializer for compiling common

^KT-56361 Fixed
This commit is contained in:
Kirill Rakhman
2023-02-03 17:51:50 +01:00
committed by Space Team
parent 81ac94b2d7
commit 22fd7921fe
11 changed files with 80 additions and 22 deletions
@@ -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<FirAnnotation> {
val annotations = typeProto.getExtension(protocol.typeAnnotation).orEmpty()
return annotations.map { deserializeAnnotation(it, nameResolver) }
}
override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List<FirAnnotation> {
val annotations = typeParameterProto.getExtension(protocol.typeParameterAnnotation).orEmpty()
return annotations.map { deserializeAnnotation(it, nameResolver) }
}
}
@@ -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
@@ -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<FirAnnotation> {
val annotations = typeProto.getExtension(KlibMetadataProtoBuf.typeAnnotation).orEmpty()
return annotations.map { deserializeAnnotation(it, nameResolver) }
}
override fun loadTypeParameterAnnotations(typeParameterProto: ProtoBuf.TypeParameter, nameResolver: NameResolver): List<FirAnnotation> {
val annotations = typeParameterProto.getExtension(KlibMetadataProtoBuf.typeParameterAnnotation).orEmpty()
return annotations.map { deserializeAnnotation(it, nameResolver) }
}
}
class KlibBasedAnnotationDeserializer(session: FirSession) :
AbstractAnnotationDeserializerWithTypeAnnotations(session, KlibMetadataSerializerProtocol)
@@ -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)
@@ -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
@@ -0,0 +1,5 @@
$TESTDATA_DIR$/lambdaWithReceiver.kt
-d
$TEMP_DIR$
-cp
$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar
+7
View File
@@ -0,0 +1,7 @@
fun foo() {
"OK".apply { this }
"OK".apply2 { this }
}
inline fun String.apply2(f: String.() -> String) = this.f()
+4
View File
@@ -0,0 +1,4 @@
compiler/testData/cli/metadata/lambdaWithReceiver.kt:2:18: warning: the expression is unused
"OK".apply { this }
^
OK
@@ -0,0 +1,7 @@
$TESTDATA_DIR$/lambdaWithReceiver.kt
-d
$TEMP_DIR$
-cp
$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar
-language-version
2.0
@@ -0,0 +1,2 @@
warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features
OK
@@ -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");