mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Glsl new multi line comments (#103)
* Add multi line comment support to glsl-new * Fix glsl-new TokenMetadata for multi line comments
This commit is contained in:
@@ -181,13 +181,10 @@ pub fn consume_token(mut input: &str) -> (Option<Token>, &str) {
|
||||
meta.chars.end = start + 2;
|
||||
(Some(Token::MulAssign(meta)), chars.as_str())
|
||||
}
|
||||
//TODO: multi-line comments
|
||||
// Some('/') => (
|
||||
// Token::MultiLineCommentClose,
|
||||
// chars.as_str(),
|
||||
// start,
|
||||
// start + 2,
|
||||
// ),
|
||||
Some('/') => {
|
||||
meta.chars.end = start + 2;
|
||||
(Some(Token::CommentEnd((meta, ()))), chars.as_str())
|
||||
}
|
||||
_ => (Some(Token::MulAssign(meta)), input),
|
||||
}
|
||||
}
|
||||
@@ -199,13 +196,10 @@ pub fn consume_token(mut input: &str) -> (Option<Token>, &str) {
|
||||
(Some(Token::DivAssign(meta)), chars.as_str())
|
||||
}
|
||||
Some('/') => (None, ""),
|
||||
//TODO: multi-line comments
|
||||
// Some('*') => (
|
||||
// Token::MultiLineCommentOpen,
|
||||
// chars.as_str(),
|
||||
// start,
|
||||
// start + 2,
|
||||
// ),
|
||||
Some('*') => {
|
||||
meta.chars.end = start + 2;
|
||||
(Some(Token::CommentStart((meta, ()))), chars.as_str())
|
||||
}
|
||||
_ => (Some(Token::Slash(meta)), input),
|
||||
}
|
||||
}
|
||||
@@ -237,6 +231,7 @@ pub struct Lexer<'a> {
|
||||
input: String,
|
||||
line: usize,
|
||||
offset: usize,
|
||||
inside_comment: bool,
|
||||
}
|
||||
|
||||
impl<'a> Lexer<'a> {
|
||||
@@ -259,6 +254,7 @@ impl<'a> Lexer<'a> {
|
||||
input,
|
||||
line,
|
||||
offset: 0,
|
||||
inside_comment: false,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +270,20 @@ impl<'a> Lexer<'a> {
|
||||
meta.chars.start += self.offset;
|
||||
meta.chars.end += self.offset;
|
||||
self.offset += end;
|
||||
Some(token)
|
||||
if !self.inside_comment {
|
||||
match token {
|
||||
Token::CommentStart(_) => {
|
||||
self.inside_comment = true;
|
||||
self.next()
|
||||
}
|
||||
_ => Some(token),
|
||||
}
|
||||
} else {
|
||||
if let Token::CommentEnd(_) = token {
|
||||
self.inside_comment = false;
|
||||
}
|
||||
self.next()
|
||||
}
|
||||
} else {
|
||||
let (line, input) = self.lines.next()?;
|
||||
|
||||
|
||||
@@ -61,6 +61,32 @@ fn glsl_lex_line_comment() {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn glsl_lex_multi_line_comment() {
|
||||
let source = "void main /* comment [] {}\n/**\n{}*/{}";
|
||||
let lex = Lexer::new(source);
|
||||
let tokens: Vec<Token> = lex.collect();
|
||||
assert_eq!(tokens.len(), 4);
|
||||
|
||||
let mut iter = tokens.iter();
|
||||
assert_eq!(
|
||||
format!("{:?}", iter.next().unwrap()),
|
||||
"Void(TokenMetadata { line: 0, chars: 0..4 })"
|
||||
);
|
||||
assert_eq!(
|
||||
format!("{:?}", iter.next().unwrap()),
|
||||
"Identifier((TokenMetadata { line: 0, chars: 5..9 }, \"main\"))"
|
||||
);
|
||||
assert_eq!(
|
||||
format!("{:?}", iter.next().unwrap()),
|
||||
"LeftBrace(TokenMetadata { line: 2, chars: 4..5 })"
|
||||
);
|
||||
assert_eq!(
|
||||
format!("{:?}", iter.next().unwrap()),
|
||||
"RightBrace(TokenMetadata { line: 2, chars: 5..6 })"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn glsl_lex_identifier() {
|
||||
let source = "id123_OK 92No æNoø No¾ No好";
|
||||
|
||||
@@ -25,6 +25,9 @@ pomelo! {
|
||||
}
|
||||
|
||||
%type Unknown char;
|
||||
%type CommentStart ();
|
||||
%type CommentEnd ();
|
||||
|
||||
%type Identifier String;
|
||||
%type IntConstant i64;
|
||||
%type UintConstant u64;
|
||||
|
||||
Reference in New Issue
Block a user