17 个稳定版本
2.7.0 | 2021年9月27日 |
---|---|
2.6.0 | 2021年6月21日 |
2.5.1 | 2021年5月16日 |
2.3.0 | 2021年4月28日 |
1.3.0 | 2019年7月26日 |
#20 in #code
204 每月下载量
在 smt2 中使用
110KB
1.5K SLoC
源Span
文档 | 包信息 | 仓库 |
此包提供定位源文件中字符和字符范围(跨度)的实用工具。它还提供打印带有跨度信息、提示、错误、警告和注释的源文件片段的方法,就像 rustc
编译器一样。
基本用法
此包设计为增量解析实用工具。其主要功能是跟踪字符流中每个字符的行和列位置
use source_span::Position;
let metrics = &source_span::DEFAULT_METRICS; // characters metrics
let mut pos = Position::new(0, 0);
let str = "Hello\nWorld!";
for c in str.chars() {
// `pos` holds the position (line, column) of
// the current character at all points.
pos.shift(c, metrics)
}
使用 Span
类型,还可以构建字符范围。
let mut chars = "1 + (2 * 2) / 3".chars();
let mut pos = Position::new(0, 0);
while let Some(c) = chars.next() {
if c == '(' {
break
}
pos.shift(c, &metrics)
}
let mut span: Span = pos.into();
while let Some(c) = chars.next() {
span.push(c, &metrics);
if c == ')' {
break
}
}
// `span` now holds the beginning and end position of the `"(2 * 2)"` slice.
SourceBuffer
此包提供了一个简单的 SourceBuffer
缓冲区,用于按字符位置索引字符流。
use std::fs::File;
use source_span::{DEFAULT_METRICS, Position, SourceBuffer};
let file = File::open("examples/fib.txt")?;
let chars = utf8_decode::UnsafeDecoder::new(file.bytes());
let metrics = DEFAULT_METRICS;
let buffer = SourceBuffer::new(chars, Position::default(), metrics);
buffer.at(Position::new(4, 2)).unwrap()? // get the character at line 4, column 2.
SourceBuffer
类型作为字符迭代器的包装器。它是惰性的:只有当需要时才会从包装的迭代器中拉取新字符并将其放入缓冲区。它可以用于访问特定游标位置的字符(如上所示)或使用 Span
迭代文本片段。
for c in buffer.iter_span(span) {
// do something
}
格式化
此包还提供了一种格式化装饰文本的方法,使用 ASCII 艺术突出显示源文本的某些部分。它可以用来产生类似以下输出的结果
每个突出显示都由一个跨度描述,可以关联到一个标签,并以特定样式绘制(定义绘制线条时使用的字符和颜色)。
许可证
许可证为以下之一
- Apache 许可证,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选。
贡献
除非您明确说明,否则您根据Apache-2.0许可证定义,有意提交以包含在工作中的任何贡献,将按照上述方式双授权,不附加任何额外条款或条件。