Skip to content

Commit 4370981

Browse files
committed
Trying to move some of the work to the previous phase.
1 parent 1559c98 commit 4370981

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class Compiler {
100100
new ArrayApply, // Optimize `scala.Array.apply([....])` and `scala.Array.apply(..., [....])` into `[...]`
101101
new ElimPolyFunction, // Rewrite PolyFunction subclasses to FunctionN subclasses
102102
new TailRec, // Rewrite tail recursion to loops
103+
new PrepareMixin,
103104
new Mixin, // Expand trait fields and trait initializers
104105
new LazyVals, // Expand lazy vals
105106
new Memoize, // Add private fields to getters and setters

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

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ class Constructors extends MiniPhase with IdentityDenotTransformer { thisPhase =
213213
val setter =
214214
if (sym.setter.exists) sym.setter
215215
else sym.accessorNamed(Mixin.traitSetterName(sym.asTerm))
216+
assert(setter.exists, sym.fullName)
216217
constrStats += Apply(ref(setter), intoConstr(stat.rhs, sym).withSpan(stat.span) :: Nil)
217218
clsStats += cpy.DefDef(stat)(rhs = EmptyTree)
218219
case DefDef(nme.CONSTRUCTOR, _, ((outerParam @ ValDef(nme.OUTER, _, _)) :: _) :: Nil, _, _) =>

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

+11-4
Original file line numberDiff line numberDiff line change
@@ -119,18 +119,18 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
119119
override def relaxedTypingInGroup: Boolean = true
120120
// Because it changes number of parameters in trait initializers
121121

122-
override def runsAfter: Set[String] = Set(Erasure.name)
122+
override def runsAfter: Set[String] = Set(Erasure.name, PrepareMixin.name)
123123

124124
override def changesMembers: Boolean = true // the phase adds implementions of mixin accessors
125125

126126
override def transformSym(sym: SymDenotation)(implicit ctx: Context): SymDenotation =
127-
if (sym.is(Accessor, butNot = Deferred) && sym.owner.is(Trait)) {
127+
/*if (sym.is(Accessor, butNot = Deferred) && sym.owner.is(Trait)) {
128128
val sym1 =
129129
if (sym.is(Lazy)) sym
130130
else sym.copySymDenotation(initFlags = sym.flags &~ ParamAccessor | Deferred)
131131
sym1.ensureNotPrivate
132132
}
133-
else if (sym.isConstructor && sym.owner.is(Trait))
133+
else*/ if (sym.isConstructor && sym.owner.is(Trait))
134134
sym.copySymDenotation(
135135
name = nme.TRAIT_CONSTRUCTOR,
136136
info = MethodType(Nil, sym.info.resultType))
@@ -139,8 +139,10 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
139139
val decls1 = classInfo.decls.cloneScope
140140
var modified: Boolean = false
141141
for (getter <- classInfo.decls)
142+
//System.err.println(s"trait getter ${getter.fullName}")
142143
if needsTraitSetter(getter) then
143144
val setter = makeTraitSetter(getter.asTerm)
145+
//System.err.println(s"create trait setter ${setter.fullName}")
144146
decls1.enter(setter)
145147
modified = true
146148
if modified then
@@ -168,9 +170,14 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
168170
}.asTerm
169171

170172
private def wasOneOf(sym: Symbol, flags: FlagSet)(implicit ctx: Context): Boolean =
171-
ctx.atPhase(thisPhase) { sym.isOneOf(flags) }
173+
ctx.atPhase(thisPhase.prev) { sym.isOneOf(flags) }
172174

173175
private def needsTraitSetter(sym: Symbol)(implicit ctx: Context): Boolean =
176+
/*System.err.println(" " + sym.isGetter)
177+
if sym.isGetter then
178+
System.err.println(" " + !wasOneOf(sym, DeferredOrLazy | ParamAccessor))
179+
System.err.println(" " + !sym.setter.exists)
180+
System.err.println(" " + !sym.info.resultType.isInstanceOf[ConstantType])*/
174181
sym.isGetter && !wasOneOf(sym, DeferredOrLazy | ParamAccessor) && !sym.setter.exists
175182
&& !sym.info.resultType.isInstanceOf[ConstantType]
176183

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package dotty.tools.dotc
2+
package transform
3+
4+
import core._
5+
import MegaPhase._
6+
import Contexts.Context
7+
import Flags._
8+
import SymUtils._
9+
import Symbols._
10+
import SymDenotations._
11+
import Types._
12+
import Decorators._
13+
import DenotTransformers._
14+
import StdNames._
15+
import Names._
16+
import NameKinds._
17+
import NameOps._
18+
import ast.Trees._
19+
import collection.mutable
20+
21+
object PrepareMixin {
22+
val name: String = "prepMixin"
23+
}
24+
25+
class PrepareMixin extends MiniPhase with SymTransformer { thisPhase =>
26+
import ast.tpd._
27+
28+
override def phaseName: String = PrepareMixin.name
29+
30+
override def runsAfter: Set[String] = Set(Erasure.name)
31+
32+
override def changesMembers: Boolean = true // the phase adds implementions of mixin accessors
33+
34+
override def transformSym(sym: SymDenotation)(implicit ctx: Context): SymDenotation =
35+
if (sym.is(Accessor, butNot = Deferred) && sym.owner.is(Trait))
36+
val sym1 =
37+
if (sym.is(Lazy)) sym
38+
else sym.copySymDenotation(initFlags = sym.flags &~ ParamAccessor | Deferred)
39+
sym1.ensureNotPrivate
40+
else
41+
sym
42+
end transformSym
43+
}

0 commit comments

Comments
 (0)