Fix inheriting from class_name messing up constants

Fixes #29586
This commit is contained in:
Bojidar Marinov 2019-07-03 17:59:29 +03:00
parent 4cb0887660
commit 2ef438c200
No known key found for this signature in database
GPG key ID: 4D546A8F1E091856
2 changed files with 15 additions and 10 deletions

View file

@ -826,11 +826,12 @@ GDScriptParser::Node *GDScriptParser::_parse_expression(Node *p_parent, bool p_s
}
// Check parents for the constant
if (!bfn && cln->extends_file != StringName()) {
Ref<GDScript> parent = ResourceLoader::load(cln->extends_file);
if (parent.is_valid() && parent->is_valid()) {
if (!bfn) {
// Using current_class instead of cln here, since cln is const*
_determine_inheritance(current_class, false);
if (cln->base_type.has_type && cln->base_type.kind == DataType::GDSCRIPT && cln->base_type.script_type->is_valid()) {
Map<StringName, Variant> parent_constants;
parent->get_constants(&parent_constants);
current_class->base_type.script_type->get_constants(&parent_constants);
if (parent_constants.has(identifier)) {
ConstantNode *constant = alloc_node<ConstantNode>();
constant->value = parent_constants[identifier];
@ -5158,9 +5159,11 @@ void GDScriptParser::_parse_class(ClassNode *p_class) {
}
}
void GDScriptParser::_determine_inheritance(ClassNode *p_class) {
void GDScriptParser::_determine_inheritance(ClassNode *p_class, bool p_recursive) {
if (p_class->extends_used) {
if (p_class->base_type.has_type) {
// Already determined
} else if (p_class->extends_used) {
//do inheritance
String path = p_class->extends_file;
@ -5355,9 +5358,11 @@ void GDScriptParser::_determine_inheritance(ClassNode *p_class) {
p_class->base_type.native_type = "Reference";
}
// Recursively determine subclasses
for (int i = 0; i < p_class->subclasses.size(); i++) {
_determine_inheritance(p_class->subclasses[i]);
if (p_recursive) {
// Recursively determine subclasses
for (int i = 0; i < p_class->subclasses.size(); i++) {
_determine_inheritance(p_class->subclasses[i], p_recursive);
}
}
}

View file

@ -599,7 +599,7 @@ private:
void _parse_class(ClassNode *p_class);
bool _end_statement();
void _determine_inheritance(ClassNode *p_class);
void _determine_inheritance(ClassNode *p_class, bool p_recursive = true);
bool _parse_type(DataType &r_type, bool p_can_be_void = false);
DataType _resolve_type(const DataType &p_source, int p_line);
DataType _type_from_variant(const Variant &p_value) const;