From e5748f7a86d38be3b03a1e7c4885829e3510cd9a Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 25 Oct 2016 13:12:33 +0300 Subject: [PATCH] Renames --- .idea/modules.xml | 2 +- .../idea-code-inliner.iml} | 0 .../CallableUsageReplacementStrategy.kt | 6 +- .../inliner}/ClassUsageReplacementStrategy.kt | 4 +- .../kotlin/idea/inliner/CodeInliner.kt} | 74 +++++++++---------- .../kotlin/idea/inliner/CodeToInline.kt} | 12 +-- .../idea/inliner/CodeToInlineBuilder.kt} | 14 ++-- .../idea/inliner/MutableCodeToInline.kt} | 16 ++-- .../idea/inliner}/ReplacementPerformer.kt | 28 +++---- .../idea/inliner}/UsageReplacementStrategy.kt | 2 +- .../kotlin/idea/inliner}/introduceValue.kt | 12 +-- idea/idea.iml | 2 +- .../replaceWith/DeprecatedSymbolUsageFix.kt | 2 +- .../DeprecatedSymbolUsageFixBase.kt | 6 +- .../DeprecatedSymbolUsageInWholeProjectFix.kt | 4 +- .../ReplaceWithAnnotationAnalyzer.kt | 12 +-- .../inline/KotlinInlineFunctionHandler.kt | 14 ++-- 17 files changed, 105 insertions(+), 105 deletions(-) rename idea/{idea-replacement-engine/idea-replacement-engine.iml => idea-code-inliner/idea-code-inliner.iml} (100%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner}/CallableUsageReplacementStrategy.kt (89%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner}/ClassUsageReplacementStrategy.kt (97%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallReplacementEngine.kt => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeInliner.kt} (89%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementCode.kt => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInline.kt} (81%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementBuilder.kt => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInlineBuilder.kt} (91%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/MutableReplacementCode.kt => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/MutableCodeToInline.kt} (84%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner}/ReplacementPerformer.kt (87%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner}/UsageReplacementStrategy.kt (98%) rename idea/{idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement => idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner}/introduceValue.kt (93%) diff --git a/.idea/modules.xml b/.idea/modules.xml index 91ba983ad1f..4fe72a18314 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -44,13 +44,13 @@ + - diff --git a/idea/idea-replacement-engine/idea-replacement-engine.iml b/idea/idea-code-inliner/idea-code-inliner.iml similarity index 100% rename from idea/idea-replacement-engine/idea-replacement-engine.iml rename to idea/idea-code-inliner/idea-code-inliner.iml diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallableUsageReplacementStrategy.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CallableUsageReplacementStrategy.kt similarity index 89% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallableUsageReplacementStrategy.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CallableUsageReplacementStrategy.kt index 2394d5631a6..da730b0b756 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallableUsageReplacementStrategy.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CallableUsageReplacementStrategy.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.intentions.OperatorToFunctionIntention @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class CallableUsageReplacementStrategy( - private val replacement: ReplacementCode + private val replacement: CodeToInline ) : UsageReplacementStrategy { override fun createReplacer(usage: KtSimpleNameExpression): (() -> KtElement?)? { @@ -44,7 +44,7 @@ class CallableUsageReplacementStrategy( createReplacer(nameExpression)!!.invoke() } else { - CallReplacementEngine(usage, bindingContext, resolvedCall, callElement, replacement).performReplacement() + CodeInliner(usage, bindingContext, resolvedCall, callElement, replacement).doInline() } } } diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ClassUsageReplacementStrategy.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ClassUsageReplacementStrategy.kt similarity index 97% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ClassUsageReplacementStrategy.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ClassUsageReplacementStrategy.kt index 345366db8f7..7a2479b96ff 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ClassUsageReplacementStrategy.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ClassUsageReplacementStrategy.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.project.Project import org.jetbrains.kotlin.idea.core.ShortenReferences @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.check class ClassUsageReplacementStrategy( typeReplacement: KtUserType?, - constructorReplacement: ReplacementCode?, + constructorReplacement: CodeToInline?, project: Project ) : UsageReplacementStrategy { diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallReplacementEngine.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeInliner.kt similarity index 89% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallReplacementEngine.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeInliner.kt index 767e054817c..85b5fed7475 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/CallReplacementEngine.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeInliner.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.util.Key import com.intellij.psi.PsiElement @@ -45,18 +45,18 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* -class CallReplacementEngine( +class CodeInliner( private val nameExpression: KtSimpleNameExpression, private val bindingContext: BindingContext, private val resolvedCall: ResolvedCall, private val callElement: TCallElement, - replacement: ReplacementCode + codeToInline: CodeToInline ) { - private val replacement = replacement.toMutable() + private val codeToInline = codeToInline.toMutable() private val project = nameExpression.project private val psiFactory = KtPsiFactory(project) - fun performReplacement(): KtElement? { + fun doInline(): KtElement? { val descriptor = resolvedCall.resultingDescriptor val file = nameExpression.getContainingKtFile() @@ -82,9 +82,9 @@ class CallReplacementEngine( receiver?.mark(RECEIVER_VALUE_KEY) //TODO: this@ - for (thisExpression in replacement.collectDescendantsOfType()) { + for (thisExpression in codeToInline.collectDescendantsOfType()) { if (receiver != null) { - replacement.replaceExpression(thisExpression, receiver) + codeToInline.replaceExpression(thisExpression, receiver) } else { thisExpression.mark(RECEIVER_VALUE_KEY) @@ -104,25 +104,25 @@ class CallReplacementEngine( if (elementToBeReplaced is KtExpression) { if (receiver != null) { - val thisReplaced = replacement.collectDescendantsOfType { it[RECEIVER_VALUE_KEY] } + val thisReplaced = codeToInline.collectDescendantsOfType { it[RECEIVER_VALUE_KEY] } if (receiver.shouldKeepValue(thisReplaced.size)) { - replacement.introduceValue(receiver, receiverType, thisReplaced, elementToBeReplaced) + codeToInline.introduceValue(receiver, receiverType, thisReplaced, elementToBeReplaced) } } for ((parameter, value, valueType) in introduceValuesForParameters) { - val usagesReplaced = replacement.collectDescendantsOfType { it[PARAMETER_VALUE_KEY] == parameter } - replacement.introduceValue(value, valueType, usagesReplaced, elementToBeReplaced, nameSuggestion = parameter.name.asString()) + val usagesReplaced = codeToInline.collectDescendantsOfType { it[PARAMETER_VALUE_KEY] == parameter } + codeToInline.introduceValue(value, valueType, usagesReplaced, elementToBeReplaced, nameSuggestion = parameter.name.asString()) } } - replacement.fqNamesToImport + codeToInline.fqNamesToImport .flatMap { file.resolveImportReference(it) } .forEach { ImportInsertHelper.getInstance(project).importDescriptor(file, it) } val replacementPerformer = when (elementToBeReplaced) { - is KtExpression -> ExpressionReplacementPerformer(replacement, elementToBeReplaced) - is KtAnnotationEntry -> AnnotationEntryReplacementPerformer(replacement, elementToBeReplaced) + is KtExpression -> ExpressionReplacementPerformer(codeToInline, elementToBeReplaced) + is KtAnnotationEntry -> AnnotationEntryReplacementPerformer(codeToInline, elementToBeReplaced) else -> error("Unsupported element") } @@ -146,8 +146,8 @@ class CallReplacementEngine( argument.expression.put(PARAMETER_VALUE_KEY, parameter) val parameterName = parameter.name - val usages = replacement.collectDescendantsOfType { - it[ReplacementCode.PARAMETER_USAGE_KEY] == parameterName + val usages = codeToInline.collectDescendantsOfType { + it[CodeToInline.PARAMETER_USAGE_KEY] == parameterName } usages.forEach { val usageArgument = it.parent as? KtValueArgument @@ -157,7 +157,7 @@ class CallReplacementEngine( if (argument.isDefaultValue) { usageArgument?.mark(DEFAULT_PARAMETER_VALUE_KEY) } - replacement.replaceExpression(it, argument.expression) + codeToInline.replaceExpression(it, argument.expression) } //TODO: sometimes we need to add explicit type arguments here because we don't have expected type in the new context @@ -185,8 +185,8 @@ class CallReplacementEngine( for ((index, typeParameter) in typeParameters.withIndex()) { val parameterName = typeParameter.name - val usages = replacement.collectDescendantsOfType { - it[ReplacementCode.TYPE_PARAMETER_USAGE_KEY] == parameterName + val usages = codeToInline.collectDescendantsOfType { + it[CodeToInline.TYPE_PARAMETER_USAGE_KEY] == parameterName } val type = resolvedCall.typeArguments[typeParameter]!! @@ -207,7 +207,7 @@ class CallReplacementEngine( val arguments = if (typeElement is KtUserType && KotlinBuiltIns.isArray(type)) typeElement.typeArgumentList?.text.orEmpty() else "" - replacement.replaceExpression(usage, psiFactory.createExpression( + codeToInline.replaceExpression(usage, psiFactory.createExpression( IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(typeClassifier) + arguments )) } @@ -216,21 +216,21 @@ class CallReplacementEngine( } else { //TODO: tests for this? - replacement.replaceExpression(usage, psiFactory.createExpression(typeElement.text)) + codeToInline.replaceExpression(usage, psiFactory.createExpression(typeElement.text)) } } } } private fun wrapCodeForSafeCall(receiver: KtExpression, receiverType: KotlinType?, expressionToBeReplaced: KtExpression) { - if (replacement.statementsBefore.isEmpty()) { - val qualified = replacement.mainExpression as? KtQualifiedExpression + if (codeToInline.statementsBefore.isEmpty()) { + val qualified = codeToInline.mainExpression as? KtQualifiedExpression if (qualified != null) { if (qualified.receiverExpression[RECEIVER_VALUE_KEY]) { if (qualified is KtSafeQualifiedExpression) return // already safe val selector = qualified.selectorExpression if (selector != null) { - replacement.mainExpression = psiFactory.createExpressionByPattern("$0?.$1", receiver, selector) + codeToInline.mainExpression = psiFactory.createExpressionByPattern("$0?.$1", receiver, selector) return } } @@ -238,32 +238,32 @@ class CallReplacementEngine( } if (expressionToBeReplaced.isUsedAsExpression(bindingContext)) { - val thisReplaced = replacement.collectDescendantsOfType { it[RECEIVER_VALUE_KEY] } - replacement.introduceValue(receiver, receiverType, thisReplaced, expressionToBeReplaced, safeCall = true) + val thisReplaced = codeToInline.collectDescendantsOfType { it[RECEIVER_VALUE_KEY] } + codeToInline.introduceValue(receiver, receiverType, thisReplaced, expressionToBeReplaced, safeCall = true) } else { val ifExpression = psiFactory.buildExpression { appendFixedText("if (") appendExpression(receiver) appendFixedText("!=null) {") - replacement.statementsBefore.forEach { + codeToInline.statementsBefore.forEach { appendExpression(it) appendFixedText("\n") } - replacement.mainExpression?.let { + codeToInline.mainExpression?.let { appendExpression(it) appendFixedText("\n") } appendFixedText("}") } - replacement.mainExpression = ifExpression - replacement.statementsBefore.clear() + codeToInline.mainExpression = ifExpression + codeToInline.statementsBefore.clear() } } private fun keepInfixFormIfPossible() { - if (replacement.statementsBefore.isNotEmpty()) return - val dotQualified = replacement.mainExpression as? KtDotQualifiedExpression ?: return + if (codeToInline.statementsBefore.isNotEmpty()) return + val dotQualified = codeToInline.mainExpression as? KtDotQualifiedExpression ?: return val receiver = dotQualified.receiverExpression if (!receiver[RECEIVER_VALUE_KEY]) return val call = dotQualified.selectorExpression as? KtCallExpression ?: return @@ -271,7 +271,7 @@ class CallReplacementEngine( val argument = call.valueArguments.singleOrNull() ?: return if (argument.getArgumentName() != null) return val argumentExpression = argument.getArgumentExpression() ?: return - replacement.mainExpression = psiFactory.createExpressionByPattern("$0 ${nameExpression.text} $1", receiver, argumentExpression) + codeToInline.mainExpression = psiFactory.createExpressionByPattern("$0 ${nameExpression.text} $1", receiver, argumentExpression) } private fun KtExpression?.shouldKeepValue(usageCount: Int): Boolean { @@ -317,13 +317,13 @@ class CallReplacementEngine( val (expression, parameterUsages) = defaultValue for ((param, usages) in parameterUsages) { - usages.forEach { it.put(ReplacementCode.PARAMETER_USAGE_KEY, param.name) } + usages.forEach { it.put(CodeToInline.PARAMETER_USAGE_KEY, param.name) } } val expressionCopy = expression.copied() // clean up user data in original - expression.forEachDescendantOfType { it.clear(ReplacementCode.PARAMETER_USAGE_KEY) } + expression.forEachDescendantOfType { it.clear(CodeToInline.PARAMETER_USAGE_KEY) } return Argument(expressionCopy, null/*TODO*/, isDefaultValue = true) } @@ -395,8 +395,8 @@ class CallReplacementEngine( // clean up user data it.forEachDescendantOfType { it.clear(USER_CODE_KEY) - it.clear(ReplacementCode.PARAMETER_USAGE_KEY) - it.clear(ReplacementCode.TYPE_PARAMETER_USAGE_KEY) + it.clear(CodeToInline.PARAMETER_USAGE_KEY) + it.clear(CodeToInline.TYPE_PARAMETER_USAGE_KEY) it.clear(PARAMETER_VALUE_KEY) it.clear(RECEIVER_VALUE_KEY) it.clear(WAS_FUNCTION_LITERAL_ARGUMENT_KEY) diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementCode.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInline.kt similarity index 81% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementCode.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInline.kt index 0c3c34cec5e..b844d2b0cd1 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementCode.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInline.kt @@ -14,25 +14,25 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.util.Key -import org.jetbrains.kotlin.idea.replacement.ReplacementCode.Companion.PARAMETER_USAGE_KEY -import org.jetbrains.kotlin.idea.replacement.ReplacementCode.Companion.TYPE_PARAMETER_USAGE_KEY +import org.jetbrains.kotlin.idea.inliner.CodeToInline.Companion.PARAMETER_USAGE_KEY +import org.jetbrains.kotlin.idea.inliner.CodeToInline.Companion.TYPE_PARAMETER_USAGE_KEY import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtExpression /** - * Represents an expression to replace usages of particular callable. + * Represents code to be inlined to replace usages of particular callable. * The expression should be preprocessed in the following way: * * Type arguments for all calls should be made explicit * * All external symbols to be imported should be either referenced via fully-qualified form or included into [fqNamesToImport] * * All usages of value parameters (of our callable) should be marked with [PARAMETER_USAGE_KEY] copyable user data (holds the name of the corresponding parameter) * * All usages of type parameters (of our callable) should be marked with [TYPE_PARAMETER_USAGE_KEY] copyable user data (holds the name of the corresponding type parameter) - * Use [ReplacementBuilder.buildReplacementCode]. + * Use [CodeToInlineBuilder.prepareCodeToInline]. */ -class ReplacementCode( +class CodeToInline( val mainExpression: KtExpression?, val statementsBefore: List, val fqNamesToImport: Collection diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementBuilder.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInlineBuilder.kt similarity index 91% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementBuilder.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInlineBuilder.kt index e588bf1dc05..658d1030de6 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementBuilder.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/CodeToInlineBuilder.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor @@ -36,21 +36,21 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import java.util.* -class ReplacementBuilder( +class CodeToInlineBuilder( private val targetCallable: CallableDescriptor, private val resolutionFacade: ResolutionFacade ) { private val psiFactory = KtPsiFactory(resolutionFacade.project) - fun buildReplacementCode( + fun prepareCodeToInline( mainExpression: KtExpression?, statementsBefore: List, analyze: () -> BindingContext, importFqNames: Collection = emptyList() - ): ReplacementCode { + ): CodeToInline { var bindingContext = analyze() - val result = MutableReplacementCode(mainExpression, statementsBefore.toMutableList(), importFqNames.toMutableSet()) + val result = MutableCodeToInline(mainExpression, statementsBefore.toMutableList(), importFqNames.toMutableSet()) val typeArgsToAdd = ArrayList>() result.forEachDescendantOfType { @@ -80,10 +80,10 @@ class ReplacementBuilder( if (expression.getReceiverExpression() == null) { if (target is ValueParameterDescriptor && target.containingDeclaration == targetCallable) { - expression.putCopyableUserData(ReplacementCode.PARAMETER_USAGE_KEY, target.name) + expression.putCopyableUserData(CodeToInline.PARAMETER_USAGE_KEY, target.name) } else if (target is TypeParameterDescriptor && target.containingDeclaration == targetCallable) { - expression.putCopyableUserData(ReplacementCode.TYPE_PARAMETER_USAGE_KEY, target.name) + expression.putCopyableUserData(CodeToInline.TYPE_PARAMETER_USAGE_KEY, target.name) } val resolvedCall = expression.getResolvedCall(bindingContext) diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/MutableReplacementCode.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/MutableCodeToInline.kt similarity index 84% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/MutableReplacementCode.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/MutableCodeToInline.kt index 8f90dfd4318..339cfee848f 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/MutableReplacementCode.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/MutableCodeToInline.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.util.Key import com.intellij.psi.PsiElement @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList private val POST_INSERTION_ACTION: Key<(KtElement) -> Unit> = Key("POST_INSERTION_ACTION") -internal class MutableReplacementCode( +internal class MutableCodeToInline( var mainExpression: KtExpression?, val statementsBefore: MutableList, val fqNamesToImport: MutableCollection @@ -81,22 +81,22 @@ internal class MutableReplacementCode( } } -internal fun ReplacementCode.toMutable(): MutableReplacementCode { - return MutableReplacementCode( +internal fun CodeToInline.toMutable(): MutableCodeToInline { + return MutableCodeToInline( mainExpression?.copied(), statementsBefore.map { it.copied() }.toMutableList(), fqNamesToImport.toMutableSet()) } -internal fun MutableReplacementCode.toNonMutable(): ReplacementCode { - return ReplacementCode(mainExpression, statementsBefore, fqNamesToImport) +internal fun MutableCodeToInline.toNonMutable(): CodeToInline { + return CodeToInline(mainExpression, statementsBefore, fqNamesToImport) } -internal inline fun MutableReplacementCode.collectDescendantsOfType(noinline predicate: (T) -> Boolean = { true }): List { +internal inline fun MutableCodeToInline.collectDescendantsOfType(noinline predicate: (T) -> Boolean = { true }): List { return expressions.flatMap { it.collectDescendantsOfType({ true }, predicate) } } -internal inline fun MutableReplacementCode.forEachDescendantOfType(noinline action: (T) -> Unit) { +internal inline fun MutableCodeToInline.forEachDescendantOfType(noinline action: (T) -> Unit) { expressions.forEach { it.forEachDescendantOfType(action) } } diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementPerformer.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ReplacementPerformer.kt similarity index 87% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementPerformer.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ReplacementPerformer.kt index 20c90887d84..2e036cf217d 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/ReplacementPerformer.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/ReplacementPerformer.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.util.Key import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -31,7 +31,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import java.util.* internal abstract class ReplacementPerformer( - protected val replacement: MutableReplacementCode, + protected val codeToInline: MutableCodeToInline, protected var elementToBeReplaced: TElement ) { protected val psiFactory = KtPsiFactory(elementToBeReplaced) @@ -40,18 +40,18 @@ internal abstract class ReplacementPerformer( } internal class AnnotationEntryReplacementPerformer( - replacement: MutableReplacementCode, + codeToInline: MutableCodeToInline, elementToBeReplaced: KtAnnotationEntry -) : ReplacementPerformer(replacement, elementToBeReplaced) { +) : ReplacementPerformer(codeToInline, elementToBeReplaced) { override fun doIt(postProcessing: (PsiChildRange) -> PsiChildRange): KtAnnotationEntry { - assert(replacement.mainExpression != null) - assert(replacement.statementsBefore.isEmpty()) + assert(codeToInline.mainExpression != null) + assert(codeToInline.statementsBefore.isEmpty()) - val dummyAnnotationEntry = createByPattern("@Dummy($0)", replacement.mainExpression!!) { psiFactory.createAnnotationEntry(it) } + val dummyAnnotationEntry = createByPattern("@Dummy($0)", codeToInline.mainExpression!!) { psiFactory.createAnnotationEntry(it) } val replaced = elementToBeReplaced.replace(dummyAnnotationEntry) - replacement.performPostInsertionActions(replaced.singletonList()) + codeToInline.performPostInsertionActions(replaced.singletonList()) var range = PsiChildRange.singleElement(replaced) range = postProcessing(range) @@ -65,13 +65,13 @@ internal class AnnotationEntryReplacementPerformer( } internal class ExpressionReplacementPerformer( - replacement: MutableReplacementCode, + codeToInline: MutableCodeToInline, expressionToBeReplaced: KtExpression -) : ReplacementPerformer(replacement, expressionToBeReplaced) { +) : ReplacementPerformer(codeToInline, expressionToBeReplaced) { override fun doIt(postProcessing: (PsiChildRange) -> PsiChildRange): KtExpression? { val insertedStatements = ArrayList() - for (statement in replacement.statementsBefore) { + for (statement in codeToInline.statementsBefore) { // copy the statement if it can get invalidated by findOrCreateBlockToInsertStatement() val statementToUse = if (statement.isPhysical) statement.copy() else statement val anchor = findOrCreateBlockToInsertStatement() @@ -83,8 +83,8 @@ internal class ExpressionReplacementPerformer( insertedStatements.add(inserted) } - val replaced = if (replacement.mainExpression != null) { - elementToBeReplaced.replace(replacement.mainExpression!!) + val replaced = if (codeToInline.mainExpression != null) { + elementToBeReplaced.replace(codeToInline.mainExpression!!) } else { val bindingContext = elementToBeReplaced.analyze(BodyResolveMode.FULL) @@ -98,7 +98,7 @@ internal class ExpressionReplacementPerformer( } } - replacement.performPostInsertionActions(insertedStatements + replaced.singletonOrEmptyList()) + codeToInline.performPostInsertionActions(insertedStatements + replaced.singletonOrEmptyList()) var range = if (replaced != null) { if (insertedStatements.isEmpty()) { diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/UsageReplacementStrategy.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/UsageReplacementStrategy.kt similarity index 98% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/UsageReplacementStrategy.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/UsageReplacementStrategy.kt index cadfa76f28f..58257e3bf24 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/UsageReplacementStrategy.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/UsageReplacementStrategy.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.progress.ProgressIndicator diff --git a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/introduceValue.kt b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/introduceValue.kt similarity index 93% rename from idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/introduceValue.kt rename to idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/introduceValue.kt index ac8073fea27..0265b77d622 100644 --- a/idea/idea-replacement-engine/src/org/jetbrains/kotlin/idea/replacement/introduceValue.kt +++ b/idea/idea-code-inliner/src/org/jetbrains/kotlin/idea/inliner/introduceValue.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.replacement +package org.jetbrains.kotlin.idea.inliner import org.jetbrains.kotlin.idea.analysis.computeTypeInContext import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -38,17 +38,17 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.addToStdlib.check /** - * Modifies [MutableReplacementCode] introducing a variable initialized by [value] and replacing all of [usages] with its use. - * The variable must be initialized (and so the value is calculated) before any other code in [MutableReplacementCode]. + * Modifies [MutableCodeToInline] introducing a variable initialized by [value] and replacing all of [usages] with its use. + * The variable must be initialized (and so the value is calculated) before any other code in [MutableCodeToInline]. * @param value Value to use for variable initialization * @param valueType Type of the value * @param usages Usages to be replaced. This collection can be empty and in this case the actual variable is not needed. * But the expression [value] must be calculated because it may have side effects. - * @param expressionToBeReplaced Expression to be replaced by the [MutableReplacementCode]. + * @param expressionToBeReplaced Expression to be replaced by the [MutableCodeToInline]. * @param nameSuggestion Name suggestion for the variable. * @param safeCall If true, then the whole code must not be executed if the [value] evaluates to null. */ -internal fun MutableReplacementCode.introduceValue( +internal fun MutableCodeToInline.introduceValue( value: KtExpression, valueType: KotlinType?, usages: Collection, @@ -151,7 +151,7 @@ private fun variableNeedsExplicitType( return valueTypeWithoutExpectedType == null || ErrorUtils.containsErrorType(valueTypeWithoutExpectedType) } -private fun collectNameUsages(scope: MutableReplacementCode, name: String): List { +private fun collectNameUsages(scope: MutableCodeToInline, name: String): List { return scope.expressions.flatMap { expression -> expression.collectDescendantsOfType { it.getReceiverExpression() == null && it.getReferencedName() == name } } diff --git a/idea/idea.iml b/idea/idea.iml index fe8f5620a20..db10fc6e492 100644 --- a/idea/idea.iml +++ b/idea/idea.iml @@ -55,6 +55,6 @@ - + \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt index 4ca83fe33fb..34d8715678e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFix.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.targetDescriptors import org.jetbrains.kotlin.idea.quickfix.CleanupFix import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory -import org.jetbrains.kotlin.idea.replacement.UsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.UsageReplacementStrategy import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny 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 b911e540fd2..ba5ff921cae 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt @@ -31,9 +31,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.OptionalParametersHelper import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.replacement.CallableUsageReplacementStrategy -import org.jetbrains.kotlin.idea.replacement.ClassUsageReplacementStrategy -import org.jetbrains.kotlin.idea.replacement.UsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.CallableUsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.ClassUsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.UsageReplacementStrategy import org.jetbrains.kotlin.psi.KtConstructorCalleeExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSimpleNameExpression diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt index 095b2b00d6a..7f8a8f5aeef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageInWholeProjectFix.kt @@ -23,8 +23,8 @@ import com.intellij.psi.PsiFile import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.replacement.UsageReplacementStrategy -import org.jetbrains.kotlin.idea.replacement.replaceUsagesInWholeProject +import org.jetbrains.kotlin.idea.inliner.UsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.replaceUsagesInWholeProject import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.DescriptorRenderer diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt index a4bbdcc2baf..18db3064015 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/ReplaceWithAnnotationAnalyzer.kt @@ -21,8 +21,8 @@ import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.replacement.ReplacementBuilder -import org.jetbrains.kotlin.idea.replacement.ReplacementCode +import org.jetbrains.kotlin.idea.inliner.CodeToInlineBuilder +import org.jetbrains.kotlin.idea.inliner.CodeToInline import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.name.FqName @@ -50,7 +50,7 @@ object ReplaceWithAnnotationAnalyzer { annotation: ReplaceWith, symbolDescriptor: CallableDescriptor, resolutionFacade: ResolutionFacade - ): ReplacementCode? { + ): CodeToInline? { val originalDescriptor = (if (symbolDescriptor is CallableMemberDescriptor) DescriptorUtils.unwrapFakeOverride(symbolDescriptor) else @@ -62,7 +62,7 @@ object ReplaceWithAnnotationAnalyzer { annotation: ReplaceWith, symbolDescriptor: CallableDescriptor, resolutionFacade: ResolutionFacade - ): ReplacementCode? { + ): CodeToInline? { val psiFactory = KtPsiFactory(resolutionFacade.project) val expression = try { psiFactory.createExpression(annotation.pattern) @@ -89,8 +89,8 @@ object ReplaceWithAnnotationAnalyzer { return expression.analyzeInContext(scope, expressionTypingServices = expressionTypingServices) } - return ReplacementBuilder(symbolDescriptor, resolutionFacade) - .buildReplacementCode(expression, emptyList(), ::analyzeExpression, importFqNames = importFqNames(annotation)) + return CodeToInlineBuilder(symbolDescriptor, resolutionFacade) + .prepareCodeToInline(expression, emptyList(), ::analyzeExpression, importFqNames = importFqNames(annotation)) } fun analyzeClassReplacement( 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 be83b65db9b..fba9f5a4451 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt @@ -29,9 +29,9 @@ import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.core.copied -import org.jetbrains.kotlin.idea.replacement.CallableUsageReplacementStrategy -import org.jetbrains.kotlin.idea.replacement.ReplacementBuilder -import org.jetbrains.kotlin.idea.replacement.replaceUsagesInWholeProject +import org.jetbrains.kotlin.idea.inliner.CallableUsageReplacementStrategy +import org.jetbrains.kotlin.idea.inliner.CodeToInlineBuilder +import org.jetbrains.kotlin.idea.inliner.replaceUsagesInWholeProject import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtNamedFunction @@ -67,21 +67,21 @@ class KotlinInlineFunctionHandler: InlineActionHandler() { expectedType = expectedType) } - val replacementBuilder = ReplacementBuilder(descriptor, element.getResolutionFacade()) + val replacementBuilder = CodeToInlineBuilder(descriptor, element.getResolutionFacade()) val replacement = if (element.hasBlockBody()) { bodyCopy as KtBlockExpression val statements = bodyCopy.statements //TODO: check no other return's! val lastReturn = statements.lastOrNull() as? KtReturnExpression if (lastReturn != null) { - replacementBuilder.buildReplacementCode(lastReturn.returnedExpression, statements.dropLast(1), ::analyzeBodyCopy) + replacementBuilder.prepareCodeToInline(lastReturn.returnedExpression, statements.dropLast(1), ::analyzeBodyCopy) } else { - replacementBuilder.buildReplacementCode(null, statements, ::analyzeBodyCopy) + replacementBuilder.prepareCodeToInline(null, statements, ::analyzeBodyCopy) } } else { - replacementBuilder.buildReplacementCode(bodyCopy, emptyList(), ::analyzeBodyCopy) + replacementBuilder.prepareCodeToInline(bodyCopy, emptyList(), ::analyzeBodyCopy) } val commandName = RefactoringBundle.message("inline.command", element.name)