diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/wast/tests/comments.rs | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/wast/tests/comments.rs')
-rw-r--r-- | third_party/rust/wast/tests/comments.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/third_party/rust/wast/tests/comments.rs b/third_party/rust/wast/tests/comments.rs new file mode 100644 index 0000000000..53a57ced3a --- /dev/null +++ b/third_party/rust/wast/tests/comments.rs @@ -0,0 +1,76 @@ +use wast::parser::{self, Parse, ParseBuffer, Parser, Result}; + +pub struct Comments<'a> { + comments: Vec<&'a str>, +} + +impl<'a> Parse<'a> for Comments<'a> { + fn parse(parser: Parser<'a>) -> Result<Comments<'a>> { + let comments = parser.step(|mut cursor| { + let mut comments = Vec::new(); + loop { + let (comment, c) = match cursor.comment() { + Some(pair) => pair, + None => break, + }; + cursor = c; + comments.push(if comment.starts_with(";;") { + &comment[2..] + } else { + &comment[2..comment.len() - 2] + }); + } + Ok((comments, cursor)) + })?; + Ok(Comments { comments }) + } +} + +pub struct Documented<'a, T> { + comments: Comments<'a>, + item: T, +} + +impl<'a, T: Parse<'a>> Parse<'a> for Documented<'a, T> { + fn parse(parser: Parser<'a>) -> Result<Self> { + let comments = parser.parse()?; + let item = parser.parens(T::parse)?; + Ok(Documented { comments, item }) + } +} + +#[test] +fn parse_comments() -> anyhow::Result<()> { + let buf = ParseBuffer::new( + r#" +;; hello +(; again ;) +(module) + "#, + )?; + + let d: Documented<wast::Module> = parser::parse(&buf)?; + assert_eq!(d.comments.comments, vec![" hello", " again "]); + drop(d.item); + + let buf = ParseBuffer::new( + r#" +;; this +(; is +on +multiple;) + + +;; lines +(func) + "#, + )?; + + let d: Documented<wast::Func> = parser::parse(&buf)?; + assert_eq!( + d.comments.comments, + vec![" this", " is\non\nmultiple", " lines"] + ); + drop(d.item); + Ok(()) +} |