From d76ec9db5069bc37351c5b9b10afa057962c05cb Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 17 May 2021 13:39:05 +0200 Subject: [PATCH] FIR IDE: add completion for annotations --- .../basic/common/annotations/ForType.kt | 1 + .../common/annotations/FunctionAnnotation1.kt | 1 + .../common/annotations/FunctionAnnotation2.kt | 1 + .../annotations/ParameterAnnotation1.kt | 1 + .../annotations/ParameterAnnotation3.kt | 1 + .../annotations/ParameterAnnotation4.kt | 1 + .../annotations/ParameterAnnotation5.kt | 1 + .../annotations/ParameterAnnotation8.kt | 1 + .../annotations/ParameterAnnotation9.kt | 1 + .../ParameterAnnotationAutoPopup1.kt | 1 + .../ParameterAnnotationAutoPopup2.kt | 1 + .../common/annotations/TopLevelAnnotation2.kt | 1 + .../common/annotations/TopLevelAnnotation3.kt | 1 + .../common/annotations/TopLevelAnnotation4.kt | 1 + .../KotlinFirCompletionContributor.kt | 9 ++++ .../context/FirPositionCompletionContext.kt | 43 +++++++++++++---- .../FirClassifierCompletionContributor.kt | 37 +++++++++++++-- .../FirWhenWithSubjectConditionContributor.kt | 0 .../frontend/api/symbols/KtClassLikeSymbol.kt | 8 +++- .../frontend/api/fir/KtSymbolByFirBuilder.kt | 2 +- .../api/fir/symbols/KtFirTypeAliasSymbol.kt | 13 +++++- .../testData/symbols/symbolByPsi/typeAlias.kt | 46 +++++++++++++++++++ .../api/symbols/SymbolByPsiTestGenerated.java | 5 ++ 23 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirWhenWithSubjectConditionContributor.kt create mode 100644 idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAlias.kt diff --git a/idea/idea-completion/testData/basic/common/annotations/ForType.kt b/idea/idea-completion/testData/basic/common/annotations/ForType.kt index cb3a1955bd5..f68c971997d 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ForType.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ForType.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON @Target(AnnotationTarget.TYPE) annotation class AnnType diff --git a/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation1.kt b/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation1.kt index 803eb66473e..a5d0eef0718 100644 --- a/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation1.kt +++ b/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation1.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation2.kt b/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation2.kt index cce9d4fc4bb..0067dfb287f 100644 --- a/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation2.kt +++ b/idea/idea-completion/testData/basic/common/annotations/FunctionAnnotation2.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation1.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation1.kt index 5286e22ab1d..6ba96de807a 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation1.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation1.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation3.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation3.kt index 6cc5190f3d2..f294399de8f 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation3.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation3.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation4.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation4.kt index 8a0211b59a6..bb83f9ee2c6 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation4.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation4.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation5.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation5.kt index 2a7e68d889e..282b6001493 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation5.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation5.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation8.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation8.kt index 84e76d3bc6f..72f59d32a05 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation8.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation8.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation9.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation9.kt index 6592dc4b96d..33fc162e8f7 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation9.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotation9.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class SHello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup1.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup1.kt index 1eceaee0fd5..be68f848392 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup1.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup1.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON val v = 1 fun foo(@[S) { } diff --git a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup2.kt b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup2.kt index 62675f058d3..193151df6c8 100644 --- a/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup2.kt +++ b/idea/idea-completion/testData/basic/common/annotations/ParameterAnnotationAutoPopup2.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON val v = 1 fun foo(@[volatile S) { } diff --git a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation2.kt b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation2.kt index bd906fc3d61..a08dae59a29 100644 --- a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation2.kt +++ b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation2.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation3.kt b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation3.kt index db9eafab578..34737236bab 100644 --- a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation3.kt +++ b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation3.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation4.kt b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation4.kt index c3aabcab23b..74061fed65f 100644 --- a/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation4.kt +++ b/idea/idea-completion/testData/basic/common/annotations/TopLevelAnnotation4.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON annotation class Hello val v = 1 diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt index 8d217501f53..321a9908d53 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt @@ -17,6 +17,8 @@ import org.jetbrains.kotlin.idea.completion.context.FirExpressionNameReferencePo import org.jetbrains.kotlin.idea.completion.context.FirPositionCompletionContextDetector import org.jetbrains.kotlin.idea.completion.context.FirTypeNameReferencePositionContext import org.jetbrains.kotlin.idea.completion.context.FirUnknownPositionContext +import org.jetbrains.kotlin.idea.completion.contributors.* +import org.jetbrains.kotlin.idea.completion.contributors.FirAnnotationCompletionContributor import org.jetbrains.kotlin.idea.completion.contributors.FirCallableCompletionContributor import org.jetbrains.kotlin.idea.completion.contributors.FirClassifierCompletionContributor import org.jetbrains.kotlin.idea.completion.contributors.FirKeywordCompletionContributor @@ -57,6 +59,7 @@ private object KotlinFirCompletionProvider : CompletionProvider { @@ -68,6 +71,12 @@ private object KotlinFirCompletionProvider : CompletionProvider { + complete(keywordContributor, positionContext) + complete(annotationsContributor, positionContext) + } + is FirUnknownPositionContext -> { complete(keywordContributor, positionContext) } diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt index 7c5a6590372..a75685958d3 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt @@ -11,10 +11,7 @@ import org.jetbrains.kotlin.idea.frontend.api.analyse import org.jetbrains.kotlin.idea.frontend.api.analyseInDependedAnalysisSession import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtLabelReferenceExpression -import org.jetbrains.kotlin.psi.KtSimpleNameExpression -import org.jetbrains.kotlin.psi.KtUserType +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression internal sealed class FirRawPositionCompletionContext { @@ -34,6 +31,15 @@ internal class FirTypeNameReferencePositionContext( override val explicitReceiver: KtExpression? ) : FirNameReferencePositionContext() +internal class FirAnnotationTypeNameReferencePositionContext( + override val position: PsiElement, + override val reference: KtSimpleNameReference, + override val nameExpression: KtSimpleNameExpression, + override val explicitReceiver: KtExpression?, + val annotationEntry: KtAnnotationEntry, +) : FirNameReferencePositionContext() + + internal class FirExpressionNameReferencePositionContext( override val position: PsiElement, override val reference: KtSimpleNameReference, @@ -55,13 +61,34 @@ internal object FirPositionCompletionContextDetector { ?: return FirUnknownPositionContext(position) val explicitReceiver = nameExpression.getReceiverExpression() - return if (nameExpression.parent is KtUserType) { - FirTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver) - } else { - FirExpressionNameReferencePositionContext(position, reference, nameExpression, explicitReceiver) + return when (val parent = nameExpression.parent) { + is KtUserType -> { + detectForTypeContext(parent, position, reference, nameExpression, explicitReceiver) + } + else -> { + FirExpressionNameReferencePositionContext(position, reference, nameExpression, explicitReceiver) + } } } + private fun detectForTypeContext( + userType: KtUserType, + position: PsiElement, + reference: KtSimpleNameReference, + nameExpression: KtSimpleNameExpression, + explicitReceiver: KtExpression? + ): FirNameReferencePositionContext { + val annotationEntry = userType.annotationEntry() + ?: return FirTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver) + return FirAnnotationTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, annotationEntry) + } + + private fun KtUserType.annotationEntry(): KtAnnotationEntry? { + val typeReference = (parent as? KtTypeReference)?.takeIf { it.typeElement == this } + val constructorCall = (typeReference?.parent as? KtConstructorCalleeExpression)?.takeIf { it.typeReference == typeReference } + return (constructorCall?.parent as? KtAnnotationEntry)?.takeIf { it.calleeExpression == constructorCall } + } + inline fun analyseInContext( basicContext: FirBasicCompletionContext, positionContext: FirRawPositionCompletionContext, diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirClassifierCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirClassifierCompletionContributor.kt index 749441c46e5..0261f25e56f 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirClassifierCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirClassifierCompletionContributor.kt @@ -9,20 +9,21 @@ import org.jetbrains.kotlin.idea.completion.checkers.CompletionVisibilityChecker import org.jetbrains.kotlin.idea.completion.context.FirBasicCompletionContext import org.jetbrains.kotlin.idea.completion.context.FirNameReferenceRawPositionContext import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassifierSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol +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.symbols.markers.KtSymbolWithMembers +import org.jetbrains.kotlin.idea.frontend.api.types.KtClassType import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtExpression -internal class FirClassifierCompletionContributor( +internal open class FirClassifierCompletionContributor( basicContext: FirBasicCompletionContext, ) : FirContextCompletionContributorBase(basicContext) { + protected open fun KtAnalysisSession.filterClassifiers(classifierSymbol: KtClassifierSymbol): Boolean = true + override fun KtAnalysisSession.complete(positionContext: FirNameReferenceRawPositionContext) { val visibilityChecker = CompletionVisibilityChecker.create(basicContext, positionContext) @@ -44,6 +45,7 @@ internal class FirClassifierCompletionContributor( val symbol = reference.resolveToSymbol() as? KtSymbolWithMembers ?: return symbol.getMemberScope() .getClassifierSymbols(scopeNameFilter) + .filter { filterClassifiers(it) } .filter { with(visibilityChecker) { isVisible(it) } } .forEach { addClassifierSymbolToCompletion(it, insertFqName = false) } } @@ -55,6 +57,7 @@ internal class FirClassifierCompletionContributor( val implicitScopes = originalKtFile.getScopeContextForPosition(positionContext.nameExpression).scopes val classesFromScopes = implicitScopes .getClassifierSymbols(scopeNameFilter) + .filter { filterClassifiers(it) } .filter { with(visibilityChecker) { isVisible(it) } } classesFromScopes.forEach { addClassifierSymbolToCompletion(it, insertFqName = true) } @@ -62,7 +65,33 @@ internal class FirClassifierCompletionContributor( val kotlinClassesFromIndices = indexHelper.getKotlinClasses(scopeNameFilter, psiFilter = { it !is KtEnumEntry }) kotlinClassesFromIndices.asSequence() .map { it.getSymbol() as KtClassifierSymbol } + .filter { filterClassifiers(it) } .filter { with(visibilityChecker) { isVisible(it) } } .forEach { addClassifierSymbolToCompletion(it, insertFqName = true) } } +} + +internal class FirAnnotationCompletionContributor( + basicContext: FirBasicCompletionContext +) : FirClassifierCompletionContributor(basicContext) { + + override fun KtAnalysisSession.filterClassifiers(classifierSymbol: KtClassifierSymbol): Boolean = when (classifierSymbol) { + is KtAnonymousObjectSymbol -> false + is KtTypeParameterSymbol -> false + is KtNamedClassOrObjectSymbol -> when (classifierSymbol.classKind) { + KtClassKind.ANNOTATION_CLASS -> true + KtClassKind.ENUM_CLASS -> false + KtClassKind.ENUM_ENTRY -> false + KtClassKind.ANONYMOUS_OBJECT -> false + KtClassKind.CLASS, KtClassKind.OBJECT, KtClassKind.COMPANION_OBJECT, KtClassKind.INTERFACE -> { + // TODO show class if nested classifier is annotation class + // classifierSymbol.getDeclaredMemberScope().getClassifierSymbols().any { filterClassifiers(it) } + false + } + } + is KtTypeAliasSymbol -> { + val expendedClass = (classifierSymbol.expandedType as? KtClassType)?.classSymbol + expendedClass?.let { filterClassifiers(it) } == true + } + } } \ No newline at end of file diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirWhenWithSubjectConditionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirWhenWithSubjectConditionContributor.kt new file mode 100644 index 00000000000..e69de29bb2d 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 c6fa3fa3a24..4e20f853213 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 @@ -33,10 +33,14 @@ sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtSymbolWithKind { } abstract class KtTypeAliasSymbol : KtClassLikeSymbol(), KtNamedSymbol { - abstract override val classIdIfNonLocal: ClassId - final override val symbolKind: KtSymbolKind get() = KtSymbolKind.TOP_LEVEL + /** + * Returns type from right-hand site of type alias + * If type alias has type parameters, then those type parameters will be present in result type + */ + abstract val expandedType: KtType + abstract override fun createPointer(): KtSymbolPointer } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt index 4fcd202dad1..d3f0f58f8e3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt @@ -154,7 +154,7 @@ internal class KtSymbolByFirBuilder private constructor( } fun buildTypeAliasSymbol(fir: FirTypeAlias): KtFirTypeAliasSymbol { - return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token) } + return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } } fun buildTypeParameterSymbol(fir: FirTypeParameter): KtFirTypeParameterSymbol { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAliasSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAliasSymbol.kt index ad5dc874a54..5db50ccfa69 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAliasSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirTypeAliasSymbol.kt @@ -6,27 +6,38 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeAlias 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.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.KtTypeAliasSymbol 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.tokens.ValidityToken +import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name internal class KtFirTypeAliasSymbol( fir: FirTypeAlias, resolveState: FirModuleResolveState, - override val token: ValidityToken + override val token: ValidityToken, + _builder: KtSymbolByFirBuilder, ) : KtTypeAliasSymbol(), KtFirSymbol { + private val builder by weakRef(_builder) + override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } override val name: Name get() = firRef.withFir { it.name } override val classIdIfNonLocal: ClassId get() = firRef.withFir { it.symbol.classId } + override val expandedType: KtType by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir -> + builder.typeBuilder.buildKtType(fir.expandedTypeRef) + } + override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating symbols for library typealiases is not supported yet") diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAlias.kt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAlias.kt new file mode 100644 index 00000000000..b8cc3f9d116 --- /dev/null +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAlias.kt @@ -0,0 +1,46 @@ +class X + +typealias Y = X + +// RESULT +/* +KtFirTypeParameterSymbol: + isReified: false + name: T + origin: SOURCE + upperBounds: [kotlin/Any?] + variance: INVARIANT + +KtFirNamedClassOrObjectSymbol: + annotationClassIds: [] + annotations: [] + classIdIfNonLocal: X + classKind: CLASS + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: X + origin: SOURCE + superTypes: [[] kotlin/Any] + symbolKind: TOP_LEVEL + typeParameters: [KtFirTypeParameterSymbol(T)] + visibility: Public + +KtFirTypeParameterSymbol: + isReified: false + name: Z + origin: SOURCE + upperBounds: [kotlin/Any?] + variance: INVARIANT + +KtFirTypeAliasSymbol: + classIdIfNonLocal: Y + expandedType: X + name: Y + origin: SOURCE + symbolKind: TOP_LEVEL +*/ diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java index 88c789f3b55..41398539f22 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/frontend/api/symbols/SymbolByPsiTestGenerated.java @@ -119,6 +119,11 @@ public class SymbolByPsiTestGenerated extends AbstractSymbolByPsiTest { runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.kt"); } + @TestMetadata("typeAlias.kt") + public void testTypeAlias() throws Exception { + runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAlias.kt"); + } + @TestMetadata("typeAnnotations.kt") public void testTypeAnnotations() throws Exception { runTest("idea/idea-frontend-fir/testData/symbols/symbolByPsi/typeAnnotations.kt");