Browse Source

Merge pull request #90448 from vnen/gdscript-infer-string-format

GDScript: Infer type with string format operator
Rémi Verschelde 1 year ago
parent
commit
67076c167d

+ 5 - 0
modules/gdscript/gdscript_analyzer.cpp

@@ -2864,6 +2864,11 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o
 		result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
 		result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
 		result.kind = GDScriptParser::DataType::BUILTIN;
 		result.kind = GDScriptParser::DataType::BUILTIN;
 		result.builtin_type = Variant::BOOL;
 		result.builtin_type = Variant::BOOL;
+	} else if (p_binary_op->variant_op == Variant::OP_MODULE && left_type.builtin_type == Variant::STRING) {
+		// The modulo operator (%) on string acts as formatting and will always return a string.
+		result.type_source = left_type.type_source;
+		result.kind = GDScriptParser::DataType::BUILTIN;
+		result.builtin_type = Variant::STRING;
 	} else if (left_type.is_variant() || right_type.is_variant()) {
 	} else if (left_type.is_variant() || right_type.is_variant()) {
 		// Cannot infer type because one operand can be anything.
 		// Cannot infer type because one operand can be anything.
 		result.kind = GDScriptParser::DataType::VARIANT;
 		result.kind = GDScriptParser::DataType::VARIANT;

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

@@ -0,0 +1,6 @@
+# GH-88082
+
+func test():
+	var x = 1
+	var message := "value: %s" % x
+	print(message)

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/features/infer_type_on_string_format.out

@@ -0,0 +1,2 @@
+GDTEST_OK
+value: 1