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 -> { is FirUnknownPositionContext -> {
complete(keywordContributor, positionContext) 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 package org.jetbrains.kotlin.idea.completion.context
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiErrorElement
import com.intellij.psi.util.parentOfType import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.analyse import org.jetbrains.kotlin.idea.frontend.api.analyse
@@ -19,6 +20,10 @@ internal sealed class FirRawPositionCompletionContext {
abstract val position: PsiElement abstract val position: PsiElement
} }
internal class FirIncorrectPositionContext(
override val position: PsiElement
): FirRawPositionCompletionContext()
internal class FirTypeConstraintNameInWhereClausePositionContext( internal class FirTypeConstraintNameInWhereClausePositionContext(
override val position: PsiElement, override val position: PsiElement,
val typeParametersOwner: KtTypeParameterListOwner val typeParametersOwner: KtTypeParameterListOwner
@@ -146,22 +151,26 @@ internal object FirPositionCompletionContextDetector {
reference: KtSimpleNameReference, reference: KtSimpleNameReference,
nameExpression: KtSimpleNameExpression, nameExpression: KtSimpleNameExpression,
explicitReceiver: KtExpression? explicitReceiver: KtExpression?
): FirNameReferencePositionContext { ): FirRawPositionCompletionContext {
val typeReference = (userType.parent as? KtTypeReference)?.takeIf { it.typeElement == userType } val typeReference = (userType.parent as? KtTypeReference)?.takeIf { it.typeElement == userType }
return when (val typeReferenceOwner = typeReference?.parent) { val typeReferenceOwner = typeReference?.parent
is KtConstructorCalleeExpression -> { return when {
typeReferenceOwner is KtConstructorCalleeExpression -> {
val constructorCall = typeReferenceOwner.takeIf { it.typeReference == typeReference } val constructorCall = typeReferenceOwner.takeIf { it.typeReference == typeReference }
val annotationEntry = (constructorCall?.parent as? KtAnnotationEntry)?.takeIf { it.calleeExpression == constructorCall } val annotationEntry = (constructorCall?.parent as? KtAnnotationEntry)?.takeIf { it.calleeExpression == constructorCall }
annotationEntry?.let { annotationEntry?.let {
FirAnnotationTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it) FirAnnotationTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it)
} }
} }
is KtSuperExpression -> { typeReferenceOwner is KtSuperExpression -> {
val superTypeCallEntry = typeReferenceOwner.takeIf { it.superTypeQualifier == typeReference } val superTypeCallEntry = typeReferenceOwner.takeIf { it.superTypeQualifier == typeReference }
superTypeCallEntry?.let { superTypeCallEntry?.let {
FirSuperTypeCallNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it) FirSuperTypeCallNameReferencePositionContext(position, reference, nameExpression, explicitReceiver, it)
} }
} }
typeReferenceOwner is KtTypeConstraint && typeReferenceOwner.children.any { it is PsiErrorElement } -> {
FirIncorrectPositionContext(position)
}
else -> null else -> null
} ?: FirTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver) } ?: FirTypeNameReferencePositionContext(position, reference, nameExpression, explicitReceiver)
} }
@@ -180,7 +189,8 @@ internal object FirPositionCompletionContextDetector {
is FirUnknownPositionContext, is FirUnknownPositionContext,
is FirImportDirectivePositionContext, is FirImportDirectivePositionContext,
is FirPackageDirectivePositionContext, is FirPackageDirectivePositionContext,
is FirTypeConstraintNameInWhereClausePositionContext -> { is FirTypeConstraintNameInWhereClausePositionContext,
is FirIncorrectPositionContext -> {
analyse(basicContext.originalKtFile, action) analyse(basicContext.originalKtFile, action)
} }
} }
@@ -46,8 +46,8 @@ internal class FirKeywordCompletionContributor(basicContext: FirBasicCompletionC
else -> reference.expression else -> reference.expression
} }
} }
is FirTypeConstraintNameInWhereClausePositionContext -> { is FirTypeConstraintNameInWhereClausePositionContext, is FirIncorrectPositionContext -> {
error("keyword completion should not be called for FirTypeConstraintNameInWhereClausePositionContext") error("keyword completion should not be called for ${positionContext::class.simpleName}")
} }
is FirUnknownPositionContext -> null is FirUnknownPositionContext -> null
} }