diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFixBase.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFixBase.kt index 686a0ef7d74..78070e6420c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFixBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/DeprecatedSymbolUsageFixBase.kt @@ -255,25 +255,37 @@ public abstract class DeprecatedSymbolUsageFixBase( val valueType: JetType?) private fun processTypeParameterUsages(resolvedCall: ResolvedCall, replacement: ReplaceWithAnnotationAnalyzer.ReplacementExpression) { - val descriptor = resolvedCall.getResultingDescriptor().getOriginal() - for (typeParameter in descriptor.getTypeParameters()) { + val typeParameters = resolvedCall.getResultingDescriptor().getOriginal().getTypeParameters() + + val callElement = resolvedCall.getCall().getCallElement() + val callExpression = callElement as? JetCallExpression + val explicitTypeArgs = callExpression?.getTypeArgumentList()?.getArguments() + if (explicitTypeArgs != null && explicitTypeArgs.size() != typeParameters.size()) return + + for ((index, typeParameter) in typeParameters.withIndex()) { val parameterName = typeParameter.getName() val usages = replacement.expression.collectDescendantsOfType { it[ReplaceWithAnnotationAnalyzer.TYPE_PARAMETER_USAGE_KEY] == parameterName } - val type = resolvedCall.getTypeArguments()[typeParameter]!! - val typeString = IdeDescriptorRenderers.SOURCE_CODE.renderType(type) + val factory = JetPsiFactory(callElement) + val typeElement = if (explicitTypeArgs != null) { // we use explicit type arguments if available to avoid shortening + val _typeElement = explicitTypeArgs[index].getTypeReference()?.getTypeElement() ?: continue + _typeElement.marked(USER_CODE_KEY) + } + else { + val type = resolvedCall.getTypeArguments()[typeParameter]!! + factory.createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type)).getTypeElement()!! + } for (usage in usages) { val parent = usage.getParent() if (parent is JetUserType) { - val typeReference = JetPsiFactory(usage).createType(typeString) - parent.replace(typeReference.getTypeElement()!!) + parent.replace(typeElement) } else { //TODO: tests for this? - usage.replace(JetPsiFactory(usage).createExpression(typeString)) + usage.replace(JetPsiFactory(usage).createExpression(typeElement.getText())) } } } diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt b/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt new file mode 100644 index 00000000000..8f24c29956e --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt @@ -0,0 +1,12 @@ +// "Replace with 'newFun()'" "true" + +@deprecated("", ReplaceWith("newFun()")) +fun oldFun() { + newFun() +} + +fun newFun(){} + +fun foo() { + oldFun() +} diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt.after new file mode 100644 index 00000000000..6e71d838085 --- /dev/null +++ b/idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt.after @@ -0,0 +1,12 @@ +// "Replace with 'newFun()'" "true" + +@deprecated("", ReplaceWith("newFun()")) +fun oldFun() { + newFun() +} + +fun newFun(){} + +fun foo() { + newFun() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 1ff6bd060cf..f6d15439259 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3498,6 +3498,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("keepOriginalIfQualified.kt") + public void testKeepOriginalIfQualified() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/keepOriginalIfQualified.kt"); + doTest(fileName); + } + @TestMetadata("noImplicitTypeArgImportRuntime.kt") public void testNoImplicitTypeArgImportRuntime() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/typeArguments/noImplicitTypeArgImportRuntime.kt");