KT-1633 support completion of named function parameters

This commit is contained in:
Nikolay Krasko
2014-03-17 04:00:33 +04:00
parent 5a5f234377
commit 607314989c
29 changed files with 527 additions and 70 deletions
+4 -1
View File
@@ -209,7 +209,10 @@
<completion.contributor language="jet" id="JetExtensionFunctionReceiverContributor" order="after JetPackagesContributor"
implementationClass="org.jetbrains.jet.plugin.completion.JetExtensionReceiverTypeContributor"/>
<completion.contributor language="jet" id="JetCompletionContributor" order="after JetExtensionFunctionReceiverContributor"
<completion.contributor language="jet" id="KotlinNamedParametersContributor" order="after JetExtensionFunctionReceiverContributor"
implementationClass="org.jetbrains.jet.plugin.completion.KotlinNamedParametersContributor"/>
<completion.contributor language="jet" id="JetCompletionContributor" order="after KotlinNamedParametersContributor"
implementationClass="org.jetbrains.jet.plugin.completion.JetCompletionContributor"/>
<completion.contributor language="jet" implementationClass="org.jetbrains.jet.plugin.liveTemplates.JetLiveTemplateCompletionContributor"
@@ -56,8 +56,20 @@ public open class JetCompletionCharFilter() : CharFilter() {
return null
}
fun checkFinishCompletionForEqual(): Result? {
if (c == '=') {
val currentItem = lookup.getCurrentItem()
if (currentItem != null && (currentItem.getObject() is KotlinNamedParametersContributor.NamedParameterLookupObject)) {
return Result.SELECT_ITEM_AND_FINISH_LOOKUP
}
}
return null
}
return checkHideLookupForRangeOperator() ?:
checkFinishCompletionForOpenBrace() ?:
checkFinishCompletionForEqual() ?:
null
}
}
@@ -0,0 +1,122 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.plugin.completion
import com.intellij.codeInsight.completion.CompletionContributor
import com.intellij.codeInsight.completion.CompletionType
import com.intellij.patterns.PlatformPatterns
import org.jetbrains.jet.lang.psi.JetValueArgument
import com.intellij.codeInsight.completion.CompletionProvider
import com.intellij.util.ProcessingContext
import com.intellij.codeInsight.completion.CompletionResultSet
import com.intellij.codeInsight.completion.CompletionParameters
import org.jetbrains.jet.lexer.JetTokens
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.psi.JetCallElement
import org.jetbrains.jet.plugin.references.JetReference
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import com.intellij.codeInsight.lookup.LookupElementBuilder
import org.jetbrains.jet.plugin.completion.KotlinNamedParametersContributor.NamedParameterLookupObject
import org.jetbrains.jet.plugin.JetIcons
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.plugin.completion.weigher.addJetSorting
import org.jetbrains.jet.plugin.quickfix.QuickFixUtil
import org.jetbrains.jet.renderer.DescriptorRenderer
import com.intellij.codeInsight.completion.InsertHandler
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.completion.InsertionContext
import com.intellij.psi.filters.position.FilterPattern
import com.intellij.psi.filters.AndFilter
import org.jetbrains.jet.lang.psi.JetValueArgumentName
import com.intellij.psi.filters.position.ParentElementFilter
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
public class KotlinNamedParametersContributor : CompletionContributor() {
public class NamedParameterLookupObject(val name: Name) {}
private val InNamedParameterFilter = AndFilter(
LeafElementFilter(JetTokens.IDENTIFIER),
OrFilter(
AndFilter(
ParentElementFilter(ClassFilter(javaClass<JetValueArgument>()), 2),
FirstChildInParentFilter(2)
),
ParentElementFilter(ClassFilter(javaClass<JetValueArgumentName>()), 2)
)
);
{
extend(CompletionType.BASIC,
PlatformPatterns.psiElement().and(FilterPattern(InNamedParameterFilter)),
object : CompletionProvider<CompletionParameters>() {
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext?, result: CompletionResultSet) {
doParamsCompletion(parameters, result)
}
})
}
fun doParamsCompletion(parameters: CompletionParameters, result: CompletionResultSet) {
val valueArgument = PsiTreeUtil.getParentOfType(parameters.getPosition(), javaClass<JetValueArgument>())!!
val callElement = PsiTreeUtil.getParentOfType(valueArgument, javaClass<JetCallElement>())
if (callElement == null) return
val callSimpleName = callElement.getCallNameExpression()
if (callSimpleName == null) return
val kotlinResultSet = result.addJetSorting(parameters)
val callReference = callSimpleName.getReference() as JetReference
val functionDescriptors = callReference.resolveToDescriptors().map { it as? FunctionDescriptor }.filterNotNull()
for (funDescriptor in functionDescriptors) {
val usedArguments = QuickFixUtil.getUsedParameters(callElement, valueArgument, funDescriptor)
for (parameter in funDescriptor.getValueParameters()) {
val name = parameter.getName().asString()
if (result.getPrefixMatcher().prefixMatches(name) && name !in usedArguments) {
val lookupElementBuilder = LookupElementBuilder.create(NamedParameterLookupObject(parameter.getName()), "${name}")
.withPresentableText("${name} = ")
.withTailText("${DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(parameter.getType())}")
.withIcon(JetIcons.PARAMETER)
.withInsertHandler(NamedParameterInsertHandler)
kotlinResultSet.addElement(lookupElementBuilder)
}
}
}
}
private object NamedParameterInsertHandler : InsertHandler<LookupElement> {
override fun handleInsert(context: InsertionContext, item: LookupElement) {
val ch = context.getCompletionChar()
if (ch == '=' || ch == ' ') {
context.setAddCompletionChar(false)
}
val editor = context.getEditor()
val tailOffset = context.getTailOffset()
editor.getDocument().insertString(tailOffset, " = ")
editor.getCaretModel().moveToOffset(tailOffset + 3)
}
}
}
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.LocalVariableDescriptor;
import org.jetbrains.jet.plugin.completion.JetLookupObject;
import org.jetbrains.jet.plugin.completion.KotlinNamedParametersContributor;
class JetKindWeigher extends LookupElementWeigher {
JetKindWeigher() {
@@ -34,6 +35,7 @@ class JetKindWeigher extends LookupElementWeigher {
private enum MyResult {
localOrParameter,
property,
namedParameter,
probableKeyword,
normal,
packages
@@ -58,6 +60,9 @@ class JetKindWeigher extends LookupElementWeigher {
}
}
}
else if (object instanceof KotlinNamedParametersContributor.NamedParameterLookupObject) {
return MyResult.namedParameter;
}
else if (object instanceof String) {
return MyResult.probableKeyword;
}
@@ -34,6 +34,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.JetVisibilityChecker;
@@ -424,27 +425,10 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
@Nullable
private static JetSimpleNameExpression getCallSimpleNameExpression(JetValueArgumentList argumentList) {
if (!(argumentList.getParent() instanceof JetCallElement)) {
return null;
}
JetCallElement callExpression = (JetCallElement)argumentList.getParent();
JetExpression calleeExpression = callExpression.getCalleeExpression();
if (calleeExpression == null) {
return null;
}
if (calleeExpression instanceof JetSimpleNameExpression) {
return (JetSimpleNameExpression) calleeExpression;
}
else if (calleeExpression instanceof JetConstructorCalleeExpression) {
JetConstructorCalleeExpression constructorCalleeExpression = (JetConstructorCalleeExpression) calleeExpression;
if (constructorCalleeExpression.getConstructorReferenceExpression() instanceof JetSimpleNameExpression) {
return (JetSimpleNameExpression) constructorCalleeExpression.getConstructorReferenceExpression();
}
}
return null;
PsiElement argumentListParent = argumentList.getParent();
return (argumentListParent instanceof JetCallElement) ?
PsiUtilPackage.getCallNameExpression((JetCallElement) argumentListParent) :
null;
}
private static JetValueArgumentList findCallAndUpdateContext(UpdateParameterInfoContext context) {
@@ -17,7 +17,6 @@
package org.jetbrains.jet.plugin.quickfix;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
@@ -72,7 +71,7 @@ public class AddNameToArgumentFix extends JetIntentionAction<JetValueArgument> {
CallableDescriptor callableDescriptor = resolvedCall.getResultingDescriptor();
JetType type = context.get(BindingContext.EXPRESSION_TYPE, argument.getArgumentExpression());
Set<String> usedParameters = getUsedParameters(callElement, callableDescriptor);
Set<String> usedParameters = QuickFixUtil.getUsedParameters(callElement, null, callableDescriptor);
List<String> names = Lists.newArrayList();
for (ValueParameterDescriptor parameter: callableDescriptor.getValueParameters()) {
String name = parameter.getName().asString();
@@ -84,27 +83,6 @@ public class AddNameToArgumentFix extends JetIntentionAction<JetValueArgument> {
return names;
}
@NotNull
private static Set<String> getUsedParameters(@NotNull JetCallElement callElement, @NotNull CallableDescriptor callableDescriptor) {
Set<String> usedParameters = Sets.newHashSet();
boolean isPositionalArgument = true;
int idx = 0;
for (ValueArgument argument : callElement.getValueArguments()) {
if (argument.isNamed()) {
JetValueArgumentName name = argument.getArgumentName();
assert name != null : "Named argument's name cannot be null";
usedParameters.add(name.getText());
isPositionalArgument = false;
}
else if (isPositionalArgument) {
ValueParameterDescriptor parameter = callableDescriptor.getValueParameters().get(idx);
usedParameters.add(parameter.getName().asString());
idx++;
}
}
return usedParameters;
}
@Override
protected void invoke(@NotNull Project project, Editor editor, JetFile file) {
if (possibleNames.size() == 1 || editor == null || !editor.getComponent().isShowing()) {
@@ -16,6 +16,7 @@
package org.jetbrains.jet.plugin.quickfix;
import com.google.common.collect.Sets;
import com.intellij.extapi.psi.ASTDelegatePsiElement;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -23,8 +24,10 @@ import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -37,6 +40,7 @@ import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.references.BuiltInsReferenceResolver;
import java.util.List;
import java.util.Set;
public class QuickFixUtil {
private QuickFixUtil() {
@@ -196,4 +200,35 @@ public class QuickFixUtil {
return returnExpression != null && canEvaluateTo(returnExpression.getReturnedExpression(), expression);
}
}
@ReadOnly
@NotNull
public static Set<String> getUsedParameters(
@NotNull JetCallElement callElement,
@Nullable JetValueArgument ignoreArgument,
@NotNull CallableDescriptor callableDescriptor
) {
Set<String> usedParameters = Sets.newHashSet();
boolean isPositionalArgument = true;
int idx = 0;
for (ValueArgument argument : callElement.getValueArguments()) {
if (argument.isNamed()) {
JetValueArgumentName name = argument.getArgumentName();
assert name != null : "Named argument's name cannot be null";
if (argument != ignoreArgument) {
usedParameters.add(name.getText());
}
isPositionalArgument = false;
}
else if (isPositionalArgument) {
ValueParameterDescriptor parameter = callableDescriptor.getValueParameters().get(idx);
if (argument != ignoreArgument) {
usedParameters.add(parameter.getName().asString());
}
idx++;
}
}
return usedParameters;
}
}
@@ -0,0 +1,41 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.plugin.util
import com.intellij.psi.filters.position.PositionElementFilter
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
public class FirstChildInParentFilter(val level: Int = 1) : PositionElementFilter() {
override fun isAcceptable(element: Any?, context: PsiElement?): Boolean {
if (!(element is PsiElement)) return false
var parent: PsiElement? = element
for (i in 1..level) {
if (parent == null) break
parent = parent?.getContext()
}
return (parent != null) && PsiTreeUtil.isAncestor(parent?.getFirstChild(), element, true)
}
override fun toString(): String {
return "firstChildInParent($level)"
}
}
@@ -0,0 +1,6 @@
fun small(param: Int) {
}
fun test() = small(<caret>)
// EXIST: {"lookupString":"param","tailText":"Int","itemText":"param = "}
@@ -0,0 +1,7 @@
fun small(first: Int, second: Int) {
}
fun test() = small(12, <caret>)
// ABSENT: first
// EXIST: second
@@ -0,0 +1,11 @@
import java.util.ArrayList
val paramTest = 12
fun small(paramFirst: ArrayList<String>, paramSecond: Comparable<java.lang.RuntimeException>) {
}
fun test() = small(<caret>)
// EXIST: {"lookupString":"paramSecond","tailText":"Comparable<RuntimeException>","itemText":"paramSecond = "}
// EXIST: {"lookupString":"paramFirst","tailText":"ArrayList<String>","itemText":"paramFirst = "}
@@ -0,0 +1,11 @@
val paramTest = 12
fun small(paramFirst: Int, paramSecond: Int) {
}
fun test() = small(paramFirst = param<caret>)
// EXIST: paramTest
// ABSENT: {"lookupString":"paramFirst","tailText":"Int","itemText":"paramFirst = "}
// ABSENT: paramSecond
// NUMBER: 1
@@ -0,0 +1,20 @@
package test
val nLocal = 12
class foo(nClassParam: String, val nClassField: String)
fun foo(nFirst: String) = 12
fun foo(nSecond: String? = null, nThird: Int = 1) { }
fun other() {
foo(n<caret>)
}
// EXIST: nFirst
// EXIST: nSecond
// EXIST: nThird
// EXIST: nLocal
// todo - should exist
// ABSENT: nClassParam
// ABSENT: nClassField
@@ -0,0 +1,10 @@
package test
class Foo(pFirst: String? = null, val pSecond: Int = 1) { }
fun other() {
Foo(p<caret>)
}
// EXIST: {"lookupString":"pFirst","tailText":"String?","itemText":"pFirst = "}
// EXIST: {"lookupString":"pSecond","tailText":"Int","itemText":"pSecond = "}
@@ -0,0 +1,11 @@
fun foo(paramFirst: String, paramSecond: String, paramThird: String, paramFourth: String) {}
fun test() {
foo("str", paramThird = "test", param<caret>)
}
// ABSENT: paramFirst
// EXIST: paramSecond
// ABSENT: paramThird
// EXIST: paramFourth
@@ -0,0 +1,11 @@
fun foo(paramFirst: Int, paramSecond: Int) = 12
fun foo(paramThird: String, paramFourth: String) = 1
fun test() {
foo(12, param<caret>)
}
// ABSENT: paramFirst
// EXIST: {"lookupString":"paramSecond","tailText":"Int","itemText":"paramSecond = "}
// ABSENT: paramThird
// ABSENT: paramFourth
@@ -0,0 +1,12 @@
val paramTest = 12
fun small(paramFirst: Int, paramSecond: Int) {
}
fun test() = small(param<caret>First = 12)
// EXIST: paramFirst
// EXIST: paramSecond
// ABSENT: paramTest
// NUMBER: 2
@@ -0,0 +1,6 @@
fun foo(paramTest: Int = 12)
fun test() {
// '=' is expected
foo(param<caret>)
}
@@ -0,0 +1,6 @@
fun foo(paramTest: Int = 12)
fun test() {
// '=' is expected
foo(paramTest = <caret>)
}
@@ -0,0 +1,8 @@
val paramVal = 12
fun foo(paramTest: Int = 12)
fun paramFun() {}
fun test() {
// Type '=', completion should be finishied
foo(param<caret>)
}
@@ -0,0 +1,8 @@
val paramVal = 12
fun foo(paramTest: Int = 12)
fun paramFun() {}
fun test() {
// Type '=', completion should be finishied
foo(paramTest = <caret>)
}
@@ -0,0 +1,10 @@
package temp.test
class Options(val listNew: Boolean, val listMatch: Boolean) {
}
fun listImportedFun() = 12
val listImportedVal = 11
@@ -0,0 +1,22 @@
package test
import temp.test.*
val listThisFileVal = 12
fun listThisFileFun() = 1
class ListThisFileClass {}
fun test(listParam: Int) {
val listLocalVal = 12
Options(list<caret>)
}
// ORDER: listLocalVal
// ORDER: listParam
// ORDER: listThisFileVal
// ORDER: listImportedVal
// ORDER: listMatch
// ORDER: listNew
// ORDER: listThisFileFun
// ORDER: listImportedFun
@@ -33,7 +33,7 @@ import org.jetbrains.jet.completion.AbstractJSBasicCompletionTest;
@InnerTestClasses({JSBasicCompletionTestGenerated.Common.class, JSBasicCompletionTestGenerated.Js.class})
public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTest {
@TestMetadata("idea/testData/completion/basic/common")
@InnerTestClasses({Common.Extensions.class})
@InnerTestClasses({Common.Extensions.class, Common.NamedParameters.class})
public static class Common extends AbstractJSBasicCompletionTest {
@TestMetadata("AfterFloatOnNewLine.kt")
public void testAfterFloatOnNewLine() throws Exception {
@@ -472,10 +472,64 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
}
@TestMetadata("idea/testData/completion/basic/common/namedParameters")
public static class NamedParameters extends AbstractJSBasicCompletionTest {
@TestMetadata("AfterBrace.kt")
public void testAfterBrace() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/AfterBrace.kt");
}
@TestMetadata("AfterComma.kt")
public void testAfterComma() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/AfterComma.kt");
}
public void testAllFilesPresentInNamedParameters() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/completion/basic/common/namedParameters"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("CompactTypeNames.kt")
public void testCompactTypeNames() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt");
}
@TestMetadata("InParameterExpression.kt")
public void testInParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt");
}
@TestMetadata("NamedParametersFromOverloads.kt")
public void testNamedParametersFromOverloads() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt");
}
@TestMetadata("NamedParamsInConstructor.kt")
public void testNamedParamsInConstructor() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt");
}
@TestMetadata("NoAlreadyUsedParameters.kt")
public void testNoAlreadyUsedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt");
}
@TestMetadata("NoParamsFromUnapplicableOverload.kt")
public void testNoParamsFromUnapplicableOverload() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt");
}
@TestMetadata("WithParameterExpression.kt")
public void testWithParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("Common");
suite.addTestSuite(Common.class);
suite.addTestSuite(Extensions.class);
suite.addTestSuite(NamedParameters.class);
return suite;
}
}
@@ -33,7 +33,7 @@ import org.jetbrains.jet.completion.AbstractJvmBasicCompletionTest;
@InnerTestClasses({JvmBasicCompletionTestGenerated.Common.class, JvmBasicCompletionTestGenerated.Java.class})
public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionTest {
@TestMetadata("idea/testData/completion/basic/common")
@InnerTestClasses({Common.Extensions.class})
@InnerTestClasses({Common.Extensions.class, Common.NamedParameters.class})
public static class Common extends AbstractJvmBasicCompletionTest {
@TestMetadata("AfterFloatOnNewLine.kt")
public void testAfterFloatOnNewLine() throws Exception {
@@ -472,10 +472,64 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
}
@TestMetadata("idea/testData/completion/basic/common/namedParameters")
public static class NamedParameters extends AbstractJvmBasicCompletionTest {
@TestMetadata("AfterBrace.kt")
public void testAfterBrace() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/AfterBrace.kt");
}
@TestMetadata("AfterComma.kt")
public void testAfterComma() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/AfterComma.kt");
}
public void testAllFilesPresentInNamedParameters() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/completion/basic/common/namedParameters"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("CompactTypeNames.kt")
public void testCompactTypeNames() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/CompactTypeNames.kt");
}
@TestMetadata("InParameterExpression.kt")
public void testInParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/InParameterExpression.kt");
}
@TestMetadata("NamedParametersFromOverloads.kt")
public void testNamedParametersFromOverloads() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NamedParametersFromOverloads.kt");
}
@TestMetadata("NamedParamsInConstructor.kt")
public void testNamedParamsInConstructor() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NamedParamsInConstructor.kt");
}
@TestMetadata("NoAlreadyUsedParameters.kt")
public void testNoAlreadyUsedParameters() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NoAlreadyUsedParameters.kt");
}
@TestMetadata("NoParamsFromUnapplicableOverload.kt")
public void testNoParamsFromUnapplicableOverload() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/NoParamsFromUnapplicableOverload.kt");
}
@TestMetadata("WithParameterExpression.kt")
public void testWithParameterExpression() throws Exception {
doTest("idea/testData/completion/basic/common/namedParameters/WithParameterExpression.kt");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("Common");
suite.addTestSuite(Common.class);
suite.addTestSuite(Extensions.class);
suite.addTestSuite(NamedParameters.class);
return suite;
}
}
@@ -22,6 +22,10 @@ public class BasicCompletionHandlerTest : CompletionHandlerTestBase(){
fun testParamsFunction() = doTest()
fun testNamedParametersCompletion() = doTest()
fun testNamedParametersCompletionOnEqual() = doTest(0, "paramTest", null, '=')
fun testInsertJavaClassImport() = doTest()
fun testInsertVoidJavaMethod() = doTest()
@@ -71,6 +71,11 @@ public class CompletionWeigherTestGenerated extends AbstractCompletionWeigherTes
doTest("idea/testData/completion/weighers/LocalsPropertiesKeywords.kt");
}
@TestMetadata("NamedParameters.kt")
public void testNamedParameters() throws Exception {
doTest("idea/testData/completion/weighers/NamedParameters.kt");
}
@TestMetadata("ParametersBeforeKeywords.kt")
public void testParametersBeforeKeywords() throws Exception {
doTest("idea/testData/completion/weighers/ParametersBeforeKeywords.kt");