File tree 3 files changed +77
-1
lines changed
compiler/src/dotty/tools/dotc
3 files changed +77
-1
lines changed Original file line number Diff line number Diff line change @@ -95,7 +95,8 @@ class Compiler {
95
95
// Note: in this mini-phase block scopes are incorrect. No phases that rely on scopes should be here
96
96
new ElimStaticThis , // Replace `this` references to static objects by global identifiers
97
97
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
98
+ new RestoreScopes , // Repair scopes rendered invalid by moving definitions in prior phases of the group
99
+ new TransformWildcards ), // Replace wildcards with default values
99
100
List (new MoveStatics , // Move static methods to companion classes
100
101
new ExpandPrivate , // Widen private definitions accessed from nested classes
101
102
new SelectStatic , // get rid of selects that would be compiled into GetStatic
Original file line number Diff line number Diff line change
1
+ package dotty .tools .dotc
2
+ package transform
3
+
4
+ import TreeTransforms ._
5
+ import core .DenotTransformers ._
6
+ import core .Contexts ._
7
+ import ast .Trees ._
8
+ import ast .tpd
9
+ import core .Constants .Constant
10
+ import core .StdNames ._
11
+ import core .Symbols ._
12
+
13
+
14
+ class TransformWildcards extends MiniPhaseTransform with IdentityDenotTransformer { thisTransform =>
15
+ import tpd ._
16
+
17
+ override def phaseName = " transformWildcards"
18
+
19
+ override def checkPostCondition (tree : Tree )(implicit ctx : Context ): Unit = {
20
+ tree match {
21
+ case ValDef (_, _, Ident (name)) => assert(name ne nme.WILDCARD )
22
+ case _ =>
23
+ }
24
+ }
25
+
26
+ 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 ))
47
+ }
48
+ }
Original file line number Diff line number Diff line change
1
+
2
+ object Test {
3
+
4
+ class A {
5
+ private [this ] var x : String = _
6
+ }
7
+
8
+ class B {
9
+ private [this ] var x : String = _
10
+ x = " foo"
11
+ }
12
+
13
+ class C {
14
+ private [this ] var x1 : Int = _
15
+ private [this ] var x2 : Unit = _
16
+ private [this ] var x3 : Char = _
17
+ private [this ] var x4 : Boolean = _
18
+ private [this ] var x5 : Float = _
19
+ private [this ] var x6 : Double = _
20
+ private [this ] var x7 : Char = _
21
+ private [this ] var x8 : Byte = _
22
+ private [this ] var x9 : AnyVal = _
23
+ private [this ] var x10 : D = _
24
+ }
25
+
26
+ class D (x : Int ) extends AnyVal
27
+ }
You can’t perform that action at this time.
0 commit comments