mirror of
https://github.com/typst/typst
synced 2025-06-13 23:56:25 +08:00
Adjust source file API surface (#6423)
This commit is contained in:
parent
a6ab6ac99a
commit
98034903e4
@ -187,7 +187,7 @@ impl SystemWorld {
|
|||||||
self.slot(id, |slot| {
|
self.slot(id, |slot| {
|
||||||
if let Some(source) = slot.source.get() {
|
if let Some(source) = slot.source.get() {
|
||||||
let source = source.as_ref().expect("file is not valid");
|
let source = source.as_ref().expect("file is not valid");
|
||||||
source.lines()
|
source.lines().clone()
|
||||||
} else if let Some(bytes) = slot.file.get() {
|
} else if let Some(bytes) = slot.file.get() {
|
||||||
let bytes = bytes.as_ref().expect("file is not valid");
|
let bytes = bytes.as_ref().expect("file is not valid");
|
||||||
Lines::try_from(bytes).expect("file is not valid utf-8")
|
Lines::try_from(bytes).expect("file is not valid utf-8")
|
||||||
|
@ -1698,7 +1698,7 @@ mod tests {
|
|||||||
|
|
||||||
// Then, add the invalid `#cite` call. Had the document been invalid
|
// Then, add the invalid `#cite` call. Had the document been invalid
|
||||||
// initially, we would have no populated document to autocomplete with.
|
// 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()");
|
world.main.edit(end..end, " #cite()");
|
||||||
|
|
||||||
test_with_doc(&world, -2, doc.as_ref())
|
test_with_doc(&world, -2, doc.as_ref())
|
||||||
|
@ -228,7 +228,7 @@ impl FilePos for (&str, isize) {
|
|||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn cursor(source: &Source, cursor: isize) -> usize {
|
fn cursor(source: &Source, cursor: isize) -> usize {
|
||||||
if cursor < 0 {
|
if cursor < 0 {
|
||||||
source.len_bytes().checked_add_signed(cursor + 1).unwrap()
|
source.text().len().checked_add_signed(cursor + 1).unwrap()
|
||||||
} else {
|
} else {
|
||||||
cursor as usize
|
cursor as usize
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ use std::sync::Arc;
|
|||||||
use crate::is_newline;
|
use crate::is_newline;
|
||||||
|
|
||||||
/// A text buffer and metadata about lines.
|
/// A text buffer and metadata about lines.
|
||||||
|
///
|
||||||
|
/// This is internally reference-counted and thus cheap to clone.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Lines<S>(Arc<Repr<S>>);
|
pub struct Lines<S>(Arc<Repr<S>>);
|
||||||
|
|
||||||
|
@ -259,10 +259,10 @@ mod tests {
|
|||||||
panic!("test failed");
|
panic!("test failed");
|
||||||
}
|
}
|
||||||
if incremental {
|
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 {
|
} else {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
source.len_bytes(),
|
source.text().len(),
|
||||||
range.len(),
|
range.len(),
|
||||||
"shouldn't have been incremental"
|
"shouldn't have been incremental"
|
||||||
);
|
);
|
||||||
|
@ -56,19 +56,15 @@ impl Source {
|
|||||||
self.0.id
|
self.0.id
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 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.
|
/// The whole source as a string slice.
|
||||||
pub fn text(&self) -> &str {
|
pub fn text(&self) -> &str {
|
||||||
self.0.lines.text()
|
self.0.lines.text()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Slice out the part of the source code enclosed by the range.
|
/// An acceleration structure for conversion of UTF-8, UTF-16 and
|
||||||
pub fn get(&self, range: Range<usize>) -> Option<&str> {
|
/// line/column indices.
|
||||||
self.text().get(range)
|
pub fn lines(&self) -> &Lines<String> {
|
||||||
|
&self.0.lines
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fully replace the source text.
|
/// Fully replace the source text.
|
||||||
@ -107,21 +103,6 @@ impl Source {
|
|||||||
reparse(&mut inner.root, inner.lines.text(), replace, with.len())
|
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.
|
/// Find the node with the given span.
|
||||||
///
|
///
|
||||||
/// Returns `None` if the span does not point into this source file.
|
/// Returns `None` if the span does not point into this source file.
|
||||||
|
@ -92,7 +92,7 @@ impl TestWorld {
|
|||||||
self.slot(id, |slot| {
|
self.slot(id, |slot| {
|
||||||
if let Some(source) = slot.source.get() {
|
if let Some(source) = slot.source.get() {
|
||||||
let source = source.as_ref().expect("file is not valid");
|
let source = source.as_ref().expect("file is not valid");
|
||||||
source.lines()
|
source.lines().clone()
|
||||||
} else if let Some(bytes) = slot.file.get() {
|
} else if let Some(bytes) = slot.file.get() {
|
||||||
let bytes = bytes.as_ref().expect("file is not valid");
|
let bytes = bytes.as_ref().expect("file is not valid");
|
||||||
Lines::try_from(bytes).expect("file is not valid utf-8")
|
Lines::try_from(bytes).expect("file is not valid utf-8")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user