Merge pull request #14558 from xsellier/bugfix/14324-nested-ternary

Properly support nested ternary expressions
This commit is contained in:
Rémi Verschelde 2017-12-12 00:14:39 +01:00 committed by GitHub
commit db262f80be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -972,6 +972,7 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
bool unary = false;
bool ternary = false;
bool error = false;
bool right_to_left = false;
switch (expression[i].op) {
@ -1022,11 +1023,13 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
case OperatorNode::OP_TERNARY_IF:
priority = 14;
ternary = true;
right_to_left = true;
break;
case OperatorNode::OP_TERNARY_ELSE:
priority = 14;
error = true;
break; // Errors out when found without IF (since IF would consume it)
// Rigth-to-left should be false in this case, otherwise it would always error.
break;
case OperatorNode::OP_ASSIGN: priority = 15; break;
case OperatorNode::OP_ASSIGN_ADD: priority = 15; break;
@ -1046,13 +1049,13 @@ GDParser::Node *GDParser::_parse_expression(Node *p_parent, bool p_static, bool
}
}
if (priority < min_priority) {
if (priority < min_priority || (right_to_left && priority == min_priority)) {
// < is used for left to right (default)
// <= is used for right to left
if (error) {
_set_error("Unexpected operator");
return NULL;
}
// < is used for left to right (default)
// <= is used for right to left
next_op = i;
min_priority = priority;
is_unary = unary;