1
- use annotate_snippets:: { Annotation , AnnotationType , Renderer , Slice , Snippet , SourceAnnotation } ;
1
+ use annotate_snippets:: { Level , Renderer , Snippet } ;
2
2
use std:: collections:: { BTreeMap , BTreeSet , HashMap } ;
3
3
use std:: ffi:: OsStr ;
4
4
use std:: path:: { Path , PathBuf } ;
@@ -123,47 +123,44 @@ fn emit_diagnostic(
123
123
return e. into ( ) ;
124
124
} ;
125
125
126
- let ( line_num, column ) = translate_position ( & contents, span. start ) ;
126
+ let line_num = get_line ( & contents, span. start ) ;
127
127
let source_start = contents[ 0 ..span. start ]
128
- . rfind ( '\n' )
128
+ . as_bytes ( )
129
+ . iter ( )
130
+ . rposition ( |b| b == & b'\n' )
129
131
. map ( |s| s + 1 )
130
132
. unwrap_or ( 0 ) ;
131
133
let source_end = contents[ span. end . saturating_sub ( 1 ) ..]
132
- . find ( '\n' )
134
+ . as_bytes ( )
135
+ . iter ( )
136
+ . position ( |b| b == & b'\n' )
133
137
. map ( |s| s + span. end )
134
138
. unwrap_or ( contents. len ( ) ) ;
135
139
let source = & contents[ source_start..source_end] ;
140
+ let highlight_start = span. start - source_start;
136
141
// Make sure we don't try to highlight past the end of the line,
137
142
// but also make sure we are highlighting at least one character
138
- let highlight_end = ( column + contents [ span] . chars ( ) . count ( ) )
139
- . min ( source . len ( ) )
140
- . max ( column + 1 ) ;
143
+ let highlight_end = ( span. end - source_start )
144
+ . min ( source_end - source_start )
145
+ . max ( highlight_start + 1 ) ;
141
146
// Get the path to the manifest, relative to the cwd
142
147
let manifest_path = diff_paths ( manifest_file, gctx. cwd ( ) )
143
148
. unwrap_or_else ( || manifest_file. to_path_buf ( ) )
144
149
. display ( )
145
150
. to_string ( ) ;
146
- let snippet = Snippet {
147
- title : Some ( Annotation {
148
- id : None ,
149
- label : Some ( e. message ( ) ) ,
150
- annotation_type : AnnotationType :: Error ,
151
- } ) ,
152
- footer : vec ! [ ] ,
153
- slices : vec ! [ Slice {
154
- source: & source,
155
- line_start: line_num + 1 ,
156
- origin: Some ( manifest_path. as_str( ) ) ,
157
- annotations: vec![ SourceAnnotation {
158
- range: ( column, highlight_end) ,
159
- label: "" ,
160
- annotation_type: AnnotationType :: Error ,
161
- } ] ,
162
- fold: false ,
163
- } ] ,
164
- } ;
165
- let renderer = Renderer :: styled ( ) ;
166
- if let Err ( err) = writeln ! ( gctx. shell( ) . err( ) , "{}" , renderer. render( snippet) ) {
151
+ let message = Level :: Error . title ( e. message ( ) ) . snippet (
152
+ Snippet :: source ( & source)
153
+ . origin ( & manifest_path)
154
+ . line_start ( line_num + 1 )
155
+ . annotation ( Level :: Error . span ( highlight_start..highlight_end) ) ,
156
+ ) ;
157
+ let renderer = Renderer :: styled ( ) . term_width (
158
+ gctx. shell ( )
159
+ . err_width ( )
160
+ . diagnostic_terminal_width ( )
161
+ . unwrap_or ( annotate_snippets:: renderer:: DEFAULT_TERM_WIDTH ) ,
162
+ ) ;
163
+ if let Err ( err) = writeln ! ( gctx. shell( ) . err( ) , "{}" , renderer. render( message) ) {
167
164
return err. into ( ) ;
168
165
}
169
166
return AlreadyPrintedError :: new ( e. into ( ) ) . into ( ) ;
@@ -2367,13 +2364,12 @@ impl ResolveToPath for ConfigRelativePath {
2367
2364
}
2368
2365
}
2369
2366
2370
- fn translate_position ( input : & str , index : usize ) -> ( usize , usize ) {
2367
+ fn get_line ( input : & str , index : usize ) -> usize {
2371
2368
if input. is_empty ( ) {
2372
- return ( 0 , index ) ;
2369
+ return 0 ;
2373
2370
}
2374
2371
2375
2372
let safe_index = index. min ( input. len ( ) - 1 ) ;
2376
- let column_offset = index - safe_index;
2377
2373
2378
2374
let nl = input[ 0 ..safe_index]
2379
2375
. as_bytes ( )
@@ -2386,13 +2382,9 @@ fn translate_position(input: &str, index: usize) -> (usize, usize) {
2386
2382
Some ( nl) => nl + 1 ,
2387
2383
None => 0 ,
2388
2384
} ;
2389
- let line = input[ 0 ..line_start]
2385
+ input[ 0 ..line_start]
2390
2386
. as_bytes ( )
2391
2387
. iter ( )
2392
2388
. filter ( |c| * * c == b'\n' )
2393
- . count ( ) ;
2394
- let column = input[ line_start..=safe_index] . chars ( ) . count ( ) - 1 ;
2395
- let column = column + column_offset;
2396
-
2397
- ( line, column)
2389
+ . count ( )
2398
2390
}
0 commit comments