@@ -33,6 +33,7 @@ use starlark::eval::Evaluator;
33
33
use starlark:: lsp:: server:: LoadContentsError ;
34
34
use starlark:: lsp:: server:: LspContext ;
35
35
use starlark:: lsp:: server:: LspEvalResult ;
36
+ use starlark:: lsp:: server:: LspUrl ;
36
37
use starlark:: lsp:: server:: ResolveLoadError ;
37
38
use starlark:: lsp:: server:: StringLiteralResult ;
38
39
use starlark:: syntax:: AstModule ;
@@ -126,7 +127,7 @@ impl Context {
126
127
) -> EvalResult < impl Iterator < Item = EvalMessage > > {
127
128
match result {
128
129
Err ( e) => EvalResult {
129
- messages : Either :: Left ( iter:: once ( EvalMessage :: from_anyhow ( file, & e) ) ) ,
130
+ messages : Either :: Left ( iter:: once ( EvalMessage :: from_anyhow ( Path :: new ( file) , & e) ) ) ,
130
131
ast : None ,
131
132
} ,
132
133
Ok ( res) => EvalResult {
@@ -210,29 +211,42 @@ impl Context {
210
211
}
211
212
212
213
impl LspContext for Context {
213
- fn parse_file_with_contents ( & self , uri : & Url , content : String ) -> LspEvalResult {
214
- let EvalResult { messages, ast } = self . file_with_contents ( uri. path ( ) , content) ;
215
- LspEvalResult {
216
- diagnostics : messages. map ( Diagnostic :: from) . collect ( ) ,
217
- ast,
214
+ fn parse_file_with_contents ( & self , uri : & LspUrl , content : String ) -> LspEvalResult {
215
+ match uri {
216
+ LspUrl :: File ( uri) => {
217
+ let EvalResult { messages, ast } =
218
+ self . file_with_contents ( & uri. to_string_lossy ( ) , content) ;
219
+ LspEvalResult {
220
+ diagnostics : messages. map ( Diagnostic :: from) . collect ( ) ,
221
+ ast,
222
+ }
223
+ }
224
+ _ => LspEvalResult :: default ( ) ,
218
225
}
219
226
}
220
227
221
- fn resolve_load ( & self , path : & str , current_file : & Path ) -> anyhow:: Result < Url > {
228
+ fn resolve_load ( & self , path : & str , current_file : & LspUrl ) -> anyhow:: Result < LspUrl > {
222
229
let path = PathBuf :: from ( path) ;
223
- let current_file_dir = current_file. parent ( ) ;
224
- let absolute_path = match ( current_file_dir, path. is_absolute ( ) ) {
225
- ( _, true ) => Ok ( path) ,
226
- ( Some ( current_file_dir) , false ) => Ok ( current_file_dir. join ( & path) ) ,
227
- ( None , false ) => Err ( ResolveLoadError :: MissingCurrentFilePath ( path) ) ,
228
- } ?;
229
- Ok ( Url :: from_file_path ( absolute_path) . unwrap ( ) )
230
+ match current_file {
231
+ LspUrl :: File ( current_file_path) => {
232
+ let current_file_dir = current_file_path. parent ( ) ;
233
+ let absolute_path = match ( current_file_dir, path. is_absolute ( ) ) {
234
+ ( _, true ) => Ok ( path) ,
235
+ ( Some ( current_file_dir) , false ) => Ok ( current_file_dir. join ( & path) ) ,
236
+ ( None , false ) => Err ( ResolveLoadError :: MissingCurrentFilePath ( path) ) ,
237
+ } ?;
238
+ Ok ( Url :: from_file_path ( absolute_path) . unwrap ( ) . try_into ( ) ?)
239
+ }
240
+ _ => Err (
241
+ ResolveLoadError :: WrongScheme ( "file://" . to_owned ( ) , current_file. clone ( ) ) . into ( ) ,
242
+ ) ,
243
+ }
230
244
}
231
245
232
246
fn resolve_string_literal (
233
247
& self ,
234
248
literal : & str ,
235
- current_file : & Path ,
249
+ current_file : & LspUrl ,
236
250
) -> anyhow:: Result < Option < StringLiteralResult > > {
237
251
self . resolve_load ( literal, current_file) . map ( |url| {
238
252
Some ( StringLiteralResult {
@@ -242,20 +256,22 @@ impl LspContext for Context {
242
256
} )
243
257
}
244
258
245
- fn get_load_contents ( & self , uri : & Url ) -> anyhow:: Result < Option < String > > {
246
- let path = PathBuf :: from ( uri. path ( ) ) ;
247
- match path. is_absolute ( ) {
248
- true => match fs:: read_to_string ( & path) {
249
- Ok ( contents) => Ok ( Some ( contents) ) ,
250
- Err ( e)
251
- if e. kind ( ) == io:: ErrorKind :: NotFound
252
- || e. kind ( ) == io:: ErrorKind :: NotADirectory =>
253
- {
254
- Ok ( None )
255
- }
256
- Err ( e) => Err ( e. into ( ) ) ,
259
+ fn get_load_contents ( & self , uri : & LspUrl ) -> anyhow:: Result < Option < String > > {
260
+ match uri {
261
+ LspUrl :: File ( path) => match path. is_absolute ( ) {
262
+ true => match fs:: read_to_string ( & path) {
263
+ Ok ( contents) => Ok ( Some ( contents) ) ,
264
+ Err ( e)
265
+ if e. kind ( ) == io:: ErrorKind :: NotFound
266
+ || e. kind ( ) == io:: ErrorKind :: NotADirectory =>
267
+ {
268
+ Ok ( None )
269
+ }
270
+ Err ( e) => Err ( e. into ( ) ) ,
271
+ } ,
272
+ false => Err ( LoadContentsError :: NotAbsolute ( uri. clone ( ) ) . into ( ) ) ,
257
273
} ,
258
- false => Err ( LoadContentsError :: NotAbsolute ( uri. clone ( ) ) . into ( ) ) ,
274
+ _ => Err ( LoadContentsError :: WrongScheme ( "file://" . to_owned ( ) , uri. clone ( ) ) . into ( ) ) ,
259
275
}
260
276
}
261
277
}
0 commit comments