summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-06-10 20:13:33 +0200
committerGitHub <noreply@github.com>2025-06-10 18:13:33 +0000
commit98034903e4184708dbaf3cf6b23a4f4de5e910ec (patch)
tree449ded5f9157587720ee6cdf656b18a121db4a74
parenta6ab6ac99a3db30d833f60e59959785f60fdc853 (diff)
Adjust source file API surface (#6423)
-rw-r--r--crates/typst-cli/src/world.rs2
-rw-r--r--crates/typst-ide/src/complete.rs2
-rw-r--r--crates/typst-ide/src/tests.rs2
-rw-r--r--crates/typst-syntax/src/lines.rs2
-rw-r--r--crates/typst-syntax/src/reparser.rs4
-rw-r--r--crates/typst-syntax/src/source.rs27
-rw-r--r--tests/src/world.rs2
7 files changed, 12 insertions, 29 deletions
diff --git a/crates/typst-cli/src/world.rs b/crates/typst-cli/src/world.rs
index f63d34b6..95bee235 100644
--- a/crates/typst-cli/src/world.rs
+++ b/crates/typst-cli/src/world.rs
@@ -187,7 +187,7 @@ impl SystemWorld {
self.slot(id, |slot| {
if let Some(source) = slot.source.get() {
let source = source.as_ref().expect("file is not valid");
- source.lines()
+ source.lines().clone()
} else if let Some(bytes) = slot.file.get() {
let bytes = bytes.as_ref().expect("file is not valid");
Lines::try_from(bytes).expect("file is not valid utf-8")
diff --git a/crates/typst-ide/src/complete.rs b/crates/typst-ide/src/complete.rs
index a042b164..c9832067 100644
--- a/crates/typst-ide/src/complete.rs
+++ b/crates/typst-ide/src/complete.rs
@@ -1698,7 +1698,7 @@ mod tests {
// Then, add the invalid `#cite` call. Had the document been invalid
// initially, we would have no populated document to autocomplete with.
- let end = world.main.len_bytes();
+ let end = world.main.text().len();
world.main.edit(end..end, " #cite()");
test_with_doc(&world, -2, doc.as_ref())
diff --git a/crates/typst-ide/src/tests.rs b/crates/typst-ide/src/tests.rs
index c6d733ca..1176e460 100644
--- a/crates/typst-ide/src/tests.rs
+++ b/crates/typst-ide/src/tests.rs
@@ -228,7 +228,7 @@ impl FilePos for (&str, isize) {
#[track_caller]
fn cursor(source: &Source, cursor: isize) -> usize {
if cursor < 0 {
- source.len_bytes().checked_add_signed(cursor + 1).unwrap()
+ source.text().len().checked_add_signed(cursor + 1).unwrap()
} else {
cursor as usize
}
diff --git a/crates/typst-syntax/src/lines.rs b/crates/typst-syntax/src/lines.rs
index fa1e7756..768119dc 100644
--- a/crates/typst-syntax/src/lines.rs
+++ b/crates/typst-syntax/src/lines.rs
@@ -6,6 +6,8 @@ use std::sync::Arc;
use crate::is_newline;
/// A text buffer and metadata about lines.
+///
+/// This is internally reference-counted and thus cheap to clone.
#[derive(Clone)]
pub struct Lines<S>(Arc<Repr<S>>);
diff --git a/crates/typst-syntax/src/reparser.rs b/crates/typst-syntax/src/reparser.rs
index c20d8314..55555c96 100644
--- a/crates/typst-syntax/src/reparser.rs
+++ b/crates/typst-syntax/src/reparser.rs
@@ -259,10 +259,10 @@ mod tests {
panic!("test failed");
}
if incremental {
- assert_ne!(source.len_bytes(), range.len(), "should have been incremental");
+ assert_ne!(source.text().len(), range.len(), "should have been incremental");
} else {
assert_eq!(
- source.len_bytes(),
+ source.text().len(),
range.len(),
"shouldn't have been incremental"
);
diff --git a/crates/typst-syntax/src/source.rs b/crates/typst-syntax/src/source.rs
index 514cb9a4..abde1f98 100644
--- a/crates/typst-syntax/src/source.rs
+++ b/crates/typst-syntax/src/source.rs
@@ -57,18 +57,14 @@ impl Source {
}
/// The whole source as a string slice.
- pub fn lines(&self) -> Lines<String> {
- Lines::clone(&self.0.lines)
- }
-
- /// The whole source as a string slice.
pub fn text(&self) -> &str {
self.0.lines.text()
}
- /// Slice out the part of the source code enclosed by the range.
- pub fn get(&self, range: Range<usize>) -> Option<&str> {
- self.text().get(range)
+ /// An acceleration structure for conversion of UTF-8, UTF-16 and
+ /// line/column indices.
+ pub fn lines(&self) -> &Lines<String> {
+ &self.0.lines
}
/// Fully replace the source text.
@@ -107,21 +103,6 @@ impl Source {
reparse(&mut inner.root, inner.lines.text(), replace, with.len())
}
- /// Get the length of the file in UTF-8 encoded bytes.
- pub fn len_bytes(&self) -> usize {
- self.0.lines.len_bytes()
- }
-
- /// Get the length of the file in UTF-16 code units.
- pub fn len_utf16(&self) -> usize {
- self.0.lines.len_utf16()
- }
-
- /// Get the length of the file in lines.
- pub fn len_lines(&self) -> usize {
- self.0.lines.len_lines()
- }
-
/// Find the node with the given span.
///
/// Returns `None` if the span does not point into this source file.
diff --git a/tests/src/world.rs b/tests/src/world.rs
index bc3e690b..68a65c1b 100644
--- a/tests/src/world.rs
+++ b/tests/src/world.rs
@@ -92,7 +92,7 @@ impl TestWorld {
self.slot(id, |slot| {
if let Some(source) = slot.source.get() {
let source = source.as_ref().expect("file is not valid");
- source.lines()
+ source.lines().clone()
} else if let Some(bytes) = slot.file.get() {
let bytes = bytes.as_ref().expect("file is not valid");
Lines::try_from(bytes).expect("file is not valid utf-8")