Extracted methods

This commit is contained in:
Valentin Kipyatkov
2016-11-07 19:11:54 +03:00
parent 85e1e53354
commit 4915b049c4
@@ -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()
} }
} }