[FIR] Introduce MetadataBasedAnnotationDeserializer for compiling common
^KT-56361 Fixed
This commit is contained in:
committed by
Space Team
parent
81ac94b2d7
commit
22fd7921fe
+27
@@ -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) }
|
||||||
|
}
|
||||||
|
}
|
||||||
-1
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.deserialization.SingleModuleDataProvider
|
|||||||
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
|
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
|
||||||
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
||||||
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
|
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.java.deserialization.OptionalAnnotationClassesProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider
|
||||||
|
|||||||
+2
-18
@@ -6,23 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.session
|
package org.jetbrains.kotlin.fir.session
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.library.metadata.KlibMetadataSerializerProtocol
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
|
||||||
|
|
||||||
class KlibBasedAnnotationDeserializer(
|
class KlibBasedAnnotationDeserializer(session: FirSession) :
|
||||||
session: FirSession
|
AbstractAnnotationDeserializerWithTypeAnnotations(session, KlibMetadataSerializerProtocol)
|
||||||
) : 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) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+12
@@ -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)
|
||||||
+4
-3
@@ -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.
|
* 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.FirSession
|
||||||
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.deserialization.*
|
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.fir.scopes.FirKotlinScopeProvider
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider
|
import org.jetbrains.kotlin.load.kotlin.PackageAndMetadataPartProvider
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
@@ -33,7 +34,7 @@ class MetadataSymbolProvider(
|
|||||||
) {
|
) {
|
||||||
private val classDataFinder = MetadataClassDataFinder(kotlinClassFinder)
|
private val classDataFinder = MetadataClassDataFinder(kotlinClassFinder)
|
||||||
|
|
||||||
private val annotationDeserializer = FirBuiltinAnnotationDeserializer(session)
|
private val annotationDeserializer = MetadataBasedAnnotationDeserializer(session)
|
||||||
|
|
||||||
private val constDeserializer = FirConstDeserializer(session, BuiltInSerializerProtocol)
|
private val constDeserializer = FirConstDeserializer(session, BuiltInSerializerProtocol)
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ class MetadataSymbolProvider(
|
|||||||
return ClassMetadataFindResult.Metadata(
|
return ClassMetadataFindResult.Metadata(
|
||||||
classData.nameResolver,
|
classData.nameResolver,
|
||||||
classData.classProto,
|
classData.classProto,
|
||||||
annotationDeserializer = null,
|
annotationDeserializer = annotationDeserializer,
|
||||||
moduleDataProvider.allModuleData.last(),
|
moduleDataProvider.allModuleData.last(),
|
||||||
sourceElement = null,
|
sourceElement = null,
|
||||||
classPostProcessor = null
|
classPostProcessor = null
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
$TESTDATA_DIR$/lambdaWithReceiver.kt
|
||||||
|
-d
|
||||||
|
$TEMP_DIR$
|
||||||
|
-cp
|
||||||
|
$TESTDATA_DIR$/../../../../dist/common/kotlin-stdlib-common.jar
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo() {
|
||||||
|
"OK".apply { this }
|
||||||
|
"OK".apply2 { this }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline fun String.apply2(f: String.() -> String) = this.f()
|
||||||
@@ -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");
|
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")
|
@TestMetadata("moduleName.args")
|
||||||
public void testModuleName() throws Exception {
|
public void testModuleName() throws Exception {
|
||||||
runTest("compiler/testData/cli/metadata/moduleName.args");
|
runTest("compiler/testData/cli/metadata/moduleName.args");
|
||||||
|
|||||||
Reference in New Issue
Block a user