mirror of
https://github.com/godotengine/godot.git
synced 2025-10-25 18:54:43 +00:00
GDScript: Allow variables in match patterns
To restore an ability available in 3.x and reduce compatibility changes.
This commit is contained in:
parent
218bef90af
commit
c68b2358d5
8 changed files with 59 additions and 15 deletions
|
|
@ -1901,11 +1901,22 @@ void GDScriptAnalyzer::resolve_match_pattern(GDScriptParser::PatternNode *p_matc
|
|||
break;
|
||||
case GDScriptParser::PatternNode::PT_EXPRESSION:
|
||||
if (p_match_pattern->expression) {
|
||||
reduce_expression(p_match_pattern->expression);
|
||||
if (!p_match_pattern->expression->is_constant) {
|
||||
push_error(R"(Expression in match pattern must be a constant.)", p_match_pattern->expression);
|
||||
GDScriptParser::ExpressionNode *expr = p_match_pattern->expression;
|
||||
reduce_expression(expr);
|
||||
result = expr->get_datatype();
|
||||
if (!expr->is_constant) {
|
||||
while (expr && expr->type == GDScriptParser::Node::SUBSCRIPT) {
|
||||
GDScriptParser::SubscriptNode *sub = static_cast<GDScriptParser::SubscriptNode *>(expr);
|
||||
if (!sub->is_attribute) {
|
||||
expr = nullptr;
|
||||
} else {
|
||||
expr = sub->base;
|
||||
}
|
||||
}
|
||||
if (!expr || expr->type != GDScriptParser::Node::IDENTIFIER) {
|
||||
push_error(R"(Expression in match pattern must be a constant expression, an identifier, or an attribute access ("A.B").)", expr);
|
||||
}
|
||||
}
|
||||
result = p_match_pattern->expression->get_datatype();
|
||||
}
|
||||
break;
|
||||
case GDScriptParser::PatternNode::PT_BIND:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue