Skip to content

Commit 05a1d75

Browse files
committed
Provide context for warning, including type and name, when available
1 parent 204aba1 commit 05a1d75

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

modules/gdscript/gdscript_analyzer.cpp

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,22 +1998,34 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
19981998
}
19991999

20002000
#if DEBUG_ENABLED
2001-
// TODO: Determine if specified type is deprecated, and emit warning if so
20022001
auto dd = EditorHelp::get_doc_data();
20032002
bool is_deprecated = false;
2003+
String new_value_type = "value";
2004+
String value_name = type.native_type;
20042005
switch (type.kind) {
20052006
case GDScriptParser::DataType::Kind::BUILTIN: // No built-in datatypes are deprecated.
20062007
break;
20072008
case GDScriptParser::DataType::Kind::NATIVE:
20082009
is_deprecated = dd && dd->class_list.has(type.native_type) && dd->class_list[type.native_type].is_deprecated;
2010+
new_value_type = "class";
20092011
break;
20102012
case GDScriptParser::DataType::Kind::SCRIPT: {
20112013
StringName class_name = type.script_type->get_doc_class_name();
20122014
is_deprecated = dd && dd->class_list.has(class_name) && dd->class_list[class_name].is_deprecated;
2015+
new_value_type = "class";
20132016
break;
20142017
}
20152018
case GDScriptParser::DataType::Kind::CLASS:
20162019
is_deprecated = type.class_type->doc_data.is_deprecated;
2020+
new_value_type = "class";
2021+
2022+
// TODO: Not recognizing the autoload name as a class type
2023+
// var my_var: MyAutoload # <--- not getting this name
2024+
if (type.class_type && type.class_type->identifier) {
2025+
value_name = type.class_type->identifier->name;
2026+
} else {
2027+
value_name = "";
2028+
}
20172029
break;
20182030
case GDScriptParser::DataType::Kind::ENUM: {
20192031
StringName enum_type = type.enum_type; // Something like MyEnum.
@@ -2026,13 +2038,14 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
20262038
is_deprecated = class_doc.enums[enum_type].is_deprecated;
20272039
}
20282040
}
2041+
new_value_type = "enum";
20292042
break;
20302043
}
20312044
default:
20322045
break;
20332046
}
20342047
if (is_deprecated) {
2035-
parser->push_warning(p_assignable, GDScriptWarning::DEPRECATED_IDENTIFIER);
2048+
parser->push_warning(p_assignable, GDScriptWarning::DEPRECATED_IDENTIFIER, new_value_type, value_name);
20362049
}
20372050
#endif
20382051

