diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java index e4210192a4b..6133fb98daf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetCallElement.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.psi; +import kotlin.jvm.KotlinSignature; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +29,7 @@ public interface JetCallElement extends JetElement { @Nullable JetValueArgumentList getValueArgumentList(); + @KotlinSignature("fun getValueArguments(): List") @NotNull List getValueArguments(); diff --git a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt index e2acb8dc832..0a11dc14209 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/CompletionSession.kt @@ -87,26 +87,28 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, } private fun collectElements() { - if (jetReference != null && !isOnlyKeywordCompletion()) { - if (shouldRunOnlyTypeCompletion()) { - if (configuration.completeNonImportedDeclarations) { - TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) + if (!NamedParametersCompletion.isOnlyNamedParameterExpected(position)) { + if (jetReference != null && !isOnlyKeywordCompletion()) { + if (shouldRunOnlyTypeCompletion()) { + if (configuration.completeNonImportedDeclarations) { + TypesCompletion(parameters, resolveSession, prefixMatcher).addAllTypes(collector) + } + else { + addReferenceVariants { isPartOfTypeDeclaration(it) } + JavaCompletionContributor.advertiseSecondCompletion(position.getProject(), resultSet) + } } else { - addReferenceVariants { isPartOfTypeDeclaration(it) } - JavaCompletionContributor.advertiseSecondCompletion(position.getProject(), resultSet) + addReferenceVariants { true } + + addNonImported() } } - else { - addReferenceVariants { true } - addNonImported() - } + KeywordCompletion().complete(parameters, collector) } - KeywordCompletion().complete(parameters, collector) - - NamedParametersCompletion.complete(parameters, collector) + NamedParametersCompletion.complete(position, collector) } private fun addNonImported() { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt index 73ac69ee08e..bf799721350 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/NamedParametersCompletion.kt @@ -37,6 +37,7 @@ import com.intellij.psi.filters.OrFilter import com.intellij.psi.filters.ClassFilter import org.jetbrains.jet.plugin.util.FirstChildInParentFilter import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression +import com.intellij.psi.PsiElement object NamedParametersCompletion { private val positionFilter = AndFilter( @@ -50,8 +51,22 @@ object NamedParametersCompletion { ) ) - public fun complete(parameters: CompletionParameters, collector: LookupElementsCollector) { - val position = parameters.getPosition() + public fun isOnlyNamedParameterExpected(position: PsiElement): Boolean { + if (!positionFilter.isAcceptable(position, position)) return false + + val thisArgument = PsiTreeUtil.getParentOfType(position, javaClass())!! + + val callElement = PsiTreeUtil.getParentOfType(thisArgument, javaClass()) ?: 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 val valueArgument = PsiTreeUtil.getParentOfType(position, javaClass())!! diff --git a/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt new file mode 100644 index 00000000000..2a6bb3ea6b7 --- /dev/null +++ b/idea/testData/completion/basic/common/namedParameters/NotOnlyNamedParameters.kt @@ -0,0 +1,9 @@ +fun foo(first: Int, second: Int, third: String) { +} + +fun test(p: Int) = foo(12, , third = "") + +// EXIST: p +// ABSENT: first +// ABSENT: third +// EXIST: second diff --git a/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt b/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt new file mode 100644 index 00000000000..4374c124ce9 --- /dev/null +++ b/idea/testData/completion/basic/common/namedParameters/OnlyNamedParameters.kt @@ -0,0 +1,9 @@ +fun foo(first: Int, second: Int, third: String) { +} + +fun test(p: Int) = foo(12, third = "", ) + +// ABSENT: p +// ABSENT: first +// ABSENT: third +// EXIST: second diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index 2fd75d39146..a46ed07b0c7 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -553,6 +553,16 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes 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") public void testWithParameterExpression() throws Exception { doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 983dc78688a..828f934fdc4 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -16,14 +16,17 @@ package org.jetbrains.jet.completion; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; + +import java.io.File; +import java.util.regex.Pattern; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import java.io.File; -import java.util.regex.Pattern; +import org.jetbrains.jet.completion.AbstractJvmBasicCompletionTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @@ -550,6 +553,16 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT 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") public void testWithParameterExpression() throws Exception { doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt");