From dab6045f6ae46ed7e3f08a514271306f39262810 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 7 May 2014 19:16:09 +0400 Subject: [PATCH] Fixed Code completion does not work inside function variable invocation #KT-4978 Fixed --- .../plugin/completion/CompletionSession.java | 19 +++++++++---------- .../completion/JetTypesCompletionHelper.java | 4 +--- .../common/FunctionVariableCallArgument.kt | 6 ++++++ .../smart/InvokeFunctionVariable.kt | 5 +++++ .../JSBasicCompletionTestGenerated.java | 5 +++++ .../JvmBasicCompletionTestGenerated.java | 5 +++++ .../JvmSmartCompletionTestGenerated.java | 5 +++++ 7 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 idea/testData/completion/basic/common/FunctionVariableCallArgument.kt create mode 100644 idea/testData/completion/smart/InvokeFunctionVariable.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java index 0a9bd876742..876e0612058 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.java @@ -18,10 +18,7 @@ package org.jetbrains.jet.plugin.completion; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; -import com.intellij.codeInsight.completion.CompletionParameters; -import com.intellij.codeInsight.completion.CompletionResultSet; -import com.intellij.codeInsight.completion.CompletionType; -import com.intellij.codeInsight.completion.JavaCompletionContributor; +import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; @@ -69,18 +66,20 @@ class CompletionSession { JetScope scope = expressionBindingContext.get(BindingContext.RESOLUTION_SCOPE, jetReference.getExpression()); inDescriptor = scope != null ? scope.getContainingDeclaration() : null; - Condition descriptorFilter = new Condition() { @Override public boolean value(DeclarationDescriptor descriptor) { return isVisibleDescriptor(descriptor); } }; - this.jetResult = new JetCompletionResultSet( - WeigherPackage.addJetSorting(result, parameters), - resolveSession, - expressionBindingContext, - descriptorFilter); + + // set prefix matcher here to override default one which relies on CompletionUtil.findReferencePrefix() + // which sometimes works incorrectly for Kotlin + result = result.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(parameters)); + + result = WeigherPackage.addJetSorting(result, parameters); + + this.jetResult = new JetCompletionResultSet(result, resolveSession, expressionBindingContext, descriptorFilter); } public void completeForReference() { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java b/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java index 50402e4dd0a..e4ccd3e11df 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetTypesCompletionHelper.java @@ -65,12 +65,10 @@ public class JetTypesCompletionHelper { @NotNull CompletionParameters parameters, @NotNull final JetCompletionResultSet jetCompletionResult ) { - CompletionResultSet tempResult = jetCompletionResult.getResult().withPrefixMatcher( - CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)); JavaClassNameCompletionContributor.addAllClasses( parameters, false, - JavaCompletionSorting.addJavaSorting(parameters, tempResult).getPrefixMatcher(), + JavaCompletionSorting.addJavaSorting(parameters, jetCompletionResult.getResult()).getPrefixMatcher(), new Consumer() { @Override public void consume(LookupElement lookupElement) { diff --git a/idea/testData/completion/basic/common/FunctionVariableCallArgument.kt b/idea/testData/completion/basic/common/FunctionVariableCallArgument.kt new file mode 100644 index 00000000000..f115dca8fc9 --- /dev/null +++ b/idea/testData/completion/basic/common/FunctionVariableCallArgument.kt @@ -0,0 +1,6 @@ +fun f(p: (String) -> Unit, s: String) { + p() +} + +// EXIST: s +// EXIST: StringBuilder diff --git a/idea/testData/completion/smart/InvokeFunctionVariable.kt b/idea/testData/completion/smart/InvokeFunctionVariable.kt new file mode 100644 index 00000000000..87f669dbf4d --- /dev/null +++ b/idea/testData/completion/smart/InvokeFunctionVariable.kt @@ -0,0 +1,5 @@ +fun f(p: (String) -> Unit, s: String) { + p() +} + +// EXIST: s diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index 976765f96b8..943674c9daa 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -189,6 +189,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest("idea/testData/completion/basic/common/FunctionCompletionFormatting.kt"); } + @TestMetadata("FunctionVariableCallArgument.kt") + public void testFunctionVariableCallArgument() throws Exception { + doTest("idea/testData/completion/basic/common/FunctionVariableCallArgument.kt"); + } + @TestMetadata("HigherOrderFunction1.kt") public void testHigherOrderFunction1() throws Exception { doTest("idea/testData/completion/basic/common/HigherOrderFunction1.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 3e18e5dbc9b..6dcfabce3da 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -189,6 +189,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest("idea/testData/completion/basic/common/FunctionCompletionFormatting.kt"); } + @TestMetadata("FunctionVariableCallArgument.kt") + public void testFunctionVariableCallArgument() throws Exception { + doTest("idea/testData/completion/basic/common/FunctionVariableCallArgument.kt"); + } + @TestMetadata("HigherOrderFunction1.kt") public void testHigherOrderFunction1() throws Exception { doTest("idea/testData/completion/basic/common/HigherOrderFunction1.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index 0e1a8fa524b..e0b21712d2d 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -266,6 +266,11 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest("idea/testData/completion/smart/InsideIdentifier.kt"); } + @TestMetadata("InvokeFunctionVariable.kt") + public void testInvokeFunctionVariable() throws Exception { + doTest("idea/testData/completion/smart/InvokeFunctionVariable.kt"); + } + @TestMetadata("JavaEnumMembers.kt") public void testJavaEnumMembers() throws Exception { doTest("idea/testData/completion/smart/JavaEnumMembers.kt");