-
Notifications
You must be signed in to change notification settings - Fork 349
Description
Parsing Rust code with syn
is useful for macro authors, but has its limitations for whole-crate tools such as cbindgen
, as is apparent in that it does not properly support namespacing since it has no access to type information and such (and the support for macro expansion is also a bit spotty).
In an ideal world, I think cbindgen
should be implemented using rustc_driver
, and distributed alongside the Rust compiler in rustup
(perhaps with a cargo cbindgen
subcommand included); this would give it all the power of rustc
, and allow it to do full semantic analysis of the code; weird quirks begone!
But I recognize that that's a huge ask from several teams, and that it may not be desired for the Rust project to take ownership over this project (which is effectively a blocker for using rustc_driver
, as doing that out-of-tree / without support from upstream is a huge hazzle).
Luckily, there exists something else we can use! Enter rustdoc
's JSON output (documentation for the format here, can be access conveniently via. the rustdoc-types
crate). This fully describes a crate's public API, which is more than enough for cbindgen
's needs (it only needs to know all pub extern "C" fn
, and their dependent types).
While the format itself is yet unstable, it is already depended on in the ecosystem, prominently cargo-semver-checks
, so I'd say there is a high likelihood that it will not outright go away without some sort of replacement1.
So: I propose that cbindgen
transitions to using this instead of syn
, which would solve all of the aforementioned problems with namespacing (and likely make the implementation of cbindgen
smaller, and capable of more advanced semantic type analysis in the future (example of something: knowledge of auto traits)).
What do you think?
1: If cbindgen
ends up going this route, we should of course state so on the tracking issue.