Skip to content

Commit 37e9286

Browse files
committed
Provide context for warning, including type and name, when available
1 parent 55b0a8e commit 37e9286

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
@@ -1987,22 +1987,34 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
19871987
}
19881988

19891989
#if DEBUG_ENABLED
1990-
// TODO: Determine if specified type is deprecated, and emit warning if so
19911990
auto dd = EditorHelp::get_doc_data();
19921991
bool is_deprecated = false;
1992+
String new_value_type = "value";
1993+
String value_name = type.native_type;
19931994
switch (type.kind) {
19941995
case GDScriptParser::DataType::Kind::BUILTIN: // No built-in datatypes are deprecated.
19951996
break;
19961997
case GDScriptParser::DataType::Kind::NATIVE:
19971998
is_deprecated = dd && dd->class_list.has(type.native_type) && dd->class_list[type.native_type].is_deprecated;
1999+
new_value_type = "class";
19982000
break;
19992001
case GDScriptParser::DataType::Kind::SCRIPT: {
20002002
StringName class_name = type.script_type->get_doc_class_name();
20012003
is_deprecated = dd && dd->class_list.has(class_name) && dd->class_list[class_name].is_deprecated;
2004+
new_value_type = "class";
20022005
break;
20032006
}
20042007
case GDScriptParser::DataType::Kind::CLASS:
20052008
is_deprecated = type.class_type->doc_data.is_deprecated;
2009+
new_value_type = "class";
2010+
2011+
// TODO: Not recognizing the autoload name as a class type
2012+
// var my_var: MyAutoload # <--- not getting this name
2013+
if (type.class_type && type.class_type->identifier) {
2014+
value_name = type.class_type->identifier->name;
2015+
} else {
2016+
value_name = "";
2017+
}
20062018
break;
20072019
case GDScriptParser::DataType::Kind::ENUM: {
20082020
StringName enum_type = type.enum_type; // Something like MyEnum.
@@ -2015,13 +2027,14 @@ void GDScriptAnalyzer::resolve_assignable(GDScriptParser::AssignableNode *p_assi
20152027
is_deprecated = class_doc.enums[enum_type].is_deprecated;
20162028
}
20172029
}
2030+
new_value_type = "enum";
20182031
break;
20192032
}
20202033
default:
20212034
break;
20222035
}
20232036
if (is_deprecated) {
2024-
parser->push_warning(p_assignable, GDScriptWarning::DEPRECATED_IDENTIFIER);
2037+
parser->push_warning(p_assignable, GDScriptWarning::DEPRECATED_IDENTIFIER, new_value_type, value_name);
20252038
}
20262039
#endif
20272040

