Skip to content

Commit 05a4bfc

Browse files
committed
Support renaming parameters from doc param name
fix #637
1 parent 032b195 commit 05a4bfc

File tree

3 files changed

+85
-7
lines changed

3 files changed

+85
-7
lines changed

crates/emmylua_code_analysis/src/semantic/semantic_info/mod.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use crate::{
77
TypeOps,
88
};
99
use emmylua_parser::{
10-
LuaAstNode, LuaAstToken, LuaDocNameType, LuaDocTag, LuaExpr, LuaLocalName, LuaSyntaxKind,
11-
LuaSyntaxNode, LuaSyntaxToken, LuaTableField,
10+
LuaAstNode, LuaAstToken, LuaDocNameType, LuaDocTag, LuaExpr, LuaLocalName, LuaParamName,
11+
LuaSyntaxKind, LuaSyntaxNode, LuaSyntaxToken, LuaTableField,
1212
};
1313
pub use infer_expr_semantic_decl::infer_expr_semantic_decl;
1414
pub use semantic_decl_level::SemanticDeclLevel;
@@ -220,6 +220,11 @@ pub fn infer_node_semantic_decl(
220220
let name_token = local_name.get_name_token()?;
221221
infer_token_semantic_decl(db, cache, name_token.syntax().clone(), level)
222222
}
223+
param_name if LuaParamName::can_cast(param_name.kind().into()) => {
224+
let param_name = LuaParamName::cast(param_name)?;
225+
let name_token = param_name.get_name_token()?;
226+
infer_token_semantic_decl(db, cache, name_token.syntax().clone(), level)
227+
}
223228
_ => None,
224229
}
225230
}

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

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

77
use emmylua_code_analysis::{LuaCompilation, LuaSemanticDeclId, SemanticDeclLevel, SemanticModel};
8-
use emmylua_parser::{LuaAstNode, LuaLiteralExpr, LuaSyntaxNode, LuaSyntaxToken, LuaTokenKind};
8+
use emmylua_parser::{
9+
LuaAst, LuaAstNode, LuaComment, LuaDocTagParam, LuaLiteralExpr, LuaSyntaxKind, LuaSyntaxNode,
10+
LuaSyntaxToken, LuaTokenKind,
11+
};
912
use lsp_types::{
1013
ClientCapabilities, OneOf, PrepareRenameResponse, RenameOptions, RenameParams,
1114
ServerCapabilities, TextDocumentPositionParams, WorkspaceEdit,
@@ -119,7 +122,7 @@ fn rename_references(
119122
new_name: String,
120123
) -> Option<WorkspaceEdit> {
121124
let mut result = HashMap::new();
122-
let semantic_decl = match get_literal_expr_parent(token.clone()) {
125+
let semantic_decl = match get_target_node(token.clone()) {
123126
Some(node) => semantic_model.find_decl(node.into(), SemanticDeclLevel::NoTrace),
124127
None => semantic_model.find_decl(token.into(), SemanticDeclLevel::NoTrace),
125128
}?;
@@ -168,10 +171,49 @@ fn rename_references(
168171
})
169172
}
170173

171-
fn get_literal_expr_parent(token: LuaSyntaxToken) -> Option<LuaSyntaxNode> {
174+
fn get_target_node(token: LuaSyntaxToken) -> Option<LuaSyntaxNode> {
172175
let parent = token.parent()?;
173-
let literal_expr = LuaLiteralExpr::cast(parent)?;
174-
literal_expr.syntax().parent()
176+
match parent.kind().into() {
177+
LuaSyntaxKind::LiteralExpr => {
178+
let literal_expr = LuaLiteralExpr::cast(parent)?;
179+
return literal_expr.syntax().parent();
180+
}
181+
LuaSyntaxKind::DocTagParam => {
182+
let doc_tag_param = LuaDocTagParam::cast(parent)?;
183+
let name = doc_tag_param.get_name_token()?;
184+
let name_text = name.get_name_text();
185+
let comment = doc_tag_param.get_parent::<LuaComment>()?;
186+
let owner = comment.get_owner()?;
187+
match owner {
188+
LuaAst::LuaLocalFuncStat(local_func_stat) => {
189+
let closure_expr = local_func_stat.get_closure()?;
190+
let param_list = closure_expr.get_params_list()?;
191+
let param_name = param_list.get_params().find(|param| {
192+
if let Some(name_token) = param.get_name_token() {
193+
name_token.get_name_text() == name_text
194+
} else {
195+
false
196+
}
197+
})?;
198+
return Some(param_name.syntax().clone());
199+
}
200+
LuaAst::LuaFuncStat(func_stat) => {
201+
let closure_expr = func_stat.get_closure()?;
202+
let param_list = closure_expr.get_params_list()?;
203+
let param_name = param_list.get_params().find(|param| {
204+
if let Some(name_token) = param.get_name_token() {
205+
name_token.get_name_text() == name_text
206+
} else {
207+
false
208+
}
209+
})?;
210+
return Some(param_name.syntax().clone());
211+
}
212+
_ => return None,
213+
}
214+
}
215+
_ => return None,
216+
}
175217
}
176218

177219
pub struct RenameCapabilities;

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,35 @@ mod tests {
103103
);
104104
assert!(result);
105105
}
106+
107+
#[test]
108+
fn test_doc_param() {
109+
let mut ws = ProviderVirtualWorkspace::new();
110+
{
111+
let result = ws.check_rename(
112+
r#"
113+
---@param aaa<??> number
114+
local function test(aaa)
115+
local b = aaa
116+
end
117+
"#,
118+
"aaa1".to_string(),
119+
3,
120+
);
121+
assert!(result);
122+
}
123+
{
124+
let result = ws.check_rename(
125+
r#"
126+
---@param aaa<??> number
127+
function testA(aaa)
128+
local b = aaa
129+
end
130+
"#,
131+
"aaa1".to_string(),
132+
3,
133+
);
134+
assert!(result);
135+
}
136+
}
106137
}

0 commit comments

Comments
 (0)