11use crate :: parser_rule_context_ext:: ParserRuleContextExt ;
22use crate :: prelude:: * ;
3- use annotate_snippets:: { Annotation , AnnotationType , Renderer , Slice , Snippet , SourceAnnotation } ;
3+ use annotate_snippets:: renderer:: DecorStyle ;
4+ use annotate_snippets:: { AnnotationKind , Level , Renderer , Snippet } ;
45use antlr_rust:: rule_context:: CustomRuleContext ;
56use antlr_rust:: token:: Token ;
67use antlr_rust:: token_factory:: TokenFactory ;
@@ -108,43 +109,32 @@ impl Diagnostic {
108109impl Display for Diagnostic {
109110 fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
110111 let label = & self . message ;
111- let annotation_type = match self . severity {
112- DiagnosticSeverity :: Error => AnnotationType :: Error ,
113- DiagnosticSeverity :: Warning => AnnotationType :: Warning ,
112+ let level = match self . severity {
113+ DiagnosticSeverity :: Error => Level :: ERROR ,
114+ DiagnosticSeverity :: Warning => Level :: WARNING ,
114115 } ;
115- let snippet = Snippet {
116- title : Some ( Annotation {
117- label : Some ( label) ,
118- id : None ,
119- annotation_type,
120- } ) ,
121- footer : vec ! [ ] ,
122- slices : vec ! [ Slice {
123- source: self . context. as_deref( ) . unwrap_or( "<unknown line>" ) ,
124- line_start: self . start_line + 1 ,
125- origin: self . file_name. as_deref( ) ,
126- fold: false ,
127- annotations: vec![ SourceAnnotation {
128- label: "" ,
129- annotation_type,
130- range: convert_absolute_range_to_relative( self ) ,
131- } ] ,
132- } ] ,
133- } ;
134- let renderer = Renderer :: styled ( ) ;
135- let annotations = renderer. render ( snippet) ;
116+ let report = level. primary_title ( label) . id ( "Y001" ) . element (
117+ Snippet :: source ( self . context . as_deref ( ) . unwrap_or ( "<unknown line>" ) )
118+ . line_start ( self . start_line + 1 )
119+ . path ( self . file_name . as_deref ( ) )
120+ . fold ( false )
121+ . annotation ( AnnotationKind :: Primary . span ( convert_absolute_range_to_relative ( self ) ) ) ,
122+ ) ;
123+ // Using `plain` until https://github.com/tokio-rs/tracing/issues/3378 is resolved... bleh
124+ let renderer = Renderer :: plain ( ) . decor_style ( DecorStyle :: Unicode ) ;
125+ let annotations = renderer. render ( & [ report] ) ;
136126 writeln ! ( f, "{annotations}" ) ?;
137127
138128 Ok ( ( ) )
139129 }
140130}
141131
142- fn convert_absolute_range_to_relative ( diagnostic : & Diagnostic ) -> ( usize , usize ) {
132+ fn convert_absolute_range_to_relative ( diagnostic : & Diagnostic ) -> Range < usize > {
143133 let Some ( range) = diagnostic. range . as_ref ( ) else {
144- return ( 0 , 0 ) ;
134+ return 0 .. 1 ;
145135 } ;
146136 let Some ( context) = diagnostic. context . as_ref ( ) else {
147- return ( 0 , 0 ) ;
137+ return 0 .. 1 ;
148138 } ;
149139
150140 let relative_start_line = range. start . line - diagnostic. start_line ;
@@ -165,7 +155,7 @@ fn convert_absolute_range_to_relative(diagnostic: &Diagnostic) -> (usize, usize)
165155 let mut char_indices = context. char_indices ( ) . map ( |( i, _) | i) ;
166156 let byte_start = char_indices. clone ( ) . nth ( relative_start) . unwrap ( ) ;
167157 let byte_end = char_indices. nth ( relative_end) . unwrap_or ( byte_start) ;
168- ( byte_start, byte_end)
158+ byte_start.. ( byte_end + 1 )
169159}
170160
171161/// Trait implemented for `Vec<Diagnostic>` to provide utility methods.
0 commit comments