2
0
Эх сурвалжийг харах

GDScript: Disallow type inference with untyped initializer

Dmitrii Maganov 2 жил өмнө
parent
commit
a1e0281b45

+ 1 - 3
modules/gdscript/gdscript_analyzer.cpp

@@ -1544,10 +1544,8 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
 		GDScriptParser::DataType initializer_type = p_assignable->initializer->get_datatype();
 
 		if (p_assignable->infer_datatype) {
-			if (!initializer_type.is_set() || initializer_type.has_no_type()) {
+			if (!initializer_type.is_set() || initializer_type.has_no_type() || !initializer_type.is_hard_type()) {
 				push_error(vformat(R"(Cannot infer the type of "%s" %s because the value doesn't have a set type.)", p_assignable->identifier->name, p_kind), p_assignable->initializer);
-			} else if (initializer_type.is_variant() && !initializer_type.is_hard_type()) {
-				push_error(vformat(R"(Cannot infer the type of "%s" %s because the value is Variant. Use explicit "Variant" type if this is intended.)", p_assignable->identifier->name, p_kind), p_assignable->initializer);
 			} else if (initializer_type.kind == GDScriptParser::DataType::BUILTIN && initializer_type.builtin_type == Variant::NIL && !is_constant) {
 				push_error(vformat(R"(Cannot infer the type of "%s" %s because the value is "null".)", p_assignable->identifier->name, p_kind), p_assignable->initializer);
 			}

+ 3 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_local_variable.gd

@@ -0,0 +1,3 @@
+func test():
+	var untyped = 1
+	var inferred := untyped

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_local_variable.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+Cannot infer the type of "inferred" variable because the value doesn't have a set type.

+ 5 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_member_variable.gd

@@ -0,0 +1,5 @@
+var untyped = 1
+var inferred := untyped
+
+func test():
+	pass

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_member_variable.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+Cannot infer the type of "inferred" variable because the value doesn't have a set type.

+ 5 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_parameter.gd

@@ -0,0 +1,5 @@
+func check(untyped = 1, inferred := untyped):
+	pass
+
+func test():
+	check()

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/inferring_with_weak_type_parameter.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+Cannot infer the type of "inferred" parameter because the value doesn't have a set type.

+ 0 - 5
modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.gd

@@ -1,9 +1,4 @@
 func test():
-	var one_0 = 0
-	one_0 = 1
-	var one_1 := one_0
-	print(one_1)
-
 	var two: Variant = 0
 	two += 2
 	print(two)

+ 0 - 1
modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.out

@@ -1,5 +1,4 @@
 GDTEST_OK
-1
 2
 3
 4