mirror of
https://github.com/godotengine/godot.git
synced 2025-10-31 21:51:22 +00:00
Adds enums to GDScript
Fixes #2966
(cherry picked from commit 4ee82a2c38)
This commit is contained in:
parent
f71da5c8c5
commit
ed80f4563a
3 changed files with 87 additions and 0 deletions
|
|
@ -3152,6 +3152,90 @@ void GDParser::_parse_class(ClassNode *p_class) {
|
|||
return;
|
||||
}
|
||||
|
||||
} break;
|
||||
case GDTokenizer::TK_PR_ENUM: {
|
||||
//mutiple constant declarations..
|
||||
|
||||
int last_assign = -1; // Incremented by 1 right before the assingment.
|
||||
|
||||
tokenizer->advance();
|
||||
if (tokenizer->get_token() != GDTokenizer::TK_CURLY_BRACKET_OPEN) {
|
||||
_set_error("Expected '{' in enum declaration");
|
||||
return;
|
||||
}
|
||||
tokenizer->advance();
|
||||
|
||||
while (true) {
|
||||
if (tokenizer->get_token() == GDTokenizer::TK_NEWLINE) {
|
||||
|
||||
tokenizer->advance(); // Ignore newlines
|
||||
} else if (tokenizer->get_token() == GDTokenizer::TK_CURLY_BRACKET_CLOSE) {
|
||||
|
||||
tokenizer->advance();
|
||||
break; // End of enum
|
||||
} else if (tokenizer->get_token() != GDTokenizer::TK_IDENTIFIER) {
|
||||
|
||||
if (tokenizer->get_token() == GDTokenizer::TK_EOF) {
|
||||
_set_error("Unexpected end of file.");
|
||||
} else {
|
||||
_set_error(String("Unexpected ") + GDTokenizer::get_token_name(tokenizer->get_token()) + ", expected identifier");
|
||||
}
|
||||
|
||||
return;
|
||||
} else { // tokenizer->get_token()==GDTokenizer::TK_IDENTIFIER
|
||||
ClassNode::Constant constant;
|
||||
|
||||
constant.identifier = tokenizer->get_token_identifier();
|
||||
|
||||
tokenizer->advance();
|
||||
|
||||
if (tokenizer->get_token() == GDTokenizer::TK_OP_ASSIGN) {
|
||||
tokenizer->advance();
|
||||
|
||||
Node *subexpr = NULL;
|
||||
|
||||
subexpr = _parse_and_reduce_expression(p_class, true, true);
|
||||
if (!subexpr) {
|
||||
if (_recover_from_completion()) {
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (subexpr->type != Node::TYPE_CONSTANT) {
|
||||
_set_error("Expected constant expression");
|
||||
}
|
||||
|
||||
const ConstantNode *subexpr_const = static_cast<const ConstantNode *>(subexpr);
|
||||
|
||||
if (subexpr_const->value.get_type() != Variant::INT) {
|
||||
_set_error("Expected an int value for enum");
|
||||
}
|
||||
|
||||
last_assign = subexpr_const->value;
|
||||
|
||||
constant.expression = subexpr;
|
||||
|
||||
} else {
|
||||
last_assign = last_assign + 1;
|
||||
ConstantNode *cn = alloc_node<ConstantNode>();
|
||||
cn->value = last_assign;
|
||||
constant.expression = cn;
|
||||
}
|
||||
|
||||
if (tokenizer->get_token() == GDTokenizer::TK_COMMA) {
|
||||
tokenizer->advance();
|
||||
}
|
||||
|
||||
p_class->constant_expressions.push_back(constant);
|
||||
}
|
||||
}
|
||||
|
||||
if (!_end_statement()) {
|
||||
_set_error("Expected end of statement (enum)");
|
||||
return;
|
||||
}
|
||||
|
||||
} break;
|
||||
|
||||
default: {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue