Browse Source

Merge pull request #74949 from dalexeev/gds-fix-await-warning

GDScript: Fix false positive `REDUNDANT_AWAIT` warning
Yuri Sizov 2 years ago
parent
commit
215893ebca

+ 1 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -2548,7 +2548,7 @@ void GDScriptAnalyzer::reduce_await(GDScriptParser::AwaitNode *p_await) {
 
 
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	GDScriptParser::DataType to_await_type = p_await->to_await->get_datatype();
 	GDScriptParser::DataType to_await_type = p_await->to_await->get_datatype();
-	if (!(to_await_type.has_no_type() || to_await_type.is_coroutine || to_await_type.builtin_type == Variant::SIGNAL)) {
+	if (!to_await_type.is_coroutine && !to_await_type.is_variant() && to_await_type.builtin_type != Variant::SIGNAL) {
 		parser->push_warning(p_await, GDScriptWarning::REDUNDANT_AWAIT);
 		parser->push_warning(p_await, GDScriptWarning::REDUNDANT_AWAIT);
 	}
 	}
 #endif
 #endif

+ 1 - 1
modules/gdscript/tests/scripts/analyzer/features/warning_ignore_annotation.gd

@@ -11,5 +11,5 @@ func test():
 
 
 	print("done")
 	print("done")
 
 
-func regular_func():
+func regular_func() -> int:
 	return 0
 	return 0

+ 53 - 0
modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.gd

@@ -0,0 +1,53 @@
+signal my_signal()
+
+# CI cannot test async things.
+func test_signals():
+	await my_signal
+	var t: Signal = my_signal
+	await t
+
+func coroutine() -> void:
+	@warning_ignore("redundant_await")
+	await 0
+
+func not_coroutine_variant():
+	pass
+
+func not_coroutine_void() -> void:
+	pass
+
+func test():
+	const CONST_NULL = null
+	var var_null = null
+	var var_int: int = 1
+	var var_variant: Variant = 1
+	var var_array: Array = [1]
+
+	await CONST_NULL
+	await var_null
+	await var_int
+	await var_variant
+	await var_array[0]
+
+	await coroutine
+	await coroutine()
+	await coroutine.call()
+	await self.coroutine()
+	await call(&"coroutine")
+
+	await not_coroutine_variant
+	await not_coroutine_variant()
+	await self.not_coroutine_variant()
+	await not_coroutine_variant.call()
+	await call(&"not_coroutine_variant")
+
+	await not_coroutine_void
+	await not_coroutine_void()
+	await self.not_coroutine_void()
+	await not_coroutine_void.call()
+	await call(&"not_coroutine_void")
+
+	var callable: Callable = coroutine
+	await callable
+	await callable.call()
+	await callable.get_method()

+ 37 - 0
modules/gdscript/tests/scripts/analyzer/warnings/redundant_await.out

@@ -0,0 +1,37 @@
+GDTEST_OK
+>> WARNING
+>> Line: 26
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 28
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 32
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 38
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 44
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 45
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 46
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 51
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.
+>> WARNING
+>> Line: 53
+>> REDUNDANT_AWAIT
+>> "await" keyword not needed in this case, because the expression isn't a coroutine nor a signal.

+ 1 - 1
modules/gdscript/tests/scripts/runtime/features/await_without_coroutine.gd

@@ -4,5 +4,5 @@ func test():
 	print(await not_coroutine())
 	print(await not_coroutine())
 
 
 
 
-func not_coroutine():
+func not_coroutine() -> String:
 	return "awaited"
 	return "awaited"