From 1f2fb4e27f8ba1cb7b1d96a332b7ffc2ee659921 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 30 Aug 2018 12:51:46 +0300 Subject: move --- crates/libanalysis/src/api.rs | 35 +++++++++++++++++- crates/libanalysis/src/imp.rs | 58 ++++++++++++++++++++++++++++- crates/libanalysis/src/lib.rs | 86 +------------------------------------------ 3 files changed, 92 insertions(+), 87 deletions(-) (limited to 'crates/libanalysis/src') diff --git a/crates/libanalysis/src/api.rs b/crates/libanalysis/src/api.rs index 02eaf7b1c..ded88cd15 100644 --- a/crates/libanalysis/src/api.rs +++ b/crates/libanalysis/src/api.rs @@ -1,7 +1,7 @@ -use relative_path::RelativePathBuf; +use relative_path::{RelativePath, RelativePathBuf}; use libsyntax2::{File, TextRange, TextUnit, AtomEdit}; use libeditor; -use {imp::AnalysisImpl, FileId, Query}; +use {imp::{AnalysisImpl, AnalysisHostImpl}, Query}; pub use libeditor::{ LocalEdit, StructureNode, LineIndex, FileSymbol, @@ -109,3 +109,34 @@ impl Analysis { self.imp.diagnostics(file_id) } } + +pub trait FileResolver: Send + Sync + 'static { + fn file_stem(&self, id: FileId) -> String; + fn resolve(&self, id: FileId, path: &RelativePath) -> Option; +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct FileId(pub u32); + +#[derive(Debug)] +pub struct AnalysisHost { + pub(crate) imp: AnalysisHostImpl +} + +impl AnalysisHost { + pub fn new() -> AnalysisHost { + AnalysisHost { imp: AnalysisHostImpl::new() } + } + + pub fn analysis(&self, file_resolver: impl FileResolver) -> Analysis { + Analysis { imp: self.imp.analysis(file_resolver) } + } + + pub fn change_file(&mut self, file_id: FileId, text: Option) { + self.change_files(::std::iter::once((file_id, text))); + } + + pub fn change_files(&mut self, changes: impl Iterator)>) { + self.imp.change_files(changes) + } +} diff --git a/crates/libanalysis/src/imp.rs b/crates/libanalysis/src/imp.rs index 5f451f53f..06bbc7cf2 100644 --- a/crates/libanalysis/src/imp.rs +++ b/crates/libanalysis/src/imp.rs @@ -22,9 +22,65 @@ use { FileId, FileResolver, Query, Diagnostic, SourceChange, SourceFileEdit, Position, FileSystemEdit, module_map::Problem, symbol_index::FileSymbols, - module_map::ModuleMap, + module_map::{ModuleMap, ChangeKind}, }; +#[derive(Debug)] +pub(crate) struct AnalysisHostImpl { + data: Arc +} + +impl AnalysisHostImpl { + pub fn new() -> AnalysisHostImpl { + AnalysisHostImpl { + data: Arc::new(WorldData::default()), + } + } + + pub fn analysis( + &self, + file_resolver: impl FileResolver, + ) -> AnalysisImpl { + AnalysisImpl { + needs_reindex: AtomicBool::new(false), + file_resolver: Arc::new(file_resolver), + data: self.data.clone() + } + } + + pub fn change_files(&mut self, changes: impl Iterator)>) { + let data = self.data_mut(); + for (file_id, text) in changes { + let change_kind = if data.file_map.remove(&file_id).is_some() { + if text.is_some() { + ChangeKind::Update + } else { + ChangeKind::Delete + } + } else { + ChangeKind::Insert + }; + data.module_map.update_file(file_id, change_kind); + data.file_map.remove(&file_id); + if let Some(text) = text { + let file_data = FileData::new(text); + data.file_map.insert(file_id, Arc::new(file_data)); + } else { + data.file_map.remove(&file_id); + } + } + } + + fn data_mut(&mut self) -> &mut WorldData { + if Arc::get_mut(&mut self.data).is_none() { + self.data = Arc::new(WorldData { + file_map: self.data.file_map.clone(), + module_map: self.data.module_map.clone(), + }); + } + Arc::get_mut(&mut self.data).unwrap() + } +} pub(crate) struct AnalysisImpl { pub(crate) needs_reindex: AtomicBool, diff --git a/crates/libanalysis/src/lib.rs b/crates/libanalysis/src/lib.rs index 027d7439b..a39141941 100644 --- a/crates/libanalysis/src/lib.rs +++ b/crates/libanalysis/src/lib.rs @@ -14,92 +14,10 @@ mod module_map; mod api; mod imp; -use std::{ - sync::{ - Arc, - atomic::{AtomicBool}, - }, -}; - -use relative_path::RelativePath; - -use self::{ - module_map::{ChangeKind}, - imp::{WorldData, FileData}, -}; pub use self::symbol_index::Query; pub use self::api::{ - Analysis, SourceChange, SourceFileEdit, FileSystemEdit, Position, Diagnostic, Runnable, RunnableKind + AnalysisHost, Analysis, SourceChange, SourceFileEdit, FileSystemEdit, Position, Diagnostic, Runnable, RunnableKind, + FileId, FileResolver, }; pub type Result = ::std::result::Result; - -pub trait FileResolver: Send + Sync + 'static { - fn file_stem(&self, id: FileId) -> String; - fn resolve(&self, id: FileId, path: &RelativePath) -> Option; -} - -#[derive(Debug)] -pub struct WorldState { - data: Arc -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct FileId(pub u32); - -impl WorldState { - pub fn new() -> WorldState { - WorldState { - data: Arc::new(WorldData::default()), - } - } - - pub fn analysis( - &self, - file_resolver: impl FileResolver, - ) -> Analysis { - let imp = imp::AnalysisImpl { - needs_reindex: AtomicBool::new(false), - file_resolver: Arc::new(file_resolver), - data: self.data.clone() - }; - Analysis { imp } - } - - pub fn change_file(&mut self, file_id: FileId, text: Option) { - self.change_files(::std::iter::once((file_id, text))); - } - - pub fn change_files(&mut self, changes: impl Iterator)>) { - let data = self.data_mut(); - for (file_id, text) in changes { - let change_kind = if data.file_map.remove(&file_id).is_some() { - if text.is_some() { - ChangeKind::Update - } else { - ChangeKind::Delete - } - } else { - ChangeKind::Insert - }; - data.module_map.update_file(file_id, change_kind); - data.file_map.remove(&file_id); - if let Some(text) = text { - let file_data = FileData::new(text); - data.file_map.insert(file_id, Arc::new(file_data)); - } else { - data.file_map.remove(&file_id); - } - } - } - - fn data_mut(&mut self) -> &mut WorldData { - if Arc::get_mut(&mut self.data).is_none() { - self.data = Arc::new(WorldData { - file_map: self.data.file_map.clone(), - module_map: self.data.module_map.clone(), - }); - } - Arc::get_mut(&mut self.data).unwrap() - } -} -- cgit v1.2.3