Only named parameters in completion when nothing else can be
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user