From c6fc6bd5a791d2ab25c7a66aa7fa641fbba900d7 Mon Sep 17 00:00:00 2001 From: zc he Date: Mon, 10 Feb 2025 23:15:03 +0800 Subject: [PATCH] fix(lsp): inlay hints span issue with user config scripts (#15071) # Description Fixes this: ![image](https://github.com/user-attachments/assets/98b523dd-df30-4e85-b069-20aaad0d9bf5) # User-Facing Changes # Tests + Formatting I can't figure out how to test this atm. Happy to do it if someone show me some hints how. # After Submitting --- crates/nu-lsp/src/hints.rs | 1 + crates/nu-protocol/src/engine/engine_state.rs | 4 +++- crates/nu-protocol/src/engine/state_working_set.rs | 10 +++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/nu-lsp/src/hints.rs b/crates/nu-lsp/src/hints.rs index 581a2e70b0..564430bad2 100644 --- a/crates/nu-lsp/src/hints.rs +++ b/crates/nu-lsp/src/hints.rs @@ -160,6 +160,7 @@ impl LanguageServer { } } +/// TODO: test for files loaded as user config #[cfg(test)] mod tests { use crate::path_to_uri; diff --git a/crates/nu-protocol/src/engine/engine_state.rs b/crates/nu-protocol/src/engine/engine_state.rs index 184f1d5343..bc6d7a2eb1 100644 --- a/crates/nu-protocol/src/engine/engine_state.rs +++ b/crates/nu-protocol/src/engine/engine_state.rs @@ -880,7 +880,9 @@ impl EngineState { } } - pub fn files(&self) -> impl Iterator { + pub fn files( + &self, + ) -> impl DoubleEndedIterator + ExactSizeIterator { self.files.iter() } diff --git a/crates/nu-protocol/src/engine/state_working_set.rs b/crates/nu-protocol/src/engine/state_working_set.rs index 8db525a2a1..c7643b501b 100644 --- a/crates/nu-protocol/src/engine/state_working_set.rs +++ b/crates/nu-protocol/src/engine/state_working_set.rs @@ -368,7 +368,15 @@ impl<'a> StateWorkingSet<'a> { } pub fn get_span_for_filename(&self, filename: &str) -> Option { - let file_id = self.files().position(|file| &*file.name == filename)?; + let predicate = |file: &CachedFile| &*file.name == filename; + // search from end to start, in case there're duplicated files with the same name + let file_id = self + .delta + .files + .iter() + .rposition(predicate) + .map(|idx| idx + self.permanent_state.num_files()) + .or_else(|| self.permanent_state.files().rposition(predicate))?; let file_id = FileId::new(file_id); Some(self.get_span_for_file(file_id))