Thanks a lot for explanation! :-)

I have some more questions:

  1. How is the connection between source file name and symbols it defines established? In particular, what if we are trying to load symbol for `A` but there's no class file corresponding to it and `A` is defined in `B.scala`?
  2. What does it mean out-of-band process exactly? Does it mean that we parse the file, then we apply namer/typer to that file and all other subsequent phases? Do we really execute tree transformers from all previous phases until current one?
  3. I realize that this mechanism is used to implement `-sourcepath` and thus allows us to compile Scala library. However, I wonder if the logic for this mechanism should live in SymbolLoaders. Or if we could create a separate component solely responsible for this out-of-band process and its semantics. SymbolLoaders could depend on that component.

I would love to hear your feedback. I'd love to understand our process of loading symbols a little bit better.