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.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
class KotlinFirCompletionContributor : CompletionContributor() {
|
class KotlinFirCompletionContributor : CompletionContributor() {
|
||||||
init {
|
init {
|
||||||
@@ -98,6 +99,10 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
|
|||||||
complete(importDirectivePackageMembersCompletionContributor, positionContext)
|
complete(importDirectivePackageMembersCompletionContributor, positionContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is FirPackageDirectivePositionContext -> {
|
||||||
|
complete(packageCompletionContributor, positionContext)
|
||||||
|
}
|
||||||
|
|
||||||
is FirUnknownPositionContext -> {
|
is FirUnknownPositionContext -> {
|
||||||
complete(keywordContributor, positionContext)
|
complete(keywordContributor, positionContext)
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-3
@@ -30,9 +30,16 @@ internal class FirImportDirectivePositionContext(
|
|||||||
override val reference: KtSimpleNameReference,
|
override val reference: KtSimpleNameReference,
|
||||||
override val nameExpression: KtSimpleNameExpression,
|
override val nameExpression: KtSimpleNameExpression,
|
||||||
override val explicitReceiver: KtExpression?,
|
override val explicitReceiver: KtExpression?,
|
||||||
val importDirective: KtImportDirective,
|
|
||||||
) : FirNameReferencePositionContext()
|
) : FirNameReferencePositionContext()
|
||||||
|
|
||||||
|
internal class FirPackageDirectivePositionContext(
|
||||||
|
override val position: PsiElement,
|
||||||
|
override val reference: KtSimpleNameReference,
|
||||||
|
override val nameExpression: KtSimpleNameExpression,
|
||||||
|
override val explicitReceiver: KtExpression?,
|
||||||
|
) : FirNameReferencePositionContext()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
internal class FirTypeNameReferencePositionContext(
|
internal class FirTypeNameReferencePositionContext(
|
||||||
override val position: PsiElement,
|
override val position: PsiElement,
|
||||||
@@ -90,7 +97,15 @@ internal object FirPositionCompletionContextDetector {
|
|||||||
reference,
|
reference,
|
||||||
nameExpression,
|
nameExpression,
|
||||||
explicitReceiver,
|
explicitReceiver,
|
||||||
parent.parentOfType(withSelf = true)!!
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
nameExpression.isImportExpressionInsidePackageDirective() -> {
|
||||||
|
FirPackageDirectivePositionContext(
|
||||||
|
position,
|
||||||
|
reference,
|
||||||
|
nameExpression,
|
||||||
|
explicitReceiver,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
@@ -108,6 +123,15 @@ internal object FirPositionCompletionContextDetector {
|
|||||||
else -> false
|
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(
|
private fun detectForTypeContext(
|
||||||
userType: KtUserType,
|
userType: KtUserType,
|
||||||
position: PsiElement,
|
position: PsiElement,
|
||||||
@@ -145,7 +169,7 @@ internal object FirPositionCompletionContextDetector {
|
|||||||
positionContext.nameExpression,
|
positionContext.nameExpression,
|
||||||
action
|
action
|
||||||
)
|
)
|
||||||
is FirUnknownPositionContext, is FirImportDirectivePositionContext -> {
|
is FirUnknownPositionContext, is FirImportDirectivePositionContext, is FirPackageDirectivePositionContext -> {
|
||||||
analyse(basicContext.originalKtFile, action)
|
analyse(basicContext.originalKtFile, action)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user