Extracted methods
This commit is contained in:
@@ -42,6 +42,7 @@ class CodeToInlineBuilder(
|
|||||||
) {
|
) {
|
||||||
private val psiFactory = KtPsiFactory(resolutionFacade.project)
|
private val psiFactory = KtPsiFactory(resolutionFacade.project)
|
||||||
|
|
||||||
|
//TODO: document that code will be modified
|
||||||
fun prepareCodeToInline(
|
fun prepareCodeToInline(
|
||||||
mainExpression: KtExpression?,
|
mainExpression: KtExpression?,
|
||||||
statementsBefore: List<KtExpression>,
|
statementsBefore: List<KtExpression>,
|
||||||
@@ -50,32 +51,42 @@ class CodeToInlineBuilder(
|
|||||||
): CodeToInline {
|
): CodeToInline {
|
||||||
var bindingContext = analyze()
|
var bindingContext = analyze()
|
||||||
|
|
||||||
val result = MutableCodeToInline(mainExpression, statementsBefore.toMutableList(), importFqNames.toMutableSet())
|
val codeToInline = MutableCodeToInline(mainExpression, statementsBefore.toMutableList(), importFqNames.toMutableSet())
|
||||||
|
|
||||||
|
bindingContext = insertExplicitTypeArguments(codeToInline, bindingContext, analyze)
|
||||||
|
|
||||||
|
insertExplicitReceivers(codeToInline, bindingContext)
|
||||||
|
|
||||||
|
return codeToInline.toNonMutable()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun insertExplicitTypeArguments(codeToInline: MutableCodeToInline, bindingContext: BindingContext, analyze: () -> BindingContext): BindingContext {
|
||||||
val typeArgsToAdd = ArrayList<Pair<KtCallExpression, KtTypeArgumentList>>()
|
val typeArgsToAdd = ArrayList<Pair<KtCallExpression, KtTypeArgumentList>>()
|
||||||
result.forEachDescendantOfType<KtCallExpression> {
|
codeToInline.forEachDescendantOfType<KtCallExpression> {
|
||||||
if (InsertExplicitTypeArgumentsIntention.isApplicableTo(it, bindingContext)) {
|
if (InsertExplicitTypeArgumentsIntention.isApplicableTo(it, bindingContext)) {
|
||||||
typeArgsToAdd.add(it to InsertExplicitTypeArgumentsIntention.createTypeArguments(it, bindingContext)!!)
|
typeArgsToAdd.add(it to InsertExplicitTypeArgumentsIntention.createTypeArguments(it, bindingContext)!!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeArgsToAdd.isNotEmpty()) {
|
if (typeArgsToAdd.isEmpty()) return bindingContext
|
||||||
for ((callExpr, typeArgs) in typeArgsToAdd) {
|
|
||||||
callExpr.addAfter(typeArgs, callExpr.calleeExpression)
|
|
||||||
}
|
|
||||||
|
|
||||||
// reanalyze expression - new usages of type parameters may be added
|
for ((callExpr, typeArgs) in typeArgsToAdd) {
|
||||||
bindingContext = analyze()
|
callExpr.addAfter(typeArgs, callExpr.calleeExpression)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reanalyze expression - new usages of type parameters may be added
|
||||||
|
return analyze()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun insertExplicitReceivers(codeToInline: MutableCodeToInline, bindingContext: BindingContext) {
|
||||||
val receiversToAdd = ArrayList<Pair<KtExpression, KtExpression>>()
|
val receiversToAdd = ArrayList<Pair<KtExpression, KtExpression>>()
|
||||||
|
|
||||||
result.forEachDescendantOfType<KtSimpleNameExpression> { expression ->
|
codeToInline.forEachDescendantOfType<KtSimpleNameExpression> { expression ->
|
||||||
val target = bindingContext[BindingContext.REFERENCE_TARGET, expression] ?: return@forEachDescendantOfType
|
val target = bindingContext[BindingContext.REFERENCE_TARGET, expression] ?: return@forEachDescendantOfType
|
||||||
|
|
||||||
//TODO: other types of references ('[]' etc)
|
//TODO: other types of references ('[]' etc)
|
||||||
if (expression.mainReference.canBeResolvedViaImport(target)) {
|
if (expression.mainReference.canBeResolvedViaImport(target)) {
|
||||||
result.fqNamesToImport.add(target.importableFqName!!)
|
codeToInline.fqNamesToImport.add(target.importableFqName!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (expression.getReceiverExpression() == null) {
|
if (expression.getReceiverExpression() == null) {
|
||||||
@@ -106,10 +117,8 @@ class CodeToInlineBuilder(
|
|||||||
// add receivers in reverse order because arguments of a call were processed after the callee's name
|
// add receivers in reverse order because arguments of a call were processed after the callee's name
|
||||||
for ((expr, receiverExpression) in receiversToAdd.asReversed()) {
|
for ((expr, receiverExpression) in receiversToAdd.asReversed()) {
|
||||||
val expressionToReplace = expr.parent as? KtCallExpression ?: expr
|
val expressionToReplace = expr.parent as? KtCallExpression ?: expr
|
||||||
result.replaceExpression(expressionToReplace,
|
codeToInline.replaceExpression(expressionToReplace,
|
||||||
psiFactory.createExpressionByPattern("$0.$1", receiverExpression, expressionToReplace))
|
psiFactory.createExpressionByPattern("$0.$1", receiverExpression, expressionToReplace))
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.toNonMutable()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user