FIR IDE: implement completion for packages
This commit is contained in:
committed by
TeamCityServer
parent
943ae108f5
commit
4785f36d8d
+5
@@ -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)
|
||||
}
|
||||
|
||||
+27
-3
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user