diff options
-rw-r--r-- | Cargo.lock | 8 | ||||
-rw-r--r-- | bin/src/main.rs | 41 | ||||
-rw-r--r-- | macros/src/lib.rs | 4 |
3 files changed, 39 insertions, 14 deletions
@@ -3,6 +3,12 @@ | |||
3 | version = 3 | 3 | version = 3 |
4 | 4 | ||
5 | [[package]] | 5 | [[package]] |
6 | name = "anyhow" | ||
7 | version = "1.0.44" | ||
8 | source = "registry+https://github.com/rust-lang/crates.io-index" | ||
9 | checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" | ||
10 | |||
11 | [[package]] | ||
6 | name = "ariadne" | 12 | name = "ariadne" |
7 | version = "0.1.3" | 13 | version = "0.1.3" |
8 | source = "registry+https://github.com/rust-lang/crates.io-index" | 14 | source = "registry+https://github.com/rust-lang/crates.io-index" |
@@ -21,8 +27,10 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" | |||
21 | name = "bin" | 27 | name = "bin" |
22 | version = "0.1.0" | 28 | version = "0.1.0" |
23 | dependencies = [ | 29 | dependencies = [ |
30 | "anyhow", | ||
24 | "ariadne", | 31 | "ariadne", |
25 | "lib", | 32 | "lib", |
33 | "rnix", | ||
26 | ] | 34 | ] |
27 | 35 | ||
28 | [[package]] | 36 | [[package]] |
diff --git a/bin/src/main.rs b/bin/src/main.rs index ae45bfe..60afd5e 100644 --- a/bin/src/main.rs +++ b/bin/src/main.rs | |||
@@ -4,9 +4,12 @@ use std::{ | |||
4 | }; | 4 | }; |
5 | 5 | ||
6 | use anyhow::{Context, Result}; | 6 | use anyhow::{Context, Result}; |
7 | use ariadne::{Color, Fmt, Label, Report as CliReport, ReportKind as CliReportKind, Source}; | 7 | use ariadne::{ |
8 | CharSet, Color, Config as CliConfig, Label, Report as CliReport, | ||
9 | ReportKind as CliReportKind, Source, | ||
10 | }; | ||
8 | use lib::{Report, LINTS}; | 11 | use lib::{Report, LINTS}; |
9 | use rnix::WalkEvent; | 12 | use rnix::{TextRange, WalkEvent}; |
10 | 13 | ||
11 | fn analyze(file: &str) -> Result<Vec<Report>> { | 14 | fn analyze(file: &str) -> Result<Vec<Report>> { |
12 | let parsed = rnix::parse(file).as_result()?; | 15 | let parsed = rnix::parse(file).as_result()?; |
@@ -28,6 +31,7 @@ fn analyze(file: &str) -> Result<Vec<Report>> { | |||
28 | } | 31 | } |
29 | 32 | ||
30 | fn print_report(report: Report, file_src: &str, file_path: &Path) -> Result<()> { | 33 | fn print_report(report: Report, file_src: &str, file_path: &Path) -> Result<()> { |
34 | let range = |at: TextRange| at.start().into()..at.end().into(); | ||
31 | let src_id = file_path.to_str().unwrap_or("<unknown>"); | 35 | let src_id = file_path.to_str().unwrap_or("<unknown>"); |
32 | let offset = report | 36 | let offset = report |
33 | .diagnostics | 37 | .diagnostics |
@@ -39,20 +43,33 @@ fn print_report(report: Report, file_src: &str, file_path: &Path) -> Result<()> | |||
39 | .diagnostics | 43 | .diagnostics |
40 | .iter() | 44 | .iter() |
41 | .fold( | 45 | .fold( |
42 | CliReport::build(CliReportKind::Warning, src_id, offset), | 46 | CliReport::build(CliReportKind::Warning, src_id, offset) |
47 | .with_config( | ||
48 | CliConfig::default() | ||
49 | .with_cross_gap(true) | ||
50 | .with_char_set(CharSet::ExtendedAscii), | ||
51 | ) | ||
52 | .with_message(report.note), | ||
43 | |cli_report, diagnostic| { | 53 | |cli_report, diagnostic| { |
44 | let range = { | 54 | let cli_report = cli_report.with_label( |
45 | let at = diagnostic.at; | 55 | Label::new((src_id, range(diagnostic.at))) |
46 | at.start().into()..at.end().into() | 56 | .with_message(&diagnostic.message) |
47 | }; | 57 | .with_color(Color::Magenta), |
48 | cli_report.with_label( | 58 | ); |
49 | Label::new((src_id, range)) | 59 | if let Some(s) = &diagnostic.suggestion { |
50 | .with_message(diagnostic.message.as_str().fg(Color::Yellow)), | 60 | let replacement_msg = format!("Try: `{}`", s.fix); |
51 | ) | 61 | cli_report.with_label( |
62 | Label::new((src_id, range(s.at))) | ||
63 | .with_message(replacement_msg) | ||
64 | .with_color(Color::Yellow), | ||
65 | ) | ||
66 | } else { | ||
67 | cli_report | ||
68 | } | ||
52 | }, | 69 | }, |
53 | ) | 70 | ) |
54 | .finish() | 71 | .finish() |
55 | .print((src_id, Source::from(file_src))) | 72 | .eprint((src_id, Source::from(file_src))) |
56 | .context("failed to print report to stdout") | 73 | .context("failed to print report to stdout") |
57 | } | 74 | } |
58 | 75 | ||
diff --git a/macros/src/lib.rs b/macros/src/lib.rs index 42f7565..36a8bb5 100644 --- a/macros/src/lib.rs +++ b/macros/src/lib.rs | |||
@@ -73,7 +73,7 @@ fn generate_name_fn(meta: &LintMeta) -> TokenStream2 { | |||
73 | if let syn::Expr::Lit(name_lit) = name { | 73 | if let syn::Expr::Lit(name_lit) = name { |
74 | if let Lit::Str(name_str) = &name_lit.lit { | 74 | if let Lit::Str(name_str) = &name_lit.lit { |
75 | return quote! { | 75 | return quote! { |
76 | fn name(&self) -> &str { | 76 | fn name() -> &'static str { |
77 | #name_str | 77 | #name_str |
78 | } | 78 | } |
79 | }; | 79 | }; |
@@ -90,7 +90,7 @@ fn generate_note_fn(meta: &LintMeta) -> TokenStream2 { | |||
90 | if let syn::Expr::Lit(note_lit) = note { | 90 | if let syn::Expr::Lit(note_lit) = note { |
91 | if let Lit::Str(note_str) = ¬e_lit.lit { | 91 | if let Lit::Str(note_str) = ¬e_lit.lit { |
92 | return quote! { | 92 | return quote! { |
93 | fn note(&self) -> &str { | 93 | fn note() -> &'static str { |
94 | #note_str | 94 | #note_str |
95 | } | 95 | } |
96 | }; | 96 | }; |