aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-05-29 17:21:58 +0200
committerMartin Odersky <odersky@gmail.com>2015-05-29 17:21:58 +0200
commitc65504d92444ffb63b385aaa0900f08912033f74 (patch)
treedd24d3ba49ff2571b6ed081794c96e168dd30852 /src
parent3350907bf1ec570a7a7f645c57f74a620cc49664 (diff)
downloaddotty-c65504d92444ffb63b385aaa0900f08912033f74.tar.gz
dotty-c65504d92444ffb63b385aaa0900f08912033f74.tar.bz2
dotty-c65504d92444ffb63b385aaa0900f08912033f74.zip
Eliminate `_' from rhs of ValDefs
Previously was only done for DefDefs. Caused backend failure.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala2
-rw-r--r--src/dotty/tools/dotc/transform/ElimWildcardIdents.scala48
-rw-r--r--src/dotty/tools/dotc/transform/LazyVals.scala6
-rw-r--r--src/dotty/tools/dotc/transform/TraitConstructors.scala1
4 files changed, 22 insertions, 35 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index cf5ba6850..a38a238c8 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -418,7 +418,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
Thicket(valdef, clsdef)
}
- def initValue(tpe: Types.Type)(implicit ctx: Context) = {
+ def defaultValue(tpe: Types.Type)(implicit ctx: Context) = {
val tpw = tpe.widen
if (tpw isRef defn.IntClass) Literal(Constant(0))
diff --git a/src/dotty/tools/dotc/transform/ElimWildcardIdents.scala b/src/dotty/tools/dotc/transform/ElimWildcardIdents.scala
index 5ef0dfe84..29194d235 100644
--- a/src/dotty/tools/dotc/transform/ElimWildcardIdents.scala
+++ b/src/dotty/tools/dotc/transform/ElimWildcardIdents.scala
@@ -1,26 +1,14 @@
-package dotty.tools.dotc.transform
+package dotty.tools.dotc
+package transform
-import dotty.tools.dotc.transform.TreeTransforms.{TransformerInfo, TreeTransform, TreeTransformer, MiniPhaseTransform}
-import dotty.tools.dotc.ast.{untpd, tpd}
-import dotty.tools.dotc.core.Contexts.Context
-import scala.collection.mutable.ListBuffer
-import dotty.tools.dotc.core.{Scopes, Flags}
-import dotty.tools.dotc.core.Symbols.NoSymbol
-import scala.annotation.tailrec
-import dotty.tools.dotc.core._
+import TreeTransforms.{MiniPhaseTransform, TransformerInfo}
+import ast.tpd
+import ast.Trees._
+import core._
+import Contexts.Context
import Symbols._
-import scala.Some
-import dotty.tools.dotc.transform.TreeTransforms.{NXTransformations, TransformerInfo, TreeTransform, TreeTransformer}
-import dotty.tools.dotc.core.Contexts.Context
-import scala.collection.mutable
-import dotty.tools.dotc.core.Names.Name
-import NameOps._
import Types._
-import scala.collection.SortedSet
-import Decorators._
import StdNames._
-import dotty.tools.dotc.util.Positions.Position
-import dotty.tools.dotc.config.JavaPlatform
/**
* Replace Ident("_") in tree with default values of corresponding type:
@@ -29,21 +17,21 @@ import dotty.tools.dotc.config.JavaPlatform
* classes: `null`
*/
class ElimWildcardIdents extends MiniPhaseTransform {
- import tpd._
+ import ast.tpd._
def phaseName: String = "elimWildcardIdents"
-
- override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = {
- def stripBlocks(arg: Tree): Tree = arg match {
- case b: Block if b.stats.isEmpty => stripBlocks(b.expr)
- case _ => arg
- }
- val b = stripBlocks(tree.rhs)
- b match {
- case x: Ident if (x.name == nme.WILDCARD && x.symbol.isClass) =>
- tpd.DefDef(tree.symbol.asTerm, tpd.initValue(x.tpe))
+ def wildcardToDefaultValue(tree: Tree)(implicit ctx: Context) = {
+ def recur(x: Tree): Tree = x match {
+ case x: Ident if x.name == nme.WILDCARD && x.symbol.isClass => defaultValue(tree.tpe)
+ case Block(Nil, y) => recur(y)
case _ => tree
}
+ recur(tree)
}
+ override def transformValDef(tree: tpd.ValDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
+ cpy.ValDef(tree)(rhs = wildcardToDefaultValue(tree.rhs))
+
+ override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
+ cpy.DefDef(tree)(rhs = wildcardToDefaultValue(tree.rhs))
}
diff --git a/src/dotty/tools/dotc/transform/LazyVals.scala b/src/dotty/tools/dotc/transform/LazyVals.scala
index 925646ca5..5b146a785 100644
--- a/src/dotty/tools/dotc/transform/LazyVals.scala
+++ b/src/dotty/tools/dotc/transform/LazyVals.scala
@@ -177,7 +177,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
tpe, coord = x.symbol.coord
).entered
- val containerTree = ValDef(containerSymbol, initValue(tpe))
+ val containerTree = ValDef(containerSymbol, defaultValue(tpe))
if (x.tpe.isNotNull && tpe <:< defn.ObjectType) { // can use 'null' value instead of flag
val slowPath = DefDef(x.symbol.asTerm, mkDefNonThreadSafeNonNullable(containerSymbol, x.rhs))
Thicket(List(containerTree, slowPath))
@@ -234,7 +234,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
val thiz = This(claz)(ctx.fresh.setOwner(claz))
val resultSymbol = ctx.newSymbol(methodSymbol, lazyNme.result, containerFlags, tp)
- val resultDef = ValDef(resultSymbol, initValue(tp))
+ val resultDef = ValDef(resultSymbol, defaultValue(tp))
val retrySymbol = ctx.newSymbol(methodSymbol, lazyNme.retry, containerFlags, defn.BooleanType)
val retryDef = ValDef(retrySymbol, Literal(Constants.Constant(true)))
@@ -332,7 +332,7 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
val containerName = ctx.freshName(x.name ++ StdNames.nme.LAZY_LOCAL).toTermName
val containerSymbol = ctx.newSymbol(claz, containerName, (x.mods &~ containerFlagsMask | containerFlags).flags, tpe, coord = x.symbol.coord).entered
- val containerTree = ValDef(containerSymbol, initValue(tpe))
+ val containerTree = ValDef(containerSymbol, defaultValue(tpe))
val offset = ref(companion).ensureApplied.select(offsetSymbol)
val getFlag = Select(ref(helperModule), lazyNme.RLazyVals.get)
diff --git a/src/dotty/tools/dotc/transform/TraitConstructors.scala b/src/dotty/tools/dotc/transform/TraitConstructors.scala
index 99ae3e187..32c4b9da4 100644
--- a/src/dotty/tools/dotc/transform/TraitConstructors.scala
+++ b/src/dotty/tools/dotc/transform/TraitConstructors.scala
@@ -18,7 +18,6 @@ class TraitConstructors extends MiniPhaseTransform with SymTransformer {
import dotty.tools.dotc.ast.tpd._
def phaseName: String = "traitConstructors"
-
override def treeTransformPhase: Phase = this.phase
def transformSym(sym: SymDenotation)(implicit ctx: Context): SymDenotation = {