GDScript: Fix `STANDALONE_EXPRESSION` warning for `preload()`

This commit is contained in:
Danil Alexeev 2024-05-16 22:11:56 +03:00
parent 5708a3a02e
commit 7dd801c580
No known key found for this signature in database
GPG Key ID: 124453E157DA8DC7
8 changed files with 30 additions and 7 deletions

View File

@ -554,10 +554,10 @@
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when defining a local or subclass member variable that would shadow a variable that is inherited from a parent class.
</member>
<member name="debug/gdscript/warnings/standalone_expression" type="int" setter="" getter="" default="1">
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling an expression that has no effect on the surrounding code, such as writing [code]2 + 2[/code] as a statement.
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling an expression that may have no effect on the surrounding code, such as writing [code]2 + 2[/code] as a statement.
</member>
<member name="debug/gdscript/warnings/standalone_ternary" type="int" setter="" getter="" default="1">
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a ternary expression that has no effect on the surrounding code, such as writing [code]42 if active else 0[/code] as a statement.
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a ternary expression that may have no effect on the surrounding code, such as writing [code]42 if active else 0[/code] as a statement.
</member>
<member name="debug/gdscript/warnings/static_called_on_instance" type="int" setter="" getter="" default="1">
When set to [code]warn[/code] or [code]error[/code], produces a warning or an error respectively when calling a static method from an instance of a class instead of from the class directly.

View File

@ -3394,6 +3394,7 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
}
#ifdef DEBUG_ENABLED
// FIXME: No warning for built-in constructors and utilities due to early return.
if (p_is_root && return_type.kind != GDScriptParser::DataType::UNRESOLVED && return_type.builtin_type != Variant::NIL &&
!(p_call->is_super && p_call->function_name == GDScriptLanguage::get_singleton()->strings._init)) {
parser->push_warning(p_call, GDScriptWarning::RETURN_VALUE_DISCARDED, p_call->function_name);

View File

@ -1877,6 +1877,10 @@ GDScriptParser::Node *GDScriptParser::parse_statement() {
case Node::CALL:
// Fine.
break;
case Node::PRELOAD:
// `preload` is a function-like keyword.
push_warning(expression, GDScriptWarning::RETURN_VALUE_DISCARDED, "preload");
break;
case Node::LAMBDA:
// Standalone lambdas can't be used, so make this an error.
push_error("Standalone lambdas cannot be accessed. Consider assigning it to a variable.", expression);

View File

@ -74,7 +74,7 @@ String GDScriptWarning::get_message() const {
case UNREACHABLE_PATTERN:
return "Unreachable pattern (pattern after wildcard or bind).";
case STANDALONE_EXPRESSION:
return "Standalone expression (the line has no effect).";
return "Standalone expression (the line may have no effect).";
case STANDALONE_TERNARY:
return "Standalone ternary operator: the return value is being discarded.";
case INCOMPATIBLE_TERNARY:

View File

@ -4,3 +4,4 @@ func i_return_int() -> int:
func test():
i_return_int()
preload("../../utils.notest.gd") # `preload` is a function-like keyword.

View File

@ -3,3 +3,7 @@ GDTEST_OK
>> Line: 6
>> RETURN_VALUE_DISCARDED
>> The function "i_return_int()" returns a value that will be discarded if not used.
>> WARNING
>> Line: 7
>> RETURN_VALUE_DISCARDED
>> The function "preload()" returns a value that will be discarded if not used.

View File

@ -6,3 +6,16 @@ func test():
Vector3.ZERO
[true, false]
float(125)
# The following statements should not produce `STANDALONE_EXPRESSION`:
var _a = 1
_a = 2 # Assignment is a local (or global) side effect.
@warning_ignore("redundant_await")
await 3 # The `await` operand is usually a coroutine or a signal.
absi(4) # A call (in general) can have side effects.
@warning_ignore("return_value_discarded")
preload("../../utils.notest.gd") # A static initializer may have side effects.
"""
Python-like "comment".
"""
@warning_ignore("standalone_ternary")
1 if 2 else 3 # Produces `STANDALONE_TERNARY` instead.

View File

@ -2,16 +2,16 @@ GDTEST_OK
>> WARNING
>> Line: 3
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> Standalone expression (the line may have no effect).
>> WARNING
>> Line: 4
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> Standalone expression (the line may have no effect).
>> WARNING
>> Line: 6
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> Standalone expression (the line may have no effect).
>> WARNING
>> Line: 7
>> STANDALONE_EXPRESSION
>> Standalone expression (the line has no effect).
>> Standalone expression (the line may have no effect).