Merge pull request #72677 from dalexeev/gds-await-infer-type

GDScript: Fix `await` type inference
This commit is contained in:
Yuri Sizov 2023-02-06 23:32:28 +03:00 committed by GitHub
commit c0edea37ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 13 deletions

View File

@ -2471,30 +2471,27 @@ void GDScriptAnalyzer::reduce_await(GDScriptParser::AwaitNode *p_await) {
return; return;
} }
GDScriptParser::DataType awaiting_type;
if (p_await->to_await->type == GDScriptParser::Node::CALL) { if (p_await->to_await->type == GDScriptParser::Node::CALL) {
reduce_call(static_cast<GDScriptParser::CallNode *>(p_await->to_await), true); reduce_call(static_cast<GDScriptParser::CallNode *>(p_await->to_await), true);
awaiting_type = p_await->to_await->get_datatype();
} else { } else {
reduce_expression(p_await->to_await); reduce_expression(p_await->to_await);
} }
if (p_await->to_await->is_constant) { GDScriptParser::DataType await_type = p_await->to_await->get_datatype();
// We cannot infer the type of the result of waiting for a signal.
if (await_type.is_hard_type() && await_type.kind == GDScriptParser::DataType::BUILTIN && await_type.builtin_type == Variant::SIGNAL) {
await_type.kind = GDScriptParser::DataType::VARIANT;
await_type.type_source = GDScriptParser::DataType::UNDETECTED;
} else if (p_await->to_await->is_constant) {
p_await->is_constant = p_await->to_await->is_constant; p_await->is_constant = p_await->to_await->is_constant;
p_await->reduced_value = p_await->to_await->reduced_value; p_await->reduced_value = p_await->to_await->reduced_value;
awaiting_type = p_await->to_await->get_datatype();
} else {
awaiting_type.kind = GDScriptParser::DataType::VARIANT;
awaiting_type.type_source = GDScriptParser::DataType::UNDETECTED;
} }
await_type.is_coroutine = false;
p_await->set_datatype(awaiting_type); p_await->set_datatype(await_type);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
awaiting_type = p_await->to_await->get_datatype(); GDScriptParser::DataType to_await_type = p_await->to_await->get_datatype();
if (!(awaiting_type.has_no_type() || awaiting_type.is_coroutine || awaiting_type.builtin_type == Variant::SIGNAL)) { if (!(to_await_type.has_no_type() || to_await_type.is_coroutine || 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

View File

@ -0,0 +1,4 @@
signal my_signal()
func test():
var _a := await my_signal

View File

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

View File

@ -0,0 +1,15 @@
func coroutine() -> int:
@warning_ignore("redundant_await")
await 0
return 1
func not_coroutine() -> int:
return 2
func test():
var a := await coroutine()
@warning_ignore("redundant_await")
var b := await not_coroutine()
@warning_ignore("redundant_await")
var c := await 3
prints(a, b, c)

View File

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