@@ -4055,7 +4068,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
40554068
for (const DocData::ConstantDoc &doc : dd->class_list[class_name].constants) {
40564069
if (doc.enumeration == base.enum_type && doc.name == name) {
40574070
if (doc.is_deprecated) {
4058-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4071+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum value", vformat("%s.%s", base.enum_type, doc.name));
40594072
}
40604073
break;
40614074
}
@@ -4209,7 +4222,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42094222
p_identifier->constant_source = member.constant;
42104223
#if DEBUG_ENABLED
42114224
if (member.constant->doc_data.is_deprecated) {
4212-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4225+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
42134226
}
42144227
#endif
42154228
return;
@@ -4222,7 +4235,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42224235
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
42234236
#if DEBUG_ENABLED
42244237
if (member.enum_value.doc_data.is_deprecated) {
4225-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4238+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum value", name);
42264239
}
42274240
#endif
42284241
return;
@@ -4235,7 +4248,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42354248
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
42364249
#if DEBUG_ENABLED
42374250
if (member.m_enum->doc_data.is_deprecated) {
4238-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4251+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum", name);
42394252
}
42404253
#endif
42414254
return;
@@ -4249,7 +4262,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42494262
member.variable->usages += 1;
42504263
#if DEBUG_ENABLED
42514264
if (member.variable->doc_data.is_deprecated) {
4252-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4265+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property or variable", name);
42534266
}
42544267
#endif
42554268
return;
@@ -4265,7 +4278,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42654278

42664279
#if DEBUG_ENABLED
42674280
if (member.signal->doc_data.is_deprecated) {
4268-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4281+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "signal", name);
42694282
}
42704283
#endif
42714284
return;
@@ -4287,7 +4300,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
42874300
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CLASS;
42884301
#ifdef DEBUG_ENABLED
42894302
if (script_class->get_member(name).m_class->doc_data.is_deprecated) {
4290-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4303+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
42914304
}
42924305
#endif
42934306
return;
@@ -4385,7 +4398,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
43854398
for (const DocData::PropertyDoc &doc : dd->class_list[native].properties) {
43864399
if (doc.name == name) {
43874400
if (doc.is_deprecated) {
4388-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4401+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property", name);
43894402
}
43904403
break;
43914404
}
@@ -4410,7 +4423,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44104423
for (const DocData::MethodDoc &doc : dd->class_list[native].signals) {
44114424
if (doc.name == name) {
44124425
if (doc.is_deprecated) {
4413-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4426+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "signal", name);
44144427
}
44154428
break;
44164429
}
@@ -4427,7 +4440,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44274440
if (dd && dd->class_list.has(native) && dd->class_list[native].enums.has(name)) {
44284441
DocData::EnumDoc doc = dd->class_list[native].enums[name];
44294442
if (doc.is_deprecated) {
4430-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4443+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "enum", name);
44314444
}
44324445
}
44334446
#endif
@@ -4447,7 +4460,7 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
44474460
for (const DocData::ConstantDoc &doc : dd->class_list[native].constants) {
44484461
if (doc.name == name) {
44494462
if (doc.is_deprecated) {
4450-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4463+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
44514464
}
44524465
break;
44534466
}
@@ -4510,7 +4523,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45104523

45114524
#ifdef DEBUG_ENABLED
45124525
if (p_identifier->constant_source->doc_data.is_deprecated) {
4513-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4526+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", p_identifier->name);
45144527
}
45154528
#endif
45164529
break;
@@ -4534,7 +4547,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45344547
}
45354548

45364549
if (p_identifier->variable_source->doc_data.is_deprecated) {
4537-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4550+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "property or variable", p_identifier->name);
45384551
}
45394552
#endif
45404553
break;
@@ -4657,7 +4670,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
46574670
DocTools *dd = EditorHelp::get_doc_data();
46584671
if (dd && dd->class_list.has(name)) {
46594672
if (dd->class_list[name].is_deprecated) {
4660-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4673+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
46614674
}
46624675
}
46634676
#endif
@@ -4671,7 +4684,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
46714684
DocTools *dd = EditorHelp::get_doc_data();
46724685
if (dd && dd->class_list.has(name)) {
46734686
if (dd->class_list[name].is_deprecated) {
4674-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4687+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
46754688
}
46764689
}
46774690
#endif
@@ -4719,7 +4732,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
47194732
DocTools *dd = EditorHelp::get_doc_data();
47204733
if (dd && dd->class_list.has(name)) {
47214734
if (dd->class_list[name].is_deprecated) {
4722-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4735+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "class", name);
47234736
}
47244737
}
47254738
#endif
@@ -4746,7 +4759,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
47464759
if (dd && dd->class_list.has("@GlobalScope")) {
47474760
for (const DocData::ConstantDoc &cd : dd->class_list["@GlobalScope"].constants) {
47484761
if (cd.name == name && cd.is_deprecated) {
4749-
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER);
4762+
parser->push_warning(p_identifier, GDScriptWarning::DEPRECATED_IDENTIFIER, "constant", name);
47504763
}
47514764
}
47524765
}
@@ -5947,7 +5960,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo
59475960
// For user-defined methods.
59485961
#ifdef DEBUG_ENABLED
59495962
if (found_function->doc_data.is_deprecated) {
5950-
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER);
5963+
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER, "function", found_function->identifier->name);
59515964
}
59525965
#endif
59535966
return true;
@@ -5999,7 +6012,7 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo
59996012
auto method_list = dd->class_list[base_native].methods;
60006013
for (int i = 0; i < method_list.size(); i++) {
60016014
if (method_list[i].name == function_name && method_list[i].is_deprecated) {
6002-
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER);
6015+
parser->push_warning(p_source, GDScriptWarning::DEPRECATED_IDENTIFIER, "function", function_name);
60036016
break;
60046017
}
60056018
}

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)