From d19001957172287afee90bd4fc3d037d2ce6f5dd Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 25 Oct 2018 17:52:50 +0300 Subject: Move input to top-level --- crates/ra_analysis/src/completion.rs | 3 +- crates/ra_analysis/src/db.rs | 98 ++++++++++++++++++++++ crates/ra_analysis/src/db/input.rs | 48 ----------- crates/ra_analysis/src/db/mod.rs | 100 ----------------------- crates/ra_analysis/src/descriptors/module/imp.rs | 4 +- crates/ra_analysis/src/descriptors/module/mod.rs | 3 +- crates/ra_analysis/src/imp.rs | 27 +++--- crates/ra_analysis/src/input.rs | 79 ++++++++++++++++++ crates/ra_analysis/src/lib.rs | 33 +------- 9 files changed, 200 insertions(+), 195 deletions(-) create mode 100644 crates/ra_analysis/src/db.rs delete mode 100644 crates/ra_analysis/src/db/input.rs delete mode 100644 crates/ra_analysis/src/db/mod.rs create mode 100644 crates/ra_analysis/src/input.rs (limited to 'crates/ra_analysis/src') diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs index 04bb82c18..0a2f99575 100644 --- a/crates/ra_analysis/src/completion.rs +++ b/crates/ra_analysis/src/completion.rs @@ -6,7 +6,8 @@ use ra_syntax::{ use crate::{ FileId, Cancelable, - db::{self, SyntaxDatabase, input::FilesDatabase}, + input::FilesDatabase, + db::{self, SyntaxDatabase}, descriptors::module::{ModulesDatabase, ModuleTree, ModuleId}, }; diff --git a/crates/ra_analysis/src/db.rs b/crates/ra_analysis/src/db.rs new file mode 100644 index 000000000..3ca14af79 --- /dev/null +++ b/crates/ra_analysis/src/db.rs @@ -0,0 +1,98 @@ +use std::{ + sync::Arc, +}; + +use ra_editor::LineIndex; +use ra_syntax::File; +use salsa; + +use crate::{ + db, + Cancelable, Canceled, + descriptors::module::{SubmodulesQuery, ModuleTreeQuery, ModulesDatabase}, + symbol_index::SymbolIndex, + FileId, +}; + +#[derive(Default, Debug)] +pub(crate) struct RootDatabase { + runtime: salsa::Runtime, +} + +impl salsa::Database for RootDatabase { + fn salsa_runtime(&self) -> &salsa::Runtime { + &self.runtime + } +} + +pub(crate) fn check_canceled(db: &impl salsa::Database) -> Cancelable<()> { + if db.salsa_runtime().is_current_revision_canceled() { + Err(Canceled) + } else { + Ok(()) + } +} + +impl salsa::ParallelDatabase for RootDatabase { + fn fork(&self) -> Self { + RootDatabase { + runtime: self.runtime.fork(), + } + } +} + +impl Clone for RootDatabase { + fn clone(&self) -> RootDatabase { + salsa::ParallelDatabase::fork(self) + } +} + +salsa::database_storage! { + pub(crate) struct RootDatabaseStorage for RootDatabase { + impl crate::input::FilesDatabase { + fn file_text() for crate::input::FileTextQuery; + fn file_source_root() for crate::input::FileSourceRootQuery; + fn source_root() for crate::input::SourceRootQuery; + fn libraries() for crate::input::LibrarieseQuery; + fn library_symbols() for crate::input::LibrarySymbolsQuery; + fn crate_graph() for crate::input::CrateGraphQuery; + } + impl SyntaxDatabase { + fn file_syntax() for FileSyntaxQuery; + fn file_lines() for FileLinesQuery; + fn file_symbols() for FileSymbolsQuery; + } + impl ModulesDatabase { + fn module_tree() for ModuleTreeQuery; + fn module_descriptor() for SubmodulesQuery; + } + } +} + +salsa::query_group! { + pub(crate) trait SyntaxDatabase: crate::input::FilesDatabase { + fn file_syntax(file_id: FileId) -> File { + type FileSyntaxQuery; + } + fn file_lines(file_id: FileId) -> Arc { + type FileLinesQuery; + } + fn file_symbols(file_id: FileId) -> Cancelable> { + type FileSymbolsQuery; + } + } +} + +fn file_syntax(db: &impl SyntaxDatabase, file_id: FileId) -> File { + let text = db.file_text(file_id); + File::parse(&*text) +} +fn file_lines(db: &impl SyntaxDatabase, file_id: FileId) -> Arc { + let text = db.file_text(file_id); + Arc::new(LineIndex::new(&*text)) +} +fn file_symbols(db: &impl SyntaxDatabase, file_id: FileId) -> Cancelable> { + db::check_canceled(db)?; + let syntax = db.file_syntax(file_id); + Ok(Arc::new(SymbolIndex::for_file(file_id, syntax))) +} diff --git a/crates/ra_analysis/src/db/input.rs b/crates/ra_analysis/src/db/input.rs deleted file mode 100644 index 9baf7474c..000000000 --- a/crates/ra_analysis/src/db/input.rs +++ /dev/null @@ -1,48 +0,0 @@ -use std::{ - sync::Arc, -}; - -use salsa; -use rustc_hash::FxHashSet; - -use crate::{FileId, FileResolverImp, CrateGraph, symbol_index::SymbolIndex}; - -salsa::query_group! { - pub(crate) trait FilesDatabase: salsa::Database { - fn file_text(file_id: FileId) -> Arc { - type FileTextQuery; - storage input; - } - fn file_source_root(file_id: FileId) -> SourceRootId { - type FileSourceRootQuery; - storage input; - } - fn source_root(id: SourceRootId) -> Arc { - type SourceRootQuery; - storage input; - } - fn libraries() -> Arc> { - type LibrarieseQuery; - storage input; - } - fn library_symbols(id: SourceRootId) -> Arc { - type LibrarySymbolsQuery; - storage input; - } - fn crate_graph() -> Arc { - type CrateGraphQuery; - storage input; - } - } -} - -#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub(crate) struct SourceRootId(pub(crate) u32); - -#[derive(Clone, Default, Debug, PartialEq, Eq)] -pub(crate) struct SourceRoot { - pub(crate) file_resolver: FileResolverImp, - pub(crate) files: FxHashSet, -} - -pub(crate) const WORKSPACE: SourceRootId = SourceRootId(0); diff --git a/crates/ra_analysis/src/db/mod.rs b/crates/ra_analysis/src/db/mod.rs deleted file mode 100644 index 1a9023697..000000000 --- a/crates/ra_analysis/src/db/mod.rs +++ /dev/null @@ -1,100 +0,0 @@ -pub(crate) mod input; - -use std::{ - sync::Arc, -}; - -use ra_editor::LineIndex; -use ra_syntax::File; -use salsa; - -use crate::{ - db, - Cancelable, Canceled, - descriptors::module::{SubmodulesQuery, ModuleTreeQuery, ModulesDatabase}, - symbol_index::SymbolIndex, - FileId, -}; - -#[derive(Default, Debug)] -pub(crate) struct RootDatabase { - runtime: salsa::Runtime, -} - -impl salsa::Database for RootDatabase { - fn salsa_runtime(&self) -> &salsa::Runtime { - &self.runtime - } -} - -pub(crate) fn check_canceled(db: &impl salsa::Database) -> Cancelable<()> { - if db.salsa_runtime().is_current_revision_canceled() { - Err(Canceled) - } else { - Ok(()) - } -} - -impl salsa::ParallelDatabase for RootDatabase { - fn fork(&self) -> Self { - RootDatabase { - runtime: self.runtime.fork(), - } - } -} - -impl Clone for RootDatabase { - fn clone(&self) -> RootDatabase { - salsa::ParallelDatabase::fork(self) - } -} - -salsa::database_storage! { - pub(crate) struct RootDatabaseStorage for RootDatabase { - impl input::FilesDatabase { - fn file_text() for input::FileTextQuery; - fn file_source_root() for input::FileSourceRootQuery; - fn source_root() for input::SourceRootQuery; - fn libraries() for input::LibrarieseQuery; - fn library_symbols() for input::LibrarySymbolsQuery; - fn crate_graph() for input::CrateGraphQuery; - } - impl SyntaxDatabase { - fn file_syntax() for FileSyntaxQuery; - fn file_lines() for FileLinesQuery; - fn file_symbols() for FileSymbolsQuery; - } - impl ModulesDatabase { - fn module_tree() for ModuleTreeQuery; - fn module_descriptor() for SubmodulesQuery; - } - } -} - -salsa::query_group! { - pub(crate) trait SyntaxDatabase: input::FilesDatabase { - fn file_syntax(file_id: FileId) -> File { - type FileSyntaxQuery; - } - fn file_lines(file_id: FileId) -> Arc { - type FileLinesQuery; - } - fn file_symbols(file_id: FileId) -> Cancelable> { - type FileSymbolsQuery; - } - } -} - -fn file_syntax(db: &impl SyntaxDatabase, file_id: FileId) -> File { - let text = db.file_text(file_id); - File::parse(&*text) -} -fn file_lines(db: &impl SyntaxDatabase, file_id: FileId) -> Arc { - let text = db.file_text(file_id); - Arc::new(LineIndex::new(&*text)) -} -fn file_symbols(db: &impl SyntaxDatabase, file_id: FileId) -> Cancelable> { - db::check_canceled(db)?; - let syntax = db.file_syntax(file_id); - Ok(Arc::new(SymbolIndex::for_file(file_id, syntax))) -} diff --git a/crates/ra_analysis/src/descriptors/module/imp.rs b/crates/ra_analysis/src/descriptors/module/imp.rs index 6a408dc89..aecf6e29a 100644 --- a/crates/ra_analysis/src/descriptors/module/imp.rs +++ b/crates/ra_analysis/src/descriptors/module/imp.rs @@ -8,8 +8,8 @@ use ra_syntax::{ }; use crate::{ - FileId, Cancelable, FileResolverImp, - db::{self, input::{SourceRoot, SourceRootId}}, + FileId, Cancelable, FileResolverImp, db, + input::{SourceRoot, SourceRootId}, }; use super::{ diff --git a/crates/ra_analysis/src/descriptors/module/mod.rs b/crates/ra_analysis/src/descriptors/module/mod.rs index 98024cc15..8968c4afd 100644 --- a/crates/ra_analysis/src/descriptors/module/mod.rs +++ b/crates/ra_analysis/src/descriptors/module/mod.rs @@ -7,7 +7,8 @@ use ra_syntax::{ast::{self, NameOwner, AstNode}, SmolStr, SyntaxNode}; use crate::{ FileId, Cancelable, - db::{SyntaxDatabase, input::SourceRootId}, + db::SyntaxDatabase, + input::SourceRootId, }; salsa::query_group! { diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index b24b5cfdc..69f5ed330 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -18,8 +18,9 @@ use crate::{ AnalysisChange, db::{ self, SyntaxDatabase, - input::{SourceRootId, FilesDatabase, SourceRoot, WORKSPACE} + }, + input::{SourceRootId, FilesDatabase, SourceRoot, WORKSPACE}, descriptors::module::{ModulesDatabase, ModuleTree, Problem}, descriptors::{FnDescriptor}, CrateGraph, CrateId, Diagnostic, FileId, FileResolver, FileSystemEdit, Position, @@ -102,7 +103,7 @@ impl AnalysisHostImpl { for (file_id, text) in change.files_changed { self.db - .query(db::input::FileTextQuery) + .query(crate::input::FileTextQuery) .set(file_id, Arc::new(text)) } if !(change.files_added.is_empty() && change.files_removed.is_empty()) { @@ -111,22 +112,22 @@ impl AnalysisHostImpl { let mut source_root = SourceRoot::clone(&self.db.source_root(WORKSPACE)); for (file_id, text) in change.files_added { self.db - .query(db::input::FileTextQuery) + .query(crate::input::FileTextQuery) .set(file_id, Arc::new(text)); self.db - .query(db::input::FileSourceRootQuery) - .set(file_id, db::input::WORKSPACE); + .query(crate::input::FileSourceRootQuery) + .set(file_id, crate::input::WORKSPACE); source_root.files.insert(file_id); } for file_id in change.files_removed { self.db - .query(db::input::FileTextQuery) + .query(crate::input::FileTextQuery) .set(file_id, Arc::new(String::new())); source_root.files.remove(&file_id); } source_root.file_resolver = file_resolver; self.db - .query(db::input::SourceRootQuery) + .query(crate::input::SourceRootQuery) .set(WORKSPACE, Arc::new(source_root)) } if !change.libraries_added.is_empty() { @@ -138,10 +139,10 @@ impl AnalysisHostImpl { for (file_id, text) in library.files { files.insert(file_id); self.db - .query(db::input::FileSourceRootQuery) + .query(crate::input::FileSourceRootQuery) .set_constant(file_id, source_root_id); self.db - .query(db::input::FileTextQuery) + .query(crate::input::FileTextQuery) .set_constant(file_id, Arc::new(text)); } let source_root = SourceRoot { @@ -149,18 +150,18 @@ impl AnalysisHostImpl { file_resolver: library.file_resolver, }; self.db - .query(db::input::SourceRootQuery) + .query(crate::input::SourceRootQuery) .set(source_root_id, Arc::new(source_root)); self.db - .query(db::input::LibrarySymbolsQuery) + .query(crate::input::LibrarySymbolsQuery) .set(source_root_id, Arc::new(library.symbol_index)); } self.db - .query(db::input::LibrarieseQuery) + .query(crate::input::LibrarieseQuery) .set((), Arc::new(libraries)); } if let Some(crate_graph) = change.crate_graph { - self.db.query(db::input::CrateGraphQuery) + self.db.query(crate::input::CrateGraphQuery) .set((), Arc::new(crate_graph)) } } diff --git a/crates/ra_analysis/src/input.rs b/crates/ra_analysis/src/input.rs new file mode 100644 index 000000000..e64fad40c --- /dev/null +++ b/crates/ra_analysis/src/input.rs @@ -0,0 +1,79 @@ +use std::{ + sync::Arc, + fmt, +}; + +use salsa; +use rustc_hash::FxHashSet; +use relative_path::RelativePath; +use rustc_hash::FxHashMap; + +use crate::{symbol_index::SymbolIndex, FileResolverImp}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct FileId(pub u32); + +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct CrateId(pub u32); + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct CrateGraph { + pub(crate) crate_roots: FxHashMap, +} + +impl CrateGraph { + pub fn new() -> CrateGraph { + CrateGraph::default() + } + pub fn add_crate_root(&mut self, file_id: FileId) -> CrateId{ + let crate_id = CrateId(self.crate_roots.len() as u32); + let prev = self.crate_roots.insert(crate_id, file_id); + assert!(prev.is_none()); + crate_id + } +} + +pub trait FileResolver: fmt::Debug + Send + Sync + 'static { + fn file_stem(&self, file_id: FileId) -> String; + fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option; +} + +salsa::query_group! { + pub(crate) trait FilesDatabase: salsa::Database { + fn file_text(file_id: FileId) -> Arc { + type FileTextQuery; + storage input; + } + fn file_source_root(file_id: FileId) -> SourceRootId { + type FileSourceRootQuery; + storage input; + } + fn source_root(id: SourceRootId) -> Arc { + type SourceRootQuery; + storage input; + } + fn libraries() -> Arc> { + type LibrarieseQuery; + storage input; + } + fn library_symbols(id: SourceRootId) -> Arc { + type LibrarySymbolsQuery; + storage input; + } + fn crate_graph() -> Arc { + type CrateGraphQuery; + storage input; + } + } +} + +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub(crate) struct SourceRootId(pub(crate) u32); + +#[derive(Clone, Default, Debug, PartialEq, Eq)] +pub(crate) struct SourceRoot { + pub(crate) file_resolver: FileResolverImp, + pub(crate) files: FxHashSet, +} + +pub(crate) const WORKSPACE: SourceRootId = SourceRootId(0); diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index af7894cd0..a67cac21e 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs @@ -6,6 +6,7 @@ extern crate relative_path; extern crate rustc_hash; extern crate salsa; +mod input; mod db; mod descriptors; mod imp; @@ -17,9 +18,8 @@ use std::{ sync::Arc, }; -use rustc_hash::FxHashMap; use ra_syntax::{AtomEdit, File, TextRange, TextUnit}; -use relative_path::{RelativePath, RelativePathBuf}; +use relative_path::RelativePathBuf; use rayon::prelude::*; use crate::{ @@ -29,6 +29,7 @@ use crate::{ pub use crate::{ descriptors::FnDescriptor, + input::{FileId, FileResolver, CrateGraph, CrateId} }; pub use ra_editor::{ CompletionItem, FileSymbol, Fold, FoldKind, HighlightedRange, LineIndex, Runnable, @@ -49,34 +50,6 @@ impl std::fmt::Display for Canceled { impl std::error::Error for Canceled { } -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct FileId(pub u32); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct CrateId(pub u32); - -#[derive(Debug, Clone, Default, PartialEq, Eq)] -pub struct CrateGraph { - crate_roots: FxHashMap, -} - -impl CrateGraph { - pub fn new() -> CrateGraph { - CrateGraph::default() - } - pub fn add_crate_root(&mut self, file_id: FileId) -> CrateId{ - let crate_id = CrateId(self.crate_roots.len() as u32); - let prev = self.crate_roots.insert(crate_id, file_id); - assert!(prev.is_none()); - crate_id - } -} - -pub trait FileResolver: fmt::Debug + Send + Sync + 'static { - fn file_stem(&self, file_id: FileId) -> String; - fn resolve(&self, file_id: FileId, path: &RelativePath) -> Option; -} - #[derive(Default)] pub struct AnalysisChange { files_added: Vec<(FileId, String)>, -- cgit v1.2.3