GDScript: Check `get_node()` shorthand in static functions

(cherry picked from commit 0f27c4ad80)
This commit is contained in:
Danil Alexeev 2023-06-22 12:19:14 +03:00 committed by Yuri Sizov
parent efa82d5025
commit d5a11e17b8
5 changed files with 26 additions and 10 deletions

View File

@ -3294,17 +3294,26 @@ void GDScriptAnalyzer::reduce_dictionary(GDScriptParser::DictionaryNode *p_dicti
void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) { void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) {
GDScriptParser::DataType result; GDScriptParser::DataType result;
result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; result.kind = GDScriptParser::DataType::VARIANT;
result.kind = GDScriptParser::DataType::NATIVE;
result.native_type = SNAME("Node");
result.builtin_type = Variant::OBJECT;
if (!ClassDB::is_parent_class(parser->current_class->base_type.native_type, result.native_type)) { if (!ClassDB::is_parent_class(parser->current_class->base_type.native_type, SNAME("Node"))) {
push_error(R"*(Cannot use shorthand "get_node()" notation ("$") on a class that isn't a node.)*", p_get_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(); 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); p_get_node->set_datatype(result);
} }

View File

@ -3033,10 +3033,8 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p
if (previous.type == GDScriptTokenizer::Token::DOLLAR) { if (previous.type == GDScriptTokenizer::Token::DOLLAR) {
// Detect initial slash, which will be handled in the loop if it matches. // Detect initial slash, which will be handled in the loop if it matches.
match(GDScriptTokenizer::Token::SLASH); match(GDScriptTokenizer::Token::SLASH);
#ifdef DEBUG_ENABLED
} else { } else {
get_node->use_dollar = false; get_node->use_dollar = false;
#endif
} }
int context_argument = 0; int context_argument = 0;

View File

@ -834,9 +834,7 @@ public:
struct GetNodeNode : public ExpressionNode { struct GetNodeNode : public ExpressionNode {
String full_path; String full_path;
#ifdef DEBUG_ENABLED
bool use_dollar = true; bool use_dollar = true;
#endif
GetNodeNode() { GetNodeNode() {
type = GET_NODE; type = GET_NODE;

View File

@ -0,0 +1,9 @@
# GH-75645
extends Node
static func static_func():
var a = $Node
func test():
pass

View File

@ -0,0 +1,2 @@
GDTEST_ANALYZER_ERROR
Cannot use shorthand "get_node()" notation ("$") in a static function.