From d310cff591e39a209a7ccefa57c0dfbb9c19446d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Fri, 14 May 2021 22:19:56 +0100 Subject: [PATCH] [glsl-in] Fix parsing of function calls --- src/front/glsl/parser.rs | 52 +++++++++++++++++++--------------- src/front/glsl/parser_tests.rs | 26 +++++++++++++++++ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index 22275873dc..fdebe6e248 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -828,23 +828,40 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { }) } + fn parse_function_call_args( + &mut self, + ctx: &mut Context, + meta: &mut TokenMetadata, + ) -> Result> { + let mut args = Vec::new(); + if let Some(token) = self.bump_if(TokenValue::RightParen) { + *meta = meta.union(&token.meta); + } else { + loop { + args.push(self.parse_assignment(ctx)?); + + let token = self.bump()?; + match token.value { + TokenValue::Comma => {} + TokenValue::RightParen => { + *meta = meta.union(&token.meta); + break; + } + _ => return Err(ErrorKind::InvalidToken(token)), + } + } + } + + Ok(args) + } + fn parse_postfix(&mut self, ctx: &mut Context) -> Result { let mut expr = match self.expect_peek()?.value { TokenValue::Identifier(_) => { let (name, mut meta) = self.expect_ident()?; if self.bump_if(TokenValue::LeftParen).is_some() { - let mut args = Vec::new(); - loop { - let token = self.bump()?; - - if let TokenValue::RightParen = token.value { - meta = meta.union(&token.meta); - break; - } - - args.push(self.parse_expression(ctx)?) - } + let args = self.parse_function_call_args(ctx, &mut meta)?; Expr { kind: ExprKind::Call(FunctionCall { @@ -875,18 +892,7 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> { }; self.expect(TokenValue::LeftParen)?; - - let mut args = Vec::new(); - loop { - let token = self.bump()?; - - if let TokenValue::RightParen = token.value { - meta = meta.union(&token.meta); - break; - } - - args.push(self.parse_expression(ctx)?) - } + let args = self.parse_function_call_args(ctx, &mut meta)?; Expr { kind: ExprKind::Call(FunctionCall { diff --git a/src/front/glsl/parser_tests.rs b/src/front/glsl/parser_tests.rs index a9e22fa7c8..6166c1c9c7 100644 --- a/src/front/glsl/parser_tests.rs +++ b/src/front/glsl/parser_tests.rs @@ -218,6 +218,15 @@ fn declarations() { &entry_points, ) .unwrap(); + + let _program = parse_program( + r#" + #version 450 + float vector = vec4(1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0); + "#, + &entry_points, + ) + .unwrap(); } #[test] @@ -338,6 +347,23 @@ fn functions() { ), "SemanticError(\"Function already defined\")" ); + + println!(); + + // Nested function call + let _program = parse_program( + r#" + # version 450 + layout(set = 0, binding = 1) uniform texture2D t_noise; + layout(set = 0, binding = 2) uniform sampler s_noise; + + void main() { + textureLod(sampler2D(t_noise, s_noise), vec2(1.0), 0); + } + "#, + &entry_points, + ) + .unwrap(); } #[test]