Cleanup code: BranchedFoldingUtils

This commit is contained in:
Mikhail Glukhikh
2017-07-05 14:34:25 +03:00
parent 2d1abda9a1
commit 2deef48b84
@@ -42,43 +42,39 @@ object BranchedFoldingUtils {
return (branch?.lastBlockStatementOrThis() as? KtBinaryExpression)?.takeIf(::checkAssignment) return (branch?.lastBlockStatementOrThis() as? KtBinaryExpression)?.takeIf(::checkAssignment)
} }
fun getFoldableBranchedReturn(branch: KtExpression?): KtReturnExpression? { fun getFoldableBranchedReturn(branch: KtExpression?): KtReturnExpression? =
return (branch?.lastBlockStatementOrThis() as? KtReturnExpression)?.takeIf { it.returnedExpression != null } (branch?.lastBlockStatementOrThis() as? KtReturnExpression)?.takeIf { it.returnedExpression != null }
}
fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean { fun checkAssignmentsMatch(a1: KtBinaryExpression, a2: KtBinaryExpression): Boolean =
return a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken
}
fun canFoldToAssignment(expression: KtExpression?): Boolean { fun canFoldToAssignment(expression: KtExpression?): Boolean {
val assignments = mutableListOf<KtBinaryExpression>() val assignments = mutableListOf<KtBinaryExpression>()
fun collectAssignmentsAndCheck(e: KtExpression?): Boolean { fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) {
return when (e) { is KtWhenExpression -> {
is KtWhenExpression -> { val entries = e.entries
val entries = e.entries KtPsiUtil.checkWhenExpressionHasSingleElse(e) &&
KtPsiUtil.checkWhenExpressionHasSingleElse(e) && entries.isNotEmpty() &&
entries.isNotEmpty() && entries.all { entry ->
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 -> {
val branches = e.branches
branches.size > 1 &&
(branches.lastOrNull()?.getStrictParentOfType<KtIfExpression>()?.`else` != null) &&
branches.all { branch ->
val assignment = getFoldableBranchedAssignment(branch)?.run { assignments.add(this) }
assignment != null || collectAssignmentsAndCheck(branch?.lastBlockStatementOrThis())
}
}
is KtCallExpression -> {
e.analyze().getType(e)?.isNothing() ?: false
}
is KtBreakExpression, is KtContinueExpression,
is KtThrowExpression, is KtReturnExpression -> true
else -> false
} }
is KtIfExpression -> {
val branches = e.branches
branches.size > 1 &&
(branches.lastOrNull()?.getStrictParentOfType<KtIfExpression>()?.`else` != null) &&
branches.all { branch ->
val assignment = getFoldableBranchedAssignment(branch)?.run { assignments.add(this) }
assignment != null || collectAssignmentsAndCheck(branch?.lastBlockStatementOrThis())
}
}
is KtCallExpression -> {
e.analyze().getType(e)?.isNothing() ?: false
}
is KtBreakExpression, is KtContinueExpression,
is KtThrowExpression, is KtReturnExpression -> true
else -> false
} }
if (!collectAssignmentsAndCheck(expression)) return false if (!collectAssignmentsAndCheck(expression)) return false
if (assignments.isEmpty()) return false if (assignments.isEmpty()) return false