Skip to content

Commit fc082dd

Browse files
committed
Merge pull request #86091 from dalexeev/gds-fix-pot-gen-skips-some-nodes
GDScript: Fix POT generator skips some nodes
2 parents 26834d2 + 1aa242f commit fc082dd

File tree

2 files changed

+73
-52
lines changed

2 files changed

+73
-52
lines changed

modules/gdscript/editor/gdscript_translation_parser_plugin.cpp

Lines changed: 73 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ bool GDScriptEditorTranslationParserPlugin::_is_constant_string(const GDScriptPa
8080
void GDScriptEditorTranslationParserPlugin::_traverse_class(const GDScriptParser::ClassNode *p_class) {
8181
for (int i = 0; i < p_class->members.size(); i++) {
8282
const GDScriptParser::ClassNode::Member &m = p_class->members[i];
83-
// There are 7 types of Member, but only class, function and variable can contain translatable strings.
83+
// Other member types can't contain translatable strings.
8484
switch (m.type) {
8585
case GDScriptParser::ClassNode::Member::CLASS:
8686
_traverse_class(m.m_class);
@@ -89,7 +89,11 @@ void GDScriptEditorTranslationParserPlugin::_traverse_class(const GDScriptParser
8989
_traverse_function(m.function);
9090
break;
9191
case GDScriptParser::ClassNode::Member::VARIABLE:
92-
_read_variable(m.variable);
92+
_assess_expression(m.variable->initializer);
93+
if (m.variable->property == GDScriptParser::VariableNode::PROP_INLINE) {
94+
_traverse_function(m.variable->setter);
95+
_traverse_function(m.variable->getter);
96+
}
9397
break;
9498
default:
9599
break;
@@ -98,11 +102,14 @@ void GDScriptEditorTranslationParserPlugin::_traverse_class(const GDScriptParser
98102
}
99103

100104
void GDScriptEditorTranslationParserPlugin::_traverse_function(const GDScriptParser::FunctionNode *p_func) {
101-
_traverse_block(p_func->body);
102-
}
105+
if (!p_func) {
106+
return;
107+
}
103108

104-
void GDScriptEditorTranslationParserPlugin::_read_variable(const GDScriptParser::VariableNode *p_var) {
105-
_assess_expression(p_var->initializer);
109+
for (int i = 0; i < p_func->parameters.size(); i++) {
110+
_assess_expression(p_func->parameters[i]->initializer);
111+
}
112+
_traverse_block(p_func->body);
106113
}
107114

108115
void GDScriptEditorTranslationParserPlugin::_traverse_block(const GDScriptParser::SuiteNode *p_suite) {
@@ -114,53 +121,51 @@ void GDScriptEditorTranslationParserPlugin::_traverse_block(const GDScriptParser
114121
for (int i = 0; i < statements.size(); i++) {
115122
const GDScriptParser::Node *statement = statements[i];
116123

117-
// Statements with Node type constant, break, continue, pass, breakpoint are skipped because they can't contain translatable strings.
124+
// BREAK, BREAKPOINT, CONSTANT, CONTINUE, and PASS are skipped because they can't contain translatable strings.
118125
switch (statement->type) {
119-
case GDScriptParser::Node::VARIABLE:
120-
_assess_expression(static_cast<const GDScriptParser::VariableNode *>(statement)->initializer);
121-
break;
126+
case GDScriptParser::Node::ASSERT: {
127+
const GDScriptParser::AssertNode *assert_node = static_cast<const GDScriptParser::AssertNode *>(statement);
128+
_assess_expression(assert_node->condition);
129+
_assess_expression(assert_node->message);
130+
} break;
131+
case GDScriptParser::Node::ASSIGNMENT: {
132+
_assess_assignment(static_cast<const GDScriptParser::AssignmentNode *>(statement));
133+
} break;
134+
case GDScriptParser::Node::FOR: {
135+
const GDScriptParser::ForNode *for_node = static_cast<const GDScriptParser::ForNode *>(statement);
136+
_assess_expression(for_node->list);
137+
_traverse_block(for_node->loop);
138+
} break;
122139
case GDScriptParser::Node::IF: {
123140
const GDScriptParser::IfNode *if_node = static_cast<const GDScriptParser::IfNode *>(statement);
124141
_assess_expression(if_node->condition);
125-
//FIXME : if the elif logic is changed in GDScriptParser, then this probably will have to change as well. See GDScriptParser::TreePrinter::print_if().
126142
_traverse_block(if_node->true_block);
127143
_traverse_block(if_node->false_block);
128-
break;
129-
}
130-
case GDScriptParser::Node::FOR: {
131-
const GDScriptParser::ForNode *for_node = static_cast<const GDScriptParser::ForNode *>(statement);
132-
_assess_expression(for_node->list);
133-
_traverse_block(for_node->loop);
134-
break;
135-
}
136-
case GDScriptParser::Node::WHILE: {
137-
const GDScriptParser::WhileNode *while_node = static_cast<const GDScriptParser::WhileNode *>(statement);
138-
_assess_expression(while_node->condition);
139-
_traverse_block(while_node->loop);
140-
break;
141-
}
144+
} break;
142145
case GDScriptParser::Node::MATCH: {
143146
const GDScriptParser::MatchNode *match_node = static_cast<const GDScriptParser::MatchNode *>(statement);
144147
_assess_expression(match_node->test);
145148
for (int j = 0; j < match_node->branches.size(); j++) {
149+
_traverse_block(match_node->branches[j]->guard_body);
146150
_traverse_block(match_node->branches[j]->block);
147151
}
148-
break;
149-
}
150-
case GDScriptParser::Node::RETURN:
152+
} break;
153+
case GDScriptParser::Node::RETURN: {
151154
_assess_expression(static_cast<const GDScriptParser::ReturnNode *>(statement)->return_value);
152-
break;
153-
case GDScriptParser::Node::ASSERT:
154-
_assess_expression((static_cast<const GDScriptParser::AssertNode *>(statement))->condition);
155-
break;
156-
case GDScriptParser::Node::ASSIGNMENT:
157-
_assess_assignment(static_cast<const GDScriptParser::AssignmentNode *>(statement));
158-
break;
159-
default:
155+
} break;
156+
case GDScriptParser::Node::VARIABLE: {
157+
_assess_expression(static_cast<const GDScriptParser::VariableNode *>(statement)->initializer);
158+
} break;
159+
case GDScriptParser::Node::WHILE: {
160+
const GDScriptParser::WhileNode *while_node = static_cast<const GDScriptParser::WhileNode *>(statement);
161+
_assess_expression(while_node->condition);
162+
_traverse_block(while_node->loop);
163+
} break;
164+
default: {
160165
if (statement->is_expression()) {
161166
_assess_expression(static_cast<const GDScriptParser::ExpressionNode *>(statement));
162167
}
163-
break;
168+
} break;
164169
}
165170
}
166171
}
@@ -172,49 +177,66 @@ void GDScriptEditorTranslationParserPlugin::_assess_expression(const GDScriptPar
172177
return;
173178
}
174179

175-
// ExpressionNode of type await, cast, get_node, identifier, literal, preload, self, subscript, unary are ignored as they can't be CallNode
176-
// containing translation strings.
180+
// GET_NODE, IDENTIFIER, LITERAL, PRELOAD, SELF, and TYPE are skipped because they can't contain translatable strings.
177181
switch (p_expression->type) {
178182
case GDScriptParser::Node::ARRAY: {
179183
const GDScriptParser::ArrayNode *array_node = static_cast<const GDScriptParser::ArrayNode *>(p_expression);
180184
for (int i = 0; i < array_node->elements.size(); i++) {
181185
_assess_expression(array_node->elements[i]);
182186
}
183-
break;
184-
}
185-
case GDScriptParser::Node::ASSIGNMENT:
187+
} break;
188+
case GDScriptParser::Node::ASSIGNMENT: {
186189
_assess_assignment(static_cast<const GDScriptParser::AssignmentNode *>(p_expression));
187-
break;
190+
} break;
191+
case GDScriptParser::Node::AWAIT: {
192+
_assess_expression(static_cast<const GDScriptParser::AwaitNode *>(p_expression)->to_await);
193+
} break;
188194
case GDScriptParser::Node::BINARY_OPERATOR: {
189195
const GDScriptParser::BinaryOpNode *binary_op_node = static_cast<const GDScriptParser::BinaryOpNode *>(p_expression);
190196
_assess_expression(binary_op_node->left_operand);
191197
_assess_expression(binary_op_node->right_operand);
192-
break;
193-
}
198+
} break;
194199
case GDScriptParser::Node::CALL: {
195200
const GDScriptParser::CallNode *call_node = static_cast<const GDScriptParser::CallNode *>(p_expression);
196201
_extract_from_call(call_node);
197202
for (int i = 0; i < call_node->arguments.size(); i++) {
198203
_assess_expression(call_node->arguments[i]);
199204
}
200205
} break;
206+
case GDScriptParser::Node::CAST: {
207+
_assess_expression(static_cast<const GDScriptParser::CastNode *>(p_expression)->operand);
208+
} break;
201209
case GDScriptParser::Node::DICTIONARY: {
202210
const GDScriptParser::DictionaryNode *dict_node = static_cast<const GDScriptParser::DictionaryNode *>(p_expression);
203211
for (int i = 0; i < dict_node->elements.size(); i++) {
204212
_assess_expression(dict_node->elements[i].key);
205213
_assess_expression(dict_node->elements[i].value);
206214
}
207-
break;
208-
}
215+
} break;
216+
case GDScriptParser::Node::LAMBDA: {
217+
_traverse_function(static_cast<const GDScriptParser::LambdaNode *>(p_expression)->function);
218+
} break;
219+
case GDScriptParser::Node::SUBSCRIPT: {
220+
const GDScriptParser::SubscriptNode *subscript_node = static_cast<const GDScriptParser::SubscriptNode *>(p_expression);
221+
_assess_expression(subscript_node->base);
222+
if (!subscript_node->is_attribute) {
223+
_assess_expression(subscript_node->index);
224+
}
225+
} break;
209226
case GDScriptParser::Node::TERNARY_OPERATOR: {
210227
const GDScriptParser::TernaryOpNode *ternary_op_node = static_cast<const GDScriptParser::TernaryOpNode *>(p_expression);
211228
_assess_expression(ternary_op_node->condition);
212229
_assess_expression(ternary_op_node->true_expr);
213230
_assess_expression(ternary_op_node->false_expr);
214-
break;
215-
}
216-
default:
217-
break;
231+
} break;
232+
case GDScriptParser::Node::TYPE_TEST: {
233+
_assess_expression(static_cast<const GDScriptParser::TypeTestNode *>(p_expression)->operand);
234+
} break;
235+
case GDScriptParser::Node::UNARY_OPERATOR: {
236+
_assess_expression(static_cast<const GDScriptParser::UnaryOpNode *>(p_expression)->operand);
237+
} break;
238+
default: {
239+
} break;
218240
}
219241
}
220242

modules/gdscript/editor/gdscript_translation_parser_plugin.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ class GDScriptEditorTranslationParserPlugin : public EditorTranslationParserPlug
5959
void _traverse_function(const GDScriptParser::FunctionNode *p_func);
6060
void _traverse_block(const GDScriptParser::SuiteNode *p_suite);
6161

62-
void _read_variable(const GDScriptParser::VariableNode *p_var);
6362
void _assess_expression(const GDScriptParser::ExpressionNode *p_expression);
6463
void _assess_assignment(const GDScriptParser::AssignmentNode *p_assignment);
6564
void _extract_from_call(const GDScriptParser::CallNode *p_call);

0 commit comments

Comments
 (0)