diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt index 4b06500d143..5550db4359c 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt @@ -111,6 +111,10 @@ private object KotlinFirCompletionProvider : CompletionProvider { complete(keywordContributor, positionContext) } + + is FirIncorrectPositionContext -> { + // do nothing, completion is not suposed to be called here + } } } diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt index a25802a8add..f328b1ac4c7 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/context/FirPositionCompletionContext.kt @@ -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) } } diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirKeywordCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirKeywordCompletionContributor.kt index d4767fab73e..d0924bb5285 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirKeywordCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/contributors/FirKeywordCompletionContributor.kt @@ -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 }