Browse Source

Check if any global script class is shadowed by a variable

Chia-Hsiang Cheng 2 years ago
parent
commit
ceda13720b

+ 5 - 1
modules/gdscript/gdscript_analyzer.cpp

@@ -5036,7 +5036,11 @@ void GDScriptAnalyzer::is_shadowing(GDScriptParser::IdentifierNode *p_identifier
 			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function");
 			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function");
 			return;
 			return;
 		} else if (ClassDB::class_exists(name)) {
 		} else if (ClassDB::class_exists(name)) {
-			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "global class");
+			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "native class");
+			return;
+		} else if (ScriptServer::is_global_class(name)) {
+			String class_path = ScriptServer::get_global_class_path(name).get_file();
+			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, vformat(R"(global class defined in "%s")", class_path));
 			return;
 			return;
 		} else if (GDScriptParser::get_builtin_type(name) != Variant::VARIANT_MAX) {
 		} else if (GDScriptParser::get_builtin_type(name) != Variant::VARIANT_MAX) {
 			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in type");
 			parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in type");

+ 3 - 0
modules/gdscript/tests/scripts/analyzer/warnings/shadowning.gd

@@ -1,3 +1,5 @@
+class_name ShadowedClass
+
 var member: int = 0
 var member: int = 0
 
 
 var print_debug := 'print_debug'
 var print_debug := 'print_debug'
@@ -12,5 +14,6 @@ func test():
 	var sqrt := 'sqrt'
 	var sqrt := 'sqrt'
 	var member := 'member'
 	var member := 'member'
 	var reference := 'reference'
 	var reference := 'reference'
+	var ShadowedClass := 'ShadowedClass'
 
 
 	print('warn')
 	print('warn')

+ 13 - 9
modules/gdscript/tests/scripts/analyzer/warnings/shadowning.out

@@ -1,30 +1,34 @@
 GDTEST_OK
 GDTEST_OK
 >> WARNING
 >> WARNING
->> Line: 3
+>> Line: 5
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> The variable "print_debug" has the same name as a built-in function.
 >> The variable "print_debug" has the same name as a built-in function.
 >> WARNING
 >> WARNING
->> Line: 9
+>> Line: 11
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> The variable "Array" has the same name as a built-in type.
 >> The variable "Array" has the same name as a built-in type.
 >> WARNING
 >> WARNING
->> Line: 10
+>> Line: 12
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> SHADOWED_GLOBAL_IDENTIFIER
->> The variable "Node" has the same name as a global class.
+>> The variable "Node" has the same name as a native class.
 >> WARNING
 >> WARNING
->> Line: 11
+>> Line: 13
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> The variable "is_same" has the same name as a built-in function.
 >> The variable "is_same" has the same name as a built-in function.
 >> WARNING
 >> WARNING
->> Line: 12
+>> Line: 14
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> SHADOWED_GLOBAL_IDENTIFIER
 >> The variable "sqrt" has the same name as a built-in function.
 >> The variable "sqrt" has the same name as a built-in function.
 >> WARNING
 >> WARNING
->> Line: 13
+>> Line: 15
 >> SHADOWED_VARIABLE
 >> SHADOWED_VARIABLE
->> The local variable "member" is shadowing an already-declared variable at line 1.
+>> The local variable "member" is shadowing an already-declared variable at line 3.
 >> WARNING
 >> WARNING
->> Line: 14
+>> Line: 16
 >> SHADOWED_VARIABLE_BASE_CLASS
 >> SHADOWED_VARIABLE_BASE_CLASS
 >> The local variable "reference" is shadowing an already-declared method at the base class "RefCounted".
 >> The local variable "reference" is shadowing an already-declared method at the base class "RefCounted".
+>> WARNING
+>> Line: 17
+>> SHADOWED_GLOBAL_IDENTIFIER
+>> The variable "ShadowedClass" has the same name as a global class defined in "shadowning.gd".
 warn
 warn