FIR IDE: do not complete after where constraint type param with qualifier
This commit is contained in:
committed by
TeamCityServer
parent
ff369b1917
commit
58d5907041
+4
@@ -111,6 +111,10 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
|
||||
is FirUnknownPositionContext -> {
|
||||
complete(keywordContributor, positionContext)
|
||||
}
|
||||
|
||||
is FirIncorrectPositionContext -> {
|
||||
// do nothing, completion is not suposed to be called here
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+15
-5
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.idea.completion.context
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiErrorElement
|
||||
import com.intellij.psi.util.parentOfType
|
||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.idea.frontend.api.analyse
|
||||
@@ -19,6 +20,10 @@ internal sealed class FirRawPositionCompletionContext {
|
||||
abstract val position: PsiElement
|
||||
}
|
||||
|
||||
internal class FirIncorrectPositionContext(
|
||||
override val position: PsiElement
|
||||
): FirRawPositionCompletionContext()
|
||||
|
||||
internal class FirTypeConstraintNameInWhereClausePositionContext(
|
||||
override val position: PsiElement,
|
||||
val typeParametersOwner: KtTypeParameterListOwner
|
||||
@@ -146,22 +151,26 @@ internal object FirPositionCompletionContextDetector {
|
||||
reference: KtSimpleNameReference,
|
||||
nameExpression: KtSimpleNameExpression,
|
||||
explicitReceiver: KtExpression?
|
||||
): FirNameReferencePositionContext {
|
||||
): FirRawPositionCompletionContext {
|
||||
val typeReference = (userType.parent as? KtTypeReference)?.takeIf { it.typeElement == userType }
|
||||
return when (val typeReferenceOwner = typeReference?.parent) {
|
||||
is KtConstructorCalleeExpression -> {
|
||||
val typeReferenceOwner = typeReference?.parent
|
||||
return when {
|
||||
typeReferenceOwner is KtConstructorCalleeExpression -> {
|
||||
val constructorCall = typeReferenceOwner.takeIf { it.typeReference == typeReference }
|
||||
val annotationEntry = (constructorCall?.parent as? KtAnnotationEntry)?.takeIf { it.calleeExpression == constructorCall }
|
||||
annotationEntry?.let {
|
||||
FirAnnotationTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it)
|
||||
}
|
||||
}
|
||||
is KtSuperExpression -> {
|
||||
typeReferenceOwner is KtSuperExpression -> {
|
||||
val superTypeCallEntry = typeReferenceOwner.takeIf { it.superTypeQualifier == typeReference }
|
||||
superTypeCallEntry?.let {
|
||||
FirSuperTypeCallNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it)
|
||||
}
|
||||
}
|
||||
typeReferenceOwner is KtTypeConstraint && typeReferenceOwner.children.any { it is PsiErrorElement } -> {
|
||||
FirIncorrectPositionContext(position)
|
||||
}
|
||||
else -> null
|
||||
} ?: FirTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver)
|
||||
}
|
||||
@@ -180,7 +189,8 @@ internal object FirPositionCompletionContextDetector {
|
||||
is FirUnknownPositionContext,
|
||||
is FirImportDirectivePositionContext,
|
||||
is FirPackageDirectivePositionContext,
|
||||
is FirTypeConstraintNameInWhereClausePositionContext -> {
|
||||
is FirTypeConstraintNameInWhereClausePositionContext,
|
||||
is FirIncorrectPositionContext -> {
|
||||
analyse(basicContext.originalKtFile, action)
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -46,8 +46,8 @@ internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionC
|
||||
else -> reference.expression
|
||||
}
|
||||
}
|
||||
is FirTypeConstraintNameInWhereClausePositionContext -> {
|
||||
error("keyword completion should not be called for FirTypeConstraintNameInWhereClausePositionContext")
|
||||
is FirTypeConstraintNameInWhereClausePositionContext, is FirIncorrectPositionContext -> {
|
||||
error("keyword completion should not be called for ${positionContext::class.simpleName}")
|
||||
}
|
||||
is FirUnknownPositionContext -> null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user