@@ -9,7 +9,7 @@ import dotty.tools.dotc.transform.TreeTransforms._
99import ast .Trees ._
1010import Flags ._
1111import Types ._
12- import Constants .Constant
12+ import Constants ._
1313import Contexts .Context
1414import Symbols ._
1515import SymDenotations ._
@@ -34,6 +34,8 @@ import StdNames._
3434 * - drops branches of ifs using the rules
3535 * if (true) A else B --> A
3636 * if (false) A else B --> B
37+ * if (C: true) A else B --> C; A
38+ * if (C: false) A else B --> C; B
3739 */
3840class FirstTransform extends MiniPhaseTransform with InfoTransformer with AnnotationTransformer { thisTransformer =>
3941 import ast .tpd ._
@@ -190,11 +192,16 @@ class FirstTransform extends MiniPhaseTransform with InfoTransformer with Annota
190192 override def transformBlock (tree : Block )(implicit ctx : Context , info : TransformerInfo ) =
191193 constToLiteral(tree)
192194
193- override def transformIf (tree : If )(implicit ctx : Context , info : TransformerInfo ) =
194- tree.cond match {
195- case Literal (Constant (c : Boolean )) => if (c) tree.thenp else tree.elsep
196- case _ => tree
195+ override def transformIf (tree : If )(implicit ctx : Context , info : TransformerInfo ) = {
196+ tree.cond.tpe.widenTermRefExpr match {
197+ case ConstantType (Constant (condVal : Boolean )) =>
198+ val selected = if (condVal) tree.thenp else tree.elsep
199+ if (isPureExpr(tree.cond)) selected
200+ else Block (tree.cond :: Nil , selected)
201+ case _ =>
202+ tree
197203 }
204+ }
198205
199206 // invariants: all modules have companion objects
200207 // all types are TypeTrees
0 commit comments