File tree Expand file tree Collapse file tree 2 files changed +60
-0
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 2 files changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -94,6 +94,7 @@ class Compiler {
94
94
List (new LambdaLift , // Lifts out nested functions to class scope, storing free variables in environments
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
+ new PhantomVals , // Remove ValDefs of phantom type
97
98
new Flatten , // Lift all inner classes to package scope
98
99
new RestoreScopes ), // Repair scopes rendered invalid by moving definitions in prior phases of the group
99
100
List (new MoveStatics , // Move static methods to companion classes
Original file line number Diff line number Diff line change
1
+ package dotty .tools .dotc
2
+ package transform
3
+
4
+ import core ._
5
+ import DenotTransformers ._
6
+ import Phases .Phase
7
+ import Contexts .Context
8
+ import Symbols ._
9
+ import Constants ._
10
+ import TreeTransforms ._
11
+ import Flags ._
12
+
13
+ /** Erases all ValDefs of phantom type,
14
+ * except for `lazy val` as the field are not yet generated.
15
+ *
16
+ * <accessor> <mods> def x(): ErasedPhantom = e
17
+ * --> <accessor> <mods> def x(): ErasedPhantom = null
18
+ *
19
+ *
20
+ * x = e --> e where type of x is ErasedPhantom
21
+ *
22
+ * Filed in class
23
+ * <private> <mods> val x: ErasedPhantom --> EmptyTree
24
+ *
25
+ * Field in method
26
+ * <mods> val x: ErasedPhantom = e --> e
27
+ */
28
+ class PhantomVals extends MiniPhaseTransform with IdentityDenotTransformer { thisTransform =>
29
+ import ast .tpd ._
30
+
31
+ override def phaseName = " phantomVals"
32
+
33
+ override def checkPostCondition (tree : Tree )(implicit ctx : Context ): Unit = {
34
+ // TODO
35
+ }
36
+
37
+ override def runsAfterGroupsOf : Set [Class [_ <: Phase ]] = Set (classOf [Constructors ])
38
+
39
+ override def transformValDef (tree : ValDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
40
+ val sym = tree.symbol
41
+ if (sym.is(Lazy ) || ! (tree.tpt.tpe =:= defn.ErasedPhantomType )) tree
42
+ else if (sym.is(Private )) EmptyTree
43
+ else tree.rhs
44
+ }
45
+
46
+ override def transformDefDef (tree : DefDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
47
+ val sym = tree.symbol
48
+ if (sym.isGetter && ! sym.is(Lazy ) && (tree.tpt.tpe =:= defn.ErasedPhantomType )) {
49
+ cpy.DefDef (tree)(rhs = Literal (Constant (null )).withType(defn.ErasedPhantomType ))
50
+ } else tree
51
+ }
52
+
53
+ override def transformAssign (tree : Assign )(implicit ctx : Context , info : TransformerInfo ): Tree = {
54
+ val lhsSym = tree.lhs.symbol
55
+ if (! lhsSym.is(Lazy ) && tree.rhs.tpe =:= defn.ErasedPhantomType ) tree.rhs
56
+ else tree
57
+ }
58
+
59
+ }
You can’t perform that action at this time.
0 commit comments