Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions crates/rust-analyzer/src/document.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//! In-memory document information.

/// Information about a document that the Language Client
// knows about.
// Its lifetime is driven by the textDocument/didOpen and textDocument/didClose
// client notifications.
#[derive(Debug, Clone)]
pub(crate) struct DocumentData {
pub version: Option<i64>,
}

impl DocumentData {
pub fn new(version: i64) -> Self {
DocumentData { version: Some(version) }
}
}
7 changes: 4 additions & 3 deletions crates/rust-analyzer/src/global_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ use rustc_hash::FxHashMap;
use crate::{
config::Config,
diagnostics::{CheckFixes, DiagnosticCollection},
document::DocumentData,
from_proto,
line_endings::LineEndings,
main_loop::Task,
Expand Down Expand Up @@ -69,7 +70,7 @@ pub(crate) struct GlobalState {
pub(crate) config: Config,
pub(crate) analysis_host: AnalysisHost,
pub(crate) diagnostics: DiagnosticCollection,
pub(crate) mem_docs: FxHashMap<VfsPath, Option<i64>>,
pub(crate) mem_docs: FxHashMap<VfsPath, DocumentData>,
pub(crate) vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>,
pub(crate) status: Status,
pub(crate) source_root_config: SourceRootConfig,
Expand All @@ -84,7 +85,7 @@ pub(crate) struct GlobalStateSnapshot {
pub(crate) analysis: Analysis,
pub(crate) check_fixes: CheckFixes,
pub(crate) latest_requests: Arc<RwLock<LatestRequests>>,
mem_docs: FxHashMap<VfsPath, Option<i64>>,
mem_docs: FxHashMap<VfsPath, DocumentData>,
vfs: Arc<RwLock<(vfs::Vfs, FxHashMap<FileId, LineEndings>)>>,
pub(crate) workspaces: Arc<Vec<ProjectWorkspace>>,
}
Expand Down Expand Up @@ -259,7 +260,7 @@ impl GlobalStateSnapshot {

pub(crate) fn url_file_version(&self, url: &Url) -> Option<i64> {
let path = from_proto::vfs_path(&url).ok()?;
self.mem_docs.get(&path).copied()?
self.mem_docs.get(&path)?.version
}

pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url {
Expand Down
1 change: 1 addition & 0 deletions crates/rust-analyzer/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ mod line_endings;
mod request_metrics;
mod lsp_utils;
mod thread_pool;
mod document;
pub mod lsp_ext;
pub mod config;

Expand Down
9 changes: 5 additions & 4 deletions crates/rust-analyzer/src/main_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use ra_prof::profile;
use crate::{
config::Config,
dispatch::{NotificationDispatcher, RequestDispatcher},
document::DocumentData,
from_proto,
global_state::{file_id_to_url, url_to_file_id, GlobalState, Status},
handlers, lsp_ext,
Expand Down Expand Up @@ -311,7 +312,7 @@ impl GlobalState {
let url = file_id_to_url(&self.vfs.read().0, file_id);
let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect();
let version = from_proto::vfs_path(&url)
.map(|path| self.mem_docs.get(&path).copied().flatten())
.map(|path| self.mem_docs.get(&path)?.version)
.unwrap_or_default();

self.send_notification::<lsp_types::notification::PublishDiagnostics>(
Expand Down Expand Up @@ -406,7 +407,7 @@ impl GlobalState {
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
if this
.mem_docs
.insert(path.clone(), Some(params.text_document.version))
.insert(path.clone(), DocumentData::new(params.text_document.version))
.is_some()
{
log::error!("duplicate DidOpenTextDocument: {}", path)
Expand All @@ -428,7 +429,7 @@ impl GlobalState {

// The version passed in DidChangeTextDocument is the version after all edits are applied
// so we should apply it before the vfs is notified.
*doc = params.text_document.version;
doc.version = params.text_document.version;

vfs.set_file_contents(path.clone(), Some(text.into_bytes()));
}
Expand All @@ -438,7 +439,7 @@ impl GlobalState {
let mut version = None;
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
match this.mem_docs.remove(&path) {
Some(entry) => version = entry,
Some(doc) => version = doc.version,
None => log::error!("orphan DidCloseTextDocument: {}", path),
}

Expand Down