GDScript: Allow variables in match patterns

To restore an ability available in 3.x and reduce compatibility changes.
This commit is contained in:
George Marques 2023-01-28 19:49:14 -03:00
parent 218bef90af
commit c68b2358d5
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D
8 changed files with 59 additions and 15 deletions

View file

@ -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: