Browse Source

Fix: Get constructor as Callable

mashumafi 2 years ago
parent
commit
b39b4010bd

+ 11 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -3264,7 +3264,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
 		base = *p_base;
 	}
 
-	const StringName &name = p_identifier->name;
+	StringName name = p_identifier->name;
 
 	if (base.kind == GDScriptParser::DataType::ENUM) {
 		if (base.is_meta_type) {
@@ -3359,12 +3359,18 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
 		get_class_node_current_scope_classes(base_class, &script_classes);
 	}
 
+	bool is_constructor = base.is_meta_type && p_identifier->name == SNAME("new");
+
 	for (GDScriptParser::ClassNode *script_class : script_classes) {
 		if (p_base == nullptr && script_class->identifier && script_class->identifier->name == name) {
 			reduce_identifier_from_base_set_class(p_identifier, script_class->get_datatype());
 			return;
 		}
 
+		if (is_constructor) {
+			name = "_init";
+		}
+
 		if (script_class->has_member(name)) {
 			resolve_class_member(script_class, name, p_identifier);
 
@@ -3443,6 +3449,10 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
 	const StringName &native = base.native_type;
 
 	if (class_exists(native)) {
+		if (is_constructor) {
+			name = "_init";
+		}
+
 		MethodInfo method_info;
 		if (ClassDB::has_property(native, name)) {
 			StringName getter_name = ClassDB::get_property_getter(native, name);

+ 10 - 0
modules/gdscript/tests/scripts/runtime/features/ctor_as_callable.gd

@@ -0,0 +1,10 @@
+# https://github.com/godotengine/godot/issues/70319
+
+class InnerClass:
+    pass
+
+func test():
+    var inner_ctor : Callable = InnerClass.new
+    print(inner_ctor)
+    var native_ctor : Callable = Node.new
+    print(native_ctor)

+ 3 - 0
modules/gdscript/tests/scripts/runtime/features/ctor_as_callable.out

@@ -0,0 +1,3 @@
+GDTEST_OK
+GDScript::new
+GDScriptNativeClass::new