[FIR] Don't create synthetic calls for when with only one branch
This commit is contained in:
+15
-4
@@ -11,6 +11,8 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.impl.FirEmptyExpressionBlock
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl
|
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionWithSmartcastImpl
|
||||||
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
|
import org.jetbrains.kotlin.fir.references.FirExplicitThisReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
||||||
@@ -25,10 +27,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope
|
|||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
|
import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||||
import org.jetbrains.kotlin.fir.symbols.*
|
import org.jetbrains.kotlin.fir.symbols.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.types.impl.*
|
import org.jetbrains.kotlin.fir.types.impl.*
|
||||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||||
@@ -526,6 +524,12 @@ open class FirBodyResolveTransformer(
|
|||||||
localScopes += FirLocalScope()
|
localScopes += FirLocalScope()
|
||||||
}
|
}
|
||||||
whenExpression.transformSubject(this, noExpectedType)
|
whenExpression.transformSubject(this, noExpectedType)
|
||||||
|
if (whenExpression.isOneBranch()) {
|
||||||
|
whenExpression.transformBranches(this, noExpectedType)
|
||||||
|
whenExpression.resultType = builtinTypes.unitType
|
||||||
|
dataFlowAnalyzer.exitWhenExpression(whenExpression)
|
||||||
|
return@with whenExpression.compose()
|
||||||
|
}
|
||||||
whenExpression.transformBranches(this, null)
|
whenExpression.transformBranches(this, null)
|
||||||
|
|
||||||
@Suppress("NAME_SHADOWING")
|
@Suppress("NAME_SHADOWING")
|
||||||
@@ -542,6 +546,13 @@ open class FirBodyResolveTransformer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun FirWhenExpression.isOneBranch(): Boolean {
|
||||||
|
if (branches.size == 1) return true
|
||||||
|
if (branches.size > 2) return false
|
||||||
|
val lastBranch = branches.last()
|
||||||
|
return lastBranch.condition is FirElseIfTrueCondition && lastBranch.result is FirEmptyExpressionBlock
|
||||||
|
}
|
||||||
|
|
||||||
override fun transformWhenBranch(whenBranch: FirWhenBranch, data: Any?): CompositeTransformResult<FirWhenBranch> {
|
override fun transformWhenBranch(whenBranch: FirWhenBranch, data: Any?): CompositeTransformResult<FirWhenBranch> {
|
||||||
return whenBranch.also { dataFlowAnalyzer.enterWhenBranchCondition(whenBranch) }
|
return whenBranch.also { dataFlowAnalyzer.enterWhenBranchCondition(whenBranch) }
|
||||||
.transformCondition(this, data).also { dataFlowAnalyzer.exitWhenBranchCondition(it) }
|
.transformCondition(this, data).also { dataFlowAnalyzer.exitWhenBranchCondition(it) }
|
||||||
|
|||||||
Reference in New Issue
Block a user