Skip to content

Commit ede5be6

Browse files
committed
Fix goto def
1 parent a6b8bbf commit ede5be6

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

crates/emmylua_ls/src/handlers/definition/goto_def_definition.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::str::FromStr;
1+
use std::{collections::HashSet, str::FromStr};
22

33
use emmylua_code_analysis::{
44
LuaDeclId, LuaMemberId, LuaMemberInfo, LuaMemberKey, LuaSemanticDeclId, LuaType, LuaTypeDeclId,
@@ -16,6 +16,7 @@ pub fn goto_def_definition(
1616
semantic_model: &SemanticModel,
1717
property_owner: LuaSemanticDeclId,
1818
trigger_token: &LuaSyntaxToken,
19+
guard: &mut GotoDefGuard,
1920
) -> Option<GotoDefinitionResponse> {
2021
if let Some(property) = semantic_model
2122
.get_db()
@@ -40,8 +41,16 @@ pub fn goto_def_definition(
4041
return Some(GotoDefinitionResponse::Scalar(location));
4142
}
4243
LuaSemanticDeclId::Member(member_id) => {
43-
if let Some(property_owner) = find_member_origin_owner(semantic_model, member_id) {
44-
return goto_def_definition(semantic_model, property_owner, trigger_token);
44+
if let Some(origin_property_owner) = find_member_origin_owner(semantic_model, member_id)
45+
{
46+
if guard.check(&origin_property_owner) {
47+
return goto_def_definition(
48+
semantic_model,
49+
origin_property_owner,
50+
trigger_token,
51+
guard,
52+
);
53+
}
4554
}
4655

4756
let member_key = semantic_model
@@ -233,3 +242,24 @@ fn get_member_location(
233242
let document = semantic_model.get_document_by_file_id(member_id.file_id)?;
234243
document.to_lsp_location(member_id.get_syntax_id().get_range())
235244
}
245+
246+
#[derive(Debug, Clone)]
247+
pub struct GotoDefGuard {
248+
ids: HashSet<LuaSemanticDeclId>,
249+
}
250+
251+
impl GotoDefGuard {
252+
pub fn new(first: LuaSemanticDeclId) -> Self {
253+
Self {
254+
ids: HashSet::from([first]),
255+
}
256+
}
257+
258+
pub fn check(&mut self, id: &LuaSemanticDeclId) -> bool {
259+
if self.ids.contains(id) {
260+
return false;
261+
}
262+
self.ids.insert(id.clone());
263+
true
264+
}
265+
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ use lsp_types::{
1717
use rowan::TokenAtOffset;
1818
use tokio_util::sync::CancellationToken;
1919

20-
use crate::context::ServerContextSnapshot;
20+
use crate::{
21+
context::ServerContextSnapshot, handlers::definition::goto_def_definition::GotoDefGuard,
22+
};
2123

2224
use super::RegisterCapabilities;
2325

@@ -67,7 +69,8 @@ pub fn definition(
6769
if let Some(semantic_decl) =
6870
semantic_model.find_decl(token.clone().into(), SemanticDeclLevel::default())
6971
{
70-
return goto_def_definition(&semantic_model, semantic_decl, &token);
72+
let mut guard = GotoDefGuard::new(semantic_decl.clone());
73+
return goto_def_definition(&semantic_model, semantic_decl, &token, &mut guard);
7174
} else if let Some(string_token) = LuaStringToken::cast(token.clone()) {
7275
if let Some(module_response) = goto_module_file(&semantic_model, string_token.clone()) {
7376
return Some(module_response);

0 commit comments

Comments
 (0)