@@ -3,7 +3,7 @@ use std::{any::Any, fmt};
3
3
use ra_syntax:: { ast, AstNode , AstPtr , SyntaxNode , SyntaxNodePtr , TextRange } ;
4
4
use relative_path:: RelativePathBuf ;
5
5
6
- use crate :: { HirDatabase , HirFileId , Name } ;
6
+ use crate :: { HirDatabase , HirFileId , Name , Source } ;
7
7
8
8
/// Diagnostic defines hir API for errors and warnings.
9
9
///
@@ -19,10 +19,9 @@ use crate::{HirDatabase, HirFileId, Name};
19
19
/// instance of `Diagnostic` on demand.
20
20
pub trait Diagnostic : Any + Send + Sync + fmt:: Debug + ' static {
21
21
fn message ( & self ) -> String ;
22
- fn file ( & self ) -> HirFileId ;
23
- fn syntax_node_ptr ( & self ) -> SyntaxNodePtr ;
22
+ fn source ( & self ) -> Source < SyntaxNodePtr > ;
24
23
fn highlight_range ( & self ) -> TextRange {
25
- self . syntax_node_ptr ( ) . range ( )
24
+ self . source ( ) . ast . range ( )
26
25
}
27
26
fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) ;
28
27
}
@@ -34,8 +33,8 @@ pub trait AstDiagnostic {
34
33
35
34
impl dyn Diagnostic {
36
35
pub fn syntax_node ( & self , db : & impl HirDatabase ) -> SyntaxNode {
37
- let node = db. parse_or_expand ( self . file ( ) ) . unwrap ( ) ;
38
- self . syntax_node_ptr ( ) . to_node ( & node)
36
+ let node = db. parse_or_expand ( self . source ( ) . file_id ) . unwrap ( ) ;
37
+ self . source ( ) . ast . to_node ( & node)
39
38
}
40
39
41
40
pub fn downcast_ref < D : Diagnostic > ( & self ) -> Option < & D > {
@@ -87,12 +86,11 @@ impl Diagnostic for NoSuchField {
87
86
fn message ( & self ) -> String {
88
87
"no such field" . to_string ( )
89
88
}
90
- fn file ( & self ) -> HirFileId {
91
- self . file
92
- }
93
- fn syntax_node_ptr ( & self ) -> SyntaxNodePtr {
94
- self . field . into ( )
89
+
90
+ fn source ( & self ) -> Source < SyntaxNodePtr > {
91
+ Source { file_id : self . file , ast : self . field . into ( ) }
95
92
}
93
+
96
94
fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
97
95
self
98
96
}
@@ -109,11 +107,8 @@ impl Diagnostic for UnresolvedModule {
109
107
fn message ( & self ) -> String {
110
108
"unresolved module" . to_string ( )
111
109
}
112
- fn file ( & self ) -> HirFileId {
113
- self . file
114
- }
115
- fn syntax_node_ptr ( & self ) -> SyntaxNodePtr {
116
- self . decl . into ( )
110
+ fn source ( & self ) -> Source < SyntaxNodePtr > {
111
+ Source { file_id : self . file , ast : self . decl . into ( ) }
117
112
}
118
113
fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
119
114
self
@@ -131,11 +126,8 @@ impl Diagnostic for MissingFields {
131
126
fn message ( & self ) -> String {
132
127
"fill structure fields" . to_string ( )
133
128
}
134
- fn file ( & self ) -> HirFileId {
135
- self . file
136
- }
137
- fn syntax_node_ptr ( & self ) -> SyntaxNodePtr {
138
- self . field_list . into ( )
129
+ fn source ( & self ) -> Source < SyntaxNodePtr > {
130
+ Source { file_id : self . file , ast : self . field_list . into ( ) }
139
131
}
140
132
fn as_any ( & self ) -> & ( dyn Any + Send + ' static ) {
141
133
self
@@ -146,8 +138,8 @@ impl AstDiagnostic for MissingFields {
146
138
type AST = ast:: NamedFieldList ;
147
139
148
140
fn ast ( & self , db : & impl HirDatabase ) -> Self :: AST {
149
- let root = db. parse_or_expand ( self . file ( ) ) . unwrap ( ) ;
150
- let node = self . syntax_node_ptr ( ) . to_node ( & root) ;
141
+ let root = db. parse_or_expand ( self . source ( ) . file_id ) . unwrap ( ) ;
142
+ let node = self . source ( ) . ast . to_node ( & root) ;
151
143
ast:: NamedFieldList :: cast ( node) . unwrap ( )
152
144
}
153
145
}
0 commit comments