Skip to content

Commit cef62c6

Browse files
committed
Fix signal refactor
1 parent 517e032 commit cef62c6

File tree

4 files changed

+66
-17
lines changed

4 files changed

+66
-17
lines changed

modules/gdscript/gdscript_editor.cpp

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5154,23 +5154,55 @@ ::Error GDScriptLanguage::refactor_rename_symbol_code(const String &p_code, cons
51545154
REFACTOR_RENAME_RETURN(ERR_CANT_RESOLVE);
51555155
}
51565156

5157-
if (context.identifier != nullptr) {
5158-
RefactorRenameSymbolDefinintionType enum_type = context.identifier_is_enum_value
5159-
? RefactorRenameSymbolDefinintionType::REFACTOR_RENAME_SYMBOL_DEFINITION_TYPE_ENUM_VALUE
5160-
: RefactorRenameSymbolDefinintionType::REFACTOR_RENAME_SYMBOL_DEFINITION_TYPE_ENUM;
5161-
Error enum_err = _refactor_rename_symbol_match_from_class(context, symbol, p_path, base_type.script_path, p_unsaved_scripts_source_code, r_result, enum_type, context.node);
5162-
REFACTOR_RENAME_RETURN(enum_err);
5157+
if (context.identifier == nullptr) {
5158+
if (context.node->get_start() == context.token.get_start()) {
5159+
// The user tried to refactor the enum keyword.
5160+
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_KEYWORD);
5161+
REFACTOR_RENAME_RETURN(OK);
5162+
}
5163+
5164+
// The user tried to refactor the enum braces.
5165+
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_SYMBOL);
5166+
REFACTOR_RENAME_RETURN(OK);
51635167
}
51645168

5165-
if (context.node->start_line == context.token.start_line && context.node->start_column == context.token.start_column) {
5166-
// The user tried to refactor the enum keyword.
5167-
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_KEYWORD);
5169+
GDScriptParser::EnumNode *enum_node = static_cast<GDScriptParser::EnumNode *>(context.node);
5170+
RefactorRenameSymbolDefinintionType enum_type = context.identifier_is_enum_value
5171+
? RefactorRenameSymbolDefinintionType::REFACTOR_RENAME_SYMBOL_DEFINITION_TYPE_ENUM_VALUE
5172+
: RefactorRenameSymbolDefinintionType::REFACTOR_RENAME_SYMBOL_DEFINITION_TYPE_ENUM;
5173+
Error enum_err = _refactor_rename_symbol_match_from_class(context, symbol, p_path, base_type.script_path, p_unsaved_scripts_source_code, r_result, enum_type, enum_node);
5174+
REFACTOR_RENAME_RETURN(enum_err);
5175+
} break;
5176+
case GDScriptParser::REFACTOR_RENAME_TYPE_SIGNAL: {
5177+
GDScriptParser::DataType base_type;
5178+
if (context.current_class) {
5179+
if (context.type != GDScriptParser::REFACTOR_RENAME_TYPE_SUPER_METHOD) {
5180+
base_type = context.current_class->get_datatype();
5181+
} else {
5182+
base_type = context.current_class->base_type;
5183+
}
5184+
} else {
5185+
REFACTOR_RENAME_RETURN(ERR_CANT_RESOLVE);
5186+
}
5187+
5188+
if (context.identifier == nullptr) {
5189+
if (context.node->get_start() == context.token.get_start()) {
5190+
// The user tried to refactor the signal keyword.
5191+
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_KEYWORD);
5192+
REFACTOR_RENAME_RETURN(OK);
5193+
}
5194+
// The user tried to refactor the symbols.
5195+
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_SYMBOL);
51685196
REFACTOR_RENAME_RETURN(OK);
51695197
}
51705198

