1
- package dotty .tools .dotc .transform
1
+ package dotty .tools .dotc
2
+ package transform
2
3
3
- import dotty . tools . dotc . ast .{ Trees , tpd }
4
- import dotty . tools . dotc . core . Annotations . Annotation
5
- import dotty . tools . dotc . core . Contexts ._
6
- import dotty . tools . dotc . core . DenotTransformers . SymTransformer
7
- import dotty . tools . dotc . core . SymDenotations . SymDenotation
8
- import dotty . tools . dotc . core . NameOps . _
9
- import dotty . tools . dotc . core . Flags
10
- import dotty . tools . dotc . core . Names . Name
11
- import dotty . tools . dotc . core . StdNames . nme
12
- import dotty . tools . dotc . core . Symbols . _
13
- import dotty . tools . dotc . core . Types . MethodType
14
- import dotty . tools . dotc . transform . MegaPhase . MiniPhase
4
+ import core . _
5
+ import Flags . _
6
+ import Contexts ._
7
+ import Symbols . _
8
+ import Decorators . _
9
+ import DenotTransformers . SymTransformer
10
+ import Types . MethodType
11
+ import Annotations . Annotation
12
+ import SymDenotations . SymDenotation
13
+ import Names . Name
14
+ import StdNames . nme
15
+ import NameOps . _
15
16
16
- object MoveStatics {
17
- val name : String = " moveStatic"
18
- }
17
+ import reporting ._
18
+ import ast ._
19
+
20
+ import SymUtils ._
21
+ import MegaPhase ._
19
22
20
23
/** Move static methods from companion to the class itself */
21
24
class MoveStatics extends MiniPhase with SymTransformer {
25
+ import ast .tpd ._
22
26
23
- import tpd ._
24
27
override def phaseName : String = MoveStatics .name
25
28
26
29
def transformSym (sym : SymDenotation )(using Context ): SymDenotation =
@@ -38,8 +41,6 @@ class MoveStatics extends MiniPhase with SymTransformer {
38
41
val pairs = classes.groupBy(_.symbol.name.stripModuleClassSuffix).asInstanceOf [Map [Name , List [TypeDef ]]]
39
42
40
43
def rebuild (orig : TypeDef , newBody : List [Tree ]): Tree = {
41
- if (orig eq null ) return EmptyTree
42
-
43
44
val staticFields = newBody.filter(x => x.isInstanceOf [ValDef ] && x.symbol.hasAnnotation(defn.ScalaStaticAnnot )).asInstanceOf [List [ValDef ]]
44
45
val newBodyWithStaticConstr =
45
46
if (staticFields.nonEmpty) {
@@ -61,21 +62,30 @@ class MoveStatics extends MiniPhase with SymTransformer {
61
62
assert(companion != module)
62
63
if (! module.symbol.is(Flags .Module )) move(companion, module)
63
64
else {
64
- val allMembers =
65
- (if (companion != null ) {companion.rhs.asInstanceOf [Template ].body} else Nil ) ++
66
- module.rhs.asInstanceOf [Template ].body
67
- val (newModuleBody, newCompanionBody) = allMembers.partition(x => {assert(x.symbol.exists); x.symbol.owner == module.symbol})
68
- Trees .flatten(rebuild(companion, newCompanionBody) :: rebuild(module, newModuleBody) :: Nil )
65
+ val moduleTmpl = module.rhs.asInstanceOf [Template ]
66
+ val companionTmpl = companion.rhs.asInstanceOf [Template ]
67
+ val (staticDefs, remainingDefs) = moduleTmpl.body.partition {
68
+ case memberDef : MemberDef => memberDef.symbol.isScalaStatic
69
+ case _ => false
70
+ }
71
+
72
+ rebuild(companion, companionTmpl.body ++ staticDefs) :: rebuild(module, remainingDefs) :: Nil
69
73
}
70
74
}
71
75
val newPairs =
72
76
for ((name, classes) <- pairs)
73
77
yield
74
- if (classes.tail.isEmpty)
75
- if (classes.head.symbol.is(Flags .Module )) move(classes.head, null )
76
- else List (rebuild(classes.head, classes.head.rhs.asInstanceOf [Template ].body))
78
+ if (classes.tail.isEmpty) {
79
+ val classDef = classes.head
80
+ val tmpl = classDef.rhs.asInstanceOf [Template ]
81
+ rebuild(classDef, tmpl.body) :: Nil
82
+ }
77
83
else move(classes.head, classes.tail.head)
78
84
Trees .flatten(newPairs.toList.flatten ++ others)
79
85
}
80
86
else trees
81
87
}
88
+
89
+ object MoveStatics {
90
+ val name : String = " moveStatic"
91
+ }
0 commit comments