Macros in sbt: Problem Solved!

In the previous report, we described how incremental compilation was made more complicated when macro-enabled programs are involved, and we implemented the foundations of the support for metaprograms in sbt, a build tool and incremental compiler for Scala. Since then, we worked on improving the internal representation of dependency relationships between files in sbt, to make it easier to extend sbt and to define new relationships. This crucial development allowed us to fix all the remaining problems that sbt had with macros: how should we handle their transitive dependencies? How can we know what they inspect during their expansion? Are there other means by which macros could introduce dependencies? How should we use these informations? In this report, we will expose the new techniques that have been proposed and implemented to offer a complete support for metaprograms along with all their dependencies in sbt, and explain the most relevant parts of their implementation.