1. A computer-implemented method comprising: compiling, in a first compiler pass, one or more source files; contributing, in the first compiler pass, one or more types to a package; compiling, in the first compiler pass, one or more processed source files that are produced from the compilation of the one or more source files; contributing, in the first compiler pass, one or more resulting types to the package; marking, in the first compiler pass, one or more source files having unresolved types or errors for second pass compilation; compiling, in a second compiler pass, one or more source files that use the source files compiled in the first compiler pass; compiling, in the second compiler pass, the marked one or more source files having unresolved types or errors; and partitioning the one or more source files into a plurality of groups by annotations, wherein source files of the one or more source files having similar dependencies are grouped together and processed by different threads and source files of the one or more source files that do not have any dependencies are grouped together.