Sfoglia il codice sorgente

Fix external enums not assignable as constants

- Add external enums test
- Rename external inner class test
- Clean up `GDScriptAnalyzer::reduce_identifier_from_base` class
  behavior
Adam Scott 2 anni fa
parent
commit
7fc814f697

+ 9 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -3137,6 +3137,12 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
 					p_identifier->reduced_value = member.enum_value.value;
 					p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
 					break;
+				case GDScriptParser::ClassNode::Member::ENUM:
+					if (p_base != nullptr && p_base->is_constant) {
+						p_identifier->is_constant = true;
+						p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
+					}
+					break;
 				case GDScriptParser::ClassNode::Member::VARIABLE:
 					p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_VARIABLE;
 					p_identifier->variable_source = member.variable;
@@ -3150,12 +3156,14 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
 					break;
 				case GDScriptParser::ClassNode::Member::CLASS:
 					if (p_base != nullptr && p_base->is_constant) {
+						p_identifier->is_constant = true;
+						p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
+
 						Error err = OK;
 						GDScript *scr = GDScriptCache::get_full_script(base.script_path, err).ptr();
 						ERR_FAIL_COND_MSG(err != OK, "Error while getting subscript full script.");
 						scr = scr->find_class(p_identifier->get_datatype().class_type->fqcn);
 						p_identifier->reduced_value = scr;
-						p_identifier->is_constant = true;
 					}
 					break;
 				default:

+ 6 - 0
modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.gd

@@ -0,0 +1,6 @@
+const External = preload("external_enum_as_constant_external.notest.gd")
+const MyEnum = External.MyEnum
+
+func test():
+    print(MyEnum.WAITING == 0)
+    print(MyEnum.GODOT == 1)

+ 3 - 0
modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.out

@@ -0,0 +1,3 @@
+GDTEST_OK
+true
+true

+ 4 - 0
modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant_external.notest.gd

@@ -0,0 +1,4 @@
+enum MyEnum {
+    WAITING,
+    GODOT
+}

+ 1 - 1
modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.gd → modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.gd

@@ -1,4 +1,4 @@
-const External = preload("inner_class_constant_assignment_external.notest.gd")
+const External = preload("external_inner_class_as_constant_external.notest.gd")
 const ExternalInnerClass = External.InnerClass
 
 func test():

+ 0 - 0
modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.out → modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.out


+ 0 - 0
modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment_external.notest.gd → modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant_external.notest.gd