glsl-in: Cull the body of do while if needed

This commit is contained in:
João Capucho
2021-12-04 22:25:02 +00:00
committed by Dzmitry Malyshau
parent 322be0772e
commit 33c1daecee
2 changed files with 12 additions and 5 deletions

View File

@@ -292,6 +292,7 @@ impl<'source> ParsingContext<'source> {
parser,
&mut context,
&mut body,
&mut None,
)?;
parser.add_function(context, name, result, body, meta);

View File

@@ -325,7 +325,8 @@ impl<'source> ParsingContext<'source> {
let mut loop_body = Block::new();
self.parse_statement(parser, ctx, &mut loop_body, &mut None)?;
let mut terminator = None;
self.parse_statement(parser, ctx, &mut loop_body, &mut terminator)?;
let mut stmt = ctx.stmt_ctx();
@@ -359,6 +360,10 @@ impl<'source> ParsingContext<'source> {
crate::Span::default(),
);
if let Some(idx) = terminator {
loop_body.cull(idx..)
}
body.push(
Statement::Loop {
body: loop_body,
@@ -481,7 +486,8 @@ impl<'source> ParsingContext<'source> {
let mut block = Block::new();
ctx.push_scope();
let meta = self.parse_compound_statement(meta, parser, ctx, &mut block)?;
let meta =
self.parse_compound_statement(meta, parser, ctx, &mut block, terminator)?;
ctx.remove_current_scope();
@@ -511,8 +517,8 @@ impl<'source> ParsingContext<'source> {
parser: &mut Parser,
ctx: &mut Context,
body: &mut Block,
terminator: &mut Option<usize>,
) -> Result<Span> {
let mut terminator = None;
loop {
if let Some(Token {
meta: brace_meta, ..
@@ -522,14 +528,14 @@ impl<'source> ParsingContext<'source> {
break;
}
let stmt = self.parse_statement(parser, ctx, body, &mut terminator)?;
let stmt = self.parse_statement(parser, ctx, body, terminator)?;
if let Some(stmt_meta) = stmt {
meta.subsume(stmt_meta);
}
}
if let Some(idx) = terminator {
if let Some(idx) = *terminator {
body.cull(idx..)
}