Skip to content

Commit

Permalink
Merge pull request #78552 from dalexeev/gds-check-get-node-in-static-…
Browse files Browse the repository at this point in the history
…func

GDScript: Check `get_node()` shorthand in static functions
  • Loading branch information
akien-mga committed Aug 17, 2023
2 parents 229af8e + 0f27c4a commit 4f00f92
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 10 deletions.
21 changes: 15 additions & 6 deletions modules/gdscript/gdscript_analyzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3301,17 +3301,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, 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 (!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 (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);
}

Expand Down
2 changes: 0 additions & 2 deletions modules/gdscript/gdscript_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3035,10 +3035,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;
Expand Down
2 changes: 0 additions & 2 deletions modules/gdscript/gdscript_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -848,9 +848,7 @@ class GDScriptParser {

struct GetNodeNode : public ExpressionNode {
String full_path;
#ifdef DEBUG_ENABLED
bool use_dollar = true;
#endif

GetNodeNode() {
type = GET_NODE;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# GH-75645

extends Node

static func static_func():
var a = $Node

func test():
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
GDTEST_ANALYZER_ERROR
Cannot use shorthand "get_node()" notation ("$") in a static function.

0 comments on commit 4f00f92

Please sign in to comment.