[wgsl-in] ability to take a pointer to something

This commit is contained in:
Dzmitry Malyshau
2021-03-30 00:40:38 -04:00
committed by Dzmitry Malyshau
parent baccfc68f5
commit c41f050312
2 changed files with 25 additions and 7 deletions

View File

@@ -1271,37 +1271,43 @@ impl Parser {
self.scopes.push(Scope::SingularExpr);
//TODO: refactor this to avoid backing up
let backup = lexer.clone();
let handle = match lexer.next().0 {
let (allow_deref, handle) = match lexer.next().0 {
Token::Operation('-') => {
let expr = crate::Expression::Unary {
op: crate::UnaryOperator::Negate,
expr: self.parse_singular_expression(lexer, ctx.reborrow())?,
};
ctx.expressions.append(expr)
(true, ctx.expressions.append(expr))
}
Token::Operation('!') => {
let expr = crate::Expression::Unary {
op: crate::UnaryOperator::Not,
expr: self.parse_singular_expression(lexer, ctx.reborrow())?,
};
ctx.expressions.append(expr)
(true, ctx.expressions.append(expr))
}
Token::Operation('&') => {
let handle = self.parse_primary_expression(lexer, ctx.reborrow())?;
(false, handle)
}
Token::Word(word) => {
match self.parse_function_call_inner(lexer, word, ctx.reborrow())? {
let handle = match self.parse_function_call_inner(lexer, word, ctx.reborrow())? {
Some(handle) => handle,
None => {
*lexer = backup;
self.parse_primary_expression(lexer, ctx.reborrow())?
}
}
};
(true, handle)
}
_ => {
*lexer = backup;
self.parse_primary_expression(lexer, ctx.reborrow())?
let handle = self.parse_primary_expression(lexer, ctx.reborrow())?;
(true, handle)
}
};
let post_handle = self.parse_postfix(lexer, ctx, handle, true)?;
let post_handle = self.parse_postfix(lexer, ctx, handle, allow_deref)?;
self.scopes.pop();
Ok(post_handle)
}

View File

@@ -274,3 +274,15 @@ fn parse_expressions() {
const z: bool = !(0.0 == 1.0);
}").unwrap();
}
#[test]
fn parse_pointers() {
parse_str(
"fn foo() {
var x: f32 = 1.0;
const px = &x;
const py = frexp(0.5, px);
}",
)
.unwrap();
}