CreateTypeParameterFromUsageFix: cleanup code

This commit is contained in:
Dmitry Gridin
2019-08-13 16:29:57 +07:00
parent 8d2ccb7bcd
commit 932765744a
@@ -43,15 +43,15 @@ import org.jetbrains.kotlin.types.typeUtil.isNullableAny
import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.SmartList
class CreateTypeParameterFromUsageFix( class CreateTypeParameterFromUsageFix(
originalElement: KtElement, originalElement: KtElement,
private val data: CreateTypeParameterData, private val data: CreateTypeParameterData,
private val presentTypeParameterNames: Boolean private val presentTypeParameterNames: Boolean
) : CreateFromUsageFixBase<KtElement>(originalElement) { ) : CreateFromUsageFixBase<KtElement>(originalElement) {
override fun getText(): String { override fun getText(): String {
val prefix = "type parameter".let { if (data.typeParameters.size > 1) StringUtil.pluralize(it) else it } val prefix = "type parameter".let { if (data.typeParameters.size > 1) StringUtil.pluralize(it) else it }
val typeParametersText = if (presentTypeParameterNames) data.typeParameters.joinToString(prefix = " ") { "'${it.name}'" } else "" val typeParametersText = if (presentTypeParameterNames) data.typeParameters.joinToString(prefix = " ") { "'${it.name}'" } else ""
val containerText = ElementDescriptionUtil.getElementDescription(data.declaration, UsageViewTypeLocation.INSTANCE) + val containerText = ElementDescriptionUtil.getElementDescription(data.declaration, UsageViewTypeLocation.INSTANCE) +
" '${data.declaration.name}'" " '${data.declaration.name}'"
return "Create $prefix$typeParametersText in $containerText" return "Create $prefix$typeParametersText in $containerText"
} }
@@ -68,20 +68,20 @@ class CreateTypeParameterFromUsageFix(
runReadAction { runReadAction {
val expectedTypeArgumentCount = declaration.typeParameters.size + data.typeParameters.size val expectedTypeArgumentCount = declaration.typeParameters.size + data.typeParameters.size
ReferencesSearch ReferencesSearch
.search(declaration) .search(declaration)
.mapNotNull { .mapNotNull {
it.element.getParentOfTypeAndBranch<KtUserType> { referenceExpression } ?: it.element.getParentOfTypeAndBranch<KtUserType> { referenceExpression }
it.element.getParentOfTypeAndBranch<KtCallElement> { calleeExpression } ?: it.element.getParentOfTypeAndBranch<KtCallElement> { calleeExpression }
}
.filter {
val arguments = when (it) {
is KtUserType -> it.typeArguments
is KtCallElement -> it.typeArguments
else -> return@filter false
} }
.filter { arguments.size != expectedTypeArgumentCount
val arguments = when (it) { }
is KtUserType -> it.typeArguments .toSet()
is KtCallElement -> it.typeArguments
else -> return@filter false
}
arguments.size != expectedTypeArgumentCount
}
.toSet()
} }
} ?: return emptyList() } ?: return emptyList()
@@ -94,8 +94,7 @@ class CreateTypeParameterFromUsageFix(
val upperBoundType = typeParameter.upperBoundType val upperBoundType = typeParameter.upperBoundType
val upperBoundText = if (upperBoundType != null && !upperBoundType.isNullableAny()) { val upperBoundText = if (upperBoundType != null && !upperBoundType.isNullableAny()) {
IdeDescriptorRenderers.SOURCE_CODE.renderType(upperBoundType) IdeDescriptorRenderers.SOURCE_CODE.renderType(upperBoundType)
} } else null
else null
val upperBound = upperBoundText?.let { psiFactory.createType(it) } val upperBound = upperBoundText?.let { psiFactory.createType(it) }
val newTypeParameterText = if (upperBound != null) "${typeParameter.name} : ${upperBound.text}" else typeParameter.name val newTypeParameterText = if (upperBound != null) "${typeParameter.name} : ${upperBound.text}" else typeParameter.name
val newTypeParameter = declaration.addTypeParameter(psiFactory.createTypeParameter(newTypeParameterText))!! val newTypeParameter = declaration.addTypeParameter(psiFactory.createTypeParameter(newTypeParameterText))!!
@@ -104,8 +103,8 @@ class CreateTypeParameterFromUsageFix(
val anonymizedTypeParameter = createFakeTypeParameterDescriptor(typeParameter.fakeTypeParameter.containingDeclaration, "_") val anonymizedTypeParameter = createFakeTypeParameterDescriptor(typeParameter.fakeTypeParameter.containingDeclaration, "_")
val anonymizedUpperBoundText = upperBoundType?.let { val anonymizedUpperBoundText = upperBoundType?.let {
TypeSubstitutor TypeSubstitutor
.create(mapOf(typeParameter.fakeTypeParameter.typeConstructor to TypeProjectionImpl(anonymizedTypeParameter.defaultType))) .create(mapOf(typeParameter.fakeTypeParameter.typeConstructor to TypeProjectionImpl(anonymizedTypeParameter.defaultType)))
.substitute(upperBoundType, Variance.INVARIANT) .substitute(upperBoundType, Variance.INVARIANT)
}?.let { }?.let {
IdeDescriptorRenderers.SOURCE_CODE.renderType(it) IdeDescriptorRenderers.SOURCE_CODE.renderType(it)
} }
@@ -117,20 +116,15 @@ class CreateTypeParameterFromUsageFix(
when (it) { when (it) {
is KtUserType -> { is KtUserType -> {
val typeArgumentList = it.typeArgumentList val typeArgumentList = it.typeArgumentList
elementsToShorten += if (typeArgumentList != null) { elementsToShorten += typeArgumentList?.addArgument(anonymizedUpperBoundAsTypeArg) ?: it.addAfter(
typeArgumentList.addArgument(anonymizedUpperBoundAsTypeArg) psiFactory.createTypeArguments("<${anonymizedUpperBoundAsTypeArg.text}>"),
} it.referenceExpression!!
else { ) as KtTypeArgumentList
it.addAfter(
psiFactory.createTypeArguments("<${anonymizedUpperBoundAsTypeArg.text}>"),
it.referenceExpression!!
) as KtTypeArgumentList
}
} }
is KtCallElement -> { is KtCallElement -> {
if (it.analyze(BodyResolveMode.PARTIAL_WITH_DIAGNOSTICS).diagnostics.forElement(it.calleeExpression!!).any { if (it.analyze(BodyResolveMode.PARTIAL_WITH_DIAGNOSTICS).diagnostics.forElement(it.calleeExpression!!).any { diagnostic ->
it.factory in Errors.TYPE_INFERENCE_ERRORS diagnostic.factory in Errors.TYPE_INFERENCE_ERRORS
}) { }) {
callsToExplicateArguments += it callsToExplicateArguments += it
} }
} }
@@ -148,8 +142,7 @@ class CreateTypeParameterFromUsageFix(
} }
it.typeArgumentList it.typeArgumentList
} } else {
else {
typeArgumentList.addArgument(anonymizedUpperBoundAsTypeArg) typeArgumentList.addArgument(anonymizedUpperBoundAsTypeArg)
} }
} }