@@ -4066,7 +4079,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
40664079
for (const DocData::ConstantDoc &doc : dd->class_list[class_name].constants) {
40674080
if (doc.enumeration == base.enum_type && doc.name == name) {
40684081
if (doc.is_deprecated) {
4069-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4082+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum value", vformat("%s.%s", base.enum_type, doc.name));
40704083
}
40714084
break;
40724085
}
@@ -4220,7 +4233,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42204233
p_identifier->constant_source = member.constant;
42214234
#if DEBUG_ENABLED
42224235
if (member.constant->doc_data.is_deprecated) {
4223-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4236+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
42244237
}
42254238
#endif
42264239
return;
@@ -4233,7 +4246,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42334246
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
42344247
#if DEBUG_ENABLED
42354248
if (member.enum_value.doc_data.is_deprecated) {
4236-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4249+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum value", name);
42374250
}
42384251
#endif
42394252
return;
@@ -4246,7 +4259,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42464259
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
42474260
#if DEBUG_ENABLED
42484261
if (member.m_enum->doc_data.is_deprecated) {
4249-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4262+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum", name);
42504263
}
42514264
#endif
42524265
return;
@@ -4260,7 +4273,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42604273
member.variable->usages += 1;
42614274
#if DEBUG_ENABLED
42624275
if (member.variable->doc_data.is_deprecated) {
4263-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4276+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property or variable", name);
42644277
}
42654278
#endif
42664279
return;
@@ -4276,7 +4289,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42764289

42774290
#if DEBUG_ENABLED
42784291
if (member.signal->doc_data.is_deprecated) {
4279-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4292+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "signal", name);
42804293
}
42814294
#endif
42824295
return;
@@ -4298,7 +4311,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42984311
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CLASS;
42994312
#ifdef DEBUG_ENABLED
43004313
if (script_class->get_member(name).m_class->doc_data.is_deprecated) {
4301-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4314+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
43024315
}
43034316
#endif
43044317
return;
@@ -4396,7 +4409,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
43964409
for (const DocData::PropertyDoc &doc : dd->class_list[native].properties) {
43974410
if (doc.name == name) {
43984411
if (doc.is_deprecated) {
4399-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4412+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property", name);
44004413
}
44014414
break;
44024415
}
@@ -4421,7 +4434,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44214434
for (const DocData::MethodDoc &doc : dd->class_list[native].signals) {
44224435
if (doc.name == name) {
44234436
if (doc.is_deprecated) {
4424-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4437+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "signal", name);
44254438
}
44264439
break;
44274440
}
@@ -4438,7 +4451,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44384451
if (dd && dd->class_list.has(native) && dd->class_list[native].enums.has(name)) {
44394452
DocData::EnumDoc doc = dd->class_list[native].enums[name];
44404453
if (doc.is_deprecated) {
4441-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4454+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum", name);
44424455
}
44434456
}
44444457
#endif
@@ -4458,7 +4471,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44584471
for (const DocData::ConstantDoc &doc : dd->class_list[native].constants) {
44594472
if (doc.name == name) {
44604473
if (doc.is_deprecated) {
4461-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4474+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
44624475
}
44634476
break;
44644477
}
@@ -4521,7 +4534,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45214534

45224535
#ifdef DEBUG_ENABLED
45234536
if (p_identifier->constant_source->doc_data.is_deprecated) {
4524-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4537+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", p_identifier->name);
45254538
}
45264539
#endif
45274540
break;
@@ -4545,7 +4558,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45454558
}
45464559

45474560
if (p_identifier->variable_source->doc_data.is_deprecated) {
4548-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4561+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property or variable", p_identifier->name);
45494562
}
45504563
#endif
45514564
break;
@@ -4668,7 +4681,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
46684681
DocTools *dd = EditorHelp::get_doc_data();
46694682
if (dd && dd->class_list.has(name)) {
46704683
if (dd->class_list[name].is_deprecated) {
4671-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4684+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
46724685
}
46734686
}
46744687
#endif
@@ -4682,7 +4695,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
46824695
DocTools *dd = EditorHelp::get_doc_data();
46834696
if (dd && dd->class_list.has(name)) {
46844697
if (dd->class_list[name].is_deprecated) {
4685-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4698+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
46864699
}
46874700
}
46884701
#endif
@@ -4730,7 +4743,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
47304743
DocTools *dd = EditorHelp::get_doc_data();
47314744
if (dd && dd->class_list.has(name)) {
47324745
if (dd->class_list[name].is_deprecated) {
4733-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4746+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
47344747
}
47354748
}
47364749
#endif
@@ -4757,7 +4770,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
47574770
if (dd && dd->class_list.has("@GlobalScope")) {
47584771
for (const DocData::ConstantDoc &cd : dd->class_list["@GlobalScope"].constants) {
47594772
if (cd.name == name && cd.is_deprecated) {
4760-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4773+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
47614774
}
47624775
}
47634776
}
@@ -5958,7 +5971,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo
59585971
// For user-defined methods.
59595972
#ifdef DEBUG_ENABLED
59605973
if (found_function->doc_data.is_deprecated) {
5961-
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER);
5974+
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER, "function", found_function->identifier->name);
59625975
}
59635976
#endif
59645977
return true;
@@ -6010,7 +6023,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo
60106023
auto method_list = dd->class_list[base_native].methods;
60116024
for (int i = 0; i < method_list.size(); i++) {
60126025
if (method_list[i].name == function_name && method_list[i].is_deprecated) {
6013-
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER);
6026+
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER, "function", function_name);
60146027
break;
60156028
}
60166029
}

modules/gdscript/gdscript_warning.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,14 @@ String GDScriptWarning::get_message() const {
162162
return vformat(R"*(The default value is using "%s" which won't return nodes in the scene tree before "_ready()" is called. Use the "@onready" annotation to solve this.)*", symbols[0]);
163163
case ONREADY_WITH_EXPORT:
164164
return R"("@onready" will set the default value after "@export" takes effect and will override it.)";
165-
case DEPRECATED_IDENTIFIER:
166-
return R"(This identifier is deprecated. See its documentation for more information and alternatives.)";
165+
case DEPRECATED_IDENTIFIER: {
166+
CHECK_SYMBOLS(2);
167+
String name = "";
168+
if (symbols[1].length() > 0) {
169+
name = vformat(R"( "%s")", symbols[1]);
170+
}
171+
return vformat(R"(The %s%s is deprecated. See its documentation for more information and alternatives.)", symbols[0], name);
172+
}
167173
#ifndef DISABLE_DEPRECATED
168174
// Never produced. These warnings migrated from 3.x by mistake.
169175
case PROPERTY_USED_AS_FUNCTION: // There is already an error.

0 commit comments

Comments
 (0)