diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CallableUsageReplacementStrategy.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CallableUsageReplacementStrategy.kt index 4f19c40c401..fc4eb338c4a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CallableUsageReplacementStrategy.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CallableUsageReplacementStrategy.kt @@ -24,7 +24,10 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -class CallableUsageReplacementStrategy(private val replacement: CodeToInline) : UsageReplacementStrategy { +class CallableUsageReplacementStrategy( + private val replacement: CodeToInline, + private val inlineSetter: Boolean = false +) : UsageReplacementStrategy { override fun createReplacer(usage: KtSimpleNameExpression): (() -> KtElement?)? { val bindingContext = usage.analyze(BodyResolveMode.PARTIAL) val resolvedCall = usage.getResolvedCall(bindingContext) ?: return null @@ -48,7 +51,7 @@ class CallableUsageReplacementStrategy(private val replacement: CodeToInline) : createReplacer(nameExpression)?.invoke() } else { - CodeInliner(usage, bindingContext, resolvedCall, callElement, replacement).doInline() + CodeInliner(usage, bindingContext, resolvedCall, callElement, inlineSetter, replacement).doInline() } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ClassUsageReplacementStrategy.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ClassUsageReplacementStrategy.kt index 80cadb1aaf4..53a1f066f93 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ClassUsageReplacementStrategy.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ClassUsageReplacementStrategy.kt @@ -33,7 +33,9 @@ class ClassUsageReplacementStrategy( private val typeReplacement = typeReplacement?.takeIf { it.referenceExpression != null } private val typeReplacementQualifierAsExpression = typeReplacement?.qualifier?.let { factory.createExpression(it.text) } - private val constructorReplacementStrategy = constructorReplacement?.let(::CallableUsageReplacementStrategy) + private val constructorReplacementStrategy = constructorReplacement?.let { + CallableUsageReplacementStrategy(it, inlineSetter = false) + } override fun createReplacer(usage: KtSimpleNameExpression): (() -> KtElement?)? { if (usage !is KtNameReferenceExpression) return null diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt index f545a5147af..d6a4d75e614 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt @@ -52,6 +52,7 @@ class CodeInliner( private val bindingContext: BindingContext, private val resolvedCall: ResolvedCall, private val callElement: TCallElement, + private val inlineSetter: Boolean, codeToInline: CodeToInline ) { private val codeToInline = codeToInline.toMutable() @@ -67,7 +68,7 @@ class CodeInliner( ?.getAssignmentByLHS() ?.takeIf { it.operationToken == KtTokens.EQ } val callableForParameters = if (assignment != null && descriptor is PropertyDescriptor) - descriptor.setter?.takeIf { it.hasBody() } ?: descriptor + descriptor.setter?.takeIf { inlineSetter && it.hasBody() } ?: descriptor else descriptor val elementToBeReplaced = assignment.takeIf { callableForParameters is PropertySetterDescriptor } ?: qualifiedElement diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/PropertyUsageReplacementStrategy.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/PropertyUsageReplacementStrategy.kt index 356fbce6caf..00695389a31 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/PropertyUsageReplacementStrategy.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/PropertyUsageReplacementStrategy.kt @@ -22,8 +22,12 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtSimpleNameExpression class PropertyUsageReplacementStrategy(readReplacement: CodeToInline?, writeReplacement: CodeToInline?) : UsageReplacementStrategy { - private val readReplacementStrategy = readReplacement?.let { CallableUsageReplacementStrategy(it) } - private val writeReplacementStrategy = writeReplacement?.let { CallableUsageReplacementStrategy(it) } + private val readReplacementStrategy = readReplacement?.let { + CallableUsageReplacementStrategy(it, inlineSetter = false) + } + private val writeReplacementStrategy = writeReplacement?.let { + CallableUsageReplacementStrategy(it, inlineSetter = true) + } override fun createReplacer(usage: KtSimpleNameExpression): (() -> KtElement?)? { val access = usage.readWriteAccess(useResolveForReadWrite = true) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt index da92c15a41c..89c41d89a0c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt @@ -141,7 +141,7 @@ abstract class DeprecatedSymbolUsageFixBase( val resolvedCall = element.getResolvedCall(bindingContext) ?: return null if (!resolvedCall.isReallySuccess()) return null val replacement = ReplaceWithAnnotationAnalyzer.analyzeCallableReplacement(replaceWith, target, resolutionFacade) ?: return null - return CallableUsageReplacementStrategy(replacement) + return CallableUsageReplacementStrategy(replacement, inlineSetter = false) } is ClassifierDescriptorWithTypeParameters -> { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt index 3c5921bd4ff..de62618edda 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt @@ -72,7 +72,7 @@ class KotlinInlineFunctionHandler: InlineActionHandler() { editor ) ?: return - val replacementStrategy = CallableUsageReplacementStrategy(codeToInline) + val replacementStrategy = CallableUsageReplacementStrategy(codeToInline, inlineSetter = false) val dialog = KotlinInlineFunctionDialog(project, element, nameReference, replacementStrategy, allowInlineThisOnly = recursive) diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt index f7c50a3d916..29adba83666 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt @@ -14,6 +14,5 @@ class A { fun foo() { val a = A() - // Works incorrectly yet a.old = "foo" } \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt.after index 3e52a79d7d0..7a5d7ad2778 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt.after +++ b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignment.kt.after @@ -14,6 +14,5 @@ class A { fun foo() { val a = A() - // Works incorrectly yet - a.new + a.new = "foo" } \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt index 92d55d213af..459ee71620d 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt @@ -15,7 +15,6 @@ class A { fun foo() { val a = A() a.apply { - // Works incorrectly yet old = "foo" } } \ No newline at end of file diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt.after index 85df2797aec..46d7d808e53 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt.after +++ b/idea/testData/quickfix/deprecatedSymbolUsage/propertyAssignmentNoReceiver.kt.after @@ -15,7 +15,6 @@ class A { fun foo() { val a = A() a.apply { - // Works incorrectly yet - new + new = "foo" } } \ No newline at end of file