in rsc/src/main/scala/rsc/outline/Outliner.scala [139:196]
private def apply(env: Env, sketch: Sketch, tpt: Tpt): Unit = {
tpt match {
case TptApply(fun, targs) =>
apply(env, sketch, fun)
targs.foreach(apply(env, sketch, _))
case TptArray(tpt) =>
apply(env, sketch, tpt)
case TptAnnotate(tpt, mods) =>
apply(env, sketch, tpt)
mods.annots.foreach(annot => apply(env, sketch, annot.init.tpt))
case TptByName(tpt) =>
apply(env, sketch, tpt)
case existentialTpt @ TptExistential(tpt, stats) =>
val existentialScope = symtab.scopes(existentialTpt)
val existentialEnv = existentialScope :: env
apply(existentialEnv, sketch, tpt)
case TptIntersect(tpts) =>
tpts.foreach(apply(env, sketch, _))
case tpt: TptLit =>
()
case tpt: TptPath =>
val resolution = {
tpt match {
case TptProject(qual @ TptRefine(None, _), id) =>
apply(env, sketch, qual)
val env1 = Env(env.root, List(symtab.scopes(qual)))
resolveSym(env1, id)
case _ =>
resolveSym(env, tpt)
}
}
resolution match {
case BlockedResolution(dep) =>
if (sketch.status.isPending) sketch.block(dep)
else ()
case _: FailedResolution =>
if (sketch.status.isPending) sketch.fail()
else ()
case _: ResolvedSymbol =>
()
}
case tpt: TptPrimitive =>
()
case refineTpt @ TptRefine(tpt, stats) =>
val refineScope = symtab.scopes(refineTpt)
val refineEnv = refineScope :: env
tpt.foreach(apply(refineEnv, sketch, _))
case TptRepeat(tpt) =>
apply(env, sketch, tpt)
case TptWildcard(ubound, lbound) =>
ubound.foreach(apply(env, sketch, _))
lbound.foreach(apply(env, sketch, _))
case TptWildcardExistential(_, tpt) =>
apply(env, sketch, tpt)
case TptWith(tpts) =>
tpts.foreach(apply(env, sketch, _))
}
}