1- package dotty .tools .dotc .transform
1+ package dotty .tools .dotc
2+ package transform
23
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 . _
1516
16- object MoveStatics {
17- val name : String = " moveStatic"
18- }
17+ import reporting ._
18+ import ast ._
19+
20+ import SymUtils ._
21+ import MegaPhase ._
1922
2023/** Move static methods from companion to the class itself */
2124class MoveStatics extends MiniPhase with SymTransformer {
25+ import ast .tpd ._
2226
23- import tpd ._
2427 override def phaseName : String = MoveStatics .name
2528
2629 def transformSym (sym : SymDenotation )(using Context ): SymDenotation =
@@ -38,8 +41,6 @@ class MoveStatics extends MiniPhase with SymTransformer {
3841 val pairs = classes.groupBy(_.symbol.name.stripModuleClassSuffix).asInstanceOf [Map [Name , List [TypeDef ]]]
3942
4043 def rebuild (orig : TypeDef , newBody : List [Tree ]): Tree = {
41- if (orig eq null ) return EmptyTree
42-
4344 val staticFields = newBody.filter(x => x.isInstanceOf [ValDef ] && x.symbol.hasAnnotation(defn.ScalaStaticAnnot )).asInstanceOf [List [ValDef ]]
4445 val newBodyWithStaticConstr =
4546 if (staticFields.nonEmpty) {
@@ -61,21 +62,30 @@ class MoveStatics extends MiniPhase with SymTransformer {
6162 assert(companion != module)
6263 if (! module.symbol.is(Flags .Module )) move(companion, module)
6364 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
6973 }
7074 }
7175 val newPairs =
7276 for ((name, classes) <- pairs)
7377 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+ }
7783 else move(classes.head, classes.tail.head)
7884 Trees .flatten(newPairs.toList.flatten ++ others)
7985 }
8086 else trees
8187}
88+
89+ object MoveStatics {
90+ val name : String = " moveStatic"
91+ }
0 commit comments