File tree 5 files changed +82
-6
lines changed
src/dotty/tools/dotc/transform
test/dotty/tools/backend/jvm
5 files changed +82
-6
lines changed Original file line number Diff line number Diff line change @@ -24,12 +24,11 @@ class MoveStatics extends MiniPhase with SymTransformer {
24
24
override def phaseName : String = MoveStatics .name
25
25
26
26
def transformSym (sym : SymDenotation )(implicit ctx : Context ): SymDenotation = {
27
- if (sym.hasAnnotation(defn.ScalaStaticAnnot ) && sym.owner.is(Flags .Module ) &&
28
- sym.owner.companionClass.exists && ! sym.owner.companionClass.is(Flags .Trait )) {
27
+ if (sym.hasAnnotation(defn.ScalaStaticAnnot ) && sym.owner.is(Flags .Module ) && sym.owner.companionClass.exists &&
28
+ ( sym.is( Flags . Method ) || ! (sym.is( Flags . Mutable ) && sym.owner.companionClass.is(Flags .Trait )) )) {
29
29
sym.owner.asClass.delete(sym.symbol)
30
30
sym.owner.companionClass.asClass.enter(sym.symbol)
31
- val flags = if (sym.is(Flags .Method )) sym.flags else sym.flags | Flags .Mutable
32
- sym.copySymDenotation(owner = sym.owner.companionClass, initFlags = flags)
31
+ sym.copySymDenotation(owner = sym.owner.companionClass)
33
32
}
34
33
else sym
35
34
}
@@ -59,9 +58,8 @@ class MoveStatics extends MiniPhase with SymTransformer {
59
58
}
60
59
61
60
def move (module : TypeDef , companion : TypeDef ): List [Tree ] = {
62
- assert(companion ne module)
61
+ assert(companion != module)
63
62
if (! module.symbol.is(Flags .Module )) move(companion, module)
64
- else if (companion != null && companion.symbol.is(Flags .Trait )) List (module, companion)
65
63
else {
66
64
val allMembers =
67
65
(if (companion != null ) {companion.rhs.asInstanceOf [Template ].body} else Nil ) ++
Original file line number Diff line number Diff line change @@ -73,6 +73,10 @@ trait DottyBytecodeTest {
73
73
classNode.methods.asScala.find(_.name == name) getOrElse
74
74
sys.error(s " Didn't find method ' $name' in class ' ${classNode.name}' " )
75
75
76
+ protected def getField (classNode : ClassNode , name : String ): FieldNode =
77
+ classNode.fields.asScala.find(_.name == name) getOrElse
78
+ sys.error(s " Didn't find field ' $name' in class ' ${classNode.name}' " )
79
+
76
80
def diffInstructions (isa : List [Instruction ], isb : List [Instruction ]): String = {
77
81
val len = Math .max(isa.length, isb.length)
78
82
val sb = new StringBuilder
Original file line number Diff line number Diff line change @@ -695,4 +695,50 @@ class TestBCode extends DottyBytecodeTest {
695
695
" `test` was not properly generated\n " + diffInstructions(instructions, expected))
696
696
}
697
697
}
698
+
699
+ @ Test def i5924b = {
700
+ val source =
701
+ """ |import scala.annotation.static
702
+ |trait Base
703
+ |
704
+ |object Base {
705
+ | @static val x = 10
706
+ | @static final val y = 10
707
+ | @static def f: Int = 30
708
+ |}
709
+ """ .stripMargin
710
+
711
+ checkBCode(source) { dir =>
712
+ val clsIn = dir.lookupName(" Base.class" , directory = false ).input
713
+ val clsNode = loadClassNode(clsIn)
714
+ getMethod(clsNode, " f" )
715
+ getField(clsNode, " x" )
716
+ getField(clsNode, " y" )
717
+ }
718
+ }
719
+
720
+ @ Test def i5924c = {
721
+ val source =
722
+ """ |import scala.annotation.static
723
+ |class Base
724
+ |
725
+ |object Base {
726
+ | @static val x = 10
727
+ | @static final val y = 10
728
+ | @static var a = 10
729
+ | @static final var b = 10
730
+ | @static def f: Int = 30
731
+ |}
732
+ """ .stripMargin
733
+
734
+ checkBCode(source) { dir =>
735
+ val clsIn = dir.lookupName(" Base.class" , directory = false ).input
736
+ val clsNode = loadClassNode(clsIn)
737
+ getMethod(clsNode, " f" )
738
+ getField(clsNode, " x" )
739
+ getField(clsNode, " y" )
740
+ getField(clsNode, " a" )
741
+ getField(clsNode, " b" )
742
+ }
743
+ }
698
744
}
Original file line number Diff line number Diff line change
1
+ import scala .annotation .static
2
+
3
+ trait Base
4
+
5
+ object Base {
6
+ @ static val x = 10
7
+ @ static final val y = 10
8
+ @ static def f : Int = 30
9
+ }
10
+
11
+ object Test {
12
+ def main (args : Array [String ]): Unit = Base
13
+ }
Original file line number Diff line number Diff line change
1
+ import scala .annotation .static
2
+
3
+ class Base
4
+
5
+ object Base {
6
+ @ static val x = 10
7
+ @ static final val y = 10
8
+ @ static var a = 10
9
+ @ static final var b = 10
10
+ @ static def f : Int = 30
11
+ }
12
+
13
+ object Test {
14
+ def main (args : Array [String ]): Unit = Base
15
+ }
You can’t perform that action at this time.
0 commit comments