From 2f98af1a8e7cf6725a78673fd1291efdca02f82b Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 31 Oct 2014 14:31:02 +0300 Subject: [PATCH] Callable Builder: Do not skip unused type parameters --- .../callableBuilder/CallableBuilder.kt | 19 ++++++++++++------- .../callableBuilder/templateExpressions.kt | 4 ++-- .../typeArguments/afterNoReceiverExtraArgs.kt | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 7ec405dcb7f..1d84d9ca55c 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -101,7 +101,7 @@ class TypeCandidate(val theType: JetType, scope: JetScope? = null) { override fun toString() = theType.toString() } -class RenderedTypeParameter( +data class RenderedTypeParameter( val typeParameter: TypeParameterDescriptor, val fake: Boolean, val text: String @@ -216,6 +216,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { val receiverClassDescriptor: ClassDescriptor? val typeParameterNameMap: Map val receiverTypeCandidate: TypeCandidate? + val mandatoryTypeParametersAsCandidates: List val substitutions: List { @@ -269,9 +270,11 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { .subtract(substitutionMap.keySet()) fakeFunction = createFakeFunctionDescriptor(scope, typeArgumentsForFakeFunction.size) collectSubstitutionsForCallableTypeParameters(fakeFunction!!, typeArgumentsForFakeFunction, substitutionMap) + mandatoryTypeParametersAsCandidates = typeArgumentsForFakeFunction.map { TypeCandidate(substitutionMap[it], scope) } } else { fakeFunction = null + mandatoryTypeParametersAsCandidates = Collections.emptyList() } substitutions = substitutionMap.map { JetTypeSubstitution(it.key, it.value) } @@ -294,6 +297,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { renderTypeCandidates(callableInfo.returnTypeInfo, typeParameterNameMap, fakeFunction) } receiverTypeCandidate?.render(typeParameterNameMap, fakeFunction) + mandatoryTypeParametersAsCandidates.forEach { it.render(typeParameterNameMap, fakeFunction) } } private fun collectSubstitutionsForReceiverTypeParameters( @@ -454,10 +458,8 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { private fun getTypeParameterRenames(scope: JetScope): Map { val allTypeParametersNotInScope = LinkedHashSet() - allTypeParametersNotInScope.addAll(receiverTypeCandidate?.typeParameters?.toList() ?: Collections.emptyList()) - - callableInfo.parameterInfos.stream() - .flatMap { typeCandidates[it.typeInfo]!!.stream() } + mandatoryTypeParametersAsCandidates.stream() + .plus(callableInfo.parameterInfos.stream().flatMap { typeCandidates[it.typeInfo]!!.stream() }) .flatMap { it.typeParameters.stream() } .toCollection(allTypeParametersNotInScope) @@ -584,7 +586,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { private fun setupTypeParameterListTemplate(builder: TemplateBuilderImpl, declaration: JetCallableDeclaration): TypeParameterListExpression { val typeParameterMap = HashMap>() - val receiverTypeParameterNames = receiverTypeCandidate?.let { it.renderedTypeParameters!! } ?: Collections.emptyList() + + val mandatoryTypeParameters = ArrayList() + //receiverTypeCandidate?.let { mandatoryTypeParameters.addAll(it.renderedTypeParameters!!) } + mandatoryTypeParametersAsCandidates.stream().flatMapTo(mandatoryTypeParameters) { it.renderedTypeParameters!!.stream() } callableInfo.parameterInfos.stream().flatMap { typeCandidates[it.typeInfo]!!.stream() }.forEach { typeParameterMap[it.renderedType!!] = it.renderedTypeParameters!! @@ -597,7 +602,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) { } // ((3, 3) is after "fun") builder.replaceElement(declaration, TextRange.create(3, 3), TYPE_PARAMETER_LIST_VARIABLE_NAME, null, false) - return TypeParameterListExpression(receiverTypeParameterNames, typeParameterMap) + return TypeParameterListExpression(mandatoryTypeParameters, typeParameterMap) } private fun setupParameterTypeTemplates(builder: TemplateBuilder, parameterList: List): List { diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/templateExpressions.kt b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/templateExpressions.kt index 7e20b84fd0f..91d67f5719a 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/templateExpressions.kt +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/createFromUsage/callableBuilder/templateExpressions.kt @@ -99,7 +99,7 @@ private class TypeExpression(public val typeCandidates: List) : E /** * A sort-of dummy Expression for parameter lists, to allow us to update the parameter list as the user makes selections. */ -private class TypeParameterListExpression(private val typeParameterNamesFromReceiverType: List, +private class TypeParameterListExpression(private val mandatoryTypeParameters: List, private val parameterTypeToTypeParameterNamesMap: Map>) : Expression() { public var currentTypeParameters: List = Collections.emptyList() private set @@ -117,7 +117,7 @@ private class TypeParameterListExpression(private val typeParameterNamesFromRece val parameters = callable.getValueParameterList()?.getParameters() ?: Collections.emptyList() val renderedTypeParameters = LinkedHashSet() - renderedTypeParameters.addAll(typeParameterNamesFromReceiverType) + renderedTypeParameters.addAll(mandatoryTypeParameters) for (parameter in parameters) { val parameterTypeRef = parameter.getTypeReference() if (parameterTypeRef != null) { diff --git a/idea/testData/quickfix/createFromUsage/createFunction/call/typeArguments/afterNoReceiverExtraArgs.kt b/idea/testData/quickfix/createFromUsage/createFunction/call/typeArguments/afterNoReceiverExtraArgs.kt index f9d5624a6cf..27672f4be3e 100644 --- a/idea/testData/quickfix/createFromUsage/createFunction/call/typeArguments/afterNoReceiverExtraArgs.kt +++ b/idea/testData/quickfix/createFromUsage/createFunction/call/typeArguments/afterNoReceiverExtraArgs.kt @@ -1,9 +1,9 @@ // "Create function 'foo'" "true" fun test(): Int { - return foo(2, "2") + return foo(2, "2") } -fun foo(arg: T1, arg1: T): T1 { +fun foo(arg: T1, arg1: T): T1 { throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. } \ No newline at end of file