From 4785f36d8dcc30c283436192b64158390f06442b Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 26 May 2021 15:28:23 +0200 Subject: [PATCH] FIR IDE: implement completion for packages --- .../KotlinFirCompletionContributor.kt | 5 ++++ .../context/FirPositionCompletionContext.kt | 30 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) 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 a37a44c0062..b702fa29bae 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 @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.util.originalKtFile import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtFile +import java.io.File class KotlinFirCompletionContributor : CompletionContributor() { init { @@ -98,6 +99,10 @@ private object KotlinFirCompletionProvider : CompletionProvider { + complete(packageCompletionContributor, 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 feee096fbcf..c2a2c8a85f6 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 @@ -30,9 +30,16 @@ internal class FirImportDirectivePositionContext( override val reference: KtSimpleNameReference, override val nameExpression: KtSimpleNameExpression, override val explicitReceiver: KtExpression?, - val importDirective: KtImportDirective, ) : FirNameReferencePositionContext() +internal class FirPackageDirectivePositionContext( + override val position: PsiElement, + override val reference: KtSimpleNameReference, + override val nameExpression: KtSimpleNameExpression, + override val explicitReceiver: KtExpression?, +) : FirNameReferencePositionContext() + + internal class FirTypeNameReferencePositionContext( override val position: PsiElement, @@ -90,7 +97,15 @@ internal object FirPositionCompletionContextDetector { reference, nameExpression, explicitReceiver, - parent.parentOfType(withSelf = true)!! + ) + } + + nameExpression.isImportExpressionInsidePackageDirective() -> { + FirPackageDirectivePositionContext( + position, + reference, + nameExpression, + explicitReceiver, ) } else -> { @@ -108,6 +123,15 @@ internal object FirPositionCompletionContextDetector { else -> false } + private fun KtExpression.isImportExpressionInsidePackageDirective() = when (val parent = parent) { + is KtPackageDirective -> parent.packageNameExpression == this + is KtDotQualifiedExpression -> { + val packageDirective = parent.parent as? KtPackageDirective + packageDirective?.packageNameExpression == parent + } + else -> false + } + private fun detectForTypeContext( userType: KtUserType, position: PsiElement, @@ -145,7 +169,7 @@ internal object FirPositionCompletionContextDetector { positionContext.nameExpression, action ) - is FirUnknownPositionContext, is FirImportDirectivePositionContext -> { + is FirUnknownPositionContext, is FirImportDirectivePositionContext, is FirPackageDirectivePositionContext -> { analyse(basicContext.originalKtFile, action) } }