@@ -25,12 +25,38 @@ use std::rc::Rc;
25
25
use term;
26
26
27
27
pub trait Emitter {
28
+ /// Emit a standalone diagnostic message.
28
29
fn emit ( & mut self , span : & MultiSpan , msg : & str , code : Option < & str > , lvl : Level ) ;
29
30
30
31
/// Emit a structured diagnostic.
31
32
fn emit_struct ( & mut self , db : & DiagnosticBuilder ) ;
32
33
}
33
34
35
+ /// A core trait that can only handle very simple messages: those
36
+ /// without spans or any real structure. Used only in specific contexts.
37
+ pub trait RudimentaryEmitter {
38
+ fn emit_rudimentary ( & mut self , msg : & str , code : Option < & str > , lvl : Level ) ;
39
+ }
40
+
41
+ impl < T : RudimentaryEmitter > Emitter for T {
42
+ fn emit ( & mut self ,
43
+ msp : & MultiSpan ,
44
+ msg : & str ,
45
+ code : Option < & str > ,
46
+ lvl : Level ) {
47
+ assert ! ( msp. primary_span( ) . is_none( ) , "Rudimenatry emitters can't handle spans" ) ;
48
+ self . emit_rudimentary ( msg, code, lvl) ;
49
+ }
50
+
51
+ fn emit_struct ( & mut self , db : & DiagnosticBuilder ) {
52
+ self . emit ( & db. span , & db. message , db. code . as_ref ( ) . map ( |s| & * * s) , db. level ) ;
53
+ for child in & db. children {
54
+ assert ! ( child. render_span. is_none( ) , "Rudimentary emitters can't handle render spans" ) ;
55
+ self . emit ( & child. span , & child. message , None , child. level ) ;
56
+ }
57
+ }
58
+ }
59
+
34
60
/// maximum number of lines we will print for each error; arbitrary.
35
61
pub const MAX_HIGHLIGHT_LINES : usize = 6 ;
36
62
@@ -57,26 +83,15 @@ pub struct BasicEmitter {
57
83
dst : Destination ,
58
84
}
59
85
60
- impl Emitter for BasicEmitter {
61
- fn emit ( & mut self ,
62
- msp : & MultiSpan ,
63
- msg : & str ,
64
- code : Option < & str > ,
65
- lvl : Level ) {
66
- assert ! ( msp. primary_span( ) . is_none( ) , "BasicEmitter can't handle spans" ) ;
67
-
86
+ impl RudimentaryEmitter for BasicEmitter {
87
+ fn emit_rudimentary ( & mut self ,
88
+ msg : & str ,
89
+ code : Option < & str > ,
90
+ lvl : Level ) {
68
91
if let Err ( e) = print_diagnostic ( & mut self . dst , "" , lvl, msg, code) {
69
92
panic ! ( "failed to print diagnostics: {:?}" , e) ;
70
93
}
71
94
}
72
-
73
- fn emit_struct ( & mut self , db : & DiagnosticBuilder ) {
74
- self . emit ( & db. span , & db. message , db. code . as_ref ( ) . map ( |s| & * * s) , db. level ) ;
75
- for child in & db. children {
76
- assert ! ( child. render_span. is_none( ) , "BasicEmitter can't handle spans" ) ;
77
- self . emit ( & child. span , & child. message , None , child. level ) ;
78
- }
79
- }
80
95
}
81
96
82
97
impl BasicEmitter {
0 commit comments