feat: add better diagnostic rendering

This commit is contained in:
2026-04-21 22:35:37 +02:00
parent 0162d5b845
commit 42ba357302
5 changed files with 74 additions and 6 deletions
Generated
+37
View File
@@ -125,6 +125,17 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "codespan-reporting"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681"
dependencies = [
"serde",
"termcolor",
"unicode-width",
]
[[package]]
name = "colorchoice"
version = "1.0.5"
@@ -136,6 +147,7 @@ name = "compiler"
version = "0.1.0"
dependencies = [
"clap",
"codespan-reporting",
"cranelift-codegen",
"cranelift-frontend",
"cranelift-module",
@@ -468,6 +480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
@@ -525,12 +538,27 @@ version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
[[package]]
name = "termcolor"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
dependencies = [
"winapi-util",
]
[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-width"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -547,6 +575,15 @@ dependencies = [
"libm",
]
[[package]]
name = "winapi-util"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys",
]
[[package]]
name = "windows-link"
version = "0.2.1"
+1
View File
@@ -10,3 +10,4 @@ cranelift-frontend = "0.131.0"
cranelift-module = "0.131.0"
cranelift-object = "0.131.0"
cranelift-native = "0.131.0"
codespan-reporting = "0.13.1"
+4
View File
@@ -1,3 +1,7 @@
fn main() -> i8 {
if 2 * 5 == 10 {
return -1;
} else {
return 45;
}
}
+7 -1
View File
@@ -1,4 +1,4 @@
use std::fmt::Display;
use std::{fmt::Display, ops::Range};
/// A half-open interval `[start, end)` representing a location in the source text.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -23,6 +23,12 @@ impl Span {
}
}
impl From<Span> for Range<usize> {
fn from(value: Span) -> Self {
value.start..value.end
}
}
/// A fundamental, categorized unit of source code produced during lexical analysis.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Token<'src> {
+24 -4
View File
@@ -1,12 +1,16 @@
use std::{fs::read_to_string, path::PathBuf, process::exit};
use clap::Parser as ClapParser;
use codespan_reporting::diagnostic::{Diagnostic, Label};
use codespan_reporting::files::SimpleFile;
use codespan_reporting::term;
use codespan_reporting::term::termcolor::{ColorChoice, StandardStream};
use crate::frontend::parser::Parser;
use crate::frontend::sema::Sema;
use crate::middle::builder::MirBuilder;
use crate::middle::dce::eliminate_dead_code;
use crate::middle::fold::fold_constants;
use clap::Parser as ClapParser;
pub mod backend;
pub mod frontend;
@@ -37,12 +41,20 @@ fn main() {
exit(1);
});
let writer = StandardStream::stderr(ColorChoice::Always);
let config = term::Config::default();
let file = SimpleFile::new(&cli.input, &content);
let mut parser = Parser::new(&content);
let module = parser.parse_module();
if let Some(errors) = parser.errors() {
for error in errors {
eprintln!("{:?}", error);
let diagnostic = Diagnostic::error()
.with_message(error.message)
.with_label(Label::primary((), error.span));
term::emit_to_write_style(&mut writer.lock(), &config, &file, &diagnostic).unwrap();
}
exit(1);
@@ -53,7 +65,11 @@ fn main() {
if let Some(errors) = sema.errors() {
for error in errors {
eprintln!("{:?}", error);
let diagnostic = Diagnostic::error()
.with_message(error.message)
.with_label(Label::primary((), error.span));
term::emit_to_write_style(&mut writer.lock(), &config, &file, &diagnostic).unwrap();
}
exit(1);
@@ -64,7 +80,11 @@ fn main() {
let warnings = eliminate_dead_code(&mut mir_module);
for warning in warnings {
eprintln!("Warning: {} at {:?}", warning.message, warning.span);
let diagnostic = Diagnostic::warning()
.with_message(warning.message)
.with_label(Label::primary((), warning.span));
term::emit_to_write_style(&mut writer.lock(), &config, &file, &diagnostic).unwrap();
}
let backend = CraneliftBackend::new();