-
Notifications
You must be signed in to change notification settings - Fork 1.1k
[wgsl-in,ir] Add support for parsing rust-style doc comments #6364
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This doesn't get the comments out of the front end, though, does it? It seems to me it could be fine to just add a field like: doc_comments: Option<Box<DocComments>>, to struct DocComments {
types: FastIndexMap<Handle<Type>, Vec<Span>>,
global_variables: FastIndexMap<Handle<GlobalVariable>, Vec<Span>>,
...
} I think it would make sense for Naga to adopt Rust's |
Correct, I'm looking into propagating them to the module now ; my first intuition was to add comments to Your idea of a "flat" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Some more comments here.
You'll also need to change compact::compact
to adjust the type handles, even though only named types can have comments and compaction never removes named types, because compaction may remove anonymous types, and that renumbers the handles.
naga/src/lib.rs
Outdated
@@ -2263,4 +2263,27 @@ pub struct Module { | |||
pub functions: Arena<Function>, | |||
/// Entry points. | |||
pub entry_points: Vec<EntryPoint>, | |||
/// Comments, usually serving as documentation | |||
pub comments: Comments, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should be an Option<Box<Comments>>
, so that users who aren't interested in collecting these comments don't need to spend memory on them.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did the change ; we could also add a feature for that ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe I didn't really say what I meant:
I think users should be able to choose to collect or ignore comments at run time. That is, naga::front::wgsl::FrontEnd::new
should take an Options
type, or FrontEnd
should have a new_with_comments
constructor - or whatever, something boring but tasteful - and then parsing should return a Module
whose comments
field is either populated or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks ! I addressed this in 57865be ; I'm open to suggestions about the implementation.
I updated a few tests to test both options.
It should be fine to work on |
@Vrixyz Since this isn't passing CI, to make it easier to track stuff I need to review, I'm going to convert this to a draft PR until those issues are sorted out. Feel free to flip it back into non-draft when you're ready. |
0025864
to
243445c
Compare
I rebased on trunk (github comment reviews are degraded, but I adressed those 🤞), tests are encouraging, there's a major bug I'm investigating still (validation_error_messages): I think spans are incorrect, which I hope to fix by working on Jim's feedback. ❓ I'm curious about "pushing rules": I imagine parsing should contain a rule for parsing comments ? so we push that rule when checking for comments. |
You mean The rule stack is currently being used as a rough approximation to WGSL's template list discovery, which you definitely do not want to get tangled up with, and which shouldn't affect your work at all. And it's used for some sanity checks. |
@Vrixyz In Rust, only comments starting with |
@jimblandy personally I'd advocate for mimicking Rust's syntax rules, and I'd be ok with implementing it 👍 (i.e ignore comments not starting by But I chose to parse every comment because wgsl spec doesn't acknowledge "comment docs", as all comments are considered documentation. That being said, I didn't quite follow my objective, because I didn't succeed in implementing module comments without adding a specific syntax: I made this decision because it made things simpler when working with |
@Vrixyz Let's go with the Rust syntax. Can we take care of it in this PR? |
Okay, this is fine. We can revisit this question in the future if necessary. |
386ed0d
to
9cb6d53
Compare
I did that in 9cb6d53 👍 |
The overall approach looks good, I mainly left some comments that I think would improve the impl and a one last question about usage. |
I squashed the commits (since there were too many commits to rebase individually), rebased the PR and made some more modifications. @Vrixyz let me know if the PR looks good, if so I think we can land it |
@@ -2750,6 +2771,8 @@ impl Parser { | |||
lexer: &mut Lexer<'a>, | |||
out: &mut ast::TranslationUnit<'a>, | |||
) -> Result<'a, ()> { | |||
let doc_comments = lexer.accumulate_doc_comments(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This approach is interesting, as we could use it to emit warning when doc comments are encountered when it shouldn't have been: check that doc_comments
is empty for items that don't support it (separator, word...).
I'd consider this for another PR though, as it will lead to questions about error reporting, etc...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, it would be nice to warn/error in these cases, through we need to make sure to only do so based on a setting or else this would make naga not spec compliant.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess we could just do it based on options.parse_doc_comments
.
Thanks @teoxoy for championing it! Looks great to me. |
Connections
None as far as I know.
Description
Generating automated documentation à la https://docs.rs is very useful, but currently difficult.
naga lacks information about comments to be too helpful, so this pull requests adds support to parsing those.
Testing
cargo xtask test
run doesn't yield more errors than trunk.Status
DocComment
DocCommentModule
///
comments/** */
comments//!
module comments/*! */
module commentsast::Struct
//!
.naga::Module
Checklist
cargo fmt
.cargo clippy
. If applicable, add:--target wasm32-unknown-unknown
--target wasm32-unknown-emscripten
cargo xtask test
to run tests.CHANGELOG.md
. See simple instructions inside file.