FIR IDE: implement completion for packages

This commit is contained in:
Ilya Kirillov
2021-05-26 15:28:23 +02:00
committed by TeamCityServer
parent 943ae108f5
commit 4785f36d8d
2 changed files with 32 additions and 3 deletions
@@ -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<CompletionParame
complete(importDirectivePackageMembersCompletionContributor, positionContext)
}
is FirPackageDirectivePositionContext -> {
complete(packageCompletionContributor, positionContext)
}
is FirUnknownPositionContext -> {
complete(keywordContributor, positionContext)
}
@@ -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)
}
}