Skip to content

Commit

Permalink
GDScript: Add missing member type check when resolving extends
Browse files Browse the repository at this point in the history
  • Loading branch information
dalexeev committed Apr 10, 2023
1 parent 78e2479 commit 66279b9
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 1 deletion.
22 changes: 21 additions & 1 deletion modules/gdscript/gdscript_analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,24 @@ Error GDScriptAnalyzer::resolve_class_inheritance(GDScriptParser::ClassNode *p_c
}
if (look_class->has_member(name)) {
resolve_class_member(look_class, name, id);
base = look_class->get_member(name).get_datatype();
GDScriptParser::ClassNode::Member member = look_class->get_member(name);
GDScriptParser::DataType member_datatype = member.get_datatype();

switch (member.type) {
case GDScriptParser::ClassNode::Member::CLASS:
break; // OK.
case GDScriptParser::ClassNode::Member::CONSTANT:
if (member_datatype.kind != GDScriptParser::DataType::SCRIPT && member_datatype.kind != GDScriptParser::DataType::CLASS) {
push_error(vformat(R"(Constant "%s" is not a preloaded script or class.)", name), id);
return ERR_PARSE_ERROR;
}
break;
default:
push_error(vformat(R"(Cannot use %s "%s" in extends chain.)", member.get_type_name(), name), id);
return ERR_PARSE_ERROR;
}

base = member_datatype;
found = true;
break;
}
Expand All @@ -506,6 +523,9 @@ Error GDScriptAnalyzer::resolve_class_inheritance(GDScriptParser::ClassNode *p_c
if (!id_type.is_set()) {
push_error(vformat(R"(Could not find nested type "%s".)", id->name), id);
return ERR_PARSE_ERROR;
} else if (id_type.kind != GDScriptParser::DataType::SCRIPT && id_type.kind != GDScriptParser::DataType::CLASS) {
push_error(vformat(R"(Identifier "%s" is not a preloaded script or class.)", id->name), id);
return ERR_PARSE_ERROR;
}

base = id_type;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# GH-75870

const A = 1

class B extends A:
pass

func test():
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
GDTEST_ANALYZER_ERROR
Constant "A" is not a preloaded script or class.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# GH-75870

class A:
const X = 1

const Y = A.X # A.X is now resolved.

class B extends A.X:
pass

func test():
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
GDTEST_ANALYZER_ERROR
Identifier "X" is not a preloaded script or class.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# GH-75870

var A = 1

class B extends A:
pass

func test():
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
GDTEST_ANALYZER_ERROR
Cannot use variable "A" in extends chain.

0 comments on commit 66279b9

Please sign in to comment.