Fixed Code completion does not work inside function variable invocation

#KT-4978 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-05-07 19:16:09 +04:00
parent 7bb84c139d
commit dab6045f6a
7 changed files with 36 additions and 13 deletions
@@ -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<DeclarationDescriptor> descriptorFilter = new Condition<DeclarationDescriptor>() {
@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() {
@@ -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<LookupElement>() {
@Override
public void consume(LookupElement lookupElement) {
@@ -0,0 +1,6 @@
fun f(p: (String) -> Unit, s: String) {
p(<caret>)
}
// EXIST: s
// EXIST: StringBuilder
@@ -0,0 +1,5 @@
fun f(p: (String) -> Unit, s: String) {
p(<caret>)
}
// EXIST: s
@@ -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");
@@ -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");
@@ -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");