in rsc/src/main/scala/rsc/outline/Scheduler.scala [547:608]
private def sketch(env: Env, tree: Sketchy): Unit = {
def loop(tpt: Tpt): Unit = {
tpt match {
case TptApply(fun, targs) =>
loop(fun)
targs.foreach(loop)
case TptArray(tpt) =>
loop(tpt)
case TptAnnotate(tpt, mods) =>
loop(tpt)
case TptByName(tpt) =>
loop(tpt)
case existentialTpt @ TptExistential(tpt, stats) =>
loop(tpt)
if (!symtab.scopes.contains(existentialTpt)) {
val existentialScope = ExistentialScope()
symtab.scopes.put(existentialTpt, existentialScope)
val existentialEnv = existentialScope :: env
stats.foreach(apply(existentialEnv, _))
existentialScope.succeed()
}
case TptIntersect(tpts) =>
tpts.foreach(loop)
case tpt: TptLit =>
()
case tpt: TptPath =>
tpt match {
case TptProject(qual @ TptRefine(None, _), _) => loop(qual)
case _ => ()
}
case tpt: TptPrimitive =>
()
case refineTpt @ TptRefine(tpt, stats) =>
tpt.foreach(loop)
if (!symtab.scopes.contains(refineTpt)) {
val refineScope = RefineScope()
symtab.scopes.put(refineTpt, refineScope)
val refineEnv = refineScope :: env
stats.foreach(apply(refineEnv, _))
refineScope.succeed()
}
case TptRepeat(tpt) =>
loop(tpt)
case TptWildcard(ubound, lbound) =>
ubound.foreach(loop)
lbound.foreach(loop)
case TptWildcardExistential(_, tpt) =>
loop(tpt)
case TptWith(tpts) =>
tpts.foreach(loop)
}
}
if (!symtab.sketches.contains(tree)) {
val sketch = Sketch(tree)
symtab.sketches.put(tree, sketch)
todo.add(env, sketch)
tree match {
case tree: Tpt => loop(tree)
case tree: ModWithin => ()
}
}
}