You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-15 13:51:40 +00:00
Mono/C#: Fix class parser bug with 'where T : struct'
The struct decl parsing was outdated. Make both struct decl and class declparsing share the same code.
This commit is contained in:
@@ -501,7 +501,10 @@ Error ScriptClassParser::parse(const String &p_code) {
|
|||||||
int type_curly_stack = 0;
|
int type_curly_stack = 0;
|
||||||
|
|
||||||
while (!error && tk != TK_EOF) {
|
while (!error && tk != TK_EOF) {
|
||||||
if (tk == TK_IDENTIFIER && String(value) == "class") {
|
String identifier = value;
|
||||||
|
if (tk == TK_IDENTIFIER && (identifier == "class" || identifier == "struct")) {
|
||||||
|
bool is_class = identifier == "class";
|
||||||
|
|
||||||
tk = get_token();
|
tk = get_token();
|
||||||
|
|
||||||
if (tk == TK_IDENTIFIER) {
|
if (tk == TK_IDENTIFIER) {
|
||||||
@@ -568,9 +571,10 @@ Error ScriptClassParser::parse(const String &p_code) {
|
|||||||
|
|
||||||
NameDecl name_decl;
|
NameDecl name_decl;
|
||||||
name_decl.name = name;
|
name_decl.name = name;
|
||||||
name_decl.type = NameDecl::CLASS_DECL;
|
name_decl.type = is_class ? NameDecl::CLASS_DECL : NameDecl::STRUCT_DECL;
|
||||||
name_stack[at_level] = name_decl;
|
name_stack[at_level] = name_decl;
|
||||||
|
|
||||||
|
if (is_class) {
|
||||||
if (!generic) { // no generics, thanks
|
if (!generic) { // no generics, thanks
|
||||||
classes.push_back(class_decl);
|
classes.push_back(class_decl);
|
||||||
} else if (OS::get_singleton()->is_stdout_verbose()) {
|
} else if (OS::get_singleton()->is_stdout_verbose()) {
|
||||||
@@ -581,35 +585,8 @@ Error ScriptClassParser::parse(const String &p_code) {
|
|||||||
OS::get_singleton()->print("Ignoring generic class declaration: %s\n", class_decl.name.utf8().get_data());
|
OS::get_singleton()->print("Ignoring generic class declaration: %s\n", class_decl.name.utf8().get_data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (tk == TK_IDENTIFIER && String(value) == "struct") {
|
|
||||||
String name;
|
|
||||||
int at_level = type_curly_stack;
|
|
||||||
while (true) {
|
|
||||||
tk = get_token();
|
|
||||||
if (tk == TK_IDENTIFIER && name.empty()) {
|
|
||||||
name = String(value);
|
|
||||||
} else if (tk == TK_CURLY_BRACKET_OPEN) {
|
|
||||||
if (name.empty()) {
|
|
||||||
error_str = "Expected " + get_token_name(TK_IDENTIFIER) + " after keyword 'struct', found " + get_token_name(TK_CURLY_BRACKET_OPEN);
|
|
||||||
error = true;
|
|
||||||
return ERR_PARSE_ERROR;
|
|
||||||
}
|
}
|
||||||
|
} else if (tk == TK_IDENTIFIER && identifier == "namespace") {
|
||||||
curly_stack++;
|
|
||||||
type_curly_stack++;
|
|
||||||
break;
|
|
||||||
} else if (tk == TK_EOF) {
|
|
||||||
error_str = "Expected " + get_token_name(TK_CURLY_BRACKET_OPEN) + " after struct decl, found " + get_token_name(TK_EOF);
|
|
||||||
error = true;
|
|
||||||
return ERR_PARSE_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NameDecl name_decl;
|
|
||||||
name_decl.name = name;
|
|
||||||
name_decl.type = NameDecl::STRUCT_DECL;
|
|
||||||
name_stack[at_level] = name_decl;
|
|
||||||
} else if (tk == TK_IDENTIFIER && String(value) == "namespace") {
|
|
||||||
if (type_curly_stack > 0) {
|
if (type_curly_stack > 0) {
|
||||||
error_str = "Found namespace nested inside type.";
|
error_str = "Found namespace nested inside type.";
|
||||||
error = true;
|
error = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user