diff options
author | Martin Odersky <odersky@gmail.com> | 2015-05-29 17:21:58 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-05-29 17:21:58 +0200 |
commit | c65504d92444ffb63b385aaa0900f08912033f74 (patch) | |
tree | dd24d3ba49ff2571b6ed081794c96e168dd30852 /src | |
parent | 3350907bf1ec570a7a7f645c57f74a620cc49664 (diff) | |
download | dotty-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.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/ElimWildcardIdents.scala | 48 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/LazyVals.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/TraitConstructors.scala | 1 |
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 = { |