K2: use MutableOrEmptyList for annotations storage in FIR elements

This commit is contained in:
Mikhail Glukhikh
2022-12-14 16:53:40 +01:00
committed by Space Team
parent be5394e211
commit 582b640bec
306 changed files with 1168 additions and 203 deletions
@@ -108,8 +108,6 @@ abstract class FirJavaFacade(
variance = INVARIANT
isReified = false
javaTypeParameterStack.addParameter(this@toFirTypeParameter, symbol)
// TODO: should be lazy (in case annotations refer to the containing class)
annotations.addFromJava(session, this@toFirTypeParameter, javaTypeParameterStack)
this.containingDeclarationSymbol = containingDeclarationSymbol
for (upperBound in this@toFirTypeParameter.upperBounds) {
bounds += upperBound.toFirJavaTypeRef(session, javaTypeParameterStack)
@@ -119,6 +117,9 @@ abstract class FirJavaFacade(
type = ConeFlexibleType(builtinTypes.anyType.type, builtinTypes.nullableAnyType.type)
}
}
}.apply {
// TODO: should be lazy (in case annotations refer to the containing class)
addAnnotationsFromJava(session, this@toFirTypeParameter, javaTypeParameterStack)
}
}
@@ -181,7 +182,7 @@ abstract class FirJavaFacade(
// 1. Resolve annotations
// 2. Enhance type parameter bounds - may refer to each other, take default nullability from annotations
// 3. Enhance super types - may refer to type parameter bounds, take default nullability from annotations
firJavaClass.annotations.addFromJava(session, javaClass, javaTypeParameterStack)
firJavaClass.addAnnotationsFromJava(session, javaClass, javaTypeParameterStack)
enhancement.enhanceTypeParameterBoundsAfterFirstRound(firJavaClass.typeParameters, initialBounds)
@@ -511,10 +512,10 @@ abstract class FirJavaFacade(
returnTypeRef = returnType.toFirJavaTypeRef(session, javaTypeParameterStack)
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = javaOrigin(javaField.isFromSource)
// TODO: check if this works properly with annotations that take the enum class as an argument
annotations.addFromJava(session, javaField, javaTypeParameterStack)
}.apply {
containingClassForStaticMemberAttr = ConeClassLikeLookupTagImpl(classId)
// TODO: check if this works properly with annotations that take the enum class as an argument
addAnnotationsFromJava(session, javaField, javaTypeParameterStack)
}
else -> buildJavaField {
source = javaField.toSourceElement()
@@ -11,8 +11,10 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.MutableOrEmptyList
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -36,7 +38,7 @@ class FirJavaClass @FirImplementationDetail internal constructor(
override var resolvePhase: FirResolvePhase,
override val name: Name,
override val origin: FirDeclarationOrigin.Java,
override val annotations: MutableList<FirAnnotation>,
override var annotations: MutableOrEmptyList<FirAnnotation>,
override var status: FirDeclarationStatus,
override val classKind: ClassKind,
override val declarations: MutableList<FirDeclaration>,
@@ -108,6 +110,10 @@ class FirJavaClass @FirImplementationDetail internal constructor(
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
annotations = newAnnotations.toMutableOrEmpty()
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirJavaClass {
annotations.transformInplace(transformer, data)
return this
@@ -152,7 +158,7 @@ class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationContainerBuil
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES,
name,
origin = javaOrigin(isFromSource),
annotations,
annotations.toMutableOrEmpty(),
status,
classKind,
declarations,
@@ -105,6 +105,10 @@ class FirJavaConstructor @FirImplementationDetail constructor(
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutating annotations for FirJava* is not supported")
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
return this
}
@@ -125,6 +125,10 @@ class FirJavaField @FirImplementationDetail constructor(
returnTypeRef = newReturnTypeRef
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutating annotations for FirJava* is not supported")
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirJavaField {
return this
}
@@ -139,6 +139,10 @@ class FirJavaMethod @FirImplementationDetail constructor(
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutating annotations for FirJava* is not supported")
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirSimpleFunction {
return this
}
@@ -142,6 +142,10 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutating annotations for FirJava* is not supported")
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirValueParameter {
return this
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.java.deserialization
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.builder.toMutableOrEmpty
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.getDeprecationsProvider
@@ -144,7 +145,7 @@ class JvmClassFileBasedSymbolProvider(
kotlinClass: KotlinClassFinder.Result.KotlinClass,
symbol: FirRegularClassSymbol
) {
val annotations = symbol.fir.annotations as MutableList<FirAnnotation>
val annotations = mutableListOf<FirAnnotation>()
kotlinClass.kotlinJvmBinaryClass.loadClassAnnotations(
object : KotlinJvmBinaryClass.AnnotationVisitor {
override fun visitAnnotation(classId: ClassId, source: SourceElement): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
@@ -156,6 +157,7 @@ class JvmClassFileBasedSymbolProvider(
},
kotlinClass.byteContent,
)
symbol.fir.replaceAnnotations(annotations.toMutableOrEmpty())
symbol.fir.replaceDeprecationsProvider(symbol.fir.getDeprecationsProvider(session.firCachesFactory))
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.java
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirConstructor
@@ -48,12 +49,14 @@ internal fun JavaAnnotationOwner.convertAnnotationsToFir(
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
): List<FirAnnotation> = annotations.convertAnnotationsToFir(session, javaTypeParameterStack)
internal fun MutableList<FirAnnotation>.addFromJava(
internal fun FirAnnotationContainer.addAnnotationsFromJava(
session: FirSession,
javaAnnotationOwner: JavaAnnotationOwner,
javaTypeParameterStack: JavaTypeParameterStack
) {
javaAnnotationOwner.annotations.mapTo(this) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
val annotations = mutableListOf<FirAnnotation>()
javaAnnotationOwner.annotations.mapTo(annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
replaceAnnotations(annotations)
}
internal fun JavaValueParameter.toFirValueParameter(
@@ -49,6 +49,10 @@ class FirJavaTypeRef(
return this
}
override fun replaceAnnotations(newAnnotations: List<FirAnnotation>) {
throw AssertionError("Mutating annotations for FirJava* is not supported")
}
override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirUserTypeRef {
return this
}