CreateTypeParameterFromUsageFix: cleanup code
This commit is contained in:
+28
-35
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user