@@ -11,6 +11,22 @@ pub use printer::DiagnosticsPrinter;
1111
1212use message:: { DiagnosticMessage , Fix , RelatedInfo } ;
1313
14+ // Re-export from query module
15+ pub use crate :: query:: { SourceId , SourceMap } ;
16+
17+ /// A location that knows which source it belongs to.
18+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
19+ pub struct Span {
20+ pub source : SourceId ,
21+ pub range : TextRange ,
22+ }
23+
24+ impl Span {
25+ pub fn new ( source : SourceId , range : TextRange ) -> Self {
26+ Self { source, range }
27+ }
28+ }
29+
1430#[ derive( Debug , Clone , Default ) ]
1531pub struct Diagnostics {
1632 messages : Vec < DiagnosticMessage > ,
@@ -32,26 +48,15 @@ impl Diagnostics {
3248 /// Create a diagnostic with the given kind and span.
3349 ///
3450 /// Uses the kind's default message. Call `.message()` on the builder to override.
35- pub fn report ( & mut self , kind : DiagnosticKind , range : TextRange ) -> DiagnosticBuilder < ' _ > {
36- DiagnosticBuilder {
37- diagnostics : self ,
38- message : DiagnosticMessage :: with_default_message ( kind, range) ,
39- }
40- }
41-
42- /// Create an error diagnostic (legacy API, prefer `report()`).
43- pub fn error ( & mut self , msg : impl Into < String > , range : TextRange ) -> DiagnosticBuilder < ' _ > {
44- DiagnosticBuilder {
45- diagnostics : self ,
46- message : DiagnosticMessage :: new ( DiagnosticKind :: UnexpectedToken , range, msg) ,
47- }
48- }
49-
50- /// Create a warning diagnostic (legacy API, prefer `report()`).
51- pub fn warning ( & mut self , msg : impl Into < String > , range : TextRange ) -> DiagnosticBuilder < ' _ > {
51+ pub fn report (
52+ & mut self ,
53+ source : SourceId ,
54+ kind : DiagnosticKind ,
55+ range : TextRange ,
56+ ) -> DiagnosticBuilder < ' _ > {
5257 DiagnosticBuilder {
5358 diagnostics : self ,
54- message : DiagnosticMessage :: new ( DiagnosticKind :: UnexpectedToken , range , msg ) ,
59+ message : DiagnosticMessage :: with_default_message ( source , kind , range ) ,
5560 }
5661 }
5762
@@ -163,29 +168,34 @@ impl Diagnostics {
163168 & self . messages
164169 }
165170
166- pub fn printer < ' a > ( & self , source : & ' a str ) -> DiagnosticsPrinter < ' a > {
167- DiagnosticsPrinter :: new ( self . messages . clone ( ) , source)
171+ /// Create a printer with a source map (multi-file support).
172+ pub fn printer < ' a > ( & self , sources : & ' a SourceMap ) -> DiagnosticsPrinter < ' a > {
173+ DiagnosticsPrinter :: new ( self . messages . clone ( ) , sources)
168174 }
169175
170- /// Printer that uses filtered diagnostics (cascading errors suppressed).
171- pub fn filtered_printer < ' a > ( & self , source : & ' a str ) -> DiagnosticsPrinter < ' a > {
172- DiagnosticsPrinter :: new ( self . filtered ( ) , source )
176+ /// Filtered printer with source map (cascading errors suppressed).
177+ pub fn filtered_printer < ' a > ( & self , sources : & ' a SourceMap ) -> DiagnosticsPrinter < ' a > {
178+ DiagnosticsPrinter :: new ( self . filtered ( ) , sources )
173179 }
174180
175- pub fn render ( & self , source : & str ) -> String {
176- self . printer ( source) . render ( )
181+ /// Render with source map.
182+ pub fn render ( & self , sources : & SourceMap ) -> String {
183+ self . printer ( sources) . render ( )
177184 }
178185
179- pub fn render_colored ( & self , source : & str , colored : bool ) -> String {
180- self . printer ( source) . colored ( colored) . render ( )
186+ /// Render with source map, colored output.
187+ pub fn render_colored ( & self , sources : & SourceMap , colored : bool ) -> String {
188+ self . printer ( sources) . colored ( colored) . render ( )
181189 }
182190
183- pub fn render_filtered ( & self , source : & str ) -> String {
184- self . filtered_printer ( source) . render ( )
191+ /// Render filtered with source map.
192+ pub fn render_filtered ( & self , sources : & SourceMap ) -> String {
193+ self . filtered_printer ( sources) . render ( )
185194 }
186195
187- pub fn render_filtered_colored ( & self , source : & str , colored : bool ) -> String {
188- self . filtered_printer ( source) . colored ( colored) . render ( )
196+ /// Render filtered with source map, colored output.
197+ pub fn render_filtered_colored ( & self , sources : & SourceMap , colored : bool ) -> String {
198+ self . filtered_printer ( sources) . colored ( colored) . render ( )
189199 }
190200
191201 pub fn extend ( & mut self , other : Diagnostics ) {
@@ -201,8 +211,15 @@ impl<'a> DiagnosticBuilder<'a> {
201211 self
202212 }
203213
204- pub fn related_to ( mut self , msg : impl Into < String > , range : TextRange ) -> Self {
205- self . message . related . push ( RelatedInfo :: new ( range, msg) ) ;
214+ pub fn related_to (
215+ mut self ,
216+ source : SourceId ,
217+ range : TextRange ,
218+ msg : impl Into < String > ,
219+ ) -> Self {
220+ self . message
221+ . related
222+ . push ( RelatedInfo :: new ( source, range, msg) ) ;
206223 self
207224 }
208225
0 commit comments