Skip to content

Commit 5312a09

Browse files
committed
fix: find_member_origin_owner 禁止追溯到参数
1 parent a2c722d commit 5312a09

2 files changed

Lines changed: 42 additions & 3 deletions

File tree

crates/emmylua_ls/src/handlers/hover/find_origin.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ fn resolve_member_owner(
187187

188188
let root = semantic_model.get_root().syntax();
189189
let current_node = member_id.get_syntax_id().to_node_from_root(&root)?;
190-
match member_id.get_syntax_id().get_kind() {
190+
let result = match member_id.get_syntax_id().get_kind() {
191191
LuaSyntaxKind::TableFieldAssign => {
192192
if LuaTableField::can_cast(current_node.kind().into()) {
193193
let table_field = LuaTableField::cast(current_node.clone())?;
@@ -213,18 +213,35 @@ fn resolve_member_owner(
213213
let assign_stat = LuaAssignStat::cast(assign_node)?;
214214
let (vars, exprs) = assign_stat.get_var_and_expr_list();
215215

216+
let mut result = None;
216217
for (var, expr) in vars.iter().zip(exprs.iter()) {
217218
if var.syntax().text_range() == current_node.text_range() {
218219
let expr_node = expr.get_syntax_id().to_node_from_root(&root)?;
219-
return semantic_model.find_decl(
220+
result = semantic_model.find_decl(
220221
expr_node.into(),
221222
emmylua_code_analysis::SemanticDeclLevel::default(),
222223
);
224+
break;
223225
}
224226
}
225-
None
227+
result
226228
}
227229
_ => None,
230+
};
231+
232+
// 禁止追溯到参数
233+
match result {
234+
Some(LuaSemanticDeclId::LuaDecl(decl_id)) => {
235+
let decl = semantic_model
236+
.get_db()
237+
.get_decl_index()
238+
.get_decl(&decl_id)?;
239+
if decl.is_param() {
240+
return None;
241+
}
242+
result
243+
}
244+
_ => result,
228245
}
229246
}
230247

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,26 @@ mod tests {
4646
);
4747
assert!(result);
4848
}
49+
50+
#[test]
51+
fn test_rename_class_field() {
52+
let mut ws = ProviderVirtualWorkspace::new();
53+
let result = ws.check_rename(
54+
r#"
55+
---@class AnonymousObserver
56+
local AnonymousObserver
57+
58+
function AnonymousObserver:__init(next)
59+
self.ne<??>xt = next
60+
end
61+
62+
function AnonymousObserver:onNextCore(value)
63+
self.next(value)
64+
end
65+
"#,
66+
"_next".to_string(),
67+
2,
68+
);
69+
assert!(result);
70+
}
4971
}

0 commit comments

Comments
 (0)