From 91f7a094fe5366e1382db6bfdad689c5e9bf55db Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 8 Nov 2012 16:32:32 +0400 Subject: [PATCH] KT-1931 Duplicate class from Kotlin runtime in completion #KT-1931 Fixed --- .../completion/DescriptorLookupConverter.java | 2 +- .../completion/JetTypesCompletionHelper.java | 22 +++++++++++++++---- .../handlers/JetJavaClassInsertHandler.java | 2 +- .../NoClassNameDuplicationForRuntimeClass.kt | 6 +++++ .../DoNotInsertImportForAlreadyImported.kt | 2 +- ...NotInsertImportForAlreadyImported.kt.after | 2 +- .../handlers/InsertFqnForJavaClass.kt | 5 +++++ .../handlers/InsertFqnForJavaClass.kt.after | 5 +++++ .../completion/JetBasicCompletionTest.java | 4 ++++ .../handlers/CompletionHandlerTest.java | 4 ++++ 10 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 idea/testData/completion/basic/NoClassNameDuplicationForRuntimeClass.kt create mode 100644 idea/testData/completion/handlers/InsertFqnForJavaClass.kt create mode 100644 idea/testData/completion/handlers/InsertFqnForJavaClass.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java b/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java index e3d18ea095a..3cd18945e6e 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/DescriptorLookupConverter.java @@ -129,7 +129,7 @@ public final class DescriptorLookupConverter { if (declaration instanceof PsiClass) { PsiClass psiClass = (PsiClass) declaration; if (!DecompiledDataFactory.isCompiledFromKotlin(psiClass)) { - return new JavaPsiClassReferenceElement(psiClass).setInsertHandler(JetJavaClassInsertHandler.JAVA_CLASS_INSERT_HANDLER); + return new JavaPsiClassReferenceElement(psiClass).setInsertHandler(JetJavaClassInsertHandler.INSTANCE); } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java b/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java index ea1a78b532d..3536c057a3b 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java @@ -24,10 +24,13 @@ import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.asJava.JetLightClass; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils; +import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.plugin.caches.JetCacheManager; import org.jetbrains.jet.plugin.caches.JetShortNamesCache; import org.jetbrains.jet.plugin.completion.handlers.JetJavaClassInsertHandler; +import org.jetbrains.jet.plugin.libraries.DecompiledDataFactory; import org.jetbrains.jet.plugin.project.JsModuleDetector; public class JetTypesCompletionHelper { @@ -69,25 +72,36 @@ public class JetTypesCompletionHelper { JavaPsiClassReferenceElement javaPsiReferenceElement = (JavaPsiClassReferenceElement) lookupElement; PsiClass psiClass = javaPsiReferenceElement.getObject(); - if (addJavaClassAsJetLookupElement(psiClass)) { + if (addJavaClassAsJetLookupElement(psiClass, jetCompletionResult)) { return; } // Redefine standard java insert handler which is going to insert fqn - javaPsiReferenceElement.setInsertHandler(JetJavaClassInsertHandler.JAVA_CLASS_INSERT_HANDLER); - jetCompletionResult.addElement(javaPsiReferenceElement); + jetCompletionResult.addElement(javaPsiReferenceElement.setInsertHandler(JetJavaClassInsertHandler.INSTANCE)); } } }); } - private static boolean addJavaClassAsJetLookupElement(PsiClass aClass) { + private static boolean addJavaClassAsJetLookupElement(PsiClass aClass, JetCompletionResultSet jetCompletionResult) { if (aClass instanceof JetLightClass) { // Do nothing. Kotlin not-compiled class should have already been added as kotlin element before. return true; } + if (DecompiledDataFactory.isCompiledFromKotlin(aClass)) { + // TODO: Filter classes for compiled kotlin objects + String qualifiedName = aClass.getQualifiedName(); + if (qualifiedName != null) { + FqName fqName = new FqName(qualifiedName); + jetCompletionResult.addAllElements( + ResolveSessionUtils.getClassDescriptorsByFqName(jetCompletionResult.getResolveSession(), fqName)); + } + + return true; + } + return false; } } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetJavaClassInsertHandler.java b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetJavaClassInsertHandler.java index f30be5e633d..3e666f1eaf1 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetJavaClassInsertHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/handlers/JetJavaClassInsertHandler.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper; * @author Nikolay Krasko */ public class JetJavaClassInsertHandler implements InsertHandler { - public static final InsertHandler JAVA_CLASS_INSERT_HANDLER = new JetJavaClassInsertHandler(); + public static final InsertHandler INSTANCE = new JetJavaClassInsertHandler(); @Override public void handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) { diff --git a/idea/testData/completion/basic/NoClassNameDuplicationForRuntimeClass.kt b/idea/testData/completion/basic/NoClassNameDuplicationForRuntimeClass.kt new file mode 100644 index 00000000000..10e828f8f85 --- /dev/null +++ b/idea/testData/completion/basic/NoClassNameDuplicationForRuntimeClass.kt @@ -0,0 +1,6 @@ +val x = LineIterator + +// RUNTIME: 1 +// TIME: 1 +// EXIST: LineIterator +// NUMBER: 1 diff --git a/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt b/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt index ba1d9f3c532..9759f9d8765 100644 --- a/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt +++ b/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt @@ -1,5 +1,5 @@ // KT-2424 Invoking completion adds unnecessary FQ name fun main(args: Array) { - throw IllegalAccessExceptio() //Press Ctrl+Space and select it + throw IllegalAccessExceptio //Press Ctrl+Space and select it } \ No newline at end of file diff --git a/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt.after b/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt.after index 8d24212dac5..bbd87b18b6a 100644 --- a/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt.after +++ b/idea/testData/completion/handlers/DoNotInsertImportForAlreadyImported.kt.after @@ -1,5 +1,5 @@ // KT-2424 Invoking completion adds unnecessary FQ name fun main(args: Array) { - throw IllegalAccessException() //Press Ctrl+Space and select it + throw IllegalAccessException //Press Ctrl+Space and select it } \ No newline at end of file diff --git a/idea/testData/completion/handlers/InsertFqnForJavaClass.kt b/idea/testData/completion/handlers/InsertFqnForJavaClass.kt new file mode 100644 index 00000000000..c9bca49c56b --- /dev/null +++ b/idea/testData/completion/handlers/InsertFqnForJavaClass.kt @@ -0,0 +1,5 @@ +class SortedSet + +fun test() { + val a = SortedSet +} diff --git a/idea/testData/completion/handlers/InsertFqnForJavaClass.kt.after b/idea/testData/completion/handlers/InsertFqnForJavaClass.kt.after new file mode 100644 index 00000000000..e36d8a11185 --- /dev/null +++ b/idea/testData/completion/handlers/InsertFqnForJavaClass.kt.after @@ -0,0 +1,5 @@ +class SortedSet + +fun test() { + val a = java.util.SortedSet +} diff --git a/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java b/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java index 3e8e13c2966..15490066c16 100644 --- a/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java +++ b/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java @@ -197,6 +197,10 @@ public class JetBasicCompletionTest extends JetCompletionTestBase { doTest(); } + public void testNoClassNameDuplicationForRuntimeClass() { + doTest(); + } + public void testNoEmptyNamespace() { doTest(); } diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java index 3a15672434c..a05111e6e56 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/CompletionHandlerTest.java @@ -103,6 +103,10 @@ public class CompletionHandlerTest extends LightCompletionTestCase { doTest(); } + public void testInsertFqnForJavaClass() { + doTest(CompletionType.BASIC, 2, "SortedSet", "java.util", '\n'); + } + public void testHigherOrderFunctionWithArg() { doTest(CompletionType.BASIC, 2, "filterNot", null, '\n'); }