Skip to content

Commit 327fe31

Browse files
committed
Reuse wildcardToDefault
1 parent 61b2da0 commit 327fe31

File tree

3 files changed

+13
-31
lines changed

3 files changed

+13
-31
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ class Compiler {
9595
// Note: in this mini-phase block scopes are incorrect. No phases that rely on scopes should be here
9696
new ElimStaticThis, // Replace `this` references to static objects by global identifiers
9797
new Flatten, // Lift all inner classes to package scope
98-
new RestoreScopes, // Repair scopes rendered invalid by moving definitions in prior phases of the group
99-
new TransformWildcards), // Replace wildcards with default values
100-
List(new MoveStatics, // Move static methods to companion classes
98+
new RestoreScopes), // Repair scopes rendered invalid by moving definitions in prior phases of the group
99+
List(new TransformWildcards, // Replace wildcards with default values
100+
new MoveStatics, // Move static methods to companion classes
101101
new ExpandPrivate, // Widen private definitions accessed from nested classes
102102
new SelectStatic, // get rid of selects that would be compiled into GetStatic
103103
new CollectEntryPoints, // Find classes with main methods

compiler/src/dotty/tools/dotc/transform/TransformWildcards.scala

+9-27
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,27 @@ package transform
44
import TreeTransforms._
55
import core.DenotTransformers._
66
import core.Contexts._
7-
import ast.Trees._
87
import 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+
*/
1414
class 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+
}

tests/pos/i2468.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,4 @@ object Test {
2424
}
2525

2626
class D(x: Int) extends AnyVal
27-
}
27+
}

0 commit comments

Comments
 (0)