Here's why it's needed: Assume the type-checker needs the info of a symbol that's not been loaded yet. `info` will trigger its symbol loader, and this might be a `source file loader`, meaning that either there is no corresponding classfile for that symbol, or the source is newer.

The source file loader needs to parse and enter the new source, and that's done through `compileLate`. The difference between `compileSources` and `compileLate` is that the first one compiles all sources in lock step: parsing, naming, typing, etc. The `late` version is an out-of-band process to bring a source through all the previous phases until the current one.

This functionality is used when bootstrapping, or when compiling a subset of the project (I think the ant build *might* rely on it as well). But it's heavily used by the presentation compiler, when in many cases you open sources without first building the project (therefore no classfiles are available).