GDScript: Check `get_node()` shorthand in static functions
(cherry picked from commit 0f27c4ad80
)
This commit is contained in:
parent
efa82d5025
commit
d5a11e17b8
|
@ -3294,17 +3294,26 @@ void GDScriptAnalyzer::reduce_dictionary(GDScriptParser::DictionaryNode *p_dicti
|
|||
|
||||
void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) {
|
||||
GDScriptParser::DataType result;
|
||||
result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
|
||||
result.kind = GDScriptParser::DataType::NATIVE;
|
||||
result.native_type = SNAME("Node");
|
||||
result.builtin_type = Variant::OBJECT;
|
||||
result.kind = GDScriptParser::DataType::VARIANT;
|
||||
|
||||
if (!ClassDB::is_parent_class(parser->current_class->base_type.native_type, result.native_type)) {
|
||||
push_error(R"*(Cannot use shorthand "get_node()" notation ("$") on a class that isn't a node.)*", p_get_node);
|
||||
if (!ClassDB::is_parent_class(parser->current_class->base_type.native_type, SNAME("Node"))) {
|
||||
push_error(vformat(R"*(Cannot use shorthand "get_node()" notation ("%c") on a class that isn't a node.)*", p_get_node->use_dollar ? '$' : '%'), p_get_node);
|
||||
p_get_node->set_datatype(result);
|
||||
return;
|
||||
}
|
||||
|
||||
if (static_context) {
|
||||
push_error(vformat(R"*(Cannot use shorthand "get_node()" notation ("%c") in a static function.)*", p_get_node->use_dollar ? '$' : '%'), p_get_node);
|
||||
p_get_node->set_datatype(result);
|
||||
return;
|
||||
}
|
||||
|
||||
mark_lambda_use_self();
|
||||
|
||||
result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
|
||||
result.kind = GDScriptParser::DataType::NATIVE;
|
||||
result.builtin_type = Variant::OBJECT;
|
||||
result.native_type = SNAME("Node");
|
||||
p_get_node->set_datatype(result);
|
||||
}
|
||||
|
||||
|
|
|
@ -3033,10 +3033,8 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p
|
|||
if (previous.type == GDScriptTokenizer::Token::DOLLAR) {
|
||||
// Detect initial slash, which will be handled in the loop if it matches.
|
||||
match(GDScriptTokenizer::Token::SLASH);
|
||||
#ifdef DEBUG_ENABLED
|
||||
} else {
|
||||
get_node->use_dollar = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
int context_argument = 0;
|
||||
|
|
|
@ -834,9 +834,7 @@ public:
|
|||
|
||||
struct GetNodeNode : public ExpressionNode {
|
||||
String full_path;
|
||||
#ifdef DEBUG_ENABLED
|
||||
bool use_dollar = true;
|
||||
#endif
|
||||
|
||||
GetNodeNode() {
|
||||
type = GET_NODE;
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
# GH-75645
|
||||
|
||||
extends Node
|
||||
|
||||
static func static_func():
|
||||
var a = $Node
|
||||
|
||||
func test():
|
||||
pass
|
|
@ -0,0 +1,2 @@
|
|||
GDTEST_ANALYZER_ERROR
|
||||
Cannot use shorthand "get_node()" notation ("$") in a static function.
|
Loading…
Reference in New Issue