diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/DebugSymbolRenderer.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/DebugSymbolRenderer.kt index 51849436dcc..502eb12d474 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/DebugSymbolRenderer.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/DebugSymbolRenderer.kt @@ -62,7 +62,7 @@ object DebugSymbolRenderer { is KtNamedConstantValue -> "${renderValue(value.name)} = ${renderValue(value.expression)}" is KtAnnotationCall -> "${renderValue(value.classId)}${value.arguments.joinToString(prefix = "(", postfix = ")") { renderValue(it) }}" - is ReceiverTypeAndAnnotations -> "${renderValue(value.annotations)} ${renderValue(value.type)}" + is KtTypeAndAnnotations -> "${renderValue(value.annotations)} ${renderValue(value.type)}" else -> value::class.simpleName!! } diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtAnnotatedSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtAnnotatedSymbol.kt index 4b164db3e02..58c17768514 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtAnnotatedSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtAnnotatedSymbol.kt @@ -6,11 +6,12 @@ package org.jetbrains.kotlin.idea.frontend.api.symbols.markers import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtCallElement -abstract class KtAnnotationCall { +abstract class KtAnnotationCall : ValidityTokenOwner { abstract val classId: ClassId? abstract val useSiteTarget: AnnotationUseSiteTarget? abstract val psi: KtCallElement? diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtPossibleExtensionSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtPossibleExtensionSymbol.kt index 5c5f5d71ca8..18fff49afc3 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtPossibleExtensionSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtPossibleExtensionSymbol.kt @@ -5,13 +5,17 @@ package org.jetbrains.kotlin.idea.frontend.api.symbols.markers +import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.types.KtType -data class ReceiverTypeAndAnnotations(val type: KtType, val annotations: List) +abstract class KtTypeAndAnnotations : ValidityTokenOwner { + abstract val type: KtType + abstract val annotations: List +} interface KtPossibleExtensionSymbol { - val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? + val receiverType: KtTypeAndAnnotations? val isExtension: Boolean } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt index 70d0009b084..4634667fb68 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterForReceiver.kt @@ -14,13 +14,13 @@ import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.ReceiverTypeAndAnnotations +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtPossibleExtensionSymbol import org.jetbrains.kotlin.psi.KtParameter internal class FirLightParameterForReceiver private constructor( - private val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations, + private val receiverTypeAndAnnotations: KtTypeAndAnnotations, private val context: KtSymbol, methodName: String, method: FirLightMethod @@ -36,7 +36,7 @@ internal class FirLightParameterForReceiver private constructor( if (callableSymbol !is KtPossibleExtensionSymbol) return null if (!callableSymbol.isExtension) return null - val extensionTypeAndAnnotations = callableSymbol.receiverTypeAndAnnotations ?: return null + val extensionTypeAndAnnotations = callableSymbol.receiverType ?: return null return FirLightParameterForReceiver( receiverTypeAndAnnotations = extensionTypeAndAnnotations, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnnotationCall.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnnotationCall.kt index c092f0653f9..e9bd29d5c85 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnnotationCall.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnnotationCall.kt @@ -6,13 +6,58 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.classId +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.idea.fir.findPsi +import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState +import org.jetbrains.kotlin.idea.frontend.api.ValidityToken +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.mapAnnotationParameters +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtCallElement class KtFirAnnotationCall( - override val classId: ClassId, - override val useSiteTarget: AnnotationUseSiteTarget?, - override val psi: KtCallElement?, - override val arguments: List -) : KtAnnotationCall() + containingDeclaration: FirDeclaration, + annotationCall: FirAnnotationCall, + resolveState: FirModuleResolveState, + override val token: ValidityToken, +) : KtAnnotationCall() { + + private val containingDeclarationRef = firRef(containingDeclaration, resolveState) + private val annotationCallRef by weakRef(annotationCall) + + override val psi: KtCallElement? by containingDeclarationRef.withFirAndCache { fir -> + annotationCallRef.findPsi(fir.session) as? KtCallElement + } + + private fun ConeClassLikeType.expandTypeAliasIfNeeded(session: FirSession): ConeClassLikeType { + val firTypeAlias = lookupTag.toSymbol(session) as? FirTypeAliasSymbol ?: return this + val expandedType = firTypeAlias.fir.expandedTypeRef.coneType + return expandedType.fullyExpandedType(session) as? ConeClassLikeType + ?: return this + } + + override val classId: ClassId? by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) { + val declaredCone = annotationCallRef.annotationTypeRef.coneType as? ConeClassLikeType + declaredCone?.expandTypeAliasIfNeeded(it.session)?.classId + } + + override val useSiteTarget: AnnotationUseSiteTarget? get() = annotationCallRef.useSiteTarget + + override val arguments: List by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) { + mapAnnotationParameters(annotationCallRef, it.session).map { (name, expression) -> + KtNamedConstantValue(name, expression.convertConstantExpression()) + } + } +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousObjectSymbol.kt index f4de67d9eb3..592155a07f3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousObjectSymbol.kt @@ -13,10 +13,8 @@ import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtAnonymousObjectSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException @@ -35,8 +33,8 @@ internal class KtFirAnonymousObjectSymbol( override val symbolKind: KtSymbolKind = KtSymbolKind.LOCAL override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val superTypes: List by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir -> diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirClassOrObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirClassOrObjectSymbol.kt index f3dc94d8ac8..4170c408cd3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirClassOrObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirClassOrObjectSymbol.kt @@ -13,9 +13,10 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbol -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef -import org.jetbrains.kotlin.idea.frontend.api.symbols.* +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolModality @@ -45,8 +46,8 @@ internal class KtFirClassOrObjectSymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val isInner: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isInner } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt index 70b96dee051..527c85bb25e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirConstructorSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol @@ -49,8 +48,8 @@ internal class KtFirConstructorSymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val containingClassIdIfNonLocal: ClassId? diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorValueParameterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorValueParameterSymbol.kt index 181879eabfe..ff342fc410d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorValueParameterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorValueParameterSymbol.kt @@ -11,15 +11,15 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef -import org.jetbrains.kotlin.idea.frontend.api.symbols.* +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorParameterSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.Name internal class KtFirConstructorValueParameterSymbol( @@ -41,8 +41,8 @@ internal class KtFirConstructorValueParameterSymbol( } } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val constructorParameterKind: KtConstructorParameterSymbolKind diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFileSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFileSymbol.kt index dadc3bff508..1063e6e15cf 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFileSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFileSymbol.kt @@ -7,12 +7,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFileSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall @@ -35,7 +33,7 @@ internal class KtFirFileSymbol( TODO("Creating pointers for files from library is not supported yet") } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index dde0978d932..0ff303b4a23 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberFunctionSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* @@ -48,20 +47,16 @@ internal class KtFirFunctionSymbol( } } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val isSuspend: Boolean get() = firRef.withFir { it.isSuspend } override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> + override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.let { typeRef -> - val type = builder.buildKtType(typeRef) - val annotations = typeRef.annotations.mapNotNull { - convertAnnotation(it, fir.session) - } - ReceiverTypeAndAnnotations(type, annotations) + KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionValueParameterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionValueParameterSymbol.kt index a2516c1f75c..841c8c9e910 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionValueParameterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionValueParameterSymbol.kt @@ -11,14 +11,13 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.Name internal class KtFirFunctionValueParameterSymbol( @@ -36,8 +35,8 @@ internal class KtFirFunctionValueParameterSymbol( override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override fun createPointer(): KtSymbolPointer { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 4b6b76392ab..9e4216c4d7e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtKotlinPropertySymbol @@ -48,13 +47,9 @@ internal class KtFirKotlinPropertySymbol( override val name: Name get() = firRef.withFir { it.name } override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) } - override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> + override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.let { typeRef -> - val type = builder.buildKtType(typeRef) - val annotations = typeRef.annotations.mapNotNull { - convertAnnotation(it, fir.session) - } - ReceiverTypeAndAnnotations(type, annotations) + KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) } } @@ -71,9 +66,8 @@ internal class KtFirKotlinPropertySymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val callableIdIfNonLocal: FqName? diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 193eb71817b..b5347650c82 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -8,14 +8,11 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor -import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality @@ -54,8 +51,8 @@ internal class KtFirPropertyGetterSymbol( override val type: KtType by firRef.withFirAndCache { builder.buildKtType(it.returnTypeRef) } override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override fun createPointer(): KtSymbolPointer { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt index 0e4a239656c..493fca3ec1d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -8,12 +8,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor -import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSetterParameterSymbol @@ -23,7 +21,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.idea.frontend.api.types.KtType internal class KtFirPropertySetterSymbol( fir: FirPropertyAccessor, @@ -45,8 +42,8 @@ internal class KtFirPropertySetterSymbol( override val modality: KtCommonSymbolModality get() = firRef.withFir(FirResolvePhase.STATUS) { it.modality.getSymbolModality() } override val visibility: KtSymbolVisibility get() = firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() } - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val parameter: KtSetterParameterSymbol by firRef.withFirAndCache { fir -> builder.buildFirSetterParameter(fir.valueParameters.single()) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSetterParameterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSetterParameterSymbol.kt index 798b0d5b957..cbea83aada1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSetterParameterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSetterParameterSymbol.kt @@ -11,14 +11,13 @@ import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSetterParameterSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.Name internal class KtFirSetterParameterSymbol( @@ -37,8 +36,8 @@ internal class KtFirSetterParameterSymbol( override val isVararg: Boolean = false - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override fun createPointer(): KtSymbolPointer { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index c926a7bdfe6..58560eb5fef 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature -import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.utils.convertConstantExpression import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPropertyGetterSymbol @@ -42,13 +41,9 @@ internal class KtFirSyntheticJavaPropertySymbol( override val isVal: Boolean get() = firRef.withFir { it.isVal } override val name: Name get() = firRef.withFir { it.name } override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { fir -> builder.buildKtType(fir.returnTypeRef) } - override val receiverTypeAndAnnotations: ReceiverTypeAndAnnotations? by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> + override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.let { typeRef -> - val type = builder.buildKtType(typeRef) - val annotations = typeRef.annotations.mapNotNull { - convertAnnotation(it, fir.session) - } - ReceiverTypeAndAnnotations(type, annotations) + KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) } } override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } @@ -59,9 +54,8 @@ internal class KtFirSyntheticJavaPropertySymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - - override val annotations: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { - convertAnnotation(it) + override val annotations: List by firRef.withFirAndCache { fir -> + fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } } override val callableIdIfNonLocal: FqName? diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt new file mode 100644 index 00000000000..4756866d8d9 --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAndAnnotations.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2020 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.idea.frontend.api.fir.symbols + +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState +import org.jetbrains.kotlin.idea.frontend.api.ValidityToken +import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotationCall +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations +import org.jetbrains.kotlin.idea.frontend.api.types.KtType + +internal class KtFirTypeAndAnnotations( + containingDeclaration: FirDeclaration, + receiverTypeRef: FirTypeRef, + resolveState: FirModuleResolveState, + override val token: ValidityToken, + private val builder: KtSymbolByFirBuilder +) : KtTypeAndAnnotations() { + + private val containingDeclarationRef = firRef(containingDeclaration, resolveState) + private val receiverWeakTypeRef by weakRef(receiverTypeRef) + + override val type: KtType by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) { + builder.buildKtType(receiverWeakTypeRef) + } + + override val annotations: List by containingDeclarationRef.withFirAndCache { fir -> + receiverWeakTypeRef.annotations.map { + KtFirAnnotationCall(fir, it, resolveState, token) + } + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt index 93351990952..28c8bf744b3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt @@ -55,37 +55,4 @@ internal fun FirExpression.convertConstantExpression(): KtConstantValue = when (this) { is FirConstExpression<*> -> KtSimpleConstantValue(value) else -> KtUnsupportedConstantValue - } - -private fun ConeClassLikeType.expandTypeAliasIfNeeded(session: FirSession): ConeClassLikeType { - val firTypeAlias = lookupTag.toSymbol(session) as? FirTypeAliasSymbol ?: return this - val expandedType = firTypeAlias.fir.expandedTypeRef.coneType - return expandedType.fullyExpandedType(session) as? ConeClassLikeType - ?: return this -} - -internal fun convertAnnotation( - annotationCall: FirAnnotationCall, - session: FirSession -): KtFirAnnotationCall? { - - val declaredCone = annotationCall.annotationTypeRef.coneType as? ConeClassLikeType ?: return null - - val classId = declaredCone.expandTypeAliasIfNeeded(session).classId ?: return null - - val resultList = mapAnnotationParameters(annotationCall, session).map { - KtNamedConstantValue(it.key, it.value.convertConstantExpression()) - } - - return KtFirAnnotationCall( - classId = classId, - useSiteTarget = annotationCall.useSiteTarget, - psi = annotationCall.psi as? KtCallElement, - arguments = resultList - ) -} - -internal fun convertAnnotation(declaration: FirAnnotatedDeclaration): List = - declaration.annotations.mapNotNull { - convertAnnotation(it, declaration.session) } \ No newline at end of file diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/fir/AbstractResolveCallTest.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/fir/AbstractResolveCallTest.kt index f589193a19c..acd1aed5076 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/fir/AbstractResolveCallTest.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/fir/AbstractResolveCallTest.kt @@ -95,7 +95,7 @@ private fun KtCall.stringRepresentation(): String { is KtFunctionLikeSymbol -> buildString { append(if (this@stringValue is KtFunctionSymbol) callableIdIfNonLocal ?: name else "") append("(") - (this@stringValue as? KtFunctionSymbol)?.receiverTypeAndAnnotations?.let { receiver -> + (this@stringValue as? KtFunctionSymbol)?.receiverType?.let { receiver -> append(": ${receiver.type.render()}") if (valueParameters.isNotEmpty()) append(", ") }