Reformat: BranchedFoldingUtils
This commit is contained in:
+28
-31
@@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user