Skip to content

Commit 6cf3966

Browse files
committed
Add worklist and refactor definition for ThisRef
This makes it closer to the Scala Symposium 21 paper.
1 parent 893892f commit 6cf3966

File tree

2 files changed

+157
-104
lines changed

2 files changed

+157
-104
lines changed

compiler/src/dotty/tools/dotc/transform/init/Checker.scala

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,38 @@ class Checker extends Phase {
3333

3434
override def runOn(units: List[CompilationUnit])(using Context): List[CompilationUnit] =
3535
units.foreach { unit => traverser.traverse(unit.tpdTree) }
36+
semantic.check()
3637
super.runOn(units)
3738

39+
def run(using Context): Unit = {
40+
// ignore, we already called `semantic.check()` in `runOn`
41+
}
42+
3843
val traverser = new TreeTraverser {
3944
override def traverse(tree: Tree)(using Context): Unit =
4045
traverseChildren(tree)
4146
tree match {
42-
case tdef: MemberDef =>
47+
case mdef: MemberDef =>
4348
// self-type annotation ValDef has no symbol
44-
if tdef.name != nme.WILDCARD then
45-
tdef.symbol.defTree = tree
49+
if mdef.name != nme.WILDCARD then
50+
mdef.symbol.defTree = tree
51+
52+
mdef match
53+
case tdef: TypeDef if tdef.isClassDef =>
54+
import semantic._
55+
val cls = tdef.symbol.asClass
56+
val ctor = cls.primaryConstructor
57+
val args = ctor.defTree.asInstanceOf[DefDef].termParamss.flatten.map(_ => Hot)
58+
val outer = Hot
59+
val thisRef = ThisRef(cls, outer, ctor, args)
60+
if shouldCheckClass(cls) then semantic.addTask(thisRef)(using Trace.empty)
61+
case _ =>
62+
4663
case _ =>
4764
}
4865
}
4966

50-
override def run(using Context): Unit = {
51-
val unit = ctx.compilationUnit
52-
unit.tpdTree.foreachSubTree {
53-
case tdef: TypeDef if tdef.isClassDef =>
54-
transformTypeDef(tdef)
55-
56-
case _ =>
57-
}
58-
}
59-
60-
61-
private def transformTypeDef(tree: TypeDef)(using Context): tpd.Tree = {
62-
val cls = tree.symbol.asClass
67+
private def shouldCheckClass(cls: ClassSymbol)(using Context) = {
6368
val instantiable: Boolean =
6469
cls.is(Flags.Module) ||
6570
!cls.isOneOf(Flags.AbstractOrTrait) && {
@@ -71,21 +76,6 @@ class Checker extends Phase {
7176
}
7277

7378
// A concrete class may not be instantiated if the self type is not satisfied
74-
if (instantiable && cls.enclosingPackageClass != defn.StdLibPatchesPackage.moduleClass) {
75-
import semantic._
76-
val tpl = tree.rhs.asInstanceOf[Template]
77-
val thisRef = ThisRef(cls).ensureExists
78-
79-
val paramValues = tpl.constr.termParamss.flatten.map(param => param.symbol -> Hot).toMap
80-
81-
given Promoted = Promoted.empty
82-
given Trace = Trace.empty
83-
given Env = Env(paramValues)
84-
85-
val res = eval(tpl, thisRef, cls)
86-
res.errors.foreach(_.issue)
87-
}
88-
89-
tree
79+
instantiable && cls.enclosingPackageClass != defn.StdLibPatchesPackage.moduleClass
9080
}
9181
}

0 commit comments

Comments
 (0)