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))