Smart completion: multiple arguments at once
This commit is contained in:
@@ -39,6 +39,7 @@ public final class JetDescriptorIconProvider {
|
|||||||
private JetDescriptorIconProvider() {
|
private JetDescriptorIconProvider() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
public static Icon getIcon(@NotNull DeclarationDescriptor descriptor, @Nullable PsiElement declaration, @Iconable.IconFlags int flags) {
|
public static Icon getIcon(@NotNull DeclarationDescriptor descriptor, @Nullable PsiElement declaration, @Iconable.IconFlags int flags) {
|
||||||
if (declaration != null && !isKotlinDeclaration(declaration)) {
|
if (declaration != null && !isKotlinDeclaration(declaration)) {
|
||||||
return declaration.getIcon(flags);
|
return declaration.getIcon(flags);
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.descriptors.ClassKind
|
|||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||||
|
|
||||||
enum class ItemPriority {
|
enum class ItemPriority {
|
||||||
|
MULTIPLE_ARGUMENTS_ITEM
|
||||||
DEFAULT
|
DEFAULT
|
||||||
NAMED_PARAMETER
|
NAMED_PARAMETER
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import com.intellij.lang.ASTNode
|
|||||||
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
import org.jetbrains.jet.lang.psi.JetQualifiedExpression
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker
|
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker
|
||||||
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo
|
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency
|
import org.jetbrains.jet.lang.resolve.calls.context.ContextDependency
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode
|
import org.jetbrains.jet.lang.resolve.calls.context.CheckValueArgumentsMode
|
||||||
import org.jetbrains.jet.lang.resolve.calls.CompositeExtension
|
import org.jetbrains.jet.lang.resolve.calls.CompositeExtension
|
||||||
@@ -35,7 +34,6 @@ import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults
|
|||||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
import org.jetbrains.jet.lang.psi.JetBinaryExpression
|
import org.jetbrains.jet.lang.psi.JetBinaryExpression
|
||||||
import org.jetbrains.jet.lexer.JetTokens
|
import org.jetbrains.jet.lexer.JetTokens
|
||||||
@@ -44,7 +42,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
|||||||
import org.jetbrains.jet.lang.psi.JetContainerNode
|
import org.jetbrains.jet.lang.psi.JetContainerNode
|
||||||
import org.jetbrains.jet.plugin.completion.smart.isSubtypeOf
|
import org.jetbrains.jet.plugin.completion.smart.isSubtypeOf
|
||||||
import org.jetbrains.jet.lang.resolve.calls.callUtil.noErrorsInValueArguments
|
import org.jetbrains.jet.lang.resolve.calls.callUtil.noErrorsInValueArguments
|
||||||
import org.jetbrains.jet.lang.resolve.calls.callUtil.hasUnmappedParameters
|
|
||||||
import org.jetbrains.jet.lang.descriptors.Visibilities
|
import org.jetbrains.jet.lang.descriptors.Visibilities
|
||||||
import org.jetbrains.jet.lang.psi.JetBlockExpression
|
import org.jetbrains.jet.lang.psi.JetBlockExpression
|
||||||
import org.jetbrains.jet.plugin.util.makeNotNullable
|
import org.jetbrains.jet.plugin.util.makeNotNullable
|
||||||
@@ -62,16 +59,14 @@ import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
|
|||||||
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
|
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
|
||||||
import org.jetbrains.jet.lang.psi.JetArrayAccessExpression
|
import org.jetbrains.jet.lang.psi.JetArrayAccessExpression
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty
|
import org.jetbrains.jet.lang.psi.JetProperty
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
|
|
||||||
import org.jetbrains.jet.lang.descriptors.VariableDescriptor
|
|
||||||
import org.jetbrains.jet.lang.psi.JetFunction
|
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor
|
|
||||||
import org.jetbrains.jet.lang.psi.JetReturnExpression
|
import org.jetbrains.jet.lang.psi.JetReturnExpression
|
||||||
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getTargetFunctionDescriptor
|
||||||
import org.jetbrains.jet.plugin.completion.smart.toList
|
import org.jetbrains.jet.plugin.completion.smart.toList
|
||||||
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor
|
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor
|
||||||
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
|
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
|
||||||
|
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies
|
||||||
|
import org.jetbrains.jet.lang.descriptors.VariableDescriptor
|
||||||
|
|
||||||
enum class Tail {
|
enum class Tail {
|
||||||
COMMA
|
COMMA
|
||||||
@@ -79,9 +74,19 @@ enum class Tail {
|
|||||||
ELSE
|
ELSE
|
||||||
}
|
}
|
||||||
|
|
||||||
data class ExpectedInfo(val `type`: JetType, val name: String?, val tail: Tail?)
|
open data class ExpectedInfo(val `type`: JetType, val name: String?, val tail: Tail?)
|
||||||
|
|
||||||
class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: ModuleDescriptor) {
|
class PositionalArgumentExpectedInfo(`type`: JetType, name: String?, tail: Tail?, val function: FunctionDescriptor, val argumentIndex: Int)
|
||||||
|
: ExpectedInfo(`type`, name, tail) {
|
||||||
|
|
||||||
|
override fun equals(other: Any?)
|
||||||
|
= other is PositionalArgumentExpectedInfo && super.equals(other) && function == other.function && argumentIndex == other.argumentIndex
|
||||||
|
|
||||||
|
override fun hashCode()
|
||||||
|
= function.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExpectedInfos(val bindingContext: BindingContext, val resolveSession: ResolveSessionForBodies) {
|
||||||
public fun calculate(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
public fun calculate(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
||||||
return calculateForArgument(expressionWithType)
|
return calculateForArgument(expressionWithType)
|
||||||
?: calculateForFunctionLiteralArgument(expressionWithType)
|
?: calculateForFunctionLiteralArgument(expressionWithType)
|
||||||
@@ -156,7 +161,7 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo
|
|||||||
CheckValueArgumentsMode.ENABLED,
|
CheckValueArgumentsMode.ENABLED,
|
||||||
CompositeExtension(listOf()),
|
CompositeExtension(listOf()),
|
||||||
false).replaceCollectAllCandidates(true)
|
false).replaceCollectAllCandidates(true)
|
||||||
val callResolver = InjectorForMacros(callElement.getProject(), moduleDescriptor).getCallResolver()!!
|
val callResolver = InjectorForMacros(callElement.getProject(), resolveSession.getModuleDescriptor()).getCallResolver()!!
|
||||||
val results: OverloadResolutionResults<FunctionDescriptor> = callResolver.resolveFunctionCall(callResolutionContext)
|
val results: OverloadResolutionResults<FunctionDescriptor> = callResolver.resolveFunctionCall(callResolutionContext)
|
||||||
|
|
||||||
val expectedInfos = HashSet<ExpectedInfo>()
|
val expectedInfos = HashSet<ExpectedInfo>()
|
||||||
@@ -172,7 +177,7 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo
|
|||||||
val tail = if (isFunctionLiteralArgument)
|
val tail = if (isFunctionLiteralArgument)
|
||||||
null
|
null
|
||||||
else if (argumentIndex == parameters.lastIndex)
|
else if (argumentIndex == parameters.lastIndex)
|
||||||
Tail.RPARENTH
|
Tail.RPARENTH //TODO: support square brackets
|
||||||
else if (parameters.drop(argumentIndex + 1).all { it.hasDefaultValue() || it.getVarargElementType() != null })
|
else if (parameters.drop(argumentIndex + 1).all { it.hasDefaultValue() || it.getVarargElementType() != null })
|
||||||
null
|
null
|
||||||
else
|
else
|
||||||
@@ -180,7 +185,7 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo
|
|||||||
|
|
||||||
val parameter = parameters[argumentIndex]
|
val parameter = parameters[argumentIndex]
|
||||||
val expectedName = if (descriptor.hasSynthesizedParameterNames()) null else parameter.getName().asString()
|
val expectedName = if (descriptor.hasSynthesizedParameterNames()) null else parameter.getName().asString()
|
||||||
expectedInfos.add(ExpectedInfo(parameter.getType(), expectedName, tail))
|
expectedInfos.add(PositionalArgumentExpectedInfo(parameter.getType(), expectedName, tail, descriptor, argumentIndex))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return expectedInfos
|
return expectedInfos
|
||||||
@@ -273,14 +278,14 @@ class ExpectedInfos(val bindingContext: BindingContext, val moduleDescriptor: Mo
|
|||||||
private fun calculateForInitializer(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
private fun calculateForInitializer(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
||||||
val property = expressionWithType.getParent() as? JetProperty ?: return null
|
val property = expressionWithType.getParent() as? JetProperty ?: return null
|
||||||
if (expressionWithType != property.getInitializer()) return null
|
if (expressionWithType != property.getInitializer()) return null
|
||||||
val propertyDescriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, property] as? VariableDescriptor ?: return null
|
val propertyDescriptor = resolveSession.resolveToDescriptor(property) as? VariableDescriptor ?: return null
|
||||||
return listOf(ExpectedInfo(propertyDescriptor.getType(), propertyDescriptor.getName().asString(), null))
|
return listOf(ExpectedInfo(propertyDescriptor.getType(), propertyDescriptor.getName().asString(), null))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun calculateForExpressionBody(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
private fun calculateForExpressionBody(expressionWithType: JetExpression): Collection<ExpectedInfo>? {
|
||||||
val declaration = expressionWithType.getParent() as? JetDeclarationWithBody ?: return null
|
val declaration = expressionWithType.getParent() as? JetDeclarationWithBody ?: return null
|
||||||
if (expressionWithType != declaration.getBodyExpression() || declaration.hasBlockBody()) return null
|
if (expressionWithType != declaration.getBodyExpression() || declaration.hasBlockBody()) return null
|
||||||
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration] as? FunctionDescriptor ?: return null
|
val descriptor = resolveSession.resolveToDescriptor(declaration) as? FunctionDescriptor ?: return null
|
||||||
return functionReturnValueExpectedInfo(descriptor).toList()
|
return functionReturnValueExpectedInfo(descriptor).toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ private fun needExplicitParameterTypes(context: InsertionContext, placeholderRan
|
|||||||
|
|
||||||
val resolveSession = file.getLazyResolveSession()
|
val resolveSession = file.getLazyResolveSession()
|
||||||
val bindingContext = resolveSession.resolveToElement(expression)
|
val bindingContext = resolveSession.resolveToElement(expression)
|
||||||
val expectedInfos = ExpectedInfos(bindingContext, resolveSession.getModuleDescriptor()).calculate(expression) ?: return false
|
val expectedInfos = ExpectedInfos(bindingContext, resolveSession).calculate(expression) ?: return false
|
||||||
val functionTypes = expectedInfos.map { it.`type` }.filter { KotlinBuiltIns.getInstance().isExactFunctionOrExtensionFunctionType(it) }.toSet()
|
val functionTypes = expectedInfos.map { it.`type` }.filter { KotlinBuiltIns.getInstance().isExactFunctionOrExtensionFunctionType(it) }.toSet()
|
||||||
if (functionTypes.size <= 1) return false
|
if (functionTypes.size <= 1) return false
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* 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.smart
|
||||||
|
|
||||||
|
import org.jetbrains.jet.plugin.completion.ExpectedInfo
|
||||||
|
import org.jetbrains.jet.lang.psi.JetExpression
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElement
|
||||||
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
||||||
|
import com.intellij.ui.LayeredIcon
|
||||||
|
import org.jetbrains.jet.renderer.DescriptorRenderer
|
||||||
|
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||||
|
import org.jetbrains.jet.plugin.completion.Tail
|
||||||
|
import org.jetbrains.jet.plugin.completion.ItemPriority
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||||
|
import java.util.HashSet
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
|
||||||
|
import org.jetbrains.jet.plugin.JetDescriptorIconProvider
|
||||||
|
import org.jetbrains.jet.lang.descriptors.VariableDescriptor
|
||||||
|
import org.jetbrains.jet.plugin.completion.PositionalArgumentExpectedInfo
|
||||||
|
import org.jetbrains.jet.plugin.completion.assignPriority
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
|
||||||
|
val typesWithAutoCasts: (DeclarationDescriptor) -> Iterable<JetType>) {
|
||||||
|
|
||||||
|
public fun addToCollection(collection: MutableCollection<LookupElement>,
|
||||||
|
expectedInfos: Collection<ExpectedInfo>,
|
||||||
|
context: JetExpression) {
|
||||||
|
val resolutionScope = bindingContext[BindingContext.RESOLUTION_SCOPE, context] ?: return
|
||||||
|
|
||||||
|
val added = HashSet<String>()
|
||||||
|
for (expectedInfo in expectedInfos) {
|
||||||
|
if (expectedInfo is PositionalArgumentExpectedInfo && expectedInfo.argumentIndex == 0) {
|
||||||
|
val parameters = expectedInfo.function.getValueParameters()
|
||||||
|
if (parameters.size > 1) {
|
||||||
|
val variables = ArrayList<VariableDescriptor>()
|
||||||
|
for ((i, parameter) in parameters.withIndices()) {
|
||||||
|
val variable = variableInScope(parameter, resolutionScope) ?: break
|
||||||
|
variables.add(variable) // TODO: cannot inline variable because of KT-5890
|
||||||
|
|
||||||
|
if (i > 0 && parameters.stream().drop(i + 1).all { it.hasDefaultValue() }) { // this is the last parameter or all others have default values
|
||||||
|
val lookupElement = createParametersLookupElement(variables)
|
||||||
|
if (added.add(lookupElement.getLookupString())) { // check that we don't already have item with the same text
|
||||||
|
collection.add(lookupElement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createParametersLookupElement(variables: List<VariableDescriptor>): LookupElement {
|
||||||
|
val compoundIcon = LayeredIcon(2)
|
||||||
|
val firstIcon = JetDescriptorIconProvider.getIcon(variables.first(), null, 0)
|
||||||
|
val lastIcon = JetDescriptorIconProvider.getIcon(variables.last(), null, 0)
|
||||||
|
compoundIcon.setIcon(lastIcon, 0, 2 * firstIcon.getIconWidth() / 5, 0)
|
||||||
|
compoundIcon.setIcon(firstIcon, 1, 0, 0)
|
||||||
|
|
||||||
|
return LookupElementBuilder
|
||||||
|
.create(variables.map { DescriptorRenderer.SOURCE_CODE.renderName(it.getName()) }.joinToString(", "))
|
||||||
|
.withIcon(compoundIcon)
|
||||||
|
.addTail(Tail.RPARENTH) //TODO: support square brackets
|
||||||
|
.assignPriority(ItemPriority.MULTIPLE_ARGUMENTS_ITEM)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun variableInScope(parameter: ValueParameterDescriptor, scope: JetScope): VariableDescriptor? {
|
||||||
|
val name = parameter.getName()
|
||||||
|
//TODO: there can be more than one property with such name in scope and we should be able to select one (but we need API for this)
|
||||||
|
val variable = scope.getLocalVariable(name) ?: scope.getProperties(name).singleOrNull() ?: return null
|
||||||
|
return if (typesWithAutoCasts(variable).any { JetTypeChecker.DEFAULT.isSubtypeOf(it, parameter.getType()) })
|
||||||
|
variable
|
||||||
|
else
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,7 +39,6 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
|
|||||||
val visibilityFilter: (DeclarationDescriptor) -> Boolean,
|
val visibilityFilter: (DeclarationDescriptor) -> Boolean,
|
||||||
val originalFile: JetFile) {
|
val originalFile: JetFile) {
|
||||||
private val bindingContext = resolveSession.resolveToElement(expression)
|
private val bindingContext = resolveSession.resolveToElement(expression)
|
||||||
private val moduleDescriptor = resolveSession.getModuleDescriptor()
|
|
||||||
private val project = expression.getProject()
|
private val project = expression.getProject()
|
||||||
|
|
||||||
public data class Result(val declarationFilter: ((DeclarationDescriptor) -> Collection<LookupElement>)?,
|
public data class Result(val declarationFilter: ((DeclarationDescriptor) -> Collection<LookupElement>)?,
|
||||||
@@ -136,6 +135,8 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
|
|||||||
LambdaItems.addToCollection(additionalItems, functionExpectedInfos)
|
LambdaItems.addToCollection(additionalItems, functionExpectedInfos)
|
||||||
|
|
||||||
KeywordValues.addToCollection(additionalItems, filteredExpectedInfos/* use filteredExpectedInfos to not include null after == */, expressionWithType)
|
KeywordValues.addToCollection(additionalItems, filteredExpectedInfos/* use filteredExpectedInfos to not include null after == */, expressionWithType)
|
||||||
|
|
||||||
|
MultipleArgumentsItemProvider(bindingContext, typesWithAutoCasts).addToCollection(additionalItems, expectedInfos, expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result(::filterDeclaration, additionalItems)
|
return Result(::filterDeclaration, additionalItems)
|
||||||
@@ -154,7 +155,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ExpectedInfos(bindingContext, moduleDescriptor).calculate(expression)
|
return ExpectedInfos(bindingContext, resolveSession).calculate(expression)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun implicitlyTypedDeclarationFromInitializer(expression: JetExpression): JetDeclaration? {
|
private fun implicitlyTypedDeclarationFromInitializer(expression: JetExpression): JetDeclaration? {
|
||||||
@@ -172,7 +173,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
|
|||||||
is JetProperty -> {
|
is JetProperty -> {
|
||||||
//TODO: this can be filtered out by ordinary completion
|
//TODO: this can be filtered out by ordinary completion
|
||||||
if (expression == parent.getInitializer()) {
|
if (expression == parent.getInitializer()) {
|
||||||
return resolveSession.resolveToElement(parent)[BindingContext.DECLARATION_TO_DESCRIPTOR, parent].toSet()
|
return resolveSession.resolveToDescriptor(parent).toSet()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ELEMENT: "a, b, c"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(a, b, c)<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// ELEMENT: "a, b, c"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b, c"
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fun f(p1: String, p2: Int, p3: Any){}
|
||||||
|
|
||||||
|
class C(val p1: String) {
|
||||||
|
val p3: String = ""
|
||||||
|
|
||||||
|
fun foo(p2: Int) {
|
||||||
|
f(<caret>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "p1, p2, p3"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String = "", d: Int= 0) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String, d: Int) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b"
|
||||||
|
// EXIST: "a, b, c"
|
||||||
|
// EXIST: "a, b, c, d"
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
class B {
|
||||||
|
open fun foo(p1: String, p2: String) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
class C : B() {
|
||||||
|
override fun foo(p1: String, p2: String) {
|
||||||
|
super.foo(<caret>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "p1, p2"
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class B(p1: String, p2: String)
|
||||||
|
|
||||||
|
class C(p1: String, p2: String, p3: String) : B(<caret>)
|
||||||
|
|
||||||
|
// EXIST: "p1, p2"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo(a: Int, b: Any, c: String?) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b, c"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String?) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABSENT: "a, b, c"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String?) {
|
||||||
|
if (c != null) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b, c"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
fun foo(a: Int, b: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b, c"
|
||||||
|
// EXIST: "a, b"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun foo(a: Int, b: String) {}
|
||||||
|
|
||||||
|
fun f(p: (Int, String) -> Unit){}
|
||||||
|
|
||||||
|
fun bar() {
|
||||||
|
f { (a, b) -> foo(<caret>) }
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun foo(a: Int, b: String) {}
|
||||||
|
|
||||||
|
fun bar(a: Int, b: String) {
|
||||||
|
fun local() {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXIST: "a, b"
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
fun foo(a: Int, b: String, c: String) {}
|
||||||
|
|
||||||
|
fun bar(b: String, a: Int, c: String) {
|
||||||
|
foo(<caret>)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ORDER: "a, b, c"
|
||||||
|
// ORDER: a
|
||||||
@@ -14,10 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fun f(fooBar1: String, fooBar2: String){}
|
fun f(x: Int, fooBar1: String, fooBar2: String){}
|
||||||
|
|
||||||
fun g(someBar0: String, someBar1: String, someBar2: String, fooBar: String, fooBar0: String, fooBar1: String, fooBar2: String) {
|
fun g(someBar0: String, someBar1: String, someBar2: String, fooBar: String, fooBar0: String, fooBar1: String, fooBar2: String) {
|
||||||
f(<caret>)
|
f(1, <caret>)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ORDER: fooBar1, fooBar, fooBar0, fooBar2, someBar1, someBar0, someBar2
|
// ORDER: fooBar1, fooBar, fooBar0, fooBar2, someBar1, someBar0, someBar2
|
||||||
|
|||||||
@@ -17,13 +17,9 @@
|
|||||||
package org.jetbrains.jet.completion;
|
package org.jetbrains.jet.completion;
|
||||||
|
|
||||||
import com.intellij.testFramework.TestDataPath;
|
import com.intellij.testFramework.TestDataPath;
|
||||||
import junit.framework.Test;
|
|
||||||
import junit.framework.TestSuite;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
import org.jetbrains.jet.test.InnerTestClasses;
|
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
import org.jetbrains.jet.test.TestMetadata;
|
||||||
import org.jetbrains.jet.JUnit3RunnerWithInners;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -446,6 +442,72 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem1.kt")
|
||||||
|
public void testMultipleArgsItem1() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem1.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem10.kt")
|
||||||
|
public void testMultipleArgsItem10() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem10.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem11.kt")
|
||||||
|
public void testMultipleArgsItem11() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem11.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem2.kt")
|
||||||
|
public void testMultipleArgsItem2() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem2.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem3.kt")
|
||||||
|
public void testMultipleArgsItem3() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem3.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem4.kt")
|
||||||
|
public void testMultipleArgsItem4() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem4.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem5.kt")
|
||||||
|
public void testMultipleArgsItem5() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem5.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem6.kt")
|
||||||
|
public void testMultipleArgsItem6() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem6.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem7.kt")
|
||||||
|
public void testMultipleArgsItem7() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem7.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem8.kt")
|
||||||
|
public void testMultipleArgsItem8() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem8.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem9.kt")
|
||||||
|
public void testMultipleArgsItem9() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/MultipleArgsItem9.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NoConstructorWithQualifier.kt")
|
@TestMetadata("NoConstructorWithQualifier.kt")
|
||||||
public void testNoConstructorWithQualifier() throws Exception {
|
public void testNoConstructorWithQualifier() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/NoConstructorWithQualifier.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/NoConstructorWithQualifier.kt");
|
||||||
|
|||||||
+6
@@ -452,6 +452,12 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem.kt")
|
||||||
|
public void testMultipleArgsItem() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/MultipleArgsItem.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NullableValue1.kt")
|
@TestMetadata("NullableValue1.kt")
|
||||||
public void testNullableValue1() throws Exception {
|
public void testNullableValue1() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/NullableValue1.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/NullableValue1.kt");
|
||||||
|
|||||||
+6
@@ -38,6 +38,12 @@ public class SmartCompletionWeigherTestGenerated extends AbstractSmartCompletion
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/completion/weighers/smart"), Pattern.compile("^([^\\.]+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/completion/weighers/smart"), Pattern.compile("^([^\\.]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultipleArgsItem.kt")
|
||||||
|
public void testMultipleArgsItem() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/weighers/smart/MultipleArgsItem.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NameSimilarity1.kt")
|
@TestMetadata("NameSimilarity1.kt")
|
||||||
public void testNameSimilarity1() throws Exception {
|
public void testNameSimilarity1() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/weighers/smart/NameSimilarity1.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/weighers/smart/NameSimilarity1.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user