11个版本

2.0.0 2023年3月7日
0.4.1 2024年4月25日
0.4.0 2024年1月1日
0.3.0 2023年6月7日
0.1.3 2021年7月29日

#4 in 编程语言

Download history 17534/week @ 2024-05-03 17973/week @ 2024-05-10 18472/week @ 2024-05-17 16800/week @ 2024-05-24 19329/week @ 2024-05-31 22420/week @ 2024-06-07 21502/week @ 2024-06-14 22604/week @ 2024-06-21 20055/week @ 2024-06-28 18196/week @ 2024-07-05 19140/week @ 2024-07-12 18382/week @ 2024-07-19 20912/week @ 2024-07-26 19801/week @ 2024-08-02 19225/week @ 2024-08-09 14240/week @ 2024-08-16

每月 77,863 次下载
用于 170 库(81 个直接使用)

MIT 许可证

105KB
2K SLoC

阿里阿德涅

crates.io crates.io License actions-badge

一个华丽的编译器诊断库。

示例

Ariadne supports arbitrary multi-line spans
fn main() {
    use ariadne::{Color, ColorGenerator, Fmt, Label, Report, ReportKind, Source};

    let mut colors = ColorGenerator::new();

    // Generate & choose some colours for each of our elements
    let a = colors.next();
    let b = colors.next();
    let out = Color::Fixed(81);

    Report::build(ReportKind::Error, "sample.tao", 12)
        .with_code(3)
        .with_message(format!("Incompatible types"))
        .with_label(
            Label::new(("sample.tao", 32..33))
                .with_message(format!("This is of type {}", "Nat".fg(a)))
                .with_color(a),
        )
        .with_label(
            Label::new(("sample.tao", 42..45))
                .with_message(format!("This is of type {}", "Str".fg(b)))
                .with_color(b),
        )
        .with_label(
            Label::new(("sample.tao", 11..48))
                .with_message(format!(
                    "The values are outputs of this {} expression",
                    "match".fg(out),
                ))
                .with_color(out),
        )
        .with_note(format!(
            "Outputs of {} expressions must coerce to the same type",
            "match".fg(out)
        ))
        .finish()
        .print(("sample.tao", Source::from(include_str!("sample.tao"))))
        .unwrap();
}

更多示例,请参阅 examples/

使用方法

对于您希望报告的每个错误

  • 调用 Report::build() 创建一个 ReportBuilder
  • 使用各种方法分配适当的错误细节,然后调用 finish 方法以获取一个 Report
  • 对于每个 Report,调用 printeprint 将报告直接写入 stdoutstderr。或者,您可以使用 write 将报告发送到任何其他 Write 目的地(例如文件)。

关于

ariadnechumsky 的姐妹项目。两者互不依赖,但我正在同时进行这两个项目,并希望它们的特性能够互补。如果您打算使用 ariadne 来处理编译器的输出,为什么不尝试使用 chumsky 来处理其输入呢?

特性

  • 支持任意跨度配置的内联和多行标签
  • 支持多文件错误
  • 通用于自定义跨度和文件缓存
  • 可选字符集以确保兼容性
  • 支持8位和24位颜色的彩色标签和突出显示(感谢 yansi
  • 标签优先级和排序
  • 紧凑模式以减小诊断的大小
  • 正确处理可变宽度字符,如制表符
  • 一个 ColorGenerator 类型,用于为视觉元素生成不同的颜色。
  • 其他许多选项(制表符宽度、标签附着点、下划线等)
  • 内置的排序/重叠启发式算法,以最佳方式避免重叠和标签交叉

货物特性

  • "concolor" 允许与 concolor 包集成,以实现应用程序全局颜色输出的控制
  • "auto-color" 启用 concolor"auto" 功能,实现自动颜色控制

concolor 的功能应由顶级二进制包定义,但如果没有启用任何功能,concolor 不会做任何事情。如果 ariadne 是您唯一使用 concolor 的依赖项,则 "auto-color" 提供了启用 concolor 自动颜色支持检测的便利性,即这

[dependencies]
ariadne = { version = "...", features = ["auto-color"] }

等同于这

[dependencies]
ariadne = { version = "...", features = ["concolor"] }
concolor = { version = "...", features = ["auto"] }

计划中的功能

  • 改进布局规划和空间使用
  • 非 ANSI 终端支持
  • 更多可访问性选项(屏幕阅读器友好模式、作为颜色替代的纹理高亮等)
  • 更多颜色选项
  • 更好地支持布局限制(例如最大终端宽度)

稳定性

API(应该)遵循 semver。然而,这并不适用于最终错误消息的布局。对内部布局启发式算法的微小调整通常会随着标签的轻微移动而导致错误消息的确切格式发生变化。如果您遇到认为是回归的布局更改(更改是不正确的,或者使您的诊断更难阅读),请提出问题。

信用

感谢

  • @brendanzab 提供了他们美丽的 codespan 包,这启发我尝试推动错误诊断的极限。

  • @estebank 通过他们在 Rust 上的工作,向无数人展示了编译器诊断可以有多好。

依赖关系

~470KB