5171-
// The user tried to refactor the enum braces.
5172-
REFACTOR_RENAME_OUTSIDE_GDSCRIPT(REFACTOR_RENAME_SYMBOL_RESULT_SYMBOL);
5173-
REFACTOR_RENAME_RETURN(OK);
5199+
GDScriptParser::SignalNode *signal_node = static_cast<GDScriptParser::SignalNode *>(context.node);
5200+
if (context.identifier != signal_node->identifier) {
5201+
REFACTOR_RENAME_RETURN(ERR_CANT_RESOLVE);
5202+
}
5203+
5204+
Error signal_err = _refactor_rename_symbol_match_from_class(context, symbol, p_path, base_type.script_path, p_unsaved_scripts_source_code, r_result, RefactorRenameSymbolDefinintionType::REFACTOR_RENAME_SYMBOL_DEFINITION_TYPE_SIGNAL, signal_node);
5205+
REFACTOR_RENAME_RETURN(signal_err);
51745206
} break;
51755207
default: {
51765208
REFACTOR_RENAME_RETURN(ERR_CANT_RESOLVE);

modules/gdscript/gdscript_parser.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,8 +1587,14 @@ GDScriptParser::ParameterNode *GDScriptParser::parse_parameter() {
15871587
}
15881588

15891589
GDScriptParser::SignalNode *GDScriptParser::parse_signal(bool p_is_static) {
1590+
GDScriptTokenizer::Token signal_start_token = previous;
1591+
15901592
SignalNode *signal = alloc_node<SignalNode>();
1591-
refactor_rename_register(REFACTOR_RENAME_TYPE_SIGNAL, signal);
1593+
if (is_for_refactor_rename()) {
1594+
if (previous.has_cursor() || current.has_cursor() || !tokenizer->is_past_cursor()) {
1595+
refactor_rename_register(REFACTOR_RENAME_TYPE_SIGNAL, signal, false);
1596+
}
1597+
}
15921598

15931599
if (!consume(GDScriptTokenizer::Token::IDENTIFIER, R"(Expected signal name after "signal".)")) {
15941600
complete_extents(signal);
@@ -1631,6 +1637,14 @@ GDScriptParser::SignalNode *GDScriptParser::parse_signal(bool p_is_static) {
16311637
complete_extents(signal);
16321638
end_statement("signal declaration");
16331639

1640+
GDScriptTokenizer::Token signal_end_token = previous;
1641+
if (is_for_refactor_rename()) {
1642+
GDScriptTokenizer::CodeArea enum_code_area(signal_start_token.get_code_area().start, signal_end_token.get_code_area().end);
1643+
if (enum_code_area.contains(GDScriptTokenizer::LineColumn(tokenizer->get_cursor_line(), tokenizer->get_cursor_column()))) {
1644+
refactor_rename_register(REFACTOR_RENAME_TYPE_SIGNAL, signal, false);
1645+
}
1646+
}
1647+
16341648
return signal;
16351649
}
16361650

@@ -1740,7 +1754,6 @@ GDScriptParser::EnumNode *GDScriptParser::parse_enum(bool p_is_static) {
17401754
end_statement("enum");
17411755

17421756
GDScriptTokenizer::Token enum_end = previous;
1743-
17441757
if (is_for_refactor_rename()) {
17451758
GDScriptTokenizer::CodeArea enum_code_area(enum_start.get_code_area().start, enum_end.get_code_area().end);
17461759
if (enum_code_area.contains(GDScriptTokenizer::LineColumn(tokenizer->get_cursor_line(), tokenizer->get_cursor_column()))) {

modules/gdscript/gdscript_parser.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,15 +373,17 @@ class GDScriptParser {
373373

374374
DataType datatype;
375375

376-
GDScriptTokenizer::CodeArea get_code_area() const { return GDScriptTokenizer::CodeArea(start_line, start_column, end_line, end_column); }
377-
378376
virtual DataType get_datatype() const { return datatype; }
379377
virtual void set_datatype(const DataType &p_datatype) { datatype = p_datatype; }
380378

381379
virtual bool is_expression() const { return false; }
382380

383381
virtual void get_nodes(LocalVector<GDScriptParser::Node *> &p_nodes, bool p_deep = false) const {}
384382

383+
constexpr GDScriptTokenizer::LineColumn get_start() const { return { start_line, start_column }; }
384+
constexpr GDScriptTokenizer::LineColumn get_end() const { return { end_line, end_column }; }
385+
constexpr GDScriptTokenizer::CodeArea get_code_area() const { return { get_start(), get_end() }; }
386+
385387
virtual ~Node() {}
386388
};
387389

modules/gdscript/gdscript_tokenizer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ class GDScriptTokenizer {
488488
bool has_cursor() const;
489489
StringName get_identifier() const { return literal; }
490490

491-
CodeArea get_code_area() const { return CodeArea(start_line, start_column, end_line, end_column); }
491+
constexpr LineColumn get_start() const { return { start_line, start_column }; }
492+
constexpr LineColumn get_end() const { return { end_line, end_column }; }
493+
constexpr CodeArea get_code_area() const { return { get_start(), get_end() }; }
492494

493495
constexpr bool operator==(const Token &p_right) {
494496
if (type != p_right.type) {

0 commit comments

Comments
 (0)