Skip to content
Draft
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
451 changes: 319 additions & 132 deletions Cargo.lock

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[workspace]
members = ["crates/*", "xtask"]
resolver = "2"

[profile.dev.package.insta]
opt-level = 3
Expand All @@ -14,7 +15,7 @@ util = { path = "crates/util" }
hir = { path = "crates/hir" }
paths = { git = "https://github.com/rust-lang/rust-analyzer", rev = "d712e529405b0ef5719c81ae620c88a97db78d93" }
test-utils = { path = "crates/test-utils" }
insta = { version = "1.28.0", features = ["glob"] }
insta = { version = "1.29.0", features = ["glob"] }
drop_bomb = "0.1.5"

la-arena = "0.3"
Expand All @@ -24,6 +25,6 @@ tracing = "0.1.37"
itertools = "0.10.5"
dashmap = "5.4.0"

tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }

tracing-tree = "0.2.2"
tracing-tree = "0.2.3"
8 changes: 4 additions & 4 deletions crates/athena-language-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ edition = "2021"
[dependencies]
dashmap.workspace = true
syntax.workspace = true
tokio = { version = "1.26.0", features = [
tokio = { version = "1.28.2", features = [
"macros",
"io-std",
"rt",
Expand All @@ -21,8 +21,8 @@ paths.workspace = true
parking_lot = "0.12.1"
extend = "1.2.0"
tracing-subscriber.workspace = true
anyhow = "1.0.70"
anyhow = "1.0.71"
tracing.workspace = true
tracing-tree.workspace = true
serde = { version = "1.0.157", features = ["derive"] }
serde_json = "1.0.94"
serde = { version = "1.0.163", features = ["derive"] }
serde_json = "1.0.96"
1 change: 1 addition & 0 deletions crates/base-db/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ salsa = "0.17.0-pre.2"
paths.workspace = true
syntax.workspace = true
test-utils.workspace = true
tracing.workspace = true
24 changes: 18 additions & 6 deletions crates/base-db/src/fixture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use test_utils::{
extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER, ESCAPED_CURSOR_MARKER,
};

use crate::{FileId, FilePosition, FileRange, SourceDatabase, VirtualFilePath};
use crate::{FileId, FilePosition, FileRange, SourceDatabase, VfsPath, VirtualFilePathBuf};

pub trait WithFixture: Default + SourceDatabase + 'static {
fn with_single_file(ath_fixture: &str) -> (Self, FileId) {
Expand Down Expand Up @@ -59,14 +59,20 @@ impl<DB: SourceDatabase + Default + 'static> WithFixture for DB {}

pub struct ChangeFixture {
pub file_position: Option<(FileId, RangeOrOffset)>,
file_paths: Vec<VirtualFilePath>,
file_paths: Vec<VirtualFilePathBuf>,
file_contents: Vec<String>,
pub files: Vec<FileId>,
}

impl ChangeFixture {
pub fn apply(&mut self, db: &mut dyn SourceDatabase) {
assert_eq!(self.file_paths.len(), self.file_contents.len());
db.set_roots(
vec![VfsPath::Virtual(VirtualFilePathBuf::assert(
"virtual:/".into(),
))]
.into(),
);
for (idx, (path, text)) in self
.file_paths
.iter()
Expand All @@ -75,7 +81,7 @@ impl ChangeFixture {
{
let id = db.intern_path(path.clone().into());
assert_eq!(id.0.as_usize(), idx);
db.set_virtual_file_contents(path.clone(), Arc::new(text.clone()));
db.add_virtual_file(path.clone(), Arc::new(text.clone()));
self.files.push(id);
}
}
Expand All @@ -85,7 +91,7 @@ impl ChangeFixture {
let mut file_paths = Vec::new();
let mut file_contents = Vec::new();

let source_root_prefix = "/".to_string();
let source_root_prefix = VirtualFilePathBuf::PREFIX.to_string();
let mut file_id = FileId(salsa::InternId::from(0u32));

let mut file_position = None;
Expand All @@ -104,10 +110,16 @@ impl ChangeFixture {
entry.text.clone()
};

let meta = FileMeta::from(entry);
let mut meta = FileMeta::from(entry);
if !meta.path.starts_with(source_root_prefix.as_str()) {
assert!(meta.path.starts_with('/'));
let path = [source_root_prefix.as_str(), meta.path.as_str()].join("");

meta.path = path;
}
assert!(meta.path.starts_with(&source_root_prefix));

file_paths.push(meta.path.into());
file_paths.push(meta.path.try_into().unwrap());
file_contents.push(text);
file_id = FileId(salsa::InternId::from(file_id.0.as_u32() + 1));
}
Expand Down
37 changes: 22 additions & 15 deletions crates/base-db/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
pub mod fixture;
mod resolve_path;
mod virtual_path;

pub use paths::{AbsPath, AbsPathBuf};
pub use salsa::{self, Cancelled};
use std::sync::Arc;
use syntax::{ast, Parse, TextRange, TextSize};
pub use virtual_path::VirtualFilePathBuf;

#[macro_export]
macro_rules! impl_intern_key {
Expand Down Expand Up @@ -45,7 +48,7 @@ impl_intern_key!(FileId);
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum VfsPath {
Real(AbsPathBuf),
Virtual(VirtualFilePath),
Virtual(VirtualFilePathBuf),
}

impl VfsPath {
Expand All @@ -70,41 +73,45 @@ impl From<AbsPathBuf> for VfsPath {
}
}

impl From<VirtualFilePath> for VfsPath {
fn from(value: VirtualFilePath) -> Self {
impl From<VirtualFilePathBuf> for VfsPath {
fn from(value: VirtualFilePathBuf) -> Self {
Self::Virtual(value)
}
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct VirtualFilePath(String);

impl From<String> for VirtualFilePath {
fn from(value: String) -> Self {
Self(value)
}
}

pub trait FileWatcher {
fn did_change_file(&mut self, file_id: FileId);

fn in_mem_contents(&self, path: &AbsPath) -> Option<Arc<String>>;

fn set_in_mem_contents(&mut self, path: AbsPathBuf, contents: Arc<String>);

fn add_virtual_file(&mut self, path: VirtualFilePathBuf, contents: Arc<String>);

fn get_virtual_file(&self, path: VirtualFilePathBuf) -> Option<Arc<String>>;
}

#[salsa::query_group(SourceDatabaseStorage)]
pub trait SourceDatabase: std::fmt::Debug + FileWatcher {
pub trait SourceDatabase: std::fmt::Debug + FileWatcher + VirtualFileDatabase {
#[salsa::invoke(parse_query)]
fn parse(&self, file_id: FileId) -> Parse<ast::SourceFile>;

#[salsa::interned]
fn intern_path(&self, path: VfsPath) -> FileId;

fn file_contents(&self, file: FileId) -> Arc<String>;

#[salsa::invoke(resolve_path::resolve_file_path_query)]
fn resolve_file_path(&self, from: FileId, path: String) -> Option<FileId>;

#[salsa::input]
fn virtual_file_contents(&self, file: VirtualFilePath) -> Arc<String>;
fn roots(&self) -> Arc<[VfsPath]>;
}

fn file_contents(&self, file: FileId) -> Arc<String>;
#[salsa::query_group(VirtualFileDatabaseStorage)]
pub trait VirtualFileDatabase {
#[salsa::input]
fn virtual_file_contents(&self, file: VirtualFilePathBuf) -> Arc<String>;
}

fn file_contents(db: &dyn SourceDatabase, file: FileId) -> Arc<String> {
Expand Down
Loading