From 2c21e950983b09178b8d08fa32874e427581efff Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Tue, 8 Apr 2025 15:34:21 +0200 Subject: [PATCH] KTIJ-33579 [kotlin] Introduce separate `ImportPositionType` class `ImportPositionTypeWithReceiver` is too rigid for some cases, because there might be no explicit receiver expression in the code, but we still need to differentiate between different types of calls GitOrigin-RevId: 8137cdfb1b19b39fdbe96d27c4544b3383294177 --- .../imprt/AbstractImportCandidatesProvider.kt | 2 +- .../codeinsight/fixes/imprt/ImportContext.kt | 2 +- ...peAndReceiver.kt => ImportPositionType.kt} | 51 +++++++++++++------ 3 files changed, 38 insertions(+), 17 deletions(-) rename plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/{ImportPositionTypeAndReceiver.kt => ImportPositionType.kt} (66%) diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/AbstractImportCandidatesProvider.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/AbstractImportCandidatesProvider.kt index a30c129df168..2219a888d960 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/AbstractImportCandidatesProvider.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/AbstractImportCandidatesProvider.kt @@ -64,6 +64,6 @@ internal abstract class AbstractImportCandidatesProvider(): ImportCandidatesProv private val KtClassLikeDeclaration.isInner: Boolean get() = hasModifier(KtTokens.INNER_KEYWORD) - private fun ImportPositionTypeAndReceiver<*>.acceptsInnerClasses(): Boolean = + private fun ImportPositionTypeAndReceiver<*, *>.acceptsInnerClasses(): Boolean = this is ImportPositionTypeAndReceiver.TypeReference || this is ImportPositionTypeAndReceiver.KDocNameReference } \ No newline at end of file diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportContext.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportContext.kt index a6f02d384ea2..5592533830af 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportContext.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportContext.kt @@ -5,5 +5,5 @@ import org.jetbrains.kotlin.psi.KtElement internal class ImportContext( val position: KtElement, - val positionTypeAndReceiver: ImportPositionTypeAndReceiver<*>, + val positionTypeAndReceiver: ImportPositionTypeAndReceiver<*, *>, ) \ No newline at end of file diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionTypeAndReceiver.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionType.kt similarity index 66% rename from plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionTypeAndReceiver.kt rename to plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionType.kt index bdd9609c6f9f..d06750e44910 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionTypeAndReceiver.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/imprt/ImportPositionType.kt @@ -6,57 +6,78 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.parents +/** + * N.B. This class is heavily copied from [org.jetbrains.kotlin.idea.util.CallType]. + * It is currently used only in an auto-import subsystem, so it has a very narrow name. + */ +internal sealed interface ImportPositionType { + object Unknown : ImportPositionType + object DefaultCall : ImportPositionType + object DotCall : ImportPositionType + object SafeCall : ImportPositionType + object SuperMembers : ImportPositionType + object InfixCall : ImportPositionType + object OperatorCall : ImportPositionType + object CallableReference : ImportPositionType + object ImportDirective : ImportPositionType + object PackageDirective : ImportPositionType + object TypeReference : ImportPositionType + object Annotation : ImportPositionType + object KDocNameReference : ImportPositionType +} + /** * N.B. This class is heavily copied from [org.jetbrains.kotlin.idea.util.CallTypeAndReceiver]. * It is currently used only in an auto-import subsystem, so it has a very narrow name. */ -internal sealed class ImportPositionTypeAndReceiver( +internal sealed class ImportPositionTypeAndReceiver( + val positionType: TPositionType, val receiver: TReceiver, ) { class Unknown() : - ImportPositionTypeAndReceiver(null) + ImportPositionTypeAndReceiver(ImportPositionType.Unknown, null) class DefaultCall() : - ImportPositionTypeAndReceiver(null) + ImportPositionTypeAndReceiver(ImportPositionType.DefaultCall, null) class DotCall(receiver: KtExpression) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.DotCall, receiver) class SafeCall(receiver: KtExpression) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.SafeCall, receiver) class SuperMembers(receiver: KtSuperExpression) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.SuperMembers, receiver) class InfixCall(receiver: KtExpression) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.InfixCall, receiver) class OperatorCall(receiver: KtExpression) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.OperatorCall, receiver) class CallableReference(receiver: KtExpression?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.CallableReference, receiver) class ImportDirective(receiver: KtExpression?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.ImportDirective, receiver) class PackageDirective(receiver: KtExpression?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.PackageDirective, receiver) class TypeReference(receiver: KtExpression?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.TypeReference, receiver) class Annotation(receiver: KtExpression?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.Annotation, receiver) /** * Important: this position is not detected by [detect] function. */ class KDocNameReference(receiver: KDocName?) : - ImportPositionTypeAndReceiver(receiver) + ImportPositionTypeAndReceiver(ImportPositionType.KDocNameReference, receiver) companion object { - fun detect(expression: KtElement): ImportPositionTypeAndReceiver<*> { + fun detect(expression: KtElement): ImportPositionTypeAndReceiver<*, *> { if (expression !is KtSimpleNameExpression) return Unknown() val parent = expression.parent