|
@@ -1624,6 +1624,10 @@ GDScriptParser::Node *GDScriptParser::parse_statement() {
|
|
case Node::AWAIT:
|
|
case Node::AWAIT:
|
|
// Fine.
|
|
// Fine.
|
|
break;
|
|
break;
|
|
|
|
+ case Node::LAMBDA:
|
|
|
|
+ // Standalone lambdas can't be used, so make this an error.
|
|
|
|
+ push_error("Standalone lambdas cannot be accessed. Consider assigning it to a variable.", expression);
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
push_warning(expression, GDScriptWarning::STANDALONE_EXPRESSION);
|
|
push_warning(expression, GDScriptWarning::STANDALONE_EXPRESSION);
|
|
}
|
|
}
|
|
@@ -2099,7 +2103,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_precedence(Precedence p_pr
|
|
ExpressionNode *previous_operand = (this->*prefix_rule)(nullptr, p_can_assign);
|
|
ExpressionNode *previous_operand = (this->*prefix_rule)(nullptr, p_can_assign);
|
|
|
|
|
|
while (p_precedence <= get_rule(current.type)->precedence) {
|
|
while (p_precedence <= get_rule(current.type)->precedence) {
|
|
- if (previous_operand == nullptr || (p_stop_on_assign && current.type == GDScriptTokenizer::Token::EQUAL)) {
|
|
|
|
|
|
+ if (previous_operand == nullptr || (p_stop_on_assign && current.type == GDScriptTokenizer::Token::EQUAL) || (previous_operand->type == Node::LAMBDA && lambda_ended)) {
|
|
return previous_operand;
|
|
return previous_operand;
|
|
}
|
|
}
|
|
// Also switch multiline mode on here for infix operators.
|
|
// Also switch multiline mode on here for infix operators.
|
|
@@ -2922,6 +2926,9 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_lambda(ExpressionNode *p_p
|
|
current_function = function;
|
|
current_function = function;
|
|
|
|
|
|
SuiteNode *body = alloc_node<SuiteNode>();
|
|
SuiteNode *body = alloc_node<SuiteNode>();
|
|
|
|
+ body->parent_function = current_function;
|
|
|
|
+ body->parent_block = current_suite;
|
|
|
|
+
|
|
SuiteNode *previous_suite = current_suite;
|
|
SuiteNode *previous_suite = current_suite;
|
|
current_suite = body;
|
|
current_suite = body;
|
|
|
|
|