@@ -395,6 +395,11 @@ void GDScriptParser::set_last_completion_call_arg(int p_argument) {
395395 completion_call_stack.back ()->get ().argument = p_argument;
396396}
397397
398+ bool GDScriptParser::refactor_rename_is_cursor_between_tokens (const GDScriptTokenizer::Token &p_token_start, const GDScriptTokenizer::Token &p_token_end) const {
399+ GDScriptTokenizer::CodeArea enum_code_area (p_token_start.get_code_area ().start , p_token_end.get_code_area ().end );
400+ return enum_code_area.contains (GDScriptTokenizer::LineColumn (tokenizer->get_cursor_line (), tokenizer->get_cursor_column ()));
401+ }
402+
398403bool GDScriptParser::refactor_rename_does_node_contains_cursor (const GDScriptParser::Node *p_node) const {
399404 ERR_FAIL_NULL_V (p_node, false );
400405 GDScriptTokenizer::CodeArea node_code_area = p_node->get_code_area ();
@@ -463,6 +468,19 @@ bool GDScriptParser::refactor_rename_register(GDScriptParser::RefactorRenameType
463468 return true ;
464469}
465470
471+ bool GDScriptParser::refactor_rename_register_if_cursor_is_between_tokens (GDScriptParser::RefactorRenameType p_type, GDScriptParser::Node *p_node, const GDScriptTokenizer::Token &p_token_start, const GDScriptTokenizer::Token &p_token_end) {
472+ if (!is_for_refactor_rename ()) {
473+ return false ;
474+ }
475+ if (refactor_rename_context.node != nullptr && refactor_rename_context.node ->is_owned_by (p_node)) {
476+ return false ;
477+ }
478+ if (!refactor_rename_is_cursor_between_tokens (p_token_start, p_token_end)) {
479+ return false ;
480+ }
481+ return refactor_rename_register (p_type, p_node, false );
482+ }
483+
466484bool GDScriptParser::refactor_rename_register_identifier (GDScriptParser::IdentifierNode *p_identifier) {
467485 if (!is_for_refactor_rename ()) {
468486 return false ;
@@ -1597,9 +1615,11 @@ GDScriptParser::ParameterNode *GDScriptParser::parse_parameter() {
15971615 return nullptr ;
15981616 }
15991617
1618+ GDScriptTokenizer::Token token_start = previous;
1619+
16001620 ParameterNode *parameter = alloc_node<ParameterNode>();
16011621 push_owner (parameter);
1602- refactor_rename_register (REFACTOR_RENAME_TYPE_PARAMETER, parameter);
1622+ refactor_rename_register_if_cursor_is_between_tokens (REFACTOR_RENAME_TYPE_PARAMETER, parameter, previous, current );
16031623 parameter->identifier = parse_identifier ();
16041624
16051625 if (match (GDScriptTokenizer::Token::COLON)) {
@@ -1615,13 +1635,16 @@ GDScriptParser::ParameterNode *GDScriptParser::parse_parameter() {
16151635
16161636 if (match (GDScriptTokenizer::Token::EQUAL)) {
16171637 // Default value.
1618- parameter->initializer = parse_expression (false );
16191638 refactor_rename_register (REFACTOR_RENAME_TYPE_PARAMETER_INITIALIZER, parameter->initializer );
1639+ parameter->initializer = parse_expression (false );
16201640 }
16211641
16221642 complete_extents (parameter);
16231643 pop_owner (parameter);
16241644
1645+ GDScriptTokenizer::Token token_end = previous;
1646+ refactor_rename_register_if_cursor_is_between_tokens (REFACTOR_RENAME_TYPE_PARAMETER, parameter, token_start, token_end);
1647+
16251648 return parameter;
16261649}
16271650
@@ -1631,11 +1654,7 @@ GDScriptParser::SignalNode *GDScriptParser::parse_signal(bool p_is_static) {
16311654 SignalNode *signal = alloc_node<SignalNode>();
16321655 push_owner (signal);
16331656
1634- if (is_for_refactor_rename ()) {
1635- if (previous.has_cursor () || current.has_cursor () || !tokenizer->is_past_cursor ()) {
1636- refactor_rename_register (REFACTOR_RENAME_TYPE_SIGNAL, signal, false );
1637- }
1638- }
1657+ refactor_rename_register_if_cursor_is_between_tokens (REFACTOR_RENAME_TYPE_SIGNAL, signal, previous, current);
16391658
16401659 if (!consume (GDScriptTokenizer::Token::IDENTIFIER, R"( Expected signal name after "signal".)" )) {
16411660 complete_extents (signal);
@@ -1680,12 +1699,7 @@ GDScriptParser::SignalNode *GDScriptParser::parse_signal(bool p_is_static) {
16801699 end_statement (" signal declaration" );
16811700
16821701 GDScriptTokenizer::Token signal_end_token = previous;
1683- if (is_for_refactor_rename ()) {
1684- GDScriptTokenizer::CodeArea enum_code_area (signal_start_token.get_code_area ().start , signal_end_token.get_code_area ().end );
1685- if (enum_code_area.contains (GDScriptTokenizer::LineColumn (tokenizer->get_cursor_line (), tokenizer->get_cursor_column ()))) {
1686- refactor_rename_register (REFACTOR_RENAME_TYPE_SIGNAL, signal, false );
1687- }
1688- }
1702+ refactor_rename_register_if_cursor_is_between_tokens (REFACTOR_RENAME_TYPE_SIGNAL, signal, signal_start_token, signal_end_token);
16891703
16901704 return signal;
16911705}
@@ -2115,7 +2129,13 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context,
21152129 if (is_at_end () || (!multiline && previous.type == GDScriptTokenizer::Token::SEMICOLON && check (GDScriptTokenizer::Token::NEWLINE))) {
21162130 break ;
21172131 }
2132+
2133+ refactor_rename_register (REFACTOR_RENAME_TYPE_STATEMENT, suite);
2134+
2135+ GDScriptTokenizer::Token statement_start = current;
21182136 Node *statement = parse_statement ();
2137+ GDScriptTokenizer::Token statement_end = previous;
2138+
21192139 if (statement == nullptr ) {
21202140 if (error_count++ > 100 ) {
21212141 push_error (" Too many statement errors." , suite);
@@ -2125,6 +2145,32 @@ GDScriptParser::SuiteNode *GDScriptParser::parse_suite(const String &p_context,
21252145 }
21262146 suite->statements .push_back (statement);
21272147
2148+ if (is_for_refactor_rename () && refactor_rename_is_cursor_between_tokens (statement_start, statement_end)) {
2149+ if (statement->type == GDScriptParser::Node::IDENTIFIER) {
2150+ // The statement is a naked identifier.
2151+ refactor_rename_register (REFACTOR_RENAME_TYPE_IDENTIFIER, statement, false );
2152+ GDScriptTokenizer::Token before_token = get_token (tokenizer->get_cursor_line (), tokenizer->get_cursor_column () - 1 );
2153+ GDScriptTokenizer::Token after_token = get_token (tokenizer->get_cursor_line (), tokenizer->get_cursor_column ());
2154+ if (before_token == after_token || statement->get_code_area () == before_token.get_code_area ()) {
2155+ refactor_rename_context.token = before_token;
2156+ } else {
2157+ refactor_rename_context.token = after_token;
2158+ }
2159+ } else if (statement->type == GDScriptParser::Node::LITERAL) {
2160+ // The statement is a naked literal.
2161+ refactor_rename_register (REFACTOR_RENAME_TYPE_LITERAL, statement, false );
2162+ GDScriptTokenizer::Token before_token = get_token (tokenizer->get_cursor_line (), tokenizer->get_cursor_column () - 1 );
2163+ GDScriptTokenizer::Token after_token = get_token (tokenizer->get_cursor_line (), tokenizer->get_cursor_column ());
2164+ if (before_token == after_token || statement->get_code_area () == before_token.get_code_area ()) {
2165+ refactor_rename_context.token = before_token;
2166+ } else {
2167+ refactor_rename_context.token = after_token;
2168+ }
2169+ } else if (!refactor_rename_context.node ->is_owned_by (statement)) {
2170+ refactor_rename_register (REFACTOR_RENAME_TYPE_STATEMENT, suite, false );
2171+ }
2172+ }
2173+
21282174 // Register locals.
21292175 switch (statement->type ) {
21302176 case Node::VARIABLE: {
0 commit comments