Skip to content

Commit cc27487

Browse files
committed
Make File contents lazy
1 parent a05a82d commit cc27487

37 files changed

Lines changed: 613 additions & 169 deletions

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ ego-tree = "0.11.0"
5757
embed-resource = "3.0.9"
5858
env_logger = "0.11.10"
5959
etcetera = "0.11.0"
60+
filetime = "0.2.23"
6061
flate2 = "1.1.9"
6162
futures = "0.3.32"
6263
harp = { path = "crates/harp" }

crates/ark/src/lsp/ark_file.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl ArkFile {
5555
}
5656

5757
pub(crate) fn contents<'db>(&self, db: &'db dyn ArkDb) -> &'db str {
58-
self.file.contents(db).as_str()
58+
self.file.source_text(db).as_str()
5959
}
6060

6161
pub(crate) fn get_line<'db>(&self, db: &'db dyn ArkDb, line: usize) -> Option<&'db str> {
@@ -148,7 +148,13 @@ pub(crate) fn test_ark_file(code: &str) -> (oak_db::OakDatabase, ArkFile) {
148148
let url = Url::parse("file:///test.R").unwrap();
149149
let key = FilePath::from_url(&url);
150150
let file = ArkFile {
151-
file: File::new(&db, key, code.to_string(), None),
151+
file: File::new(
152+
&db,
153+
key,
154+
oak_db::FileRevision::zero(),
155+
Some(code.to_string()),
156+
None,
157+
),
152158
version: None,
153159
config: DocumentConfig::default(),
154160
url,

crates/ark/src/lsp/db.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ fn tree_sitter_query(db: &dyn ArkDb, file: File) -> TreeSitterTree {
6565

6666
// Unwrap Safety: parsing without a timeout or cancellation flag never
6767
// returns `None`.
68-
let tree = parser.parse(file.contents(db), None).unwrap();
68+
let tree = parser.parse(file.source_text(db).as_str(), None).unwrap();
6969

7070
TreeSitterTree(tree)
7171
}

crates/ark/src/lsp/diagnostics.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,13 @@ mod tests {
11731173

11741174
fn generate_diagnostics(code: &str, state: WorldState) -> Vec<lsp_types::Diagnostic> {
11751175
let url = url::Url::parse("file:///test.R").unwrap();
1176-
let file = oak_db::File::new(&state.db, FilePath::from_url(&url), code.to_string(), None);
1176+
let file = oak_db::File::new(
1177+
&state.db,
1178+
FilePath::from_url(&url),
1179+
oak_db::FileRevision::zero(),
1180+
Some(code.to_string()),
1181+
None,
1182+
);
11771183
let ark_file = ArkFile {
11781184
file,
11791185
version: None,

crates/ark/src/lsp/indent.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ mod tests {
302302
let mut contents = file.contents(&*db).to_string();
303303
let mut line_index = file.line_index(&*db).clone();
304304
from_proto::apply_text_edits(&mut contents, edits, &mut line_index, encoding);
305-
file.file.set_contents(db).to(contents);
305+
file.file.set_source_text_override(db).to(Some(contents));
306306
}
307307

308308
#[test]

crates/ark/src/lsp/indexer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub(crate) fn find(db: &dyn ArkDb, symbol: &str) -> Option<IndexEntry> {
103103
#[salsa::tracked(returns(ref))]
104104
fn file_index(db: &dyn ArkDb, file: File) -> FileIndex {
105105
let tree = file.tree_sitter(db);
106-
let contents = file.contents(db).as_str();
106+
let contents = file.source_text(db).as_str();
107107

108108
let root = tree.root_node();
109109
let mut cursor = root.walk();

crates/ark/src/lsp/tests/db.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
use aether_path::FilePath;
22
use oak_db::File;
3+
use oak_db::FileRevision;
34
use oak_db::OakDatabase;
45
use url::Url;
56

67
use crate::lsp::db::FileExt;
78

89
fn file(db: &OakDatabase, contents: &str) -> File {
910
let url = FilePath::from_url(&Url::parse("file:///test.R").unwrap());
10-
File::new(db, url, contents.to_string(), None)
11+
File::new(
12+
db,
13+
url,
14+
FileRevision::zero(),
15+
Some(contents.to_string()),
16+
None,
17+
)
1118
}
1219

1320
#[test]

crates/ark/src/lsp/tests/state_handlers.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ fn test_r_file_created_routes_through_add_file() {
251251
assert_eq!(root.scripts(&state.db).len(), 1);
252252
let file_path = FilePath::from_path_buf(path.clone()).unwrap();
253253
let file = state.db.file_by_path(&file_path).unwrap();
254-
assert_eq!(file.contents(&state.db), "x <- 1\n");
254+
assert_eq!(file.source_text(&state.db), "x <- 1\n");
255255
}
256256

257257
#[test]
@@ -280,7 +280,7 @@ fn test_r_file_changed_for_editor_open_file_is_skipped() {
280280
did_change_watched_files(params, &mut state).unwrap();
281281

282282
let file = state.db.file_by_path(&file_path).unwrap();
283-
assert_eq!(file.contents(&state.db), "editor_v2\n");
283+
assert_eq!(file.source_text(&state.db), "editor_v2\n");
284284
}
285285

286286
#[test]
@@ -318,7 +318,7 @@ fn test_r_file_changed_for_unopened_file_updates_contents() {
318318
.db
319319
.file_by_path(&file_path)
320320
.unwrap()
321-
.contents(&state.db),
321+
.source_text(&state.db),
322322
"v1\n"
323323
);
324324

@@ -333,7 +333,7 @@ fn test_r_file_changed_for_unopened_file_updates_contents() {
333333
.db
334334
.file_by_path(&file_path)
335335
.unwrap()
336-
.contents(&state.db),
336+
.source_text(&state.db),
337337
"v2\n"
338338
);
339339
}
@@ -365,7 +365,7 @@ fn test_r_file_deleted_for_editor_open_file_is_skipped() {
365365
did_change_watched_files(params, &mut state).unwrap();
366366

367367
let file = state.db.file_by_path(&file_path).unwrap();
368-
assert_eq!(file.contents(&state.db), "editor_v2\n");
368+
assert_eq!(file.source_text(&state.db), "editor_v2\n");
369369
}
370370

371371
#[test]
@@ -591,7 +591,7 @@ fn test_did_change_workspace_folders_preserves_open_buffer_across_churn() {
591591
.orphan_root()
592592
.files(&state.db)
593593
.contains(&after_remove));
594-
assert_eq!(after_remove.contents(&state.db), "editor <- 2\n");
594+
assert_eq!(after_remove.source_text(&state.db), "editor <- 2\n");
595595

596596
// Re-add the same folder. The file snaps back into pkg.files with
597597
// the same entity and the editor content carries over (the scan's
@@ -602,7 +602,7 @@ fn test_did_change_workspace_folders_preserves_open_buffer_across_churn() {
602602
let after_readd = state.db.file_by_path(&file_path).unwrap();
603603
assert_eq!(file_before, after_readd);
604604
assert!(after_readd.package(&state.db).is_some());
605-
assert_eq!(after_readd.contents(&state.db), "editor <- 2\n");
605+
assert_eq!(after_readd.source_text(&state.db), "editor <- 2\n");
606606
// `upsert_root_file` cleaned the orphan reference.
607607
assert!(!state
608608
.db

crates/oak_db/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ biome_line_index.workspace = true
2121
biome_rowan.workspace = true
2222
camino.workspace = true
2323
compact_str.workspace = true
24+
filetime.workspace = true
2425
log.workspace = true
2526
oak_core.workspace = true
2627
oak_package_metadata.workspace = true
@@ -33,3 +34,4 @@ url.workspace = true
3334

3435
[dev-dependencies]
3536
oak_semantic = { workspace = true, features = ["salsa", "testing"] }
37+
tempfile.workspace = true

0 commit comments

Comments
 (0)