1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #80085 from vnen/gdscript-pattern-guards

GDScript: Implement pattern guards for match statement
This commit is contained in:
Yuri Sizov
2023-09-28 20:03:57 +02:00
15 changed files with 163 additions and 1 deletions

View File

@@ -1925,6 +1925,26 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui
}
}
// If there's a guard, check its condition too.
if (branch->guard_body != nullptr) {
// Do this first so the guard does not run unless the pattern matched.
gen->write_and_left_operand(pattern_result);
// Don't actually use the block for the guard.
// The binds are already in the locals and we don't want to clear the result of the guard condition before we check the actual match.
GDScriptCodeGenerator::Address guard_result = _parse_expression(codegen, err, static_cast<GDScriptParser::ExpressionNode *>(branch->guard_body->statements[0]));
if (err) {
return err;
}
gen->write_and_right_operand(guard_result);
gen->write_end_and(pattern_result);
if (guard_result.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
codegen.generator->pop_temporary();
}
}
// Check if pattern did match.
gen->write_if(pattern_result);