aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/transform/FirstTransform.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dark@d-d.me>2017-04-19 06:58:40 -0500
committerGitHub <noreply@github.com>2017-04-19 06:58:40 -0500
commit02e38832668ed2a0504a77dd4f86270fa1a1d4bf (patch)
tree5f931022c36fc3cf8ef585e4bcc08f554f92142e /compiler/src/dotty/tools/dotc/transform/FirstTransform.scala
parent4623e1282ebe7dfc31cb12411fed16457ed289ca (diff)
parent983ce8da3ce321bed7f8100c00b4aa709528208e (diff)
downloaddotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.tar.gz
dotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.tar.bz2
dotty-02e38832668ed2a0504a77dd4f86270fa1a1d4bf.zip
Merge pull request #2267 from dotty-staging/fix-constant-lazy-vals
Fix #2266: Do not replace constant type lazy vals with constant.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/transform/FirstTransform.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/transform/FirstTransform.scala17
1 files changed, 12 insertions, 5 deletions
diff --git a/compiler/src/dotty/tools/dotc/transform/FirstTransform.scala b/compiler/src/dotty/tools/dotc/transform/FirstTransform.scala
index a3cf71ef2..767ee0901 100644
--- a/compiler/src/dotty/tools/dotc/transform/FirstTransform.scala
+++ b/compiler/src/dotty/tools/dotc/transform/FirstTransform.scala
@@ -9,7 +9,7 @@ import dotty.tools.dotc.transform.TreeTransforms._
import ast.Trees._
import Flags._
import Types._
-import Constants.Constant
+import Constants._
import Contexts.Context
import Symbols._
import SymDenotations._
@@ -34,6 +34,8 @@ import StdNames._
* - drops branches of ifs using the rules
* if (true) A else B --> A
* if (false) A else B --> B
+ * if (C: true) A else B --> C; A
+ * if (C: false) A else B --> C; B
*/
class FirstTransform extends MiniPhaseTransform with InfoTransformer with AnnotationTransformer { thisTransformer =>
import ast.tpd._
@@ -190,11 +192,16 @@ class FirstTransform extends MiniPhaseTransform with InfoTransformer with Annota
override def transformBlock(tree: Block)(implicit ctx: Context, info: TransformerInfo) =
constToLiteral(tree)
- override def transformIf(tree: If)(implicit ctx: Context, info: TransformerInfo) =
- tree.cond match {
- case Literal(Constant(c: Boolean)) => if (c) tree.thenp else tree.elsep
- case _ => tree
+ override def transformIf(tree: If)(implicit ctx: Context, info: TransformerInfo) = {
+ tree.cond.tpe.widenTermRefExpr match {
+ case ConstantType(Constant(condVal: Boolean)) =>
+ val selected = if (condVal) tree.thenp else tree.elsep
+ if (isPureExpr(tree.cond)) selected
+ else Block(tree.cond :: Nil, selected)
+ case _ =>
+ tree
}
+ }
// invariants: all modules have companion objects
// all types are TypeTrees