GDScript: Tidy up assignment operator check
The operator is already gathered by the parser, no need to do it again in the analyzer.
This commit is contained in:
parent
241e709462
commit
3aef60591b
|
@ -1369,48 +1369,11 @@ void GDScriptAnalyzer::reduce_assignment(GDScriptParser::AssignmentNode *p_assig
|
||||||
push_error("Cannot assign a new value to a constant.", p_assignment->assignee);
|
push_error("Cannot assign a new value to a constant.", p_assignment->assignee);
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant::Operator vop = Variant::Operator::OP_EQUAL;
|
|
||||||
switch (p_assignment->operation) {
|
|
||||||
case GDScriptParser::AssignmentNode::OP_NONE:
|
|
||||||
vop = Variant::Operator::OP_EQUAL;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_ADDITION:
|
|
||||||
vop = Variant::Operator::OP_ADD;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_SUBTRACTION:
|
|
||||||
vop = Variant::Operator::OP_SUBTRACT;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_MULTIPLICATION:
|
|
||||||
vop = Variant::Operator::OP_MULTIPLY;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_DIVISION:
|
|
||||||
vop = Variant::Operator::OP_DIVIDE;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_MODULO:
|
|
||||||
vop = Variant::Operator::OP_MODULE;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_BIT_SHIFT_LEFT:
|
|
||||||
vop = Variant::Operator::OP_SHIFT_LEFT;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_BIT_SHIFT_RIGHT:
|
|
||||||
vop = Variant::Operator::OP_SHIFT_RIGHT;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_BIT_AND:
|
|
||||||
vop = Variant::Operator::OP_BIT_AND;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_BIT_OR:
|
|
||||||
vop = Variant::Operator::OP_BIT_OR;
|
|
||||||
break;
|
|
||||||
case GDScriptParser::AssignmentNode::OP_BIT_XOR:
|
|
||||||
vop = Variant::Operator::OP_BIT_XOR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!p_assignment->assignee->get_datatype().is_variant() && !p_assignment->assigned_value->get_datatype().is_variant()) {
|
if (!p_assignment->assignee->get_datatype().is_variant() && !p_assignment->assigned_value->get_datatype().is_variant()) {
|
||||||
bool compatible = true;
|
bool compatible = true;
|
||||||
GDScriptParser::DataType op_type = p_assignment->assigned_value->get_datatype();
|
GDScriptParser::DataType op_type = p_assignment->assigned_value->get_datatype();
|
||||||
if (vop != Variant::OP_EQUAL) {
|
if (p_assignment->operation != GDScriptParser::AssignmentNode::OP_NONE) {
|
||||||
op_type = get_operation_type(vop, p_assignment->assignee->get_datatype(), p_assignment->assigned_value->get_datatype(), compatible);
|
op_type = get_operation_type(p_assignment->variant_op, p_assignment->assignee->get_datatype(), p_assignment->assigned_value->get_datatype(), compatible);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compatible) {
|
if (compatible) {
|
||||||
|
|
|
@ -2005,7 +2005,6 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_binary_operator(Expression
|
||||||
push_error(vformat(R"(Expected expression after "%s" operator.")", op.get_name()));
|
push_error(vformat(R"(Expected expression after "%s" operator.")", op.get_name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Store the Variant operator here too (in the node).
|
|
||||||
// TODO: Also for unary, ternary, and assignment.
|
// TODO: Also for unary, ternary, and assignment.
|
||||||
switch (op.type) {
|
switch (op.type) {
|
||||||
case GDScriptTokenizer::Token::PLUS:
|
case GDScriptTokenizer::Token::PLUS:
|
||||||
|
@ -2167,39 +2166,50 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_assignment(ExpressionNode
|
||||||
switch (previous.type) {
|
switch (previous.type) {
|
||||||
case GDScriptTokenizer::Token::EQUAL:
|
case GDScriptTokenizer::Token::EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_NONE;
|
assignment->operation = AssignmentNode::OP_NONE;
|
||||||
|
assignment->variant_op = Variant::OP_MAX;
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
has_operator = false;
|
has_operator = false;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::PLUS_EQUAL:
|
case GDScriptTokenizer::Token::PLUS_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_ADDITION;
|
assignment->operation = AssignmentNode::OP_ADDITION;
|
||||||
|
assignment->variant_op = Variant::OP_ADD;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::MINUS_EQUAL:
|
case GDScriptTokenizer::Token::MINUS_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_SUBTRACTION;
|
assignment->operation = AssignmentNode::OP_SUBTRACTION;
|
||||||
|
assignment->variant_op = Variant::OP_SUBTRACT;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::STAR_EQUAL:
|
case GDScriptTokenizer::Token::STAR_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_MULTIPLICATION;
|
assignment->operation = AssignmentNode::OP_MULTIPLICATION;
|
||||||
|
assignment->variant_op = Variant::OP_MULTIPLY;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::SLASH_EQUAL:
|
case GDScriptTokenizer::Token::SLASH_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_DIVISION;
|
assignment->operation = AssignmentNode::OP_DIVISION;
|
||||||
|
assignment->variant_op = Variant::OP_DIVIDE;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::PERCENT_EQUAL:
|
case GDScriptTokenizer::Token::PERCENT_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_MODULO;
|
assignment->operation = AssignmentNode::OP_MODULO;
|
||||||
|
assignment->variant_op = Variant::OP_MODULE;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::LESS_LESS_EQUAL:
|
case GDScriptTokenizer::Token::LESS_LESS_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_BIT_SHIFT_LEFT;
|
assignment->operation = AssignmentNode::OP_BIT_SHIFT_LEFT;
|
||||||
|
assignment->variant_op = Variant::OP_SHIFT_LEFT;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::GREATER_GREATER_EQUAL:
|
case GDScriptTokenizer::Token::GREATER_GREATER_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_BIT_SHIFT_RIGHT;
|
assignment->operation = AssignmentNode::OP_BIT_SHIFT_RIGHT;
|
||||||
|
assignment->variant_op = Variant::OP_SHIFT_RIGHT;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::AMPERSAND_EQUAL:
|
case GDScriptTokenizer::Token::AMPERSAND_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_BIT_AND;
|
assignment->operation = AssignmentNode::OP_BIT_AND;
|
||||||
|
assignment->variant_op = Variant::OP_BIT_AND;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::PIPE_EQUAL:
|
case GDScriptTokenizer::Token::PIPE_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_BIT_OR;
|
assignment->operation = AssignmentNode::OP_BIT_OR;
|
||||||
|
assignment->variant_op = Variant::OP_BIT_OR;
|
||||||
break;
|
break;
|
||||||
case GDScriptTokenizer::Token::CARET_EQUAL:
|
case GDScriptTokenizer::Token::CARET_EQUAL:
|
||||||
assignment->operation = AssignmentNode::OP_BIT_XOR;
|
assignment->operation = AssignmentNode::OP_BIT_XOR;
|
||||||
|
assignment->variant_op = Variant::OP_BIT_XOR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break; // Unreachable.
|
break; // Unreachable.
|
||||||
|
|
Loading…
Reference in New Issue