1
- //! Lsif generator
1
+ //! LSIF (language server index format) generator
2
2
3
3
use std:: collections:: HashMap ;
4
4
use std:: env;
5
5
use std:: time:: Instant ;
6
6
7
7
use ide:: {
8
- Analysis , Cancellable , FileId , FileRange , RootDatabase , StaticIndex , StaticIndexedFile ,
9
- TokenId , TokenStaticData ,
8
+ Analysis , FileId , FileRange , RootDatabase , StaticIndex , StaticIndexedFile , TokenId ,
9
+ TokenStaticData ,
10
10
} ;
11
11
use ide_db:: LineIndexDatabase ;
12
12
13
13
use ide_db:: base_db:: salsa:: { self , ParallelDatabase } ;
14
- use lsp_types:: { lsif :: * , Hover , HoverContents , NumberOrString } ;
14
+ use lsp_types:: { self , lsif } ;
15
15
use project_model:: { CargoConfig , ProjectManifest , ProjectWorkspace } ;
16
16
use vfs:: { AbsPathBuf , Vfs } ;
17
17
@@ -44,9 +44,9 @@ struct LsifManager<'a> {
44
44
#[ derive( Clone , Copy ) ]
45
45
struct Id ( i32 ) ;
46
46
47
- impl From < Id > for NumberOrString {
47
+ impl From < Id > for lsp_types :: NumberOrString {
48
48
fn from ( Id ( x) : Id ) -> Self {
49
- NumberOrString :: Number ( x)
49
+ lsp_types :: NumberOrString :: Number ( x)
50
50
}
51
51
}
52
52
@@ -63,13 +63,21 @@ impl LsifManager<'_> {
63
63
}
64
64
}
65
65
66
- fn add ( & mut self , data : Element ) -> Id {
66
+ fn add ( & mut self , data : lsif :: Element ) -> Id {
67
67
let id = Id ( self . count ) ;
68
- self . emit ( & serde_json:: to_string ( & Entry { id : id. into ( ) , data } ) . unwrap ( ) ) ;
68
+ self . emit ( & serde_json:: to_string ( & lsif :: Entry { id : id. into ( ) , data } ) . unwrap ( ) ) ;
69
69
self . count += 1 ;
70
70
id
71
71
}
72
72
73
+ fn add_vertex ( & mut self , vertex : lsif:: Vertex ) -> Id {
74
+ self . add ( lsif:: Element :: Vertex ( vertex) )
75
+ }
76
+
77
+ fn add_edge ( & mut self , edge : lsif:: Edge ) -> Id {
78
+ self . add ( lsif:: Element :: Edge ( edge) )
79
+ }
80
+
73
81
// FIXME: support file in addition to stdout here
74
82
fn emit ( & self , data : & str ) {
75
83
println ! ( "{}" , data) ;
@@ -79,14 +87,14 @@ impl LsifManager<'_> {
79
87
if let Some ( x) = self . token_map . get ( & id) {
80
88
return * x;
81
89
}
82
- let result_set_id = self . add ( Element :: Vertex ( Vertex :: ResultSet ( ResultSet { key : None } ) ) ) ;
90
+ let result_set_id = self . add_vertex ( lsif :: Vertex :: ResultSet ( lsif :: ResultSet { key : None } ) ) ;
83
91
self . token_map . insert ( id, result_set_id) ;
84
92
result_set_id
85
93
}
86
94
87
- fn get_range_id ( & mut self , id : FileRange ) -> Cancellable < Id > {
95
+ fn get_range_id ( & mut self , id : FileRange ) -> Id {
88
96
if let Some ( x) = self . range_map . get ( & id) {
89
- return Ok ( * x ) ;
97
+ return * x ;
90
98
}
91
99
let file_id = id. file_id ;
92
100
let doc_id = self . get_file_id ( file_id) ;
@@ -96,15 +104,15 @@ impl LsifManager<'_> {
96
104
encoding : OffsetEncoding :: Utf16 ,
97
105
endings : LineEndings :: Unix ,
98
106
} ;
99
- let range_id = self . add ( Element :: Vertex ( Vertex :: Range {
107
+ let range_id = self . add_vertex ( lsif :: Vertex :: Range {
100
108
range : to_proto:: range ( & line_index, id. range ) ,
101
109
tag : None ,
102
- } ) ) ;
103
- self . add ( Element :: Edge ( Edge :: Contains ( EdgeDataMultiIn {
110
+ } ) ;
111
+ self . add_edge ( lsif :: Edge :: Contains ( lsif :: EdgeDataMultiIn {
104
112
in_vs : vec ! [ range_id. into( ) ] ,
105
113
out_v : doc_id. into ( ) ,
106
- } ) ) ) ;
107
- Ok ( range_id)
114
+ } ) ) ;
115
+ range_id
108
116
}
109
117
110
118
fn get_file_id ( & mut self , id : FileId ) -> Id {
@@ -113,73 +121,74 @@ impl LsifManager<'_> {
113
121
}
114
122
let path = self . vfs . file_path ( id) ;
115
123
let path = path. as_path ( ) . unwrap ( ) ;
116
- let doc_id = self . add ( Element :: Vertex ( Vertex :: Document ( Document {
124
+ let doc_id = self . add_vertex ( lsif :: Vertex :: Document ( lsif :: Document {
117
125
language_id : "rust" . to_string ( ) ,
118
126
uri : lsp_types:: Url :: from_file_path ( path) . unwrap ( ) ,
119
- } ) ) ) ;
127
+ } ) ) ;
120
128
self . file_map . insert ( id, doc_id) ;
121
129
doc_id
122
130
}
123
131
124
- fn add_token ( & mut self , id : TokenId , token : TokenStaticData ) -> Cancellable < ( ) > {
132
+ fn add_token ( & mut self , id : TokenId , token : TokenStaticData ) {
125
133
let result_set_id = self . get_token_id ( id) ;
126
134
if let Some ( hover) = token. hover {
127
- let hover_id = self . add ( Element :: Vertex ( Vertex :: HoverResult {
128
- result : Hover {
129
- contents : HoverContents :: Markup ( to_proto:: markup_content ( hover. markup ) ) ,
135
+ let hover_id = self . add_vertex ( lsif:: Vertex :: HoverResult {
136
+ result : lsp_types:: Hover {
137
+ contents : lsp_types:: HoverContents :: Markup ( to_proto:: markup_content (
138
+ hover. markup ,
139
+ ) ) ,
130
140
range : None ,
131
141
} ,
132
- } ) ) ;
133
- self . add ( Element :: Edge ( Edge :: Hover ( EdgeData {
142
+ } ) ;
143
+ self . add_edge ( lsif :: Edge :: Hover ( lsif :: EdgeData {
134
144
in_v : hover_id. into ( ) ,
135
145
out_v : result_set_id. into ( ) ,
136
- } ) ) ) ;
146
+ } ) ) ;
137
147
}
138
148
if let Some ( def) = token. definition {
139
- let result_id = self . add ( Element :: Vertex ( Vertex :: DefinitionResult ) ) ;
140
- let def_vertex = self . get_range_id ( def) ? ;
141
- self . add ( Element :: Edge ( Edge :: Item ( Item {
149
+ let result_id = self . add_vertex ( lsif :: Vertex :: DefinitionResult ) ;
150
+ let def_vertex = self . get_range_id ( def) ;
151
+ self . add_edge ( lsif :: Edge :: Item ( lsif :: Item {
142
152
document : ( * self . file_map . get ( & def. file_id ) . unwrap ( ) ) . into ( ) ,
143
153
property : None ,
144
- edge_data : EdgeDataMultiIn {
154
+ edge_data : lsif :: EdgeDataMultiIn {
145
155
in_vs : vec ! [ def_vertex. into( ) ] ,
146
156
out_v : result_id. into ( ) ,
147
157
} ,
148
- } ) ) ) ;
149
- self . add ( Element :: Edge ( Edge :: Definition ( EdgeData {
158
+ } ) ) ;
159
+ self . add_edge ( lsif :: Edge :: Definition ( lsif :: EdgeData {
150
160
in_v : result_id. into ( ) ,
151
161
out_v : result_set_id. into ( ) ,
152
- } ) ) ) ;
162
+ } ) ) ;
153
163
}
154
164
if !token. references . is_empty ( ) {
155
- let result_id = self . add ( Element :: Vertex ( Vertex :: ReferenceResult ) ) ;
156
- self . add ( Element :: Edge ( Edge :: References ( EdgeData {
165
+ let result_id = self . add_vertex ( lsif :: Vertex :: ReferenceResult ) ;
166
+ self . add_edge ( lsif :: Edge :: References ( lsif :: EdgeData {
157
167
in_v : result_id. into ( ) ,
158
168
out_v : result_set_id. into ( ) ,
159
- } ) ) ) ;
169
+ } ) ) ;
160
170
for x in token. references {
161
171
let vertex = * self . range_map . get ( & x. range ) . unwrap ( ) ;
162
- self . add ( Element :: Edge ( Edge :: Item ( Item {
172
+ self . add_edge ( lsif :: Edge :: Item ( lsif :: Item {
163
173
document : ( * self . file_map . get ( & x. range . file_id ) . unwrap ( ) ) . into ( ) ,
164
174
property : Some ( if x. is_definition {
165
- ItemKind :: Definitions
175
+ lsif :: ItemKind :: Definitions
166
176
} else {
167
- ItemKind :: References
177
+ lsif :: ItemKind :: References
168
178
} ) ,
169
- edge_data : EdgeDataMultiIn {
179
+ edge_data : lsif :: EdgeDataMultiIn {
170
180
in_vs : vec ! [ vertex. into( ) ] ,
171
181
out_v : result_id. into ( ) ,
172
182
} ,
173
- } ) ) ) ;
183
+ } ) ) ;
174
184
}
175
185
}
176
- Ok ( ( ) )
177
186
}
178
187
179
- fn add_file ( & mut self , file : StaticIndexedFile ) -> Cancellable < ( ) > {
188
+ fn add_file ( & mut self , file : StaticIndexedFile ) {
180
189
let StaticIndexedFile { file_id, tokens, folds } = file;
181
190
let doc_id = self . get_file_id ( file_id) ;
182
- let text = self . analysis . file_text ( file_id) ? ;
191
+ let text = self . analysis . file_text ( file_id) . unwrap ( ) ;
183
192
let line_index = self . db . line_index ( file_id) ;
184
193
let line_index = LineIndex {
185
194
index : line_index. clone ( ) ,
@@ -190,32 +199,31 @@ impl LsifManager<'_> {
190
199
. into_iter ( )
191
200
. map ( |it| to_proto:: folding_range ( & * text, & line_index, false , it) )
192
201
. collect ( ) ;
193
- let folding_id = self . add ( Element :: Vertex ( Vertex :: FoldingRangeResult { result } ) ) ;
194
- self . add ( Element :: Edge ( Edge :: FoldingRange ( EdgeData {
202
+ let folding_id = self . add_vertex ( lsif :: Vertex :: FoldingRangeResult { result } ) ;
203
+ self . add_edge ( lsif :: Edge :: FoldingRange ( lsif :: EdgeData {
195
204
in_v : folding_id. into ( ) ,
196
205
out_v : doc_id. into ( ) ,
197
- } ) ) ) ;
206
+ } ) ) ;
198
207
let tokens_id = tokens
199
208
. into_iter ( )
200
209
. map ( |( range, id) | {
201
- let range_id = self . add ( Element :: Vertex ( Vertex :: Range {
210
+ let range_id = self . add_vertex ( lsif :: Vertex :: Range {
202
211
range : to_proto:: range ( & line_index, range) ,
203
212
tag : None ,
204
- } ) ) ;
213
+ } ) ;
205
214
self . range_map . insert ( FileRange { file_id, range } , range_id) ;
206
215
let result_set_id = self . get_token_id ( id) ;
207
- self . add ( Element :: Edge ( Edge :: Next ( EdgeData {
216
+ self . add_edge ( lsif :: Edge :: Next ( lsif :: EdgeData {
208
217
in_v : result_set_id. into ( ) ,
209
218
out_v : range_id. into ( ) ,
210
- } ) ) ) ;
219
+ } ) ) ;
211
220
range_id. into ( )
212
221
} )
213
222
. collect ( ) ;
214
- self . add ( Element :: Edge ( Edge :: Contains ( EdgeDataMultiIn {
223
+ self . add_edge ( lsif :: Edge :: Contains ( lsif :: EdgeDataMultiIn {
215
224
in_vs : tokens_id,
216
225
out_v : doc_id. into ( ) ,
217
- } ) ) ) ;
218
- Ok ( ( ) )
226
+ } ) ) ;
219
227
}
220
228
}
221
229
@@ -239,20 +247,20 @@ impl flags::Lsif {
239
247
let db = host. raw_database ( ) ;
240
248
let analysis = host. analysis ( ) ;
241
249
242
- let si = StaticIndex :: compute ( db, & analysis) ? ;
250
+ let si = StaticIndex :: compute ( db, & analysis) ;
243
251
244
252
let mut lsif = LsifManager :: new ( & analysis, db, & vfs) ;
245
- lsif. add ( Element :: Vertex ( Vertex :: MetaData ( MetaData {
253
+ lsif. add_vertex ( lsif :: Vertex :: MetaData ( lsif :: MetaData {
246
254
version : String :: from ( "0.5.0" ) ,
247
255
project_root : lsp_types:: Url :: from_file_path ( path) . unwrap ( ) ,
248
- position_encoding : Encoding :: Utf16 ,
256
+ position_encoding : lsif :: Encoding :: Utf16 ,
249
257
tool_info : None ,
250
- } ) ) ) ;
258
+ } ) ) ;
251
259
for file in si. files {
252
- lsif. add_file ( file) ? ;
260
+ lsif. add_file ( file) ;
253
261
}
254
262
for ( id, token) in si. tokens . iter ( ) {
255
- lsif. add_token ( id, token) ? ;
263
+ lsif. add_token ( id, token) ;
256
264
}
257
265
eprintln ! ( "Generating LSIF finished in {:?}" , now. elapsed( ) ) ;
258
266
Ok ( ( ) )
0 commit comments