#source-file #spans #source #map #code

source-span

源代码映射和显示工具

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

Download history 14/week @ 2024-04-22 12/week @ 2024-04-29 6/week @ 2024-05-06 9/week @ 2024-05-13 14/week @ 2024-05-20 12/week @ 2024-05-27 13/week @ 2024-06-03 17/week @ 2024-06-10 114/week @ 2024-06-17 20/week @ 2024-06-24 124/week @ 2024-07-01 29/week @ 2024-07-08 13/week @ 2024-07-15 65/week @ 2024-07-22 111/week @ 2024-07-29 13/week @ 2024-08-05

204 每月下载量
smt2 中使用

MIT/Apache

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 艺术突出显示源文本的某些部分。它可以用来产生类似以下输出的结果

Formatter example

每个突出显示都由一个跨度描述,可以关联到一个标签,并以特定样式绘制(定义绘制线条时使用的字符和颜色)。

许可证

许可证为以下之一

任选。

贡献

除非您明确说明,否则您根据Apache-2.0许可证定义,有意提交以包含在工作中的任何贡献,将按照上述方式双授权,不附加任何额外条款或条件。

依赖项