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 -> {
|
is FirUnknownPositionContext -> {
|
||||||
complete(keywordContributor, positionContext)
|
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
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user