@@ -4,45 +4,27 @@ package transform
44import TreeTransforms ._
55import core .DenotTransformers ._
66import core .Contexts ._
7- import ast .Trees ._
87import ast .tpd
9- import core .Constants .Constant
10- import core .StdNames ._
11- import core .Symbols ._
12-
138
9+ /** This phase transforms wildcards in valdefs with their default value.
10+ * In particular for every valdef that is declared:
11+ * `val x : T = _` to `val x : T = <zero of T>`
12+ *
13+ */
1414class TransformWildcards extends MiniPhaseTransform with IdentityDenotTransformer { thisTransform =>
1515 import tpd ._
1616
1717 override def phaseName = " transformWildcards"
1818
1919 override def checkPostCondition (tree : Tree )(implicit ctx : Context ): Unit = {
2020 tree match {
21- case ValDef (_, _, Ident (name)) => assert(name ne nme. WILDCARD )
21+ case vDef : ValDef => assert(! tpd.isWildcardArg(vDef.rhs) )
2222 case _ =>
2323 }
2424 }
2525
2626 override def transformValDef (tree : ValDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
27- tree.rhs match {
28- case Ident (nme.WILDCARD ) =>
29- val literal = defaultValueLiteral(tree)
30- cpy.ValDef (tree)(rhs = literal)
31- case _ => tree
32- }
33- }
34-
35- def defaultValueLiteral (tree : ValDef )(implicit ctx : Context ) = {
36- val t = tree.rhs.tpe.widenDealias.classSymbol
37-
38- if (t eq defn.DoubleClass ) Literal (Constant (0.0d ))
39- else if (t eq defn.IntClass ) Literal (Constant (0 ))
40- else if (t eq defn.CharClass ) Literal (Constant ('\u0000 ' ))
41- else if (t eq defn.ByteClass ) Literal (Constant (0 : Byte ))
42- else if (t eq defn.LongClass ) Literal (Constant (0L ))
43- else if (t eq defn.FloatClass ) Literal (Constant (0f ))
44- else if (t eq defn.UnitClass ) Literal (Constant (()))
45- else if (t eq defn.BooleanClass ) Literal (Constant (false ))
46- else Literal (Constant (null ))
27+ if (ctx.owner.isClass) tree
28+ else cpy.ValDef (tree)(rhs = tree.rhs.wildcardToDefault)
4729 }
48- }
30+ }
0 commit comments