From c4a11016002dfbdb48e19f8eb50ca2a34b3de655 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 2 Sep 2019 13:07:10 +0700 Subject: [PATCH] KtSimpleNameReference: add root prefix support to `bindToFqName` function --- .../idea/references/KtSimpleNameReference.kt | 25 ++++++++----------- .../ClassResolvedToPackage.expected.kt | 12 +++------ .../imports/ClassResolvedToPackage.kt | 3 --- .../conflictWithClassIdentifier.kt | 7 ++++++ .../conflictWithClassIdentifier.kt.after | 9 +++++++ .../conflictWithLocalIdentifier.kt | 7 ++++++ .../conflictWithLocalIdentifier.kt.after | 9 +++++++ .../type/ClassSameNameAsPackage.kt.after | 3 +-- .../idea/quickfix/QuickFixTestGenerated.java | 10 ++++++++ 9 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt create mode 100644 idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt.after create mode 100644 idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt create mode 100644 idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt.after diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index bfd5fa01538..5bad39a16f4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.references @@ -175,7 +164,15 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere if (expression !is KtNameReferenceExpression) return expression if (expression.parent is KtThisExpression || expression.parent is KtSuperExpression) return expression // TODO: it's a bad design of PSI tree, we should change it - val newExpression = expression.changeQualifiedName(fqName.quoteIfNeeded(), targetElement) + val newExpression = expression.changeQualifiedName( + fqName.quoteIfNeeded().let { + if (shorteningMode == ShorteningMode.NO_SHORTENING) + it + else + it.withRootPrefixIfNeeded(expression) + }, + targetElement + ) val newQualifiedElement = newExpression.getQualifiedElementOrCallableRef() if (shorteningMode == ShorteningMode.NO_SHORTENING) return newExpression diff --git a/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt b/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt index 4e7356a5f39..e69b77335e3 100644 --- a/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt +++ b/idea/testData/copyPaste/imports/ClassResolvedToPackage.expected.kt @@ -1,14 +1,8 @@ -// ERROR: Unresolved reference: a -// ERROR: Unresolved reference: a -// ERROR: Unresolved reference: a package to import a.a -fun f(i: a.a) { - // TODO References shortening doesn't work for package vs class conflicts under the new resolution rules. - // After importing 'a.a', expression 'a.a' is unresolved (since 'a' becomes a class). - // 'package' in expression syntax might be required to fix it properly. - a.a - a.a() +fun f(i: a) { + a + a() } \ No newline at end of file diff --git a/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt b/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt index 5360bec9bf3..63b8e7e6f02 100644 --- a/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt +++ b/idea/testData/copyPaste/imports/ClassResolvedToPackage.kt @@ -6,9 +6,6 @@ class a { } fun f(i: a) { - // TODO References shortening doesn't work for package vs class conflicts under the new resolution rules. - // After importing 'a.a', expression 'a.a' is unresolved (since 'a' becomes a class). - // 'package' in expression syntax might be required to fix it properly. a a() } \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt b/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt new file mode 100644 index 00000000000..f5a3d07dc4b --- /dev/null +++ b/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt @@ -0,0 +1,7 @@ +// "Import" "true" +// DISABLE-ERRORS +class java + +fun test() { + Arrays +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt.after b/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt.after new file mode 100644 index 00000000000..a729a340f5a --- /dev/null +++ b/idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt.after @@ -0,0 +1,9 @@ +import java.util.Arrays + +// "Import" "true" +// DISABLE-ERRORS +class java + +fun test() { + Arrays +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt b/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt new file mode 100644 index 00000000000..63ba0bb7ed6 --- /dev/null +++ b/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt @@ -0,0 +1,7 @@ +// "Import" "true" +// DISABLE-ERRORS + +fun test() { + val java = 42 + Arrays +} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt.after b/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt.after new file mode 100644 index 00000000000..33190d242db --- /dev/null +++ b/idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt.after @@ -0,0 +1,9 @@ +import java.util.Arrays + +// "Import" "true" +// DISABLE-ERRORS + +fun test() { + val java = 42 + Arrays +} \ No newline at end of file diff --git a/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt.after b/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt.after index db7e8c5b4eb..ec85b599c0a 100644 --- a/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt.after +++ b/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt.after @@ -1,5 +1,4 @@ import same.same -// todo must be: s: same -fun f(s: same.same) { +fun f(s: same) { } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index da209e72872..c7f6183c844 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -1738,6 +1738,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/autoImports/checkNoStackOverflowInImportInnerClassInCurrentFile.kt"); } + @TestMetadata("conflictWithClassIdentifier.kt") + public void testConflictWithClassIdentifier() throws Exception { + runTest("idea/testData/quickfix/autoImports/conflictWithClassIdentifier.kt"); + } + + @TestMetadata("conflictWithLocalIdentifier.kt") + public void testConflictWithLocalIdentifier() throws Exception { + runTest("idea/testData/quickfix/autoImports/conflictWithLocalIdentifier.kt"); + } + @TestMetadata("enumEntries.kt") public void testEnumEntries() throws Exception { runTest("idea/testData/quickfix/autoImports/enumEntries.kt");