From b03a297ed062a0b8640543fb8e6471a40a44c32e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 2 Oct 2015 19:22:55 +0300 Subject: [PATCH] KT-9326 IDE tries to resolve name in qualified `this` to any class in project/classpath #KT-9326 Fixed --- .../jetbrains/kotlin/idea/util/CallType.kt | 54 ++++++++++++------- .../kotlin/idea/quickfix/AutoImportFix.kt | 14 ++--- .../quickfix/autoImports/notForThisLabel.kt | 6 +++ .../idea/quickfix/QuickFixTestGenerated.java | 6 +++ 4 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 idea/testData/quickfix/autoImports/notForThisLabel.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt index fcb21165dea..0186c971416 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt @@ -121,30 +121,48 @@ public sealed class CallTypeAndReceiver { + if (receiverExpression == null) { + return UNKNOWN // incomplete code + } + return when (parent) { + is JetBinaryExpression -> { + //TODO: operator vs infix + CallTypeAndReceiver.INFIX(receiverExpression) + } - return when (parent) { - is JetBinaryExpression -> CallTypeAndReceiver.INFIX(receiverExpression) + is JetUnaryExpression -> CallTypeAndReceiver.UNARY(receiverExpression) - is JetCallExpression -> { - if ((parent.parent as JetQualifiedExpression).operationSign == JetTokens.SAFE_ACCESS) - CallTypeAndReceiver.SAFE(receiverExpression) - else - CallTypeAndReceiver.DOT(receiverExpression) + else -> error("Unknown parent for JetOperationReferenceExpression: $parent") + } } - is JetQualifiedExpression -> { - if (parent.operationSign == JetTokens.SAFE_ACCESS) - CallTypeAndReceiver.SAFE(receiverExpression) - else - CallTypeAndReceiver.DOT(receiverExpression) + is JetNameReferenceExpression -> { + if (receiverExpression == null) { + return CallTypeAndReceiver.DEFAULT + } + + return when (parent) { + is JetCallExpression -> { + if ((parent.parent as JetQualifiedExpression).operationSign == JetTokens.SAFE_ACCESS) + CallTypeAndReceiver.SAFE(receiverExpression) + else + CallTypeAndReceiver.DOT(receiverExpression) + } + + is JetQualifiedExpression -> { + if (parent.operationSign == JetTokens.SAFE_ACCESS) + CallTypeAndReceiver.SAFE(receiverExpression) + else + CallTypeAndReceiver.DOT(receiverExpression) + } + + else -> error("Unknown parent for JetNameReferenceExpression with receiver: $parent") + } } - is JetUnaryExpression -> CallTypeAndReceiver.UNARY(receiverExpression) - - else -> error("Unknown parent for expression with receiver: $parent") + else -> return UNKNOWN } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt index e5a5b43913c..0e9d83ce0a5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.getResolutionScope import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.project.ProjectStructureUtil +import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetPsiUtil @@ -116,9 +117,12 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction { - if (!element.isValid()) return listOf() + if (!element.isValid()) return emptyList() - val file = element.getContainingFile() as? JetFile ?: return listOf() + val file = element.getContainingFile() as? JetFile ?: return emptyList() + + val callType = CallTypeAndReceiver.detect(element).callType + if (callType is CallType.UNKNOWN) return emptyList() var referenceName = element.getReferencedName() if (element.getIdentifier() == null) { @@ -127,20 +131,18 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 72445d0b265..1e2b1fc220e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -478,6 +478,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("notForThisLabel.kt") + public void testNotForThisLabel() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/notForThisLabel.kt"); + doTest(fileName); + } + @TestMetadata("sAMConstructorFromLambda.kt") public void testSAMConstructorFromLambda() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/autoImports/sAMConstructorFromLambda.kt");