Reformat: BranchedFoldingUtils

This commit is contained in:
Mikhail Glukhikh
2018-04-28 18:42:20 +03:00
parent 89981ecbbb
commit 2854e6b7a1
@@ -46,14 +46,14 @@ object BranchedFoldingUtils {
} }
fun getFoldableBranchedReturn(branch: KtExpression?): KtReturnExpression? = fun getFoldableBranchedReturn(branch: KtExpression?): KtReturnExpression? =
(branch?.lastBlockStatementOrThis() as? KtReturnExpression)?.takeIf { (branch?.lastBlockStatementOrThis() as? KtReturnExpression)?.takeIf {
it.returnedExpression != null && it.returnedExpression != null &&
it.returnedExpression !is KtLambdaExpression && it.returnedExpression !is KtLambdaExpression &&
it.getTargetLabel() == null it.getTargetLabel() == null
} }
private fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean = private fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean =
a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken
internal fun getFoldableAssignmentNumber(expression: KtExpression?): Int { internal fun getFoldableAssignmentNumber(expression: KtExpression?): Int {
expression ?: return -1 expression ?: return -1
@@ -61,18 +61,15 @@ object BranchedFoldingUtils {
fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) { fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) {
is KtWhenExpression -> { is KtWhenExpression -> {
val entries = e.entries val entries = e.entries
!e.hasMissingCases() && !e.hasMissingCases() && entries.isNotEmpty() && entries.all { entry ->
entries.isNotEmpty() &&
entries.all { entry ->
val assignment = getFoldableBranchedAssignment(entry.expression)?.run { assignments.add(this) } val assignment = getFoldableBranchedAssignment(entry.expression)?.run { assignments.add(this) }
assignment != null || collectAssignmentsAndCheck(entry.expression?.lastBlockStatementOrThis()) assignment != null || collectAssignmentsAndCheck(entry.expression?.lastBlockStatementOrThis())
} }
} }
is KtIfExpression -> { is KtIfExpression -> {
val branches = e.branches val branches = e.branches
branches.size > 1 && val elseBranch = branches.lastOrNull()?.getStrictParentOfType<KtIfExpression>()?.`else`
(branches.lastOrNull()?.getStrictParentOfType<KtIfExpression>()?.`else` != null) && branches.size > 1 && elseBranch != null && branches.all { branch ->
branches.all { branch ->
val assignment = getFoldableBranchedAssignment(branch)?.run { assignments.add(this) } val assignment = getFoldableBranchedAssignment(branch)?.run { assignments.add(this) }
assignment != null || collectAssignmentsAndCheck(branch?.lastBlockStatementOrThis()) assignment != null || collectAssignmentsAndCheck(branch?.lastBlockStatementOrThis())
} }
@@ -105,25 +102,25 @@ object BranchedFoldingUtils {
else else
false false
} }
)) { )
) {
return -1 return -1
} }
return assignments.size return assignments.size
} }
private fun getFoldableReturns(branches: List<KtExpression?>): List<KtReturnExpression>? = private fun getFoldableReturns(branches: List<KtExpression?>): List<KtReturnExpression>? =
branches.fold<KtExpression?, MutableList<KtReturnExpression>?>(mutableListOf()) { prevList, branch -> branches.fold<KtExpression?, MutableList<KtReturnExpression>?>(mutableListOf()) { prevList, branch ->
if (prevList == null) return@fold null if (prevList == null) return@fold null
val foldableBranchedReturn = getFoldableBranchedReturn(branch) val foldableBranchedReturn = getFoldableBranchedReturn(branch)
if (foldableBranchedReturn != null) { if (foldableBranchedReturn != null) {
prevList.add(foldableBranchedReturn) prevList.add(foldableBranchedReturn)
} } else {
else { val currReturns = getFoldableReturns(branch?.lastBlockStatementOrThis()) ?: return@fold null
val currReturns = getFoldableReturns(branch?.lastBlockStatementOrThis()) ?: return@fold null prevList += currReturns
prevList += currReturns
}
prevList
} }
prevList
}
internal fun getFoldableReturns(expression: KtExpression?): List<KtReturnExpression>? = when (expression) { internal fun getFoldableReturns(expression: KtExpression?): List<KtReturnExpression>? = when (expression) {
is KtWhenExpression -> { is KtWhenExpression -> {
@@ -175,6 +172,7 @@ object BranchedFoldingUtils {
replace(rhs) replace(rhs)
} }
} }
fun lift(e: KtExpression?) { fun lift(e: KtExpression?) {
when (e) { when (e) {
is KtWhenExpression -> e.entries.forEach { entry -> is KtWhenExpression -> e.entries.forEach { entry ->
@@ -196,19 +194,18 @@ object BranchedFoldingUtils {
fun KtReturnExpression.replaceWithReturned() { fun KtReturnExpression.replaceWithReturned() {
replace(returnedExpression!!) replace(returnedExpression!!)
} }
fun lift(e: KtExpression?) { fun lift(e: KtExpression?) {
when (e) { when (e) {
is KtWhenExpression -> e.entries.forEach { entry -> is KtWhenExpression -> e.entries.forEach { entry ->
getFoldableBranchedReturn(entry.expression)?.replaceWithReturned() val entryExpr = entry.expression
?: lift(entry.expression?.lastBlockStatementOrThis()) getFoldableBranchedReturn(entryExpr)?.replaceWithReturned() ?: lift(entryExpr?.lastBlockStatementOrThis())
} }
is KtIfExpression -> e.branches.forEach { branch -> is KtIfExpression -> e.branches.forEach { branch ->
getFoldableBranchedReturn(branch)?.replaceWithReturned() ?: getFoldableBranchedReturn(branch)?.replaceWithReturned() ?: lift(branch?.lastBlockStatementOrThis())
lift(branch?.lastBlockStatementOrThis())
} }
is KtTryExpression -> e.tryBlockAndCatchBodies().forEach { is KtTryExpression -> e.tryBlockAndCatchBodies().forEach {
getFoldableBranchedReturn(it)?.replaceWithReturned() ?: getFoldableBranchedReturn(it)?.replaceWithReturned() ?: lift(it?.lastBlockStatementOrThis())
lift(it?.lastBlockStatementOrThis())
} }
} }
} }
@@ -219,6 +216,6 @@ object BranchedFoldingUtils {
private fun KtTryExpression.tryBlockAndCatchBodies(): List<KtExpression?> = listOf(tryBlock) + catchClauses.map { it.catchBody } private fun KtTryExpression.tryBlockAndCatchBodies(): List<KtExpression?> = listOf(tryBlock) + catchClauses.map { it.catchBody }
private fun KtWhenExpression.hasMissingCases(): Boolean = private fun KtWhenExpression.hasMissingCases(): Boolean =
!KtPsiUtil.checkWhenExpressionHasSingleElse(this) && WhenChecker.getMissingCases(this, this.analyze()).isNotEmpty() !KtPsiUtil.checkWhenExpressionHasSingleElse(this) && WhenChecker.getMissingCases(this, this.analyze()).isNotEmpty()
} }