File tree 6 files changed +70
-8
lines changed
6 files changed +70
-8
lines changed Original file line number Diff line number Diff line change @@ -164,7 +164,7 @@ object TypeErasure {
164
164
else if (sym.isConstructor) outer.addParam(sym.owner.asClass, erase(tp)(erasureCtx))
165
165
else erase.eraseInfo(tp, sym)(erasureCtx) match {
166
166
case einfo : MethodType if sym.isGetter && einfo.resultType.isRef(defn.UnitClass ) =>
167
- defn.BoxedUnitClass .typeRef
167
+ MethodType ( Nil , Nil , defn.BoxedUnitClass .typeRef)
168
168
case einfo =>
169
169
einfo
170
170
}
Original file line number Diff line number Diff line change @@ -50,15 +50,15 @@ import Decorators._
50
50
51
51
override def transformDefDef (tree : DefDef )(implicit ctx : Context , info : TransformerInfo ): Tree = {
52
52
val sym = tree.symbol
53
-
53
+
54
54
def newField = ctx.newSymbol(
55
55
owner = ctx.owner,
56
56
name = sym.name.asTermName.fieldName,
57
57
flags = Private | (if (sym is Stable ) EmptyFlags else Mutable ),
58
58
info = sym.info.resultType,
59
59
coord = tree.pos).enteredAfter(thisTransform)
60
-
61
- lazy val field = sym.field.orElse(newField).asTerm
60
+
61
+ lazy val field = sym.field.orElse(newField).asTerm
62
62
if (sym.is(Accessor , butNot = NoFieldNeeded ))
63
63
if (sym.isGetter) {
64
64
tree.rhs.changeOwnerAfter(sym, field, thisTransform)
Original file line number Diff line number Diff line change @@ -152,8 +152,14 @@ class Mixin extends MiniPhaseTransform with SymTransformer { thisTransform =>
152
152
def traitInits (mixin : ClassSymbol ): List [Tree ] =
153
153
for (getter <- mixin.info.decls.filter(getr => getr.isGetter && ! wasDeferred(getr)).toList)
154
154
yield {
155
- // transformFollowing call is needed to make memoize & lazy vals run
156
- transformFollowing(DefDef (implementation(getter.asTerm), superRef(initializer(getter)).appliedToNone))
155
+ // transformFollowing call is needed to make memoize & lazy vals run
156
+ val rhs = transformFollowing(superRef(initializer(getter)).appliedToNone)
157
+ // isCurrent: getter is a member of implementing class
158
+ val isCurrent = getter.is(ExpandedName ) || ctx.atPhase(thisTransform) { implicit ctx =>
159
+ cls.info.member(getter.name).suchThat(_.isGetter).symbol == getter
160
+ }
161
+ if (isCurrent) transformFollowing(DefDef (implementation(getter.asTerm), rhs))
162
+ else rhs
157
163
}
158
164
159
165
def setters (mixin : ClassSymbol ): List [Tree ] =
Original file line number Diff line number Diff line change @@ -83,7 +83,7 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th
83
83
def methodOverrides (mixin : ClassSymbol ): List [Tree ] = {
84
84
def isOverridden (meth : Symbol ) = meth.overridingSymbol(cls).is(Method , butNot = Deferred )
85
85
def needsDisambiguation (meth : Symbol ): Boolean =
86
- meth.is(Method , butNot = PrivateOrDeferred ) &&
86
+ meth.is(Method , butNot = PrivateOrAccessorOrDeferred ) &&
87
87
! isOverridden(meth) &&
88
88
! meth.allOverriddenSymbols.forall(_ is Deferred )
89
89
for (meth <- mixin.info.decls.toList if needsDisambiguation(meth))
@@ -107,5 +107,5 @@ class ResolveSuper extends MiniPhaseTransform with IdentityDenotTransformer { th
107
107
else ddef
108
108
}
109
109
110
- private val PrivateOrDeferred = Private | Deferred
110
+ private val PrivateOrAccessorOrDeferred = Private | Accessor | Deferred
111
111
}
Original file line number Diff line number Diff line change
1
+ trait A {
2
+ def foo = 1
3
+ }
4
+
5
+ trait B {
6
+ def foo = 2
7
+ }
8
+
9
+ class C extends A with B {
10
+ override def foo = super [A ].foo + super [B ].foo
11
+ }
12
+
13
+ object Test {
14
+ def main (args : Array [String ]) = assert(new C ().foo == 3 )
15
+ }
Original file line number Diff line number Diff line change
1
+ object store {
2
+ var str = " "
3
+ }
4
+
5
+ import store ._
6
+
7
+ trait A {
8
+ str += " a"
9
+ val i = 2
10
+ val s = str += 'A'
11
+ str += '1'
12
+ }
13
+
14
+ trait B extends A {
15
+ str += 'b'
16
+ override val i = 3
17
+ override val s = str += 'B'
18
+ str += '2'
19
+ }
20
+
21
+ class D (sup : Unit ) extends A {
22
+ str += 'd'
23
+ override val i = 4
24
+ override val s = str += 'D'
25
+ str += '3'
26
+ }
27
+
28
+ class E (sup : Unit ) extends A with B {
29
+ str += 'd'
30
+ override val i = 5
31
+ override val s = str += 'E'
32
+ str += '3'
33
+ }
34
+
35
+
36
+ object Test extends D ({str += " Z" }) with B {
37
+ // should only have 2 fields
38
+ str += 'E'
39
+ def main (args : Array [String ]) = assert(str == " ZaA1dD3bB2E4" , str)
40
+ str += '4'
41
+ }
You can’t perform that action at this time.
0 commit comments