From 86ce33808fd0e93f0d89f7849bdb046b9002a2ff Mon Sep 17 00:00:00 2001 From: Igor Shaposhnik Date: Tue, 15 Feb 2022 13:05:21 +0300 Subject: [PATCH 1/2] [wgsl-in] Optional parentheses for if and switch --- src/front/wgsl/mod.rs | 6 ------ src/front/wgsl/tests.rs | 39 ++++++++++++++++++++++++++++++++++++-- tests/in/boids.wgsl | 24 +++++++++++------------ tests/in/collatz.wgsl | 4 ++-- tests/in/control-flow.wgsl | 10 +++++----- tests/in/extra.wgsl | 2 +- tests/in/operators.wgsl | 2 +- tests/in/quad.wgsl | 2 +- tests/in/shadow.wgsl | 4 ++-- 9 files changed, 61 insertions(+), 32 deletions(-) diff --git a/src/front/wgsl/mod.rs b/src/front/wgsl/mod.rs index 1b1cbacb01..8b2172c88b 100644 --- a/src/front/wgsl/mod.rs +++ b/src/front/wgsl/mod.rs @@ -3602,14 +3602,12 @@ impl Parser { } "if" => { let _ = lexer.next(); - lexer.expect(Token::Paren('('))?; emitter.start(context.expressions); let condition = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), )?; block.extend(emitter.finish(context.expressions)); - lexer.expect(Token::Paren(')'))?; let accept = self.parse_block(lexer, context.reborrow(), false)?; @@ -3628,14 +3626,12 @@ impl Parser { // ... else if (...) { ... } let mut sub_emitter = super::Emitter::default(); - lexer.expect(Token::Paren('('))?; sub_emitter.start(context.expressions); let other_condition = self.parse_general_expression( lexer, context.as_expression(block, &mut sub_emitter), )?; let other_emit = sub_emitter.finish(context.expressions); - lexer.expect(Token::Paren(')'))?; let other_block = self.parse_block(lexer, context.reborrow(), false)?; elsif_stack.push(( elseif_span_start, @@ -3671,7 +3667,6 @@ impl Parser { "switch" => { let _ = lexer.next(); emitter.start(context.expressions); - lexer.expect(Token::Paren('('))?; let selector = self.parse_general_expression( lexer, context.as_expression(block, &mut emitter), @@ -3681,7 +3676,6 @@ impl Parser { .as_expression(block, &mut emitter) .resolve_type(selector)? .scalar_kind(); - lexer.expect(Token::Paren(')'))?; block.extend(emitter.finish(context.expressions)); lexer.expect(Token::Paren('{'))?; let mut cases = Vec::new(); diff --git a/src/front/wgsl/tests.rs b/src/front/wgsl/tests.rs index 4d5e047a6a..a439eff4b9 100644 --- a/src/front/wgsl/tests.rs +++ b/src/front/wgsl/tests.rs @@ -206,6 +206,26 @@ fn parse_statement() { #[test] fn parse_if() { + parse_str( + " + fn main() { + if true { + discard; + } else {} + if 0 != 1 {} + if false { + return; + } else if true { + return; + } else {} + } + ", + ) + .unwrap(); +} + +#[test] +fn parse_parentheses_if() { parse_str( " fn main() { @@ -231,11 +251,11 @@ fn parse_loop() { fn main() { var i: i32 = 0; loop { - if (i == 1) { break; } + if i == 1 { break; } continuing { i = 1; } } loop { - if (i == 0) { continue; } + if i == 0 { continue; } break; } } @@ -283,6 +303,21 @@ fn parse_switch() { .unwrap(); } +#[test] +fn parse_parentheses_switch() { + parse_str( + " + fn main() { + var pos: f32; + switch pos > 1.0 { + default: { pos = 3.0; } + } + } + ", + ) + .unwrap(); +} + #[test] fn parse_texture_load() { parse_str( diff --git a/tests/in/boids.wgsl b/tests/in/boids.wgsl index 6f44752c64..c3106f1c64 100644 --- a/tests/in/boids.wgsl +++ b/tests/in/boids.wgsl @@ -27,7 +27,7 @@ struct Particles { @stage(compute) @workgroup_size(64) fn main(@builtin(global_invocation_id) global_invocation_id : vec3) { let index : u32 = global_invocation_id.x; - if (index >= NUM_PARTICLES) { + if index >= NUM_PARTICLES { return; } @@ -44,24 +44,24 @@ fn main(@builtin(global_invocation_id) global_invocation_id : vec3) { var vel : vec2; var i : u32 = 0u; loop { - if (i >= NUM_PARTICLES) { + if i >= NUM_PARTICLES { break; } - if (i == index) { + if i == index { continue; } pos = particlesSrc.particles[i].pos; vel = particlesSrc.particles[i].vel; - if (distance(pos, vPos) < params.rule1Distance) { + if distance(pos, vPos) < params.rule1Distance { cMass = cMass + pos; cMassCount = cMassCount + 1; } - if (distance(pos, vPos) < params.rule2Distance) { + if distance(pos, vPos) < params.rule2Distance { colVel = colVel - (pos - vPos); } - if (distance(pos, vPos) < params.rule3Distance) { + if distance(pos, vPos) < params.rule3Distance { cVel = cVel + vel; cVelCount = cVelCount + 1; } @@ -70,10 +70,10 @@ fn main(@builtin(global_invocation_id) global_invocation_id : vec3) { i = i + 1u; } } - if (cMassCount > 0) { + if cMassCount > 0 { cMass = cMass / f32(cMassCount) - vPos; } - if (cVelCount > 0) { + if cVelCount > 0 { cVel = cVel / f32(cVelCount); } @@ -88,16 +88,16 @@ fn main(@builtin(global_invocation_id) global_invocation_id : vec3) { vPos = vPos + (vVel * params.deltaT); // Wrap around boundary - if (vPos.x < -1.0) { + if vPos.x < -1.0 { vPos.x = 1.0; } - if (vPos.x > 1.0) { + if vPos.x > 1.0 { vPos.x = -1.0; } - if (vPos.y < -1.0) { + if vPos.y < -1.0 { vPos.y = 1.0; } - if (vPos.y > 1.0) { + if vPos.y > 1.0 { vPos.y = -1.0; } diff --git a/tests/in/collatz.wgsl b/tests/in/collatz.wgsl index cf972a8ffd..7e2b135434 100644 --- a/tests/in/collatz.wgsl +++ b/tests/in/collatz.wgsl @@ -15,10 +15,10 @@ fn collatz_iterations(n_base: u32) -> u32 { var n = n_base; var i: u32 = 0u; loop { - if (n <= 1u) { + if n <= 1u { break; } - if (n % 2u == 0u) { + if n % 2u == 0u { n = n / 2u; } else { diff --git a/tests/in/control-flow.wgsl b/tests/in/control-flow.wgsl index 9ce08fff73..db87b320f2 100644 --- a/tests/in/control-flow.wgsl +++ b/tests/in/control-flow.wgsl @@ -6,7 +6,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { var pos: i32; // switch without cases - switch (1) { + switch 1 { default: { pos = 1; } @@ -14,7 +14,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { // non-empty switch *not* in last-statement-in-function position // (return statements might be inserted into the switch cases otherwise) - switch (pos) { + switch pos { case 1: { pos = 0; break; @@ -41,7 +41,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { } // non-empty switch in last-statement-in-function position - switch (pos) { + switch pos { case 1: { pos = 0; break; @@ -61,7 +61,7 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { } fn switch_default_break(i: i32) { - switch (i) { + switch i { default: { break; } @@ -80,7 +80,7 @@ fn switch_case_break() { fn loop_switch_continue(x: i32) { loop { - switch (x) { + switch x { case 1: { continue; } diff --git a/tests/in/extra.wgsl b/tests/in/extra.wgsl index d728c56be5..c963078067 100644 --- a/tests/in/extra.wgsl +++ b/tests/in/extra.wgsl @@ -11,7 +11,7 @@ struct FragmentIn { @stage(fragment) fn main(in: FragmentIn) -> @location(0) vec4 { - if (in.primitive_index % 2u == 0u) { + if in.primitive_index % 2u == 0u { return in.color; } else { return vec4(vec3(1.0) - in.color.rgb, in.color.a); diff --git a/tests/in/operators.wgsl b/tests/in/operators.wgsl index 5252d4031f..9d472294f1 100644 --- a/tests/in/operators.wgsl +++ b/tests/in/operators.wgsl @@ -30,7 +30,7 @@ fn splat() -> vec4 { fn unary() -> i32 { let a = 1; - if (!true) { return a; } else { return ~a; }; + if !true { return a; } else { return ~a; }; } fn bool_cast(x: vec3) -> vec3 { diff --git a/tests/in/quad.wgsl b/tests/in/quad.wgsl index 48334cac13..847de8630f 100644 --- a/tests/in/quad.wgsl +++ b/tests/in/quad.wgsl @@ -21,7 +21,7 @@ fn vert_main( @stage(fragment) fn frag_main(@location(0) uv : vec2) -> @location(0) vec4 { let color = textureSample(u_texture, u_sampler, uv); - if (color.a == 0.0) { + if color.a == 0.0 { discard; } // forcing the expression here to be emitted in order to check the diff --git a/tests/in/shadow.wgsl b/tests/in/shadow.wgsl index bbd0a3f687..c50769d112 100644 --- a/tests/in/shadow.wgsl +++ b/tests/in/shadow.wgsl @@ -23,7 +23,7 @@ var t_shadow: texture_depth_2d_array; var sampler_shadow: sampler_comparison; fn fetch_shadow(light_id: u32, homogeneous_coords: vec4) -> f32 { - if (homogeneous_coords.w <= 0.0) { + if homogeneous_coords.w <= 0.0 { return 1.0; } let flip_correction = vec2(0.5, -0.5); @@ -44,7 +44,7 @@ fn fs_main( var color = c_ambient; var i: u32 = 0u; loop { - if (i >= min(u_globals.num_lights.x, c_max_lights)) { + if i >= min(u_globals.num_lights.x, c_max_lights) { break; } let light = s_lights.data[i]; From bd2c7801ca1cec7b69134cf56eb4f16a52479629 Mon Sep 17 00:00:00 2001 From: Igor Shaposhnik Date: Tue, 15 Feb 2022 13:06:55 +0300 Subject: [PATCH 2/2] [wgsl-out] Optional parentheses for if and switch --- src/back/wgsl/writer.rs | 8 +++---- tests/out/wgsl/246-collatz-comp.wgsl | 4 ++-- tests/out/wgsl/932-for-loop-if-vert.wgsl | 2 +- tests/out/wgsl/bevy-pbr-frag.wgsl | 4 ++-- tests/out/wgsl/boids.wgsl | 24 ++++++++++---------- tests/out/wgsl/collatz.wgsl | 4 ++-- tests/out/wgsl/constant-array-size-vert.wgsl | 2 +- tests/out/wgsl/control-flow.wgsl | 14 ++++++------ tests/out/wgsl/extra.wgsl | 2 +- tests/out/wgsl/operators.wgsl | 2 +- tests/out/wgsl/quad.wgsl | 2 +- tests/out/wgsl/shadow.wgsl | 4 ++-- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/back/wgsl/writer.rs b/src/back/wgsl/writer.rs index 4e4cd70467..fa32c6b6d8 100644 --- a/src/back/wgsl/writer.rs +++ b/src/back/wgsl/writer.rs @@ -691,9 +691,9 @@ impl Writer { ref reject, } => { write!(self.out, "{}", level)?; - write!(self.out, "if (")?; + write!(self.out, "if ")?; self.write_expr(module, condition, func_ctx)?; - writeln!(self.out, ") {{")?; + writeln!(self.out, " {{")?; let l2 = level.next(); for sta in accept { @@ -845,9 +845,9 @@ impl Writer { } => { // Start the switch write!(self.out, "{}", level)?; - write!(self.out, "switch(")?; + write!(self.out, "switch ")?; self.write_expr(module, selector, func_ctx)?; - writeln!(self.out, ") {{")?; + writeln!(self.out, " {{")?; let type_postfix = match *func_ctx.info[selector].ty.inner_with(&module.types) { crate::TypeInner::Scalar { diff --git a/tests/out/wgsl/246-collatz-comp.wgsl b/tests/out/wgsl/246-collatz-comp.wgsl index e983ee8dea..a990dd31ba 100644 --- a/tests/out/wgsl/246-collatz-comp.wgsl +++ b/tests/out/wgsl/246-collatz-comp.wgsl @@ -13,12 +13,12 @@ fn collatz_iterations(n: u32) -> u32 { n_1 = n; loop { let _e7 = n_1; - if (!((_e7 != u32(1)))) { + if !((_e7 != u32(1))) { break; } { let _e14 = n_1; - if (((f32(_e14) % f32(2)) == f32(0))) { + if ((f32(_e14) % f32(2)) == f32(0)) { { let _e22 = n_1; n_1 = (_e22 / u32(2)); diff --git a/tests/out/wgsl/932-for-loop-if-vert.wgsl b/tests/out/wgsl/932-for-loop-if-vert.wgsl index 9927e46b0f..3bc7924b2b 100644 --- a/tests/out/wgsl/932-for-loop-if-vert.wgsl +++ b/tests/out/wgsl/932-for-loop-if-vert.wgsl @@ -3,7 +3,7 @@ fn main_1() { loop { let _e2 = i; - if (!((_e2 < 1))) { + if !((_e2 < 1)) { break; } { diff --git a/tests/out/wgsl/bevy-pbr-frag.wgsl b/tests/out/wgsl/bevy-pbr-frag.wgsl index b5913a6266..bf12b515da 100644 --- a/tests/out/wgsl/bevy-pbr-frag.wgsl +++ b/tests/out/wgsl/bevy-pbr-frag.wgsl @@ -801,7 +801,7 @@ fn main_1() { let _e224 = i; let _e225 = global_2.NumLights; let _e229 = i; - if (!(((_e224 < i32(_e225.x)) && (_e229 < 10)))) { + if !(((_e224 < i32(_e225.x)) && (_e229 < 10))) { break; } { @@ -828,7 +828,7 @@ fn main_1() { let _e261 = i_1; let _e262 = global_2.NumLights; let _e266 = i_1; - if (!(((_e261 < i32(_e262.y)) && (_e266 < 1)))) { + if !(((_e261 < i32(_e262.y)) && (_e266 < 1))) { break; } { diff --git a/tests/out/wgsl/boids.wgsl b/tests/out/wgsl/boids.wgsl index b0f3180b29..1910535abc 100644 --- a/tests/out/wgsl/boids.wgsl +++ b/tests/out/wgsl/boids.wgsl @@ -40,7 +40,7 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { var i: u32 = 0u; let index = global_invocation_id.x; - if ((index >= NUM_PARTICLES)) { + if (index >= NUM_PARTICLES) { return; } let _e10 = particlesSrc.particles[index].pos; @@ -52,11 +52,11 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { colVel = vec2(0.0, 0.0); loop { let _e37 = i; - if ((_e37 >= NUM_PARTICLES)) { + if (_e37 >= NUM_PARTICLES) { break; } let _e39 = i; - if ((_e39 == index)) { + if (_e39 == index) { continue; } let _e42 = i; @@ -68,7 +68,7 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let _e51 = pos; let _e52 = vPos; let _e55 = params.rule1Distance; - if ((distance(_e51, _e52) < _e55)) { + if (distance(_e51, _e52) < _e55) { let _e57 = cMass; let _e58 = pos; cMass = (_e57 + _e58); @@ -78,7 +78,7 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let _e63 = pos; let _e64 = vPos; let _e67 = params.rule2Distance; - if ((distance(_e63, _e64) < _e67)) { + if (distance(_e63, _e64) < _e67) { let _e69 = colVel; let _e70 = pos; let _e71 = vPos; @@ -87,7 +87,7 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let _e74 = pos; let _e75 = vPos; let _e78 = params.rule3Distance; - if ((distance(_e74, _e75) < _e78)) { + if (distance(_e74, _e75) < _e78) { let _e80 = cVel; let _e81 = vel; cVel = (_e80 + _e81); @@ -100,14 +100,14 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { } } let _e89 = cMassCount; - if ((_e89 > 0)) { + if (_e89 > 0) { let _e92 = cMass; let _e93 = cMassCount; let _e97 = vPos; cMass = ((_e92 / vec2(f32(_e93))) - _e97); } let _e99 = cVelCount; - if ((_e99 > 0)) { + if (_e99 > 0) { let _e102 = cVel; let _e103 = cVelCount; cVel = (_e102 / vec2(f32(_e103))); @@ -128,19 +128,19 @@ fn main(@builtin(global_invocation_id) global_invocation_id: vec3) { let _e134 = params.deltaT; vPos = (_e131 + (_e132 * _e134)); let _e138 = vPos.x; - if ((_e138 < -1.0)) { + if (_e138 < -1.0) { vPos.x = 1.0; } let _e144 = vPos.x; - if ((_e144 > 1.0)) { + if (_e144 > 1.0) { vPos.x = -1.0; } let _e150 = vPos.y; - if ((_e150 < -1.0)) { + if (_e150 < -1.0) { vPos.y = 1.0; } let _e156 = vPos.y; - if ((_e156 > 1.0)) { + if (_e156 > 1.0) { vPos.y = -1.0; } let _e164 = vPos; diff --git a/tests/out/wgsl/collatz.wgsl b/tests/out/wgsl/collatz.wgsl index b4fb82c465..334a779e6f 100644 --- a/tests/out/wgsl/collatz.wgsl +++ b/tests/out/wgsl/collatz.wgsl @@ -12,11 +12,11 @@ fn collatz_iterations(n_base: u32) -> u32 { n = n_base; loop { let _e5 = n; - if ((_e5 <= 1u)) { + if (_e5 <= 1u) { break; } let _e8 = n; - if (((_e8 % 2u) == 0u)) { + if ((_e8 % 2u) == 0u) { let _e13 = n; n = (_e13 / 2u); } else { diff --git a/tests/out/wgsl/constant-array-size-vert.wgsl b/tests/out/wgsl/constant-array-size-vert.wgsl index 26e32eda7a..f0d5474a20 100644 --- a/tests/out/wgsl/constant-array-size-vert.wgsl +++ b/tests/out/wgsl/constant-array-size-vert.wgsl @@ -11,7 +11,7 @@ fn function_() -> vec4 { loop { let _e9 = i; - if (!((_e9 < 42))) { + if !((_e9 < 42)) { break; } { diff --git a/tests/out/wgsl/control-flow.wgsl b/tests/out/wgsl/control-flow.wgsl index fad5a45e8e..e31585d0b1 100644 --- a/tests/out/wgsl/control-flow.wgsl +++ b/tests/out/wgsl/control-flow.wgsl @@ -1,5 +1,5 @@ fn switch_default_break(i: i32) { - switch(i) { + switch i { default: { break; } @@ -7,7 +7,7 @@ fn switch_default_break(i: i32) { } fn switch_case_break() { - switch(0) { + switch 0 { case 0: { break; } @@ -19,7 +19,7 @@ fn switch_case_break() { fn loop_switch_continue(x: i32) { loop { - switch(x) { + switch x { case 1: { continue; } @@ -36,13 +36,13 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { storageBarrier(); workgroupBarrier(); - switch(1) { + switch 1 { default: { pos = 1; } } let _e4 = pos; - switch(_e4) { + switch _e4 { case 1: { pos = 0; break; @@ -60,14 +60,14 @@ fn main(@builtin(global_invocation_id) global_id: vec3) { pos = 3; } } - switch(0u) { + switch 0u { case 0u: { } default: { } } let _e10 = pos; - switch(_e10) { + switch _e10 { case 1: { pos = 0; break; diff --git a/tests/out/wgsl/extra.wgsl b/tests/out/wgsl/extra.wgsl index 5dc44e4632..6db9c19234 100644 --- a/tests/out/wgsl/extra.wgsl +++ b/tests/out/wgsl/extra.wgsl @@ -12,7 +12,7 @@ var pc: PushConstants; @stage(fragment) fn main(in: FragmentIn) -> @location(0) vec4 { - if (((in.primitive_index % 2u) == 0u)) { + if ((in.primitive_index % 2u) == 0u) { return in.color; } else { return vec4((vec3(1.0) - in.color.xyz), in.color.w); diff --git a/tests/out/wgsl/operators.wgsl b/tests/out/wgsl/operators.wgsl index 53c1c17015..eac31fec00 100644 --- a/tests/out/wgsl/operators.wgsl +++ b/tests/out/wgsl/operators.wgsl @@ -26,7 +26,7 @@ fn splat() -> vec4 { } fn unary() -> i32 { - if (!(true)) { + if !(true) { return 1; } else { return ~(1); diff --git a/tests/out/wgsl/quad.wgsl b/tests/out/wgsl/quad.wgsl index 0f6e3f56dc..641f2fd289 100644 --- a/tests/out/wgsl/quad.wgsl +++ b/tests/out/wgsl/quad.wgsl @@ -18,7 +18,7 @@ fn vert_main(@location(0) pos: vec2, @location(1) uv: vec2) -> VertexO @stage(fragment) fn frag_main(@location(0) uv_1: vec2) -> @location(0) vec4 { let color = textureSample(u_texture, u_sampler, uv_1); - if ((color.w == 0.0)) { + if (color.w == 0.0) { discard; } let premultiplied = (color.w * color); diff --git a/tests/out/wgsl/shadow.wgsl b/tests/out/wgsl/shadow.wgsl index d1e2ace3ee..393003ad26 100644 --- a/tests/out/wgsl/shadow.wgsl +++ b/tests/out/wgsl/shadow.wgsl @@ -25,7 +25,7 @@ var t_shadow: texture_depth_2d_array; var sampler_shadow: sampler_comparison; fn fetch_shadow(light_id: u32, homogeneous_coords: vec4) -> f32 { - if ((homogeneous_coords.w <= 0.0)) { + if (homogeneous_coords.w <= 0.0) { return 1.0; } let flip_correction = vec2(0.5, -0.5); @@ -43,7 +43,7 @@ fn fs_main(@location(0) raw_normal: vec3, @location(1) position: vec4) loop { let _e12 = i; let _e15 = u_globals.num_lights.x; - if ((_e12 >= min(_e15, c_max_lights))) { + if (_e12 >= min(_e15, c_max_lights)) { break; } let _e19 = i;