From ab2cf8b84244470e31fcee76efaa04c16015e4b7 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Tue, 26 Jan 2021 23:29:40 -0500 Subject: [PATCH] [wgsl] support vector type casts --- src/front/wgsl/mod.rs | 35 ++++++++++++---------- src/front/wgsl/tests.rs | 9 ++++++ tests/snapshots/snapshots__skybox.msl.snap | 4 +-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index 6f647e6f76..bd2412bf42 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -62,6 +62,8 @@ pub enum Error<'a> { BadTexture(&'a str), #[error("bad texture coordinate")] BadCoordinate, + #[error("invalid type cast to `{0}`")] + BadTypeCast(&'a str), #[error(transparent)] InvalidResolve(ResolveError), #[error("unknown import: `{0}`")] @@ -435,15 +437,6 @@ impl Parser { let expr = self.parse_general_expression(lexer, ctx.reborrow())?; lexer.expect(Token::Paren(')'))?; Some(crate::Expression::Derivative { axis, expr }) - } else if let Some((kind, _width)) = conv::get_scalar_type(name) { - lexer.expect(Token::Paren('('))?; - let expr = self.parse_general_expression(lexer, ctx.reborrow())?; - lexer.expect(Token::Paren(')'))?; - Some(crate::Expression::As { - expr, - kind, - convert: true, - }) } else if let Some(fun) = conv::map_standard_fun(name) { lexer.expect(Token::Paren('('))?; let arg_count = fun.argument_count(); @@ -833,18 +826,28 @@ impl Parser { ctx.types, ctx.constants, )?; + let kind = inner.scalar_kind(); let ty = ctx.types.fetch_or_append(crate::Type { name: None, inner }); lexer.expect(Token::Paren('('))?; let mut components = Vec::new(); - while !lexer.skip(Token::Paren(')')) { - if !components.is_empty() { - lexer.expect(Token::Separator(','))?; - } - let sub_expr = self.parse_general_expression(lexer, ctx.reborrow())?; - components.push(sub_expr); + let mut last_component = + self.parse_general_expression(lexer, ctx.reborrow())?; + while lexer.skip(Token::Separator(',')) { + components.push(last_component); + last_component = self.parse_general_expression(lexer, ctx.reborrow())?; + } + lexer.expect(Token::Paren(')'))?; + if components.is_empty() { + crate::Expression::As { + expr: last_component, + kind: kind.ok_or(Error::BadTypeCast(word))?, + convert: true, + } + } else { + components.push(last_component); + crate::Expression::Compose { ty, components } } - crate::Expression::Compose { ty, components } } } other => return other.unexpected("primary expression"), diff --git a/src/front/wgsl/tests.rs b/src/front/wgsl/tests.rs index 6ef5e0460b..01dfc57c8c 100644 --- a/src/front/wgsl/tests.rs +++ b/src/front/wgsl/tests.rs @@ -37,6 +37,15 @@ fn parse_type_cast() { ", ) .unwrap(); + parse_str( + " + fn main() { + const x: vec2 = vec2(1.0, 2.0); + const y: vec2 = vec2(x); + } + ", + ) + .unwrap(); } #[test] diff --git a/tests/snapshots/snapshots__skybox.msl.snap b/tests/snapshots/snapshots__skybox.msl.snap index ce8662f0d5..ed0e4a72d8 100644 --- a/tests/snapshots/snapshots__skybox.msl.snap +++ b/tests/snapshots/snapshots__skybox.msl.snap @@ -20,9 +20,9 @@ struct Data { typedef int type4; -typedef metal::float3x3 type5; +typedef float type5; -typedef float type6; +typedef metal::float3x3 type6; typedef metal::texturecube type7;