1个不稳定版本

0.2.0-alpha.02023年1月30日

292编程语言

Download history 142/week @ 2024-03-13 161/week @ 2024-03-20 99/week @ 2024-03-27 82/week @ 2024-04-03 72/week @ 2024-04-10 135/week @ 2024-04-17 154/week @ 2024-04-24 123/week @ 2024-05-01 104/week @ 2024-05-08 95/week @ 2024-05-15 113/week @ 2024-05-22 96/week @ 2024-05-29 191/week @ 2024-06-05 266/week @ 2024-06-12 129/week @ 2024-06-19 84/week @ 2024-06-26

678 每月下载量

MIT 协议

73KB
1.5K SLoC

Ariadne

crates.io crates.io License actions-badge

一个花哨的编译器诊断Crates。

这是一个apollo-rs在等待新版本期间使用的临时分支!请勿依赖此分支。

示例

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 上的工作向无数人展示了编译器诊断可以有多好。

依赖关系

~465KB