Skip to content

Commit 4f573d0

Browse files
committed
wip
1 parent b2da316 commit 4f573d0

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

compiler/src/dotty/tools/dotc/transform/Constructors.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,16 @@ class Constructors extends MiniPhase with IdentityDenotTransformer { thisPhase =
205205
owner = constr.symbol).installAfter(thisPhase)
206206
constrStats += intoConstr(stat, sym)
207207
}
208+
case stat @ DefDef(name, _, _, tpt, _)
209+
if stat.symbol.isGetter && stat.symbol.owner.is(Trait) && !stat.symbol.is(Lazy) =>
210+
val sym = stat.symbol
211+
assert(isRetained(sym), sym)
212+
if (!stat.rhs.isEmpty && !isWildcardArg(stat.rhs))
213+
val setter =
214+
if (sym.setter.exists) sym.setter
215+
else sym.accessorNamed(Mixin.traitSetterName(sym.asTerm))
216+
constrStats += Apply(ref(setter), intoConstr(stat.rhs, sym).withSpan(stat.span) :: Nil)
217+
clsStats += cpy.DefDef(stat)(rhs = EmptyTree)
208218
case DefDef(nme.CONSTRUCTOR, _, ((outerParam @ ValDef(nme.OUTER, _, _)) :: _) :: Nil, _, _) =>
209219
clsStats += mapOuter(outerParam.symbol).transform(stat)
210220
case _: DefTree =>

compiler/src/dotty/tools/dotc/transform/Mixin.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@ import Types._
1212
import Decorators._
1313
import DenotTransformers._
1414
import StdNames._
15+
import Names._
1516
import NameKinds._
1617
import NameOps._
1718
import ast.Trees._
1819
import collection.mutable
1920

2021
object Mixin {
2122
val name: String = "mixin"
23+
24+
def traitSetterName(getter: TermSymbol)(implicit ctx: Context): TermName =
25+
getter.ensureNotPrivate.name
26+
.expandedName(getter.owner, TraitSetterName)
27+
.asTermName.setterName
2228
}
2329

2430
/** This phase performs the following transformations:
@@ -155,9 +161,7 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
155161

156162
private def traitSetter(getter: TermSymbol)(implicit ctx: Context): Symbol =
157163
getter.copy(
158-
name = getter.ensureNotPrivate.name
159-
.expandedName(getter.owner, TraitSetterName)
160-
.asTermName.setterName,
164+
name = Mixin.traitSetterName(getter),
161165
flags = Method | Accessor | Deferred,
162166
info = MethodType(getter.info.resultType :: Nil, defn.UnitType))
163167

0 commit comments

Comments
 (0)