20 个版本 (10 个重大更新)

0.11.1 2021年2月25日
0.11.0 2020年11月29日
0.10.1 2020年8月17日
0.10.0 2020年7月21日
0.1.0 2018年5月7日

#146 in 文本编辑器

Download history 1227/week @ 2024-03-13 1077/week @ 2024-03-20 1185/week @ 2024-03-27 1257/week @ 2024-04-03 1745/week @ 2024-04-10 1311/week @ 2024-04-17 1391/week @ 2024-04-24 1284/week @ 2024-05-01 1356/week @ 2024-05-08 1687/week @ 2024-05-15 1267/week @ 2024-05-22 644/week @ 2024-05-29 916/week @ 2024-06-05 983/week @ 2024-06-12 1173/week @ 2024-06-19 1197/week @ 2024-06-26

每月下载量:4,395
2 crates 中使用

Apache-2.0

105KB
1.5K SLoC

codespan-reporting

Continuous integration Crates.io Docs.rs Matrix

为基于文本的编程语言提供美观的诊断报告。

Example preview

如 Rust 和 Elm 这样的语言已经支持美观的错误报告输出,但为新编程语言实现这一功能可能需要大量工作!codespan-reporting crate 旨在让每个人都能轻松且相对容易地实现美观的错误诊断!

我们仍在努力改进 crate,以支持更广泛的使用案例并提高诊断渲染质量,请密切关注更新,并请提供反馈(如有)。我们也非常欢迎贡献!

示例

use codespan_reporting::diagnostic::{Diagnostic, Label};
use codespan_reporting::files::SimpleFiles;
use codespan_reporting::term::termcolor::{ColorChoice, StandardStream};

// `files::SimpleFile` and `files::SimpleFiles` help you get up and running with
// `codespan-reporting` quickly! More complicated use cases can be supported
// by creating custom implementations of the `files::Files` trait.

let mut files = SimpleFiles::new();

let file_id = files.add(
    "FizzBuzz.fun",
    unindent::unindent(
        r#"
            module FizzBuzz where

            fizz₁ : Nat → String
            fizz₁ num = case (mod num 5) (mod num 3) of
                0 0 => "FizzBuzz"
                0 _ => "Fizz"
                _ 0 => "Buzz"
                _ _ => num

            fizz₂ : Nat → String
            fizz₂ num =
                case (mod num 5) (mod num 3) of
                    0 0 => "FizzBuzz"
                    0 _ => "Fizz"
                    _ 0 => "Buzz"
                    _ _ => num
        "#,
    ),
);

// We normally recommend creating a custom diagnostic data type for your
// application, and then converting that to `codespan-reporting`'s diagnostic
// type, but for the sake of this example we construct it directly.

let diagnostic = Diagnostic::error()
    .with_message("`case` clauses have incompatible types")
    .with_code("E0308")
    .with_labels(vec![
        Label::primary(file_id, 328..331).with_message("expected `String`, found `Nat`"),
        Label::secondary(file_id, 211..331).with_message("`case` clauses have incompatible types"),
        Label::secondary(file_id, 258..268).with_message("this is found to be of type `String`"),
        Label::secondary(file_id, 284..290).with_message("this is found to be of type `String`"),
        Label::secondary(file_id, 306..312).with_message("this is found to be of type `String`"),
        Label::secondary(file_id, 186..192).with_message("expected type `String` found here"),
    ])
    .with_notes(vec![unindent::unindent(
        "
            expected type `String`
                found type `Nat`
        ",
    )]);

// We now set up the writer and configuration, and then finally render the
// diagnostic to standard error.

let writer = StandardStream::stderr(ColorChoice::Always);
let config = codespan_reporting::term::Config::default();

term::emit(&mut writer.lock(), &config, &files, &diagnostic)?;

运行 CLI 示例

要了解彩色 CLI 输出的样子,请克隆 仓库 并运行以下 shell 命令

cargo run --example term

有关使用 codespan-reporting 的更多示例,请参阅 示例目录

使用 codespan-reporting 的项目

codespan-reporting 目前在以下项目中使用

codespan-reporting 的替代方案

包括以下替代方案:

这些方案最终都受到了 rustc 优秀的 错误报告基础设施 的启发。

贡献

有关为 codespan-reporting 贡献的指南,请参阅 此处

行为准则

请注意,本项目附带行为准则发布。通过参与本项目,您同意遵守其条款。


lib.rs:

将 codespan 类型转换为语言服务器协议 (LSP) 类型的实用工具

依赖项

~2–11MB
~131K SLoC