From d8dbc46867ecb2838a8b63bf8598074654debb76 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 20 Oct 2014 20:23:40 +0400 Subject: [PATCH] Fixed KT-6075 Qualified name inserted when completing class with class object #KT-6075 Fixed --- .../plugin/codeInsight/ShortenReferences.kt | 39 +++++++------------ .../multifile/ClassWithClassObject-1.kt | 5 +++ .../multifile/ClassWithClassObject-2.kt | 9 +++++ .../multifile/ClassWithClassObject.kt.after | 7 ++++ .../CompletionMultifileHandlerTest.java | 4 ++ 5 files changed, 40 insertions(+), 24 deletions(-) create mode 100644 idea/testData/completion/handlers/multifile/ClassWithClassObject-1.kt create mode 100644 idea/testData/completion/handlers/multifile/ClassWithClassObject-2.kt create mode 100644 idea/testData/completion/handlers/multifile/ClassWithClassObject.kt.after diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/ShortenReferences.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/ShortenReferences.kt index bad12afb0ff..e9247c9d9b4 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/ShortenReferences.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/codeInsight/ShortenReferences.kt @@ -25,20 +25,15 @@ import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper; import org.jetbrains.jet.renderer.DescriptorRenderer; import java.util.HashSet; import com.intellij.psi.util.PsiTreeUtil -import java.util.ArrayList import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiDocumentManager import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession -import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall -import org.jetbrains.jet.renderer.DescriptorRenderer.FQ_NAMES_IN_TYPES -import org.jetbrains.jet.lang.resolve.calls.callUtil.getResolvedCall import org.jetbrains.jet.lang.resolve.DescriptorUtils -import org.jetbrains.jet.lang.resolve.ImportPath -import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector import java.util.Collections import org.jetbrains.jet.analyzer.analyzeInContext import org.jetbrains.jet.lang.resolve.calls.callUtil.getCalleeExpressionIfAny import java.util.LinkedHashSet +import org.jetbrains.jet.lang.resolve.ImportPath public object ShortenReferences { public fun process(element: JetElement) { @@ -169,10 +164,7 @@ public object ShortenReferences { val name = target.getName() val targetByName = scope.getClassifier(name) if (targetByName == null) { - if (target.getContainingDeclaration() is ClassDescriptor) return false - - importInserter.addImport(target) - return true + return importInserter.addImport(target) } else if (target.asString() == targetByName.asString()) { return true @@ -237,8 +229,6 @@ public object ShortenReferences { val selector = qualifiedExpression.getSelectorExpression() ?: return false val callee = selector.getCalleeExpressionIfAny() as? JetReferenceExpression ?: return false val targetBefore = callee.getTargets(context).singleOrNull() ?: return false - val isClassMember = targetBefore.getContainingDeclaration() is ClassDescriptor - val isClassOrPackage = targetBefore is ClassDescriptor || targetBefore is PackageViewDescriptor val scope = context[BindingContext.RESOLUTION_SCOPE, qualifiedExpression] ?: return false val selectorCopy = selector.copy() as JetReferenceExpression @@ -246,17 +236,9 @@ public object ShortenReferences { val targetsAfter = (selectorCopy.getCalleeExpressionIfAny() as JetReferenceExpression).getTargets(newContext) when (targetsAfter.size) { - 0 -> { - if (!isClassMember && isClassOrPackage) { - importInserter.addImport(targetBefore) - return true - } - return false - } + 0 -> return importInserter.addImport(targetBefore) - 1 -> { - if (targetBefore == targetsAfter.first()) return true - } + 1 -> if (targetBefore == targetsAfter.first()) return true } if (importInserter.optimizeImports()) { @@ -290,9 +272,18 @@ public object ShortenReferences { private class ImportInserter(val file: JetFile) { private var optimizeImports = true - fun addImport(descriptor: DeclarationDescriptor) { + fun addImport(target: DeclarationDescriptor): Boolean { + val realTarget = if (DescriptorUtils.isClassObject(target)) // references to class object are treated as ones to its owner class + target.getContainingDeclaration() as? ClassDescriptor ?: return false + else + target + + if (realTarget !is ClassDescriptor && realTarget !is PackageViewDescriptor) return false + if (realTarget.getContainingDeclaration() is ClassDescriptor) return false // do not insert imports for nested classes + optimizeImports() - ImportInsertHelper.getInstance().writeImportToFile(ImportPath(DescriptorUtils.getFqNameSafe(descriptor), false), file) + ImportInsertHelper.getInstance().writeImportToFile(ImportPath(DescriptorUtils.getFqNameSafe(realTarget), false), file) + return true } fun optimizeImports(): Boolean { diff --git a/idea/testData/completion/handlers/multifile/ClassWithClassObject-1.kt b/idea/testData/completion/handlers/multifile/ClassWithClassObject-1.kt new file mode 100644 index 00000000000..26f67d2b76e --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ClassWithClassObject-1.kt @@ -0,0 +1,5 @@ +fun foo() { + KtCla +} + +// ELEMENT: KtClass diff --git a/idea/testData/completion/handlers/multifile/ClassWithClassObject-2.kt b/idea/testData/completion/handlers/multifile/ClassWithClassObject-2.kt new file mode 100644 index 00000000000..13cce197389 --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ClassWithClassObject-2.kt @@ -0,0 +1,9 @@ +package pack + +class KtClass { + fun foo(){} + + class object { + fun staticFoo(){} + } +} \ No newline at end of file diff --git a/idea/testData/completion/handlers/multifile/ClassWithClassObject.kt.after b/idea/testData/completion/handlers/multifile/ClassWithClassObject.kt.after new file mode 100644 index 00000000000..d14d00d8632 --- /dev/null +++ b/idea/testData/completion/handlers/multifile/ClassWithClassObject.kt.after @@ -0,0 +1,7 @@ +import pack.KtClass + +fun foo() { + KtClass +} + +// ELEMENT: KtClass diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionMultifileHandlerTest.java b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionMultifileHandlerTest.java index 1ad3ed97aba..ec9614b024f 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionMultifileHandlerTest.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionMultifileHandlerTest.java @@ -62,6 +62,10 @@ public class CompletionMultifileHandlerTest extends KotlinCompletionTestCase { doTest(); } + public void testClassWithClassObject() throws Exception { + doTest(); + } + public void doTest() throws Exception { String fileName = getTestName(false);