mirror of
https://github.com/oxalica/nil.git
synced 2024-11-30 01:54:53 +03:00
Impl Analysis interface
This commit is contained in:
parent
2ff5eddeaa
commit
0d8cf14269
@ -55,7 +55,7 @@ impl Change {
|
|||||||
self.file_changes.push((file_id, content));
|
self.file_changes.push((file_id, content));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn apply(self, db: &mut dyn SourceDatabase) {
|
pub(crate) fn apply(self, db: &mut dyn SourceDatabase) {
|
||||||
for (file_id, content) in self.file_changes {
|
for (file_id, content) in self.file_changes {
|
||||||
let content = content.unwrap_or_else(|| String::new().into());
|
let content = content.unwrap_or_else(|| String::new().into());
|
||||||
// TODO: Better guess of durability?
|
// TODO: Better guess of durability?
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::FileId;
|
use crate::{base::SourceDatabaseStorage, def::DefDatabaseStorage, Change, FileId, FilePos};
|
||||||
use crate::{base::SourceDatabaseStorage, def::DefDatabaseStorage};
|
|
||||||
use rowan::TextRange;
|
use rowan::TextRange;
|
||||||
|
use salsa::{Cancelled, Database, Durability, ParallelDatabase};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
mod goto_definition;
|
mod goto_definition;
|
||||||
@ -12,6 +12,8 @@ pub struct NavigationTarget {
|
|||||||
pub focus_range: TextRange,
|
pub focus_range: TextRange,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type Cancellable<T> = Result<T, Cancelled>;
|
||||||
|
|
||||||
#[salsa::database(SourceDatabaseStorage, DefDatabaseStorage)]
|
#[salsa::database(SourceDatabaseStorage, DefDatabaseStorage)]
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct RootDatabase {
|
pub struct RootDatabase {
|
||||||
@ -33,3 +35,47 @@ impl fmt::Debug for RootDatabase {
|
|||||||
f.debug_struct("RootDatabase").finish_non_exhaustive()
|
f.debug_struct("RootDatabase").finish_non_exhaustive()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct AnalysisHost {
|
||||||
|
db: RootDatabase,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AnalysisHost {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn snapshot(&self) -> Analysis {
|
||||||
|
Analysis {
|
||||||
|
db: self.db.snapshot(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn request_cancellation(&mut self) {
|
||||||
|
self.db.salsa_runtime_mut().synthetic_write(Durability::LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn apply_change(&mut self, change: Change) {
|
||||||
|
self.request_cancellation();
|
||||||
|
change.apply(&mut self.db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Analysis {
|
||||||
|
db: salsa::Snapshot<RootDatabase>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Analysis {
|
||||||
|
fn with_db<F, T>(&self, f: F) -> Cancellable<T>
|
||||||
|
where
|
||||||
|
F: FnOnce(&RootDatabase) -> T + std::panic::UnwindSafe,
|
||||||
|
{
|
||||||
|
Cancelled::catch(|| f(&self.db))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn goto_definition(&self, pos: FilePos) -> Cancellable<Option<NavigationTarget>> {
|
||||||
|
self.with_db(|db| goto_definition::goto_definition(db, pos.file_id, pos.value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,4 +6,4 @@ mod ide;
|
|||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
pub use base::{Change, FileId, FilePos, InFile};
|
pub use base::{Change, FileId, FilePos, InFile};
|
||||||
pub use ide::RootDatabase;
|
pub use ide::{Analysis, AnalysisHost, RootDatabase};
|
||||||
|
Loading…
Reference in New Issue
Block a user