rustc_driver
and rustc_interface
The rustc_driver
is essentially rustc
's main
function.
It acts as the glue for running the various phases of the compiler in the correct order,
using the interface defined in the rustc_interface
crate.
Generally the rustc_interface
crate provides external users with an (unstable) API
for running code at particular times during the compilation process, allowing
third parties to effectively use rustc
's internals as a library for
analyzing a crate or for ad hoc emulating of the compiler (i.e. rustdoc
compiling code and serving output).
More specifically the rustc_interface::run_compiler
function is the
main entrypoint for using nightly-rustc
as a library.
Initially run_compiler
takes a configuration variable for the compiler
and a closure
taking a yet unresolved Compiler
.
Operationally run_compiler
creates a Compiler
from the configuration and passes
it to the closure
. Inside the closure
you can use the Compiler
to drive
queries to compile a crate and get the results.
Providing results about the internal state of the compiler what the rustc_driver
does too.
You can see a minimal example of how to use rustc_interface
here.
You can see what queries are currently available in the Compiler
rustdocs.
You can see an example of how to use the queries by looking at the rustc_driver
implementation,
specifically rustc_driver::run_compiler
(not to be confused with rustc_interface::run_compiler
).
Generally rustc_driver::run_compiler
takes a bunch of command-line args
and some other configurations and drives the compilation to completion.
Finally rustc_driver::run_compiler
also takes a Callbacks
,
which is a trait
that allows for custom compiler configuration,
as well as allowing custom code to run after different phases of the compilation.
Warning: By its very nature, the internal compiler APIs are always going to be unstable. That said, we do try not to break things unnecessarily.