Callable Builder: Do not skip unused type parameters

This commit is contained in:
Alexey Sedunov
2014-10-31 14:31:02 +03:00
parent 88dcd858a6
commit 2f98af1a8e
3 changed files with 16 additions and 11 deletions
@@ -101,7 +101,7 @@ class TypeCandidate(val theType: JetType, scope: JetScope? = null) {
override fun toString() = theType.toString() override fun toString() = theType.toString()
} }
class RenderedTypeParameter( data class RenderedTypeParameter(
val typeParameter: TypeParameterDescriptor, val typeParameter: TypeParameterDescriptor,
val fake: Boolean, val fake: Boolean,
val text: String val text: String
@@ -216,6 +216,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
val receiverClassDescriptor: ClassDescriptor? val receiverClassDescriptor: ClassDescriptor?
val typeParameterNameMap: Map<TypeParameterDescriptor, String> val typeParameterNameMap: Map<TypeParameterDescriptor, String>
val receiverTypeCandidate: TypeCandidate? val receiverTypeCandidate: TypeCandidate?
val mandatoryTypeParametersAsCandidates: List<TypeCandidate>
val substitutions: List<JetTypeSubstitution> val substitutions: List<JetTypeSubstitution>
{ {
@@ -269,9 +270,11 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
.subtract(substitutionMap.keySet()) .subtract(substitutionMap.keySet())
fakeFunction = createFakeFunctionDescriptor(scope, typeArgumentsForFakeFunction.size) fakeFunction = createFakeFunctionDescriptor(scope, typeArgumentsForFakeFunction.size)
collectSubstitutionsForCallableTypeParameters(fakeFunction!!, typeArgumentsForFakeFunction, substitutionMap) collectSubstitutionsForCallableTypeParameters(fakeFunction!!, typeArgumentsForFakeFunction, substitutionMap)
mandatoryTypeParametersAsCandidates = typeArgumentsForFakeFunction.map { TypeCandidate(substitutionMap[it], scope) }
} }
else { else {
fakeFunction = null fakeFunction = null
mandatoryTypeParametersAsCandidates = Collections.emptyList()
} }
substitutions = substitutionMap.map { JetTypeSubstitution(it.key, it.value) } substitutions = substitutionMap.map { JetTypeSubstitution(it.key, it.value) }
@@ -294,6 +297,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
renderTypeCandidates(callableInfo.returnTypeInfo, typeParameterNameMap, fakeFunction) renderTypeCandidates(callableInfo.returnTypeInfo, typeParameterNameMap, fakeFunction)
} }
receiverTypeCandidate?.render(typeParameterNameMap, fakeFunction) receiverTypeCandidate?.render(typeParameterNameMap, fakeFunction)
mandatoryTypeParametersAsCandidates.forEach { it.render(typeParameterNameMap, fakeFunction) }
} }
private fun collectSubstitutionsForReceiverTypeParameters( private fun collectSubstitutionsForReceiverTypeParameters(
@@ -454,10 +458,8 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
private fun getTypeParameterRenames(scope: JetScope): Map<TypeParameterDescriptor, String> { private fun getTypeParameterRenames(scope: JetScope): Map<TypeParameterDescriptor, String> {
val allTypeParametersNotInScope = LinkedHashSet<TypeParameterDescriptor>() val allTypeParametersNotInScope = LinkedHashSet<TypeParameterDescriptor>()
allTypeParametersNotInScope.addAll(receiverTypeCandidate?.typeParameters?.toList() ?: Collections.emptyList()) mandatoryTypeParametersAsCandidates.stream()
.plus(callableInfo.parameterInfos.stream().flatMap { typeCandidates[it.typeInfo]!!.stream() })
callableInfo.parameterInfos.stream()
.flatMap { typeCandidates[it.typeInfo]!!.stream() }
.flatMap { it.typeParameters.stream() } .flatMap { it.typeParameters.stream() }
.toCollection(allTypeParametersNotInScope) .toCollection(allTypeParametersNotInScope)
@@ -584,7 +586,10 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
private fun setupTypeParameterListTemplate(builder: TemplateBuilderImpl, declaration: JetCallableDeclaration): TypeParameterListExpression { private fun setupTypeParameterListTemplate(builder: TemplateBuilderImpl, declaration: JetCallableDeclaration): TypeParameterListExpression {
val typeParameterMap = HashMap<String, List<RenderedTypeParameter>>() val typeParameterMap = HashMap<String, List<RenderedTypeParameter>>()
val receiverTypeParameterNames = receiverTypeCandidate?.let { it.renderedTypeParameters!! } ?: Collections.emptyList()
val mandatoryTypeParameters = ArrayList<RenderedTypeParameter>()
//receiverTypeCandidate?.let { mandatoryTypeParameters.addAll(it.renderedTypeParameters!!) }
mandatoryTypeParametersAsCandidates.stream().flatMapTo(mandatoryTypeParameters) { it.renderedTypeParameters!!.stream() }
callableInfo.parameterInfos.stream().flatMap { typeCandidates[it.typeInfo]!!.stream() }.forEach { callableInfo.parameterInfos.stream().flatMap { typeCandidates[it.typeInfo]!!.stream() }.forEach {
typeParameterMap[it.renderedType!!] = it.renderedTypeParameters!! typeParameterMap[it.renderedType!!] = it.renderedTypeParameters!!
@@ -597,7 +602,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
} }
// ((3, 3) is after "fun") // ((3, 3) is after "fun")
builder.replaceElement(declaration, TextRange.create(3, 3), TYPE_PARAMETER_LIST_VARIABLE_NAME, null, false) 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<JetParameter>): List<TypeExpression> { private fun setupParameterTypeTemplates(builder: TemplateBuilder, parameterList: List<JetParameter>): List<TypeExpression> {
@@ -99,7 +99,7 @@ private class TypeExpression(public val typeCandidates: List<TypeCandidate>) : E
/** /**
* A sort-of dummy <code>Expression</code> for parameter lists, to allow us to update the parameter list as the user makes selections. * A sort-of dummy <code>Expression</code> for parameter lists, to allow us to update the parameter list as the user makes selections.
*/ */
private class TypeParameterListExpression(private val typeParameterNamesFromReceiverType: List<RenderedTypeParameter>, private class TypeParameterListExpression(private val mandatoryTypeParameters: List<RenderedTypeParameter>,
private val parameterTypeToTypeParameterNamesMap: Map<String, List<RenderedTypeParameter>>) : Expression() { private val parameterTypeToTypeParameterNamesMap: Map<String, List<RenderedTypeParameter>>) : Expression() {
public var currentTypeParameters: List<TypeParameterDescriptor> = Collections.emptyList() public var currentTypeParameters: List<TypeParameterDescriptor> = Collections.emptyList()
private set private set
@@ -117,7 +117,7 @@ private class TypeParameterListExpression(private val typeParameterNamesFromRece
val parameters = callable.getValueParameterList()?.getParameters() ?: Collections.emptyList<JetParameter>() val parameters = callable.getValueParameterList()?.getParameters() ?: Collections.emptyList<JetParameter>()
val renderedTypeParameters = LinkedHashSet<RenderedTypeParameter>() val renderedTypeParameters = LinkedHashSet<RenderedTypeParameter>()
renderedTypeParameters.addAll(typeParameterNamesFromReceiverType) renderedTypeParameters.addAll(mandatoryTypeParameters)
for (parameter in parameters) { for (parameter in parameters) {
val parameterTypeRef = parameter.getTypeReference() val parameterTypeRef = parameter.getTypeReference()
if (parameterTypeRef != null) { if (parameterTypeRef != null) {
@@ -1,9 +1,9 @@
// "Create function 'foo'" "true" // "Create function 'foo'" "true"
fun test(): Int { fun test(): Int {
return foo<String, Int>(2, "2") return foo<String, Int, Boolean>(2, "2")
} }
fun <T, T1> foo(arg: T1, arg1: T): T1 { fun <T, T1, T2> foo(arg: T1, arg1: T): T1 {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }