Skip to content

Commit 19c946a

Browse files
committed
optimize rename
1 parent 46da34e commit 19c946a

4 files changed

Lines changed: 57 additions & 17 deletions

File tree

crates/emmylua_ls/src/handlers/rename/mod.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod rename_type;
55
use std::collections::HashMap;
66

77
use emmylua_code_analysis::{LuaCompilation, LuaSemanticDeclId, SemanticDeclLevel, SemanticModel};
8-
use emmylua_parser::{LuaAstNode, LuaLiteralExpr, LuaSyntaxToken, LuaTableField, LuaTokenKind};
8+
use emmylua_parser::{LuaAstNode, LuaLiteralExpr, LuaSyntaxNode, LuaSyntaxToken, LuaTokenKind};
99
use lsp_types::{
1010
ClientCapabilities, OneOf, PrepareRenameResponse, RenameOptions, RenameParams,
1111
ServerCapabilities, TextDocumentPositionParams, WorkspaceEdit,
@@ -54,7 +54,9 @@ pub async fn on_prepare_rename_handler(
5454
let token = match root.syntax().token_at_offset(position_offset) {
5555
TokenAtOffset::Single(token) => token,
5656
TokenAtOffset::Between(left, right) => {
57-
if left.kind() == LuaTokenKind::TkName.into() {
57+
if left.kind() == LuaTokenKind::TkName.into()
58+
|| left.kind() == LuaTokenKind::TkInt.into()
59+
{
5860
left
5961
} else {
6062
right
@@ -118,10 +120,7 @@ fn rename_references(
118120
) -> Option<WorkspaceEdit> {
119121
let mut result = HashMap::new();
120122
let semantic_decl = match try_get_table_field(token.clone()) {
121-
Some(table_field) => semantic_model.find_decl(
122-
table_field.syntax().clone().into(),
123-
SemanticDeclLevel::NoTrace,
124-
),
123+
Some(node) => semantic_model.find_decl(node.into(), SemanticDeclLevel::NoTrace),
125124
None => semantic_model.find_decl(token.into(), SemanticDeclLevel::NoTrace),
126125
}?;
127126

@@ -169,10 +168,10 @@ fn rename_references(
169168
})
170169
}
171170

172-
fn try_get_table_field(token: LuaSyntaxToken) -> Option<LuaTableField> {
171+
fn try_get_table_field(token: LuaSyntaxToken) -> Option<LuaSyntaxNode> {
173172
let parent = token.parent()?;
174173
let literal_expr = LuaLiteralExpr::cast(parent)?;
175-
literal_expr.get_parent::<LuaTableField>()
174+
literal_expr.syntax().parent()
176175
}
177176

178177
pub struct RenameCapabilities;

crates/emmylua_ls/src/handlers/rename/rename_member.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use emmylua_code_analysis::{
44
LuaCompilation, LuaMemberId, LuaSemanticDeclId, SemanticDeclLevel, SemanticModel,
55
};
66
use emmylua_parser::{
7-
LuaAst, LuaAstNode, LuaAstToken, LuaIndexToken, LuaLiteralExpr, LuaNameToken, LuaSyntaxNode,
8-
LuaTokenKind,
7+
LuaAst, LuaAstNode, LuaAstToken, LuaIndexToken, LuaLiteralExpr, LuaNameToken, LuaNumberToken,
8+
LuaSyntaxNode, LuaTokenKind,
99
};
1010
use lsp_types::Uri;
1111

@@ -72,12 +72,24 @@ fn get_member_name_token_lsp_range(
7272

7373
// 此时可能是 [] 访问
7474
if let Some(_) = node.token::<LuaIndexToken>() {
75-
let literal = node.child::<LuaLiteralExpr>()?.get_literal()?;
76-
if matches!(
77-
literal.get_token_kind(),
78-
LuaTokenKind::TkInt | LuaTokenKind::TkString
79-
) {
80-
return document.to_lsp_range(literal.get_range());
75+
match node {
76+
LuaAst::LuaDocTagField(tag) => {
77+
if let Some(token) = tag.token::<LuaNumberToken>() {
78+
if matches!(token.get_token_kind(), LuaTokenKind::TkInt) {
79+
return document.to_lsp_range(token.get_range());
80+
}
81+
return document.to_lsp_range(token.get_range());
82+
}
83+
}
84+
_ => {
85+
let literal = node.child::<LuaLiteralExpr>()?.get_literal()?;
86+
if matches!(
87+
literal.get_token_kind(),
88+
LuaTokenKind::TkInt | LuaTokenKind::TkString
89+
) {
90+
return document.to_lsp_range(literal.get_range());
91+
}
92+
}
8193
}
8294
}
8395

crates/emmylua_ls/src/handlers/test/rename_test.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod tests {
55
#[test]
66
fn test_int_key() {
77
let mut ws = ProviderVirtualWorkspace::new();
8-
let result = ws.check_rename(
8+
assert!(ws.check_rename(
99
r#"
1010
local export = {
1111
[<??>1] = 1,
@@ -15,6 +15,34 @@ mod tests {
1515
"#,
1616
"2".to_string(),
1717
2,
18+
));
19+
20+
assert!(ws.check_rename(
21+
r#"
22+
local export = {
23+
[1] = 1,
24+
}
25+
26+
export[<??>1] = 2
27+
"#,
28+
"2".to_string(),
29+
2,
30+
));
31+
}
32+
33+
#[test]
34+
fn test_int_key_in_class() {
35+
let mut ws = ProviderVirtualWorkspace::new();
36+
let result = ws.check_rename(
37+
r#"
38+
---@class Test
39+
---@field [<??>1] number
40+
local Test = {}
41+
42+
Test[1] = 2
43+
"#,
44+
"2".to_string(),
45+
2,
1846
);
1947
assert!(result);
2048
}

crates/emmylua_ls/src/handlers/test_lib/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::{
1414
code_actions::code_action,
1515
completion::{completion, completion_resolve},
1616
inlay_hint::inlay_hint,
17+
rename::rename,
1718
semantic_token::semantic_token,
1819
signature_helper::signature_help,
1920
},

0 commit comments

Comments
 (0)