Skip to content

Commit 41bcb6a

Browse files
committed
Refactor for code sharing
1 parent a6a3385 commit 41bcb6a

File tree

2 files changed

+27
-38
lines changed

2 files changed

+27
-38
lines changed

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import StdNames._
1515
import dotty.tools.dotc.transform._
1616
import Phases._
1717

18+
import scala.collection.mutable
1819

1920
import Semantic._
2021

@@ -31,17 +32,22 @@ class Checker extends Phase {
3132

3233
override def runOn(units: List[CompilationUnit])(using Context): List[CompilationUnit] =
3334
val checkCtx = ctx.fresh.setPhase(this.start)
34-
Semantic.checkTasks(using checkCtx) {
35-
val traverser = new InitTreeTraverser()
36-
units.foreach { unit => traverser.traverse(unit.tpdTree) }
37-
}
35+
val traverser = new InitTreeTraverser()
36+
units.foreach { unit => traverser.traverse(unit.tpdTree) }
37+
val classes = traverser.getConcreteClasses()
38+
39+
Semantic.checkClasses(classes)(using checkCtx)
3840
units
3941

40-
def run(using Context): Unit = {
42+
def run(using Context): Unit =
4143
// ignore, we already called `Semantic.check()` in `runOn`
42-
}
44+
()
45+
46+
class InitTreeTraverser extends TreeTraverser {
47+
private val concreteClasses: mutable.ArrayBuffer[ClassSymbol] = new mutable.ArrayBuffer
48+
49+
def getConcreteClasses(): List[ClassSymbol] = concreteClasses.toList
4350

44-
class InitTreeTraverser(using WorkList) extends TreeTraverser {
4551
override def traverse(tree: Tree)(using Context): Unit =
4652
traverseChildren(tree)
4753
tree match {
@@ -53,15 +59,14 @@ class Checker extends Phase {
5359
mdef match
5460
case tdef: TypeDef if tdef.isClassDef =>
5561
val cls = tdef.symbol.asClass
56-
val thisRef = ThisRef(cls)
57-
if shouldCheckClass(cls) then Semantic.addTask(thisRef)
62+
if isConcreteClass(cls) then concreteClasses.append(cls)
5863
case _ =>
5964

6065
case _ =>
6166
}
6267
}
6368

64-
private def shouldCheckClass(cls: ClassSymbol)(using Context) = {
69+
private def isConcreteClass(cls: ClassSymbol)(using Context) = {
6570
val instantiable: Boolean =
6671
cls.is(Flags.Module) ||
6772
!cls.isOneOf(Flags.AbstractOrTrait) && {

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

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,31 +1207,23 @@ object Semantic:
12071207
cls == defn.ObjectClass
12081208

12091209
// ----- Work list ---------------------------------------------------
1210-
case class Task(value: ThisRef)
1211-
1212-
class WorkList private[Semantic]():
1213-
private val pendingTasks: mutable.ArrayBuffer[Task] = new mutable.ArrayBuffer
1214-
1215-
def addTask(task: Task): Unit =
1216-
if !pendingTasks.contains(task) then pendingTasks.append(task)
1217-
1210+
class WorkList private[Semantic](tasks: List[ClassSymbol]):
12181211
/** Process the worklist until done */
12191212
final def work()(using Cache, Context): Unit =
1220-
for task <- pendingTasks
1221-
do doTask(task)
1213+
for task <- tasks do doTask(task)
12221214

12231215
/** Check an individual class
12241216
*
12251217
* This method should only be called from the work list scheduler.
12261218
*/
1227-
private def doTask(task: Task)(using Cache, Context): Unit =
1228-
val thisRef = task.value
1229-
val tpl = thisRef.klass.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template]
1219+
private def doTask(classSym: ClassSymbol)(using Cache, Context): Unit =
1220+
val thisRef = ThisRef(classSym)
1221+
val tpl = classSym.defTree.asInstanceOf[TypeDef].rhs.asInstanceOf[Template]
12301222

12311223
@tailrec
12321224
def iterate(): Unit = {
1233-
given Promoted = Promoted.empty(thisRef.klass)
1234-
given Trace = Trace.empty.add(thisRef.klass.defTree)
1225+
given Promoted = Promoted.empty(classSym)
1226+
given Trace = Trace.empty.add(classSym.defTree)
12351227
given reporter: Reporter.BufferedReporter = new Reporter.BufferedReporter
12361228

12371229
thisRef.ensureFresh()
@@ -1240,7 +1232,7 @@ object Semantic:
12401232
for param <- tpl.constr.termParamss.flatten do
12411233
thisRef.updateField(param.symbol, Hot)
12421234

1243-
log("checking " + task) { eval(tpl, thisRef, thisRef.klass) }
1235+
log("checking " + classSym) { eval(tpl, thisRef, classSym) }
12441236
reporter.errors.foreach(_.issue)
12451237

12461238
if cache.hasChanged && reporter.errors.isEmpty then
@@ -1254,23 +1246,15 @@ object Semantic:
12541246
iterate()
12551247
end doTask
12561248
end WorkList
1257-
inline def workList(using wl: WorkList): WorkList = wl
12581249

12591250
// ----- API --------------------------------
12601251

1261-
/** Add a checking task to the work list */
1262-
def addTask(thisRef: ThisRef)(using WorkList) = workList.addTask(Task(thisRef))
1263-
1264-
/** Check the specified tasks
1265-
*
1266-
* Semantic.checkTasks {
1267-
* Semantic.addTask(...)
1268-
* }
1252+
/**
1253+
* Check the specified concrete classes
12691254
*/
1270-
def checkTasks(using Context)(taskBuilder: WorkList ?=> Unit): Unit =
1271-
val workList = new WorkList
1255+
def checkClasses(concreteClasses: List[ClassSymbol])(using Context): Unit =
1256+
val workList = new WorkList(concreteClasses)
12721257
val cache = new Cache
1273-
taskBuilder(using workList)
12741258
workList.work()(using cache, ctx)
12751259

12761260
// ----- Semantic definition --------------------------------

0 commit comments

Comments
 (0)