mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
KTIJ-33579 [kotlin] Add ImportContext.positionType property and use it where possible
GitOrigin-RevId: 215c093e779c18b0a3555216cb0b2553514306f8
This commit is contained in:
committed by
intellij-monorepo-bot
parent
60cd149366
commit
ec7e24ebc9
+5
-5
@@ -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
|
||||
}
|
||||
|
||||
+10
-10
@@ -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
|
||||
}
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -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(
|
||||
|
||||
+6
-6
@@ -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),
|
||||
)
|
||||
|
||||
|
||||
+11
-11
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user