FIR IDE: do not complete after where constraint type param with qualifier

This commit is contained in:
Ilya Kirillov
2021-05-26 23:56:20 +02:00
committed by TeamCityServer
parent ff369b1917
commit 58d5907041
3 changed files with 21 additions and 7 deletions
@@ -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
}
}
}
@@ -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)
}
}
@@ -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
}