use ra_editor::LineIndex;
use ra_syntax::{File, SyntaxNode};
-use salsa;
+use salsa::{self, Database};
use crate::{
db,
Cancelable, Canceled, FileId,
};
-#[derive(Default, Debug)]
+#[derive(Debug)]
pub(crate) struct RootDatabase {
runtime: salsa::Runtime<RootDatabase>,
}
}
}
+impl Default for RootDatabase {
+ fn default() -> RootDatabase {
+ let mut db = RootDatabase {
+ runtime: Default::default(),
+ };
+ db.query_mut(crate::input::SourceRootQuery)
+ .set(crate::input::WORKSPACE, Default::default());
+ db.query_mut(crate::input::CrateGraphQuery)
+ .set((), Default::default());
+ db.query_mut(crate::input::LibrariesQuery)
+ .set((), Default::default());
+ db
+ }
+}
+
pub(crate) fn check_canceled(db: &impl salsa::Database) -> Cancelable<()> {
if db.salsa_runtime().is_current_revision_canceled() {
Err(Canceled)
}
}
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub(crate) struct AnalysisHostImpl {
db: db::RootDatabase,
}
impl AnalysisHostImpl {
- pub fn new() -> AnalysisHostImpl {
- let mut db = db::RootDatabase::default();
- db.query_mut(crate::input::SourceRootQuery)
- .set(WORKSPACE, Default::default());
- db.query_mut(crate::input::CrateGraphQuery)
- .set((), Default::default());
- db.query_mut(crate::input::LibrariesQuery)
- .set((), Default::default());
- AnalysisHostImpl { db }
- }
pub fn analysis(&self) -> AnalysisImpl {
AnalysisImpl {
db: self.db.snapshot(),
}
/// `AnalysisHost` stores the current state of the world.
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct AnalysisHost {
imp: AnalysisHostImpl,
}
impl AnalysisHost {
- pub fn new() -> AnalysisHost {
- AnalysisHost {
- imp: AnalysisHostImpl::new(),
- }
- }
/// Returns a snapshot of the current state, which you can query for
/// semantic information.
pub fn analysis(&self) -> Analysis {
FileId(idx as u32 + 1)
}
pub fn analysis_host(self) -> AnalysisHost {
- let mut host = AnalysisHost::new();
+ let mut host = AnalysisHost::default();
let mut file_map = Vec::new();
let mut change = AnalysisChange::new();
for (id, (path, contents)) in self.files.into_iter().enumerate() {
let (ws_worker, ws_watcher) = workspace_loader();
info!("server initialized, serving requests");
- let mut state = ServerWorldState::new();
+ let mut state = ServerWorldState::default();
let mut pending_requests = FxHashSet::default();
let mut subs = Subscriptions::new();
}
impl PathMap {
- pub fn new() -> PathMap {
- Default::default()
- }
pub fn get_or_insert(&mut self, path: PathBuf, root: Root) -> (bool, FileId) {
let mut inserted = false;
let file_id = self
#[test]
fn test_resolve() {
- let mut m = PathMap::new();
+ let mut m = PathMap::default();
let (_, id1) = m.get_or_insert(PathBuf::from("/foo"), Root::Workspace);
let (_, id2) = m.get_or_insert(PathBuf::from("/foo/bar.rs"), Root::Workspace);
assert_eq!(m.resolve(id1, &RelativePath::new("bar.rs")), Some(id2),)
Result,
};
-#[derive(Debug)]
+#[derive(Debug, Default)]
pub struct ServerWorldState {
pub workspaces: Arc<Vec<CargoWorkspace>>,
pub analysis_host: AnalysisHost,
}
impl ServerWorldState {
- pub fn new() -> ServerWorldState {
- ServerWorldState {
- workspaces: Arc::new(Vec::new()),
- analysis_host: AnalysisHost::new(),
- path_map: PathMap::new(),
- mem_map: FxHashMap::default(),
- }
- }
pub fn apply_fs_changes(&mut self, events: Vec<FileEvent>) {
let mut change = AnalysisChange::new();
let mut inserted = false;