Skip to content

Commit 54f6a1b

Browse files
committed
Fix lookup symbol for enum members to search a correct code definition
1 parent 4c4e673 commit 54f6a1b

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

modules/gdscript/gdscript_analyzer.cpp

+12-3
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ static GDScriptParser::DataType make_enum_type(const StringName &p_enum_name, co
148148
return type;
149149
}
150150

151+
static GDScriptParser::DataType make_class_enum_type(const StringName &p_enum_name, GDScriptParser::ClassNode *p_class, const String &p_script_path, bool p_meta = true) {
152+
GDScriptParser::DataType type = make_enum_type(p_enum_name, p_class->fqcn, p_meta);
153+
154+
type.class_type = p_class;
155+
type.script_path = p_script_path;
156+
157+
return type;
158+
}
159+
151160
static GDScriptParser::DataType make_native_enum_type(const StringName &p_enum_name, const StringName &p_native_class, bool p_meta = true) {
152161
// Find out which base class declared the enum, so the name is always the same even when coming from other contexts.
153162
StringName native_base = p_native_class;
@@ -1101,7 +1110,7 @@ void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class,
11011110
check_class_member_name_conflict(p_class, member.m_enum->identifier->name, member.m_enum);
11021111

11031112
member.m_enum->set_datatype(resolving_datatype);
1104-
GDScriptParser::DataType enum_type = make_enum_type(member.m_enum->identifier->name, p_class->fqcn, true);
1113+
GDScriptParser::DataType enum_type = make_class_enum_type(member.m_enum->identifier->name, p_class, parser->script_path, true);
11051114

11061115
const GDScriptParser::EnumNode *prev_enum = current_enum;
11071116
current_enum = member.m_enum;
@@ -1194,7 +1203,7 @@ void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class,
11941203
// Also update the original references.
11951204
member.enum_value.parent_enum->values.set(member.enum_value.index, member.enum_value);
11961205

1197-
member.enum_value.identifier->set_datatype(make_enum_type(UNNAMED_ENUM, p_class->fqcn, false));
1206+
member.enum_value.identifier->set_datatype(make_class_enum_type(UNNAMED_ENUM, p_class, parser->script_path, false));
11981207
} break;
11991208
case GDScriptParser::ClassNode::Member::CLASS:
12001209
check_class_member_name_conflict(p_class, member.m_class->identifier->name, member.m_class);
@@ -4249,7 +4258,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
42494258
const GDScriptParser::EnumNode::Value &element = current_enum->values[i];
42504259
if (element.identifier->name == p_identifier->name) {
42514260
StringName enum_name = current_enum->identifier ? current_enum->identifier->name : UNNAMED_ENUM;
4252-
GDScriptParser::DataType type = make_enum_type(enum_name, parser->current_class->fqcn, false);
4261+
GDScriptParser::DataType type = make_class_enum_type(enum_name, parser->current_class, parser->script_path, false);
42534262
if (element.parent_enum->identifier) {
42544263
type.enum_type = element.parent_enum->identifier->name;
42554264
}

modules/gdscript/gdscript_editor.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -3782,7 +3782,19 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
37823782
}
37833783
} break;
37843784
case GDScriptParser::DataType::ENUM: {
3785-
if (base_type.enum_values.has(p_symbol)) {
3785+
if (base_type.class_type && base_type.class_type->has_member(base_type.enum_type)) {
3786+
GDScriptParser::EnumNode *base_enum = base_type.class_type->get_member(base_type.enum_type).m_enum;
3787+
for (const GDScriptParser::EnumNode::Value &value : base_enum->values) {
3788+
if (value.identifier && value.identifier->name == p_symbol) {
3789+
r_result.type = ScriptLanguage::LOOKUP_RESULT_SCRIPT_LOCATION;
3790+
r_result.class_path = base_type.script_path;
3791+
r_result.location = value.line;
3792+
Error err = OK;
3793+
r_result.script = GDScriptCache::get_shallow_script(r_result.class_path, err);
3794+
return err;
3795+
}
3796+
}
3797+
} else if (base_type.enum_values.has(p_symbol)) {
37863798
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT;
37873799
r_result.class_name = String(base_type.native_type).get_slicec('.', 0);
37883800
r_result.class_member = p_symbol;

0 commit comments

Comments
 (0)