Ver Fonte

GDScript: Fix inheritance check of @onready for inner classes

George Marques há 2 anos atrás
pai
commit
ed5ddab7e5

+ 1 - 1
modules/gdscript/gdscript_parser.cpp

@@ -3619,7 +3619,7 @@ bool GDScriptParser::icon_annotation(const AnnotationNode *p_annotation, Node *p
 bool GDScriptParser::onready_annotation(const AnnotationNode *p_annotation, Node *p_node) {
 	ERR_FAIL_COND_V_MSG(p_node->type != Node::VARIABLE, false, R"("@onready" annotation can only be applied to class variables.)");
 
-	if (head && !ClassDB::is_parent_class(head->get_datatype().native_type, SNAME("Node"))) {
+	if (current_class && !ClassDB::is_parent_class(current_class->get_datatype().native_type, SNAME("Node"))) {
 		push_error(R"("@onready" can only be used in classes that inherit "Node".)", p_annotation);
 	}
 

+ 7 - 0
modules/gdscript/tests/scripts/analyzer/errors/onready_within_non_node_inner_class.gd

@@ -0,0 +1,7 @@
+extends Node
+
+class Inner extends RefCounted:
+	@onready var nope = 0
+
+func test():
+	print("Cannot use @onready without a Node base")

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/errors/onready_within_non_node_inner_class.out

@@ -0,0 +1,2 @@
+GDTEST_ANALYZER_ERROR
+"@onready" can only be used in classes that inherit "Node".

+ 7 - 0
modules/gdscript/tests/scripts/analyzer/features/onready_on_inner_class_with_non_node_outer.gd

@@ -0,0 +1,7 @@
+extends RefCounted
+
+func test():
+	print("ok")
+
+class Inner extends Node:
+	@onready var okay = 0

+ 2 - 0
modules/gdscript/tests/scripts/analyzer/features/onready_on_inner_class_with_non_node_outer.out

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