From 8891a337e290a8c8ba05a3370263c01692caf296 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Wed, 16 Dec 2020 21:01:09 +0300 Subject: [PATCH] [FIR IDE] Implement type annotations for fir symbols --- .../KotlinFirLookupElementFactory.kt | 9 +-- .../weighers/ExpectedTypeWeigher.kt | 2 +- .../api/symbols/KtAnonymousObjectSymbol.kt | 3 +- .../frontend/api/symbols/KtClassLikeSymbol.kt | 2 +- .../frontend/api/symbols/markers/markers.kt | 2 +- .../classes/FirLightClassForEnumEntry.kt | 7 +- .../idea/asJava/classes/firLightClassUtils.kt | 6 +- .../asJava/fields/FirLightFieldEnumEntry.kt | 2 +- .../fields/FirLightFieldForPropertySymbol.kt | 4 +- .../kotlin/idea/asJava/firLightUtils.kt | 25 ++++--- .../FirLightAccessorMethodForSymbol.kt | 4 +- .../methods/FirLightSimpleMethodForSymbol.kt | 4 +- .../FirLightParameterBaseForSymbol.kt | 19 ++--- .../FirLightParameterForReceiver.kt | 2 +- .../parameters/FirLightTypeParameter.kt | 8 +- .../components/KtFirExpressionTypeProvider.kt | 9 +-- .../api/fir/symbols/KtFirAnnotationCall.kt | 37 +++++---- .../symbols/KtFirAnonymousFunctionSymbol.kt | 8 +- .../fir/symbols/KtFirAnonymousObjectSymbol.kt | 15 ++-- .../fir/symbols/KtFirClassOrObjectSymbol.kt | 18 ++--- .../api/fir/symbols/KtFirConstructorSymbol.kt | 12 ++- .../KtFirConstructorValueParameterSymbol.kt | 13 ++-- .../api/fir/symbols/KtFirEnumEntrySymbol.kt | 7 +- .../api/fir/symbols/KtFirFileSymbol.kt | 2 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 16 ++-- .../KtFirFunctionValueParameterSymbol.kt | 11 ++- .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 6 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 16 ++-- .../fir/symbols/KtFirLocalVariableSymbol.kt | 6 +- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 15 ++-- .../fir/symbols/KtFirPropertySetterSymbol.kt | 5 +- .../fir/symbols/KtFirSetterParameterSymbol.kt | 14 ++-- .../KtFirSyntheticJavaPropertySymbol.kt | 18 ++--- .../fir/symbols/KtFirTypeAndAnnotations.kt | 75 ++++++++++++++----- .../fir/symbols/KtFirTypeParameterSymbol.kt | 2 +- .../api/fir/symbols/firSymbolUtils.kt | 16 +++- .../api/fir/utils/FirRefWithValidityCheck.kt | 2 +- .../idea/frontend/api/fir/utils/firUtils.kt | 21 +++--- .../api/fir/AbstractResolveCallTest.kt | 6 +- 39 files changed, 258 insertions(+), 191 deletions(-) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt index 01d79ba6a5a..5f42e22a93b 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirLookupElementFactory.kt @@ -19,7 +19,6 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol -import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtTypeArgumentList @@ -67,7 +66,7 @@ private class TypeParameterLookupElementFactory { private class VariableLookupElementFactory { fun KtAnalysisSession.createLookup(symbol: KtVariableLikeSymbol): LookupElementBuilder { return LookupElementBuilder.create(UniqueLookupObject(), symbol.name.asString()) - .withTypeText(symbol.type.render()) + .withTypeText(symbol.annotatedType.type.render()) .markIfSyntheticJavaProperty(symbol) .withInsertHandler(createInsertHandler(symbol)) } @@ -95,7 +94,7 @@ private class FunctionLookupElementFactory { return try { LookupElementBuilder.create(UniqueLookupObject(), symbol.name.asString()) .withTailText(getTailText(symbol), true) - .withTypeText(symbol.type.render()) + .withTypeText(symbol.annotatedType.type.render()) .withInsertHandler(createInsertHandler(symbol)) } catch (e: Throwable) { if (e is ControlFlowException) throw e @@ -110,7 +109,7 @@ private class FunctionLookupElementFactory { private fun KtAnalysisSession.insertLambdaBraces(symbol: KtFunctionSymbol): Boolean { val singleParam = symbol.valueParameters.singleOrNull() - return singleParam != null && !singleParam.hasDefaultValue && singleParam.type.isBuiltInFunctionalType() + return singleParam != null && !singleParam.hasDefaultValue && singleParam.annotatedType.type.isBuiltInFunctionalType() } private fun KtAnalysisSession.createInsertHandler(symbol: KtFunctionSymbol): InsertHandler { @@ -232,7 +231,7 @@ private object ShortNamesRenderer { function.valueParameters.joinToString(", ", "(", ")") { renderFunctionParameter(it) } private fun KtAnalysisSession.renderFunctionParameter(param: KtFunctionParameterSymbol): String = - "${if (param.isVararg) "vararg " else ""}${param.name.asString()}: ${param.type.render()}" + "${if (param.isVararg) "vararg " else ""}${param.name.asString()}: ${param.annotatedType.type.render()}" } private fun Document.isTextAt(offset: Int, text: String) = diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/weighers/ExpectedTypeWeigher.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/weighers/ExpectedTypeWeigher.kt index d77a1794f87..c44b669b31d 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/weighers/ExpectedTypeWeigher.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/weighers/ExpectedTypeWeigher.kt @@ -31,7 +31,7 @@ internal object ExpectedTypeWeigher { ) = when { expectedType == null -> MatchesExpectedType.NON_TYPABLE symbol !is KtTypedSymbol -> MatchesExpectedType.NON_TYPABLE - else -> MatchesExpectedType.matches(symbol.type isSubTypeOf expectedType) + else -> MatchesExpectedType.matches(symbol.annotatedType.type isSubTypeOf expectedType) } diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtAnonymousObjectSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtAnonymousObjectSymbol.kt index 6c5db0b8210..149a72e7d72 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtAnonymousObjectSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtAnonymousObjectSymbol.kt @@ -8,11 +8,12 @@ package org.jetbrains.kotlin.idea.frontend.api.symbols import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.types.KtType abstract class KtAnonymousObjectSymbol : KtSymbolWithKind, KtAnnotatedSymbol, KtSymbolWithMembers { - abstract val superTypes: List + abstract val superTypes: List abstract override fun createPointer(): KtSymbolPointer } \ No newline at end of file diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt index 3aa75dc4ca6..a7eef0dbde4 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtClassLikeSymbol.kt @@ -44,7 +44,7 @@ abstract class KtClassOrObjectSymbol : KtClassLikeSymbol(), abstract val companionObject: KtClassOrObjectSymbol? - abstract val superTypes: List + abstract val superTypes: List abstract val primaryConstructor: KtConstructorSymbol? diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/markers.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/markers.kt index b1221a84399..bebe2ed0c23 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/markers.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/markers.kt @@ -15,7 +15,7 @@ interface KtNamedSymbol : KtSymbol { } interface KtTypedSymbol : KtSymbol { - val type: KtType + val annotatedType: KtTypeAndAnnotations } interface KtSymbolWithTypeParameters { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt index 97648a2cd1a..7167ccd449f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/FirLightClassForEnumEntry.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.idea.asJava.FirLightPsiJavaCodeReferenceElementWithN import org.jetbrains.kotlin.idea.asJava.classes.createMethods import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol -import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.psi.KtClassOrObject @@ -83,9 +82,9 @@ internal class FirLightClassForEnumEntry( private val _extendsList: PsiReferenceList? by lazyPub { - val mappedType = (enumEntrySymbol.type as? KtClassType)?.let { - it.mapSupertype(this@FirLightClassForEnumEntry) - } ?: return@lazyPub null + val mappedType = enumEntrySymbol.annotatedType + .mapSupertype(this@FirLightClassForEnumEntry) + ?: return@lazyPub null KotlinSuperTypeListBuilder( kotlinOrigin = enumClass.kotlinOrigin?.getSuperTypeList(), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt index e7e95670fd4..d4c015e822a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/classes/firLightClassUtils.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithMembers +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.lexer.KtTokens @@ -268,7 +269,7 @@ internal fun FirLightClassBase.createField( ) } -internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, superTypes: List): PsiReferenceList { +internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, superTypes: List): PsiReferenceList { val role = if (forExtendsList) PsiReferenceList.Role.EXTENDS_LIST else PsiReferenceList.Role.IMPLEMENTS_LIST @@ -296,8 +297,7 @@ internal fun FirLightClassBase.createInheritanceList(forExtendsList: Boolean, su //TODO Add support for kotlin.collections. superTypes.asSequence() - .filterIsInstance() - .filter { it.needToAddTypeIntoList() } + .filter { it.type.needToAddTypeIntoList() } .mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) } .forEach { listBuilder.addReference(it) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt index 038c88c87b2..4465f9f9594 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldEnumEntry.kt @@ -65,7 +65,7 @@ internal class FirLightFieldForEnumEntry( override fun getName(): String = enumEntrySymbol.name.asString() private val _type: PsiType by lazyPub { - enumEntrySymbol.type.asPsiType(enumEntrySymbol, this@FirLightFieldForEnumEntry, FirResolvePhase.TYPES) + enumEntrySymbol.annotatedType.asPsiType(enumEntrySymbol, this@FirLightFieldForEnumEntry, FirResolvePhase.TYPES) } override fun getType(): PsiType = _type diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt index f6b67561033..2b495a14985 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/fields/FirLightFieldForPropertySymbol.kt @@ -29,7 +29,7 @@ internal class FirLightFieldForPropertySymbol( override val kotlinOrigin: KtDeclaration? = propertySymbol.psi as? KtDeclaration private val _returnedType: PsiType by lazyPub { - propertySymbol.type.asPsiType( + propertySymbol.annotatedType.asPsiType( propertySymbol, this@FirLightFieldForPropertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE @@ -83,7 +83,7 @@ internal class FirLightFieldForPropertySymbol( } val nullability = if (visibility != PsiModifier.PRIVATE && !(propertySymbol is KtKotlinPropertySymbol && propertySymbol.isLateInit)) - propertySymbol.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + propertySymbol.annotatedType.type.getTypeNullability(propertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) else NullabilityType.Unknown val annotations = propertySymbol.computeAnnotations( diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt index 1a91c52d042..16b49999fcc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/firLightUtils.kt @@ -16,14 +16,12 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMember import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.backend.jvm.jvmTypeMapper import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.isPrimitiveType import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl @@ -38,7 +36,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.types.* import org.jetbrains.kotlin.load.kotlin.TypeMappingMode -import org.jetbrains.kotlin.load.kotlin.TypeMappingModeInternals import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.model.SimpleTypeMarker import java.text.StringCharacterIterator @@ -52,17 +49,18 @@ private fun PsiElement.nonExistentType() = JavaPsiFacade.getElementFactory(proje .createTypeFromText("error.NonExistentClass", this) internal fun KtTypedSymbol.asPsiType(parent: PsiElement, phase: FirResolvePhase): PsiType = - type.asPsiType(this, parent, phase) + annotatedType.asPsiType(this, parent, phase) -internal fun KtType.asPsiType( +internal fun KtTypeAndAnnotations.asPsiType( context: KtSymbol, parent: PsiElement, phase: FirResolvePhase ): PsiType { - require(this is KtFirType) + val type = this.type + require(type is KtFirType) require(context is KtFirSymbol<*>) val session = context.firRef.withFir(phase) { it.session } - return coneType.asPsiType(session, context.firRef.resolveState, TypeMappingMode.DEFAULT, parent) + return type.coneType.asPsiType(session, context.firRef.resolveState, TypeMappingMode.DEFAULT, parent) } internal fun KtClassOrObjectSymbol.typeForClassSymbol(psiElement: PsiElement): PsiType { @@ -153,12 +151,19 @@ private fun mapSupertype( psiContext ) as? PsiClassType -internal fun KtClassType.mapSupertype( +internal fun KtTypeAndAnnotations.mapSupertype( psiContext: PsiElement, kotlinCollectionAsIs: Boolean = false +): PsiClassType? = type.mapSupertype(psiContext, kotlinCollectionAsIs, emptyList()) + +internal fun KtType.mapSupertype( + psiContext: PsiElement, + kotlinCollectionAsIs: Boolean = false, + annotations: List ): PsiClassType? { + if (this !is KtClassType) return null require(this is KtFirClassType) - val contextSymbol = this.classSymbol + val contextSymbol = classSymbol require(contextSymbol is KtFirSymbol<*>) val session = contextSymbol.firRef.withFir { it.session } @@ -167,7 +172,7 @@ internal fun KtClassType.mapSupertype( psiContext, session, contextSymbol.firRef.resolveState, - this.coneType, + coneType, kotlinCollectionAsIs, ) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt index ff69b173709..21165b55980 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightAccessorMethodForSymbol.kt @@ -71,7 +71,7 @@ internal class FirLightAccessorMethodForSymbol( !isPrivate && !(isParameter && (containingClass.isAnnotationType || containingClass.isEnum)) - val nullabilityType = if (nullabilityApplicable) containingPropertySymbol.type + val nullabilityType = if (nullabilityApplicable) containingPropertySymbol.annotatedType.type .getTypeNullability(containingPropertySymbol, FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) else NullabilityType.Unknown @@ -144,7 +144,7 @@ internal class FirLightAccessorMethodForSymbol( private val _returnedType: PsiType? by lazyPub { if (!isGetter) return@lazyPub PsiType.VOID - return@lazyPub containingPropertySymbol.type.asPsiType( + return@lazyPub containingPropertySymbol.annotatedType.asPsiType( context = containingPropertySymbol, parent = this@FirLightAccessorMethodForSymbol, phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt index 2f65a0c48f1..52240f81aa3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/methods/FirLightSimpleMethodForSymbol.kt @@ -58,7 +58,7 @@ internal class FirLightSimpleMethodForSymbol( private fun computeAnnotations(isPrivate: Boolean): List { val nullability = if (isVoidReturnType || isPrivate) NullabilityType.Unknown - else functionSymbol.type.getTypeNullability( + else functionSymbol.annotatedType.type.getTypeNullability( context = functionSymbol, phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE ) @@ -122,7 +122,7 @@ internal class FirLightSimpleMethodForSymbol( override fun isConstructor(): Boolean = false private val isVoidReturnType: Boolean - get() = functionSymbol.type.run { + get() = functionSymbol.annotatedType.type.run { isUnit && nullabilityType != NullabilityType.Nullable } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterBaseForSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterBaseForSymbol.kt index a82b8e16e1a..159b28c3883 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterBaseForSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightParameterBaseForSymbol.kt @@ -8,11 +8,8 @@ package org.jetbrains.kotlin.idea.asJava import com.intellij.psi.* import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.idea.frontend.api.symbols.* -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind -import org.jetbrains.kotlin.idea.util.ifTrue import org.jetbrains.kotlin.psi.KtParameter internal abstract class FirLightParameterBaseForSymbol( @@ -33,13 +30,17 @@ internal abstract class FirLightParameterBaseForSymbol( FirLightIdentifier(this, parameterSymbol) } - protected val nullabilityType: NullabilityType get() { - val nullabilityApplicable = !containingMethod.containingClass.let { it.isAnnotationType || it.isEnum } && - !containingMethod.hasModifierProperty(PsiModifier.PRIVATE) + protected val nullabilityType: NullabilityType + get() { + val nullabilityApplicable = !containingMethod.containingClass.let { it.isAnnotationType || it.isEnum } && + !containingMethod.hasModifierProperty(PsiModifier.PRIVATE) - return if (nullabilityApplicable) parameterSymbol.type.getTypeNullability(parameterSymbol, FirResolvePhase.TYPES) - else NullabilityType.Unknown - } + return if (nullabilityApplicable) parameterSymbol.annotatedType.type.getTypeNullability( + parameterSymbol, + FirResolvePhase.TYPES + ) + else NullabilityType.Unknown + } override fun getNameIdentifier(): PsiIdentifier = _identifier 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 4634667fb68..c643dc1d151 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 @@ -72,7 +72,7 @@ internal class FirLightParameterForReceiver private constructor( } private val _type: PsiType by lazyPub { - receiverTypeAndAnnotations.type.asPsiType(context, method, FirResolvePhase.TYPES) + receiverTypeAndAnnotations.asPsiType(context, method, FirResolvePhase.TYPES) } override fun getType(): PsiType = _type diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightTypeParameter.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightTypeParameter.kt index 25793088718..cd9334b9ffe 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightTypeParameter.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/asJava/parameters/FirLightTypeParameter.kt @@ -64,7 +64,13 @@ internal class FirLightTypeParameter( typeParameterSymbol.upperBounds .filterIsInstance() .filter { it.classId != StandardClassIds.Any } - .mapNotNull { it.mapSupertype(this, kotlinCollectionAsIs = true) } + .mapNotNull { + it.mapSupertype( + psiContext = this, + kotlinCollectionAsIs = true, + annotations = emptyList() + ) + } .forEach { listBuilder.addReference(it) } listBuilder diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt index 7ec8775ce3a..19ab4a10e10 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionTypeProvider.kt @@ -11,23 +11,16 @@ import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.argumentMapping import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType -import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirOfType import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe import org.jetbrains.kotlin.idea.frontend.api.ValidityToken -import org.jetbrains.kotlin.idea.frontend.api.assertIsValid -import org.jetbrains.kotlin.idea.frontend.api.components.KtBuiltinTypes import org.jetbrains.kotlin.idea.frontend.api.components.KtExpressionTypeProvider import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypedSymbol import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.types.AbstractTypeChecker -import org.jetbrains.kotlin.types.AbstractTypeCheckerContext internal class KtFirExpressionTypeProvider( override val analysisSession: KtFirAnalysisSession, @@ -66,7 +59,7 @@ internal class KtFirExpressionTypeProvider( private fun getExpectedTypeByReturnExpression(expression: PsiElement): KtType? { val returnParent = expression.getReturnExpressionWithThisType() ?: return null val targetSymbol = with(analysisSession) { returnParent.getReturnTargetSymbol() } ?: return null - return (targetSymbol as? KtTypedSymbol)?.type + return (targetSymbol as? KtTypedSymbol)?.annotatedType?.type } private fun PsiElement.getReturnExpressionWithThisType(): KtReturnExpression? = 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 e9bd29d5c85..3e84c1291ac 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 @@ -7,6 +7,7 @@ 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.FirAnnotatedDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -19,6 +20,8 @@ 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.* +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck 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 @@ -27,37 +30,33 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtCallElement -class KtFirAnnotationCall( - containingDeclaration: FirDeclaration, - annotationCall: FirAnnotationCall, - resolveState: FirModuleResolveState, - override val token: ValidityToken, +internal class KtFirAnnotationCall( + private val containingDeclaration: FirRefWithValidityCheck, + annotationCall: FirAnnotationCall ) : 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 + override val token: ValidityToken get() = containingDeclaration.token + + override val psi: KtCallElement? by containingDeclaration.withFirAndCache { fir -> + fir.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) { + override val classId: ClassId? by containingDeclaration.withFirAndCache(FirResolvePhase.TYPES) { fir -> val declaredCone = annotationCallRef.annotationTypeRef.coneType as? ConeClassLikeType - declaredCone?.expandTypeAliasIfNeeded(it.session)?.classId + declaredCone?.expandTypeAliasIfNeeded(fir.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) -> + override val arguments: List by containingDeclaration.withFirAndCache(FirResolvePhase.TYPES) { fir -> + mapAnnotationParameters(annotationCallRef, fir.session).map { (name, expression) -> KtNamedConstantValue(name, expression.convertConstantExpression()) } } } + +internal fun FirRefWithValidityCheck.toAnnotationsList() = withFir { fir -> + fir.annotations.map { KtFirAnnotationCall(this, it) } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt index 12cf18b7d51..3cd8fbc80e1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt @@ -12,10 +12,11 @@ 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.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached 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.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer @@ -28,7 +29,10 @@ internal class KtFirAnonymousFunctionSymbol( override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { builder.buildKtType(it.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } + override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> check(valueParameter is FirValueParameterImpl) 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 592155a07f3..220f2ec84ad 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 @@ -7,20 +7,19 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.superConeTypes 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.cached 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.markers.KtAnnotationCall import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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 KtFirAnonymousObjectSymbol( fir: FirAnonymousObject, @@ -33,14 +32,12 @@ 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 { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } - override val superTypes: List by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir -> - fir.superConeTypes.map { - builder.buildKtType(it) - } + override val superTypes: List by cached { + firRef.superTypesAndAnnotationsList(builder) } override fun createPointer(): KtSymbolPointer = 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 4170c408cd3..e2e8ad37e1a 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,18 +13,15 @@ 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.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef 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 -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.ClassId import org.jetbrains.kotlin.name.Name @@ -46,8 +43,8 @@ internal class KtFirClassOrObjectSymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } override val isInner: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isInner } @@ -56,11 +53,10 @@ internal class KtFirClassOrObjectSymbol( fir.companionObject?.let { builder.buildClassSymbol(it) } } - override val superTypes: List by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir -> - fir.superConeTypes.map { - builder.buildKtType(it) - } + override val superTypes: List by cached { + firRef.superTypesAndAnnotationsList(builder) } + override val primaryConstructor: KtConstructorSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { fir -> fir.getPrimaryConstructorIfAny()?.let { builder.buildConstructorSymbol(it) } } 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 527c85bb25e..dae71f29763 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,16 +16,17 @@ 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.cached 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 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.KtSymbolVisibility +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.idea.frontend.api.withValidityAssertion import org.jetbrains.kotlin.name.ClassId @@ -38,7 +39,10 @@ internal class KtFirConstructorSymbol( override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { builder.buildKtType(it.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } + override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> check(valueParameter is FirValueParameterImpl) @@ -48,8 +52,8 @@ internal class KtFirConstructorSymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } 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 ff342fc410d..fb4acdfb76d 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 @@ -12,14 +12,15 @@ 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.cached 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.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.markers.KtTypeAndAnnotations 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( @@ -29,10 +30,12 @@ internal class KtFirConstructorValueParameterSymbol( private val builder: KtSymbolByFirBuilder ) : KtConstructorParameterSymbol(), KtFirSymbol { override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } + override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } override val name: Name get() = firRef.withFir { it.name } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { builder.buildKtType(it.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder) + } override val symbolKind: KtSymbolKind get() = firRef.withFir { fir -> when { @@ -41,8 +44,8 @@ internal class KtFirConstructorValueParameterSymbol( } } - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } override val constructorParameterKind: KtConstructorParameterSymbolKind diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt index 31e28b8687f..660bf83b3b4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirEnumEntrySymbol.kt @@ -15,11 +15,12 @@ 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.KtFirEnumEntrySymbolPointer import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.createSignature +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtEnumEntrySymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations 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.ClassId import org.jetbrains.kotlin.name.Name @@ -34,7 +35,9 @@ internal class KtFirEnumEntrySymbol( override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } 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 annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } override val containingEnumClassIdIfNonLocal: ClassId? get() = firRef.withFir { it.containingClass()?.classId?.takeUnless { it.isLocal } } 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 1063e6e15cf..0055f924281 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 @@ -34,6 +34,6 @@ internal class KtFirFileSymbol( } override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + fir.annotations.map { KtFirAnnotationCall(firRef, it) } } } \ 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 0ff303b4a23..b16c5851632 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,13 +15,13 @@ 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.cached 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.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.FqName import org.jetbrains.kotlin.name.Name @@ -34,7 +34,9 @@ internal class KtFirFunctionSymbol( override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } 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 annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } override val valueParameters: List by firRef.withFirAndCache { fir -> fir.valueParameters.map { valueParameter -> check(valueParameter is FirValueParameterImpl) @@ -47,17 +49,15 @@ internal class KtFirFunctionSymbol( } } - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } override val isSuspend: Boolean get() = firRef.withFir { it.isSuspend } override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> - fir.receiverTypeRef?.let { typeRef -> - KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) - } + override val receiverType: KtTypeAndAnnotations? by cached { + firRef.receiverTypeAndAnnotations(builder) } override val isOperator: Boolean get() = firRef.withFir { it.isOperator } 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 841c8c9e910..04f9d434a0a 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 @@ -12,12 +12,13 @@ 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.cached 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.markers.KtTypeAndAnnotations 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( @@ -31,12 +32,14 @@ internal class KtFirFunctionValueParameterSymbol( override val name: Name get() = firRef.withFir { it.name } override val isVararg: Boolean get() = firRef.withFir { it.isVararg } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> builder.buildKtType(fir.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder) + } override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null } - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } override fun createPointer(): KtSymbolPointer { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt index 09eeb8e1d13..b39e8a0dbec 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -13,10 +13,12 @@ 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.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtJavaFieldSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -30,7 +32,9 @@ internal class KtFirJavaFieldSymbol( override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> builder.buildKtType(fir.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder) + } override val isVal: Boolean get() = firRef.withFir { it.isVal } override val name: Name get() = firRef.withFir { it.name } 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 9e4216c4d7e..3aeef009e88 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,6 +15,7 @@ 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.cached 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 @@ -25,7 +26,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.FqName import org.jetbrains.kotlin.name.Name @@ -45,12 +45,12 @@ internal class KtFirKotlinPropertySymbol( 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 receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> - fir.receiverTypeRef?.let { typeRef -> - KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) - } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } + override val receiverType: KtTypeAndAnnotations? by cached { + firRef.receiverTypeAndAnnotations(builder) } override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } @@ -66,8 +66,8 @@ internal class KtFirKotlinPropertySymbol( override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } override val callableIdIfNonLocal: FqName? diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirLocalVariableSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirLocalVariableSymbol.kt index 2ce16c8211c..44e7a5f9cb5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirLocalVariableSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirLocalVariableSymbol.kt @@ -11,12 +11,12 @@ 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.types.KtType import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.symbols.KtLocalVariableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer @@ -38,7 +38,9 @@ internal class KtFirLocalVariableSymbol( 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 annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL override fun createPointer(): KtSymbolPointer { 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 b5347650c82..fb2911acd6c 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 @@ -12,15 +12,12 @@ 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.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef 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 -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.markers.* 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 KtFirPropertyGetterSymbol( fir: FirPropertyAccessor, @@ -48,11 +45,13 @@ internal class KtFirPropertyGetterSymbol( } } - override val type: KtType by firRef.withFirAndCache { builder.buildKtType(it.returnTypeRef) } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } 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 { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } 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 493fca3ec1d..c511cacccd8 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 @@ -12,6 +12,7 @@ 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.cached 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 @@ -42,8 +43,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 { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } 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 cbea83aada1..7a8368bdac5 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 @@ -12,12 +12,13 @@ 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.cached 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.markers.KtTypeAndAnnotations 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( @@ -27,17 +28,18 @@ internal class KtFirSetterParameterSymbol( private val builder: KtSymbolByFirBuilder ) : KtSetterParameterSymbol(), KtFirSymbol { override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } + override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } override val name: Name get() = firRef.withFir { it.name } - override val type: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> builder.buildKtType(fir.returnTypeRef) } - + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.TYPES, builder) + } override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null } override val isVararg: Boolean = false - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } 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 58560eb5fef..ebe2eb44dfe 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,6 +15,7 @@ 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.cached 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 @@ -25,7 +26,6 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException 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.FqName import org.jetbrains.kotlin.name.Name @@ -40,22 +40,20 @@ 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 receiverType: KtTypeAndAnnotations? by firRef.withFirAndCache { fir -> - fir.receiverTypeRef?.let { typeRef -> - KtFirTypeAndAnnotations(fir, typeRef, resolveState, token, builder) - } + override val annotatedType: KtTypeAndAnnotations by cached { + firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) + } + override val receiverType: KtTypeAndAnnotations? by cached { + firRef.receiverTypeAndAnnotations(builder) } override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } override val initializer: KtConstantValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> fir.initializer?.convertConstantExpression() } - override val modality: KtCommonSymbolModality get() = getModality() - override val visibility: KtSymbolVisibility get() = getVisibility() - override val annotations: List by firRef.withFirAndCache { fir -> - fir.annotations.map { KtFirAnnotationCall(fir, it, resolveState, token) } + override val annotations: List by cached { + firRef.toAnnotationsList() } 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 index 4756866d8d9..99e28dabc68 100644 --- 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 @@ -5,36 +5,73 @@ 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.fir.declarations.* +import org.jetbrains.kotlin.fir.types.* 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.FirRefWithValidityCheck +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached 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 +internal class KtFirTypeAndAnnotations( + private val containingDeclaration: FirRefWithValidityCheck, + typeResolvePhase: FirResolvePhase, + private val builder: KtSymbolByFirBuilder, + private val typeRef: (T) -> FirTypeRef, ) : KtTypeAndAnnotations() { - private val containingDeclarationRef = firRef(containingDeclaration, resolveState) - private val receiverWeakTypeRef by weakRef(receiverTypeRef) + override val token: ValidityToken get() = containingDeclaration.token - override val type: KtType by containingDeclarationRef.withFirAndCache(FirResolvePhase.TYPES) { - builder.buildKtType(receiverWeakTypeRef) + override val type: KtType by containingDeclaration.withFirAndCache(typeResolvePhase) { fir -> + builder.buildKtType(typeRef(fir)) } - override val annotations: List by containingDeclarationRef.withFirAndCache { fir -> - receiverWeakTypeRef.annotations.map { - KtFirAnnotationCall(fir, it, resolveState, token) + override val annotations: List by containingDeclaration.withFirAndCache { fir -> + typeRef(fir).annotations.map { + KtFirAnnotationCall(containingDeclaration, it) } } -} \ No newline at end of file +} + +internal class KtSimpleFirTypeAndAnnotations( + coneType: ConeKotlinType, + annotationsList: List, + builder: KtSymbolByFirBuilder, + override val token: ValidityToken +) : KtTypeAndAnnotations() { + + private val coneTypeRef by weakRef(coneType) + private val annotationsListRef by weakRef(annotationsList) + + override val type: KtType by cached { + builder.buildKtType(coneTypeRef) + } + + override val annotations: List get() = annotationsListRef +} + +internal fun FirRefWithValidityCheck>.superTypesAndAnnotationsList(builder: KtSymbolByFirBuilder): List = + withFir(FirResolvePhase.SUPER_TYPES) { fir -> + fir.superTypeRefs.map { typeRef -> + val annotations = typeRef.annotations.map { annotation -> + KtFirAnnotationCall(this, annotation) + } + KtSimpleFirTypeAndAnnotations(typeRef.coneType, annotations, builder, token) + } + } + +internal fun FirRefWithValidityCheck.returnTypeAndAnnotations( + typeResolvePhase: FirResolvePhase, + builder: KtSymbolByFirBuilder +) = KtFirTypeAndAnnotations(this, typeResolvePhase, builder) { it.returnTypeRef } + +internal fun FirRefWithValidityCheck>.receiverTypeAndAnnotations(builder: KtSymbolByFirBuilder) = withFir { fir -> + fir.receiverTypeRef?.let { _ -> + KtFirTypeAndAnnotations(this, FirResolvePhase.TYPES, builder) { + it.receiverTypeRef ?: error { "Receiver expected for callable declaration but it is null" } + } + } +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeParameterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeParameterSymbol.kt index 0727f759820..2097e0ade50 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeParameterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeParameterSymbol.kt @@ -26,7 +26,7 @@ internal class KtFirTypeParameterSymbol( private val builder: KtSymbolByFirBuilder ) : KtTypeParameterSymbol(), KtFirSymbol { override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { it.findPsi(fir.session) } + override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } override val name: Name get() = firRef.withFir { it.name } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt index 8d59e319cbd..168f56922d4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/firSymbolUtils.kt @@ -9,10 +9,16 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.java.JavaVisibilities +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.modality import org.jetbrains.kotlin.fir.declarations.visibility +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.coneType import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtCommonSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolModality import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolVisibility @@ -42,4 +48,12 @@ internal fun Visibility?.getSymbolVisibility(): KtSymbolVisibility = when (this) } internal fun KtFirSymbol.getVisibility(): KtSymbolVisibility = - firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() } \ No newline at end of file + firRef.withFir(FirResolvePhase.STATUS) { it.visibility.getSymbolVisibility() } + + +internal 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 +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt index d143492571c..0382bc3bfcc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/FirRefWithValidityCheck.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.assertIsValid import java.lang.ref.WeakReference -internal class FirRefWithValidityCheck(fir: D, resolveState: FirModuleResolveState, val token: ValidityToken) { +internal class FirRefWithValidityCheck(fir: D, resolveState: FirModuleResolveState, val token: ValidityToken) { private val firWeakRef = WeakReference(fir) private val resolveStateWeakRef = WeakReference(resolveState) 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 28c8bf744b3..5ea2b4b7ff5 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 @@ -5,21 +5,18 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.utils import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.fir.resolve.fullyExpandedType +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.getPrimaryConstructorIfAny +import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.expressions.FirConstExpression +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol 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.frontend.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirAnnotationCall -import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* -import org.jetbrains.kotlin.psi.KtCallElement -import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtConstantValue +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSimpleConstantValue +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtUnsupportedConstantValue internal fun mapAnnotationParameters(annotationCall: FirAnnotationCall, session: FirSession): Map { 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 acd1aed5076..0caa225b8d4 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 @@ -100,12 +100,12 @@ private fun KtCall.stringRepresentation(): String { if (valueParameters.isNotEmpty()) append(", ") } valueParameters.joinTo(this) { parameter -> - "${parameter.name}: ${parameter.type.render()}" + "${parameter.name}: ${parameter.typeAndAnnotations.type.render()}" } append(")") - append(": ${type.render()}") + append(": ${typeAndAnnotations.type.render()}") } - is KtParameterSymbol -> "$name: ${type.render()}" + is KtParameterSymbol -> "$name: ${typeAndAnnotations.type.render()}" is KtSuccessCallTarget -> symbol.stringValue() is KtErrorCallTarget -> "ERR<${this.diagnostic.message}, [${candidates.joinToString { it.stringValue() }}]>" is Boolean -> toString()