KTIJ-33579 [kotlin] Add ImportContext.positionType property and use it where possible

GitOrigin-RevId: 215c093e779c18b0a3555216cb0b2553514306f8
This commit is contained in:
Roman Golyshev
2025-04-12 14:32:17 +00:00
committed by intellij-monorepo-bot
parent 60cd149366
commit ec7e24ebc9
7 changed files with 37 additions and 36 deletions
@@ -42,7 +42,7 @@ internal abstract class AbstractImportCandidatesProvider(): ImportCandidatesProv
protected fun PsiMember.canBeImported(): Boolean {
return when (this) {
is PsiClass -> qualifiedName != null && (containingClass == null || hasModifier(JvmModifier.STATIC) || importContext.positionTypeAndReceiver.acceptsInnerClasses())
is PsiClass -> qualifiedName != null && (containingClass == null || hasModifier(JvmModifier.STATIC) || importContext.positionType.acceptsInnerClasses())
is PsiField, is PsiMethod -> hasModifier(JvmModifier.STATIC) && containingClass?.qualifiedName != null
else -> false
}
@@ -53,7 +53,7 @@ internal abstract class AbstractImportCandidatesProvider(): ImportCandidatesProv
is KtProperty -> isTopLevel || containingClassOrObject is KtObjectDeclaration
is KtNamedFunction -> isTopLevel || containingClassOrObject is KtObjectDeclaration
is KtTypeAlias -> true
is KtClassOrObject -> !isLocal && (!isInner || importContext.positionTypeAndReceiver.acceptsInnerClasses())
is KtClassOrObject -> !isLocal && (!isInner || importContext.positionType.acceptsInnerClasses())
else -> false
}
@@ -64,6 +64,6 @@ internal abstract class AbstractImportCandidatesProvider(): ImportCandidatesProv
private val KtClassLikeDeclaration.isInner: Boolean get() = hasModifier(KtTokens.INNER_KEYWORD)
private fun ImportPositionTypeAndReceiver<*, *>.acceptsInnerClasses(): Boolean =
this is ImportPositionTypeAndReceiver.TypeReference || this is ImportPositionTypeAndReceiver.KDocNameReference
}
private fun ImportPositionType.acceptsInnerClasses(): Boolean =
this is ImportPositionType.TypeReference || this is ImportPositionType.KDocNameReference
}
@@ -22,12 +22,12 @@ internal class CallableImportCandidatesProvider(
acceptsKotlinCallableAtPosition(kotlinCallable) && !kotlinCallable.isImported() && kotlinCallable.canBeImported()
private fun acceptsKotlinCallableAtPosition(kotlinCallable: KtCallableDeclaration): Boolean =
when (importContext.positionTypeAndReceiver) {
is ImportPositionTypeAndReceiver.InfixCall -> {
when (importContext.positionType) {
is ImportPositionType.InfixCall -> {
kotlinCallable.hasModifier(KtTokens.INFIX_KEYWORD) && kotlinCallable.isExtensionDeclaration()
}
is ImportPositionTypeAndReceiver.OperatorCall -> {
is ImportPositionType.OperatorCall -> {
kotlinCallable.hasModifier(KtTokens.OPERATOR_KEYWORD) && kotlinCallable.isExtensionDeclaration()
}
@@ -38,20 +38,20 @@ internal class CallableImportCandidatesProvider(
acceptsJavaCallableAtPosition() && !javaCallable.isImported() && javaCallable.canBeImported()
private fun acceptsJavaCallableAtPosition(): Boolean =
when (importContext.positionTypeAndReceiver) {
is ImportPositionTypeAndReceiver.InfixCall,
is ImportPositionTypeAndReceiver.OperatorCall -> false
when (importContext.positionType) {
is ImportPositionType.InfixCall,
is ImportPositionType.OperatorCall -> false
else -> true
}
private fun acceptsCallableCandidate(kotlinCallable: CallableImportCandidate): Boolean =
when (importContext.positionTypeAndReceiver) {
is ImportPositionTypeAndReceiver.InfixCall -> {
when (importContext.positionType) {
is ImportPositionType.InfixCall -> {
val functionSymbol = kotlinCallable.symbol as? KaNamedFunctionSymbol
functionSymbol?.isInfix == true && functionSymbol.isExtension
}
is ImportPositionTypeAndReceiver.OperatorCall -> {
is ImportPositionType.OperatorCall -> {
val functionSymbol = kotlinCallable.symbol as? KaNamedFunctionSymbol
functionSymbol?.isOperator == true && functionSymbol.isExtension
}
@@ -89,7 +89,7 @@ internal class CallableImportCandidatesProvider(
allowInapplicableExtensions -> {
// extensions were already provided
}
importContext.positionTypeAndReceiver is ImportPositionTypeAndReceiver.KDocNameReference -> {
importContext.positionType is ImportPositionType.KDocNameReference -> {
// we do not try to complete extensions for KDocs for now
// TODO consider combining this with allowInapplicableExtensions flag
}
@@ -60,7 +60,7 @@ internal class AnnotationImportCandidatesProvider(
) : ClassifierImportCandidatesProvider(importContext) {
init {
requireIsInstance<ImportPositionTypeAndReceiver.Annotation>(importContext.positionTypeAndReceiver)
requireIsInstance<ImportPositionType.Annotation>(importContext.positionType)
}
override fun acceptsKotlinClass(kotlinClass: KtClassLikeDeclaration): Boolean {
@@ -86,7 +86,7 @@ internal class ConstructorReferenceImportCandidatesProvider(
) : ClassifierImportCandidatesProvider(importContext) {
init {
requireIsInstance<ImportPositionTypeAndReceiver.CallableReference>(importContext.positionTypeAndReceiver)
requireIsInstance<ImportPositionType.CallableReference>(importContext.positionType)
}
override fun acceptsKotlinClass(kotlinClass: KtClassLikeDeclaration): Boolean {
@@ -14,7 +14,7 @@ internal class EnumEntryImportCandidatesProvider(override val importContext: Imp
AbstractImportCandidatesProvider() {
init {
requireIsInstance<ImportPositionTypeAndReceiver.DefaultCall>(importContext.positionTypeAndReceiver)
requireIsInstance<ImportPositionType.DefaultCall>(importContext.positionType)
}
private fun acceptsKotlinEnumEntry(enumEntry: KtEnumEntry): Boolean {
@@ -45,4 +45,4 @@ internal class EnumEntryImportCandidatesProvider(override val importContext: Imp
.filter { it.isVisible(visibilityChecker) }
.toList()
}
}
}
@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.psi.KtElement
internal interface ImportContext {
val position: KtElement
val positionTypeAndReceiver: ImportPositionTypeAndReceiver<*, *>
val positionType: ImportPositionType get() = positionTypeAndReceiver.positionType
}
internal class DefaultImportContext(
@@ -67,16 +67,16 @@ internal object MismatchedArgumentsImportQuickFixFactory : AbstractImportQuickFi
context(KaSession)
private fun getCandidateProvidersForUnresolvedNameReference(
importContext: ImportContext,
): Sequence<AbstractImportCandidatesProvider> = when (importContext.positionTypeAndReceiver) {
is ImportPositionTypeAndReceiver.DefaultCall -> sequenceOf(
): Sequence<AbstractImportCandidatesProvider> = when (importContext.positionType) {
is ImportPositionType.DefaultCall -> sequenceOf(
CallableImportCandidatesProvider(importContext),
ClassifierImportCandidatesProvider(importContext),
)
is ImportPositionTypeAndReceiver.DotCall,
is ImportPositionTypeAndReceiver.SafeCall,
is ImportPositionTypeAndReceiver.InfixCall,
is ImportPositionTypeAndReceiver.OperatorCall -> sequenceOf(
is ImportPositionType.DotCall,
is ImportPositionType.SafeCall,
is ImportPositionType.InfixCall,
is ImportPositionType.OperatorCall -> sequenceOf(
CallableImportCandidatesProvider(importContext),
)
@@ -43,37 +43,37 @@ internal object UnresolvedNameReferenceImportQuickFixFactory : AbstractImportQui
context(KaSession)
private fun getCandidateProvidersForUnresolvedNameReference(
importContext: ImportContext,
): Sequence<AbstractImportCandidatesProvider> = when (importContext.positionTypeAndReceiver) {
is ImportPositionTypeAndReceiver.TypeReference -> sequenceOf(
): Sequence<AbstractImportCandidatesProvider> = when (importContext.positionType) {
is ImportPositionType.TypeReference -> sequenceOf(
ClassifierImportCandidatesProvider(importContext),
)
is ImportPositionTypeAndReceiver.Annotation -> sequenceOf(
is ImportPositionType.Annotation -> sequenceOf(
AnnotationImportCandidatesProvider(importContext),
)
is ImportPositionTypeAndReceiver.DefaultCall -> sequenceOf(
is ImportPositionType.DefaultCall -> sequenceOf(
CallableImportCandidatesProvider(importContext),
ClassifierImportCandidatesProvider(importContext),
EnumEntryImportCandidatesProvider(importContext),
)
is ImportPositionTypeAndReceiver.DotCall,
is ImportPositionTypeAndReceiver.SafeCall,
is ImportPositionTypeAndReceiver.InfixCall,
is ImportPositionTypeAndReceiver.OperatorCall -> sequenceOf(
is ImportPositionType.DotCall,
is ImportPositionType.SafeCall,
is ImportPositionType.InfixCall,
is ImportPositionType.OperatorCall -> sequenceOf(
CallableImportCandidatesProvider(importContext),
)
is ImportPositionTypeAndReceiver.KDocNameReference -> sequenceOf(
is ImportPositionType.KDocNameReference -> sequenceOf(
// TODO this is currently reported by KDocUnresolvedReferenceInspection
)
is ImportPositionTypeAndReceiver.CallableReference -> sequenceOf(
is ImportPositionType.CallableReference -> sequenceOf(
CallableImportCandidatesProvider(importContext),
ConstructorReferenceImportCandidatesProvider(importContext),
)
else -> sequenceOf()
}
}
}