Only named parameters in completion when nothing else can be

This commit is contained in:
Valentin Kipyatkov
2014-08-05 16:52:39 +04:00
parent 3e051d617c
commit 83b33bd58b
7 changed files with 77 additions and 17 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.psi; package org.jetbrains.jet.lang.psi;
import kotlin.jvm.KotlinSignature;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -28,6 +29,7 @@ public interface JetCallElement extends JetElement {
@Nullable @Nullable
JetValueArgumentList getValueArgumentList(); JetValueArgumentList getValueArgumentList();
@KotlinSignature("fun getValueArguments(): List<out ValueArgument>")
@NotNull @NotNull
List<? extends ValueArgument> getValueArguments(); List<? extends ValueArgument> getValueArguments();
@@ -87,26 +87,28 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
} }
private fun collectElements() { private fun collectElements() {
if (jetReference != null && !isOnlyKeywordCompletion()) { if (!NamedParametersCompletion.isOnlyNamedParameterExpected(position)) {
if (shouldRunOnlyTypeCompletion()) { if (jetReference != null && !isOnlyKeywordCompletion()) {
if (configuration.completeNonImportedDeclarations) { if (shouldRunOnlyTypeCompletion()) {
TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) if (configuration.completeNonImportedDeclarations) {
TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector)
}
else {
addReferenceVariants { isPartOfTypeDeclaration(it) }
JavaCompletionContributor.advertiseSecondCompletion(position.getProject(), resultSet)
}
} }
else { else {
addReferenceVariants { isPartOfTypeDeclaration(it) } addReferenceVariants { true }
JavaCompletionContributor.advertiseSecondCompletion(position.getProject(), resultSet)
addNonImported()
} }
} }
else {
addReferenceVariants { true }
addNonImported() KeywordCompletion().complete(parameters, collector)
}
} }
KeywordCompletion().complete(parameters, collector) NamedParametersCompletion.complete(position, collector)
NamedParametersCompletion.complete(parameters, collector)
} }
private fun addNonImported() { private fun addNonImported() {
@@ -37,6 +37,7 @@ import com.intellij.psi.filters.OrFilter
import com.intellij.psi.filters.ClassFilter import com.intellij.psi.filters.ClassFilter
import org.jetbrains.jet.plugin.util.FirstChildInParentFilter import org.jetbrains.jet.plugin.util.FirstChildInParentFilter
import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression
import com.intellij.psi.PsiElement
object NamedParametersCompletion { object NamedParametersCompletion {
private val positionFilter = AndFilter( private val positionFilter = AndFilter(
@@ -50,8 +51,22 @@ object NamedParametersCompletion {
) )
) )
public fun complete(parameters: CompletionParameters, collector: LookupElementsCollector) { public fun isOnlyNamedParameterExpected(position: PsiElement): Boolean {
val position = parameters.getPosition() if (!positionFilter.isAcceptable(position, position)) return false
val thisArgument = PsiTreeUtil.getParentOfType(position, javaClass<JetValueArgument>())!!
val callElement = PsiTreeUtil.getParentOfType(thisArgument, javaClass<JetCallElement>()) ?: return false
for (argument in callElement.getValueArguments()) {
if (argument.isNamed()) return true
if (argument == thisArgument) break
}
return false
}
public fun complete(position: PsiElement, collector: LookupElementsCollector) {
if (!positionFilter.isAcceptable(position, position)) return if (!positionFilter.isAcceptable(position, position)) return
val valueArgument = PsiTreeUtil.getParentOfType(position, javaClass<JetValueArgument>())!! val valueArgument = PsiTreeUtil.getParentOfType(position, javaClass<JetValueArgument>())!!
@@ -0,0 +1,9 @@
fun foo(first: Int, second: Int, third: String) {
}
fun test(p: Int) = foo(12, <caret>, third = "")
// EXIST: p
// ABSENT: first
// ABSENT: third
// EXIST: second
@@ -0,0 +1,9 @@
fun foo(first: Int, second: Int, third: String) {
}
fun test(p: Int) = foo(12, third = "", <caret>)
// ABSENT: p
// ABSENT: first
// ABSENT: third
// EXIST: second
@@ -553,6 +553,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt"); doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt");
} }
@TestMetadata("NotOnlyNamedParameters.kt")
public void testNotOnlyNamedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt");
}
@TestMetadata("OnlyNamedParameters.kt")
public void testOnlyNamedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt");
}
@TestMetadata("WithParameterExpression.kt") @TestMetadata("WithParameterExpression.kt")
public void testWithParameterExpression() throws Exception { public void testWithParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt"); doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt");
@@ -16,14 +16,17 @@
package org.jetbrains.jet.completion; package org.jetbrains.jet.completion;
import junit.framework.Assert;
import junit.framework.Test; import junit.framework.Test;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import java.io.File;
import java.util.regex.Pattern;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata; import org.jetbrains.jet.test.TestMetadata;
import java.io.File; import org.jetbrains.jet.completion.AbstractJvmBasicCompletionTest;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@@ -550,6 +553,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt"); doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt");
} }
@TestMetadata("NotOnlyNamedParameters.kt")
public void testNotOnlyNamedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt");
}
@TestMetadata("OnlyNamedParameters.kt")
public void testOnlyNamedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt");
}
@TestMetadata("WithParameterExpression.kt") @TestMetadata("WithParameterExpression.kt")
public void testWithParameterExpression() throws Exception { public void testWithParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt"); doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt");