@@ -255,35 +255,21 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
255
255
} ;
256
256
( def, Some ( format ! ( "structfield.{}" , field. name( db) ) ) )
257
257
}
258
- Definition :: Macro ( _) => todo ! ( ) ,
259
- Definition :: SelfType ( _) => todo ! ( ) ,
258
+ // FIXME macros
259
+ Definition :: Macro ( _) => return None ,
260
+ // FIXME impls
261
+ Definition :: SelfType ( _) => return None ,
260
262
Definition :: Local ( _) | Definition :: GenericParam ( _) | Definition :: Label ( _) => return None ,
261
263
} ;
262
264
263
- let krate = match definition {
264
- // Definition::module gives back the parent module, we don't want that as it fails for root modules
265
- Definition :: ModuleDef ( ModuleDef :: Module ( module) ) => module. krate ( ) ,
266
- _ => definition. module ( db) ?. krate ( ) ,
267
- } ;
265
+ let krate = crate_of_def ( db, target) ?;
266
+ let mut url = get_doc_base_url ( db, & krate) ?;
268
267
269
- let mut base = krate. display_name ( db) ?. to_string ( ) ;
270
- let is_non_root_module = !matches ! (
271
- definition,
272
- Definition :: ModuleDef ( ModuleDef :: Module ( module) ) if krate. root_module( db) == module
273
- ) ;
274
- if is_non_root_module {
275
- target
276
- . canonical_module_path ( db) ?
277
- . flat_map ( |it| it. name ( db) )
278
- . for_each ( |name| format_to ! ( base, "/{}" , name) ) ;
268
+ if let Some ( path) = mod_path_of_def ( db, target) {
269
+ url = url. join ( & path) . ok ( ) ?;
279
270
}
280
- base += "/" ;
281
271
282
- let mut url = get_doc_base_url ( db, & krate) ?
283
- . join ( & base)
284
- . ok ( ) ?
285
- . join ( & get_symbol_filename ( db, & target) ?)
286
- . ok ( ) ?;
272
+ url = url. join ( & get_symbol_filename ( db, & target) ?) . ok ( ) ?;
287
273
url. set_fragment ( frag. as_deref ( ) ) ;
288
274
289
275
Some ( url. into ( ) )
@@ -296,31 +282,29 @@ fn rewrite_intra_doc_link(
296
282
title : & str ,
297
283
) -> Option < ( String , String ) > {
298
284
let ( link, ns) = parse_intra_doc_link ( target) ;
285
+
299
286
let resolved = resolve_doc_path_for_def ( db, def, link, ns) ?;
300
- let krate = resolved. module ( db) ?. krate ( ) ;
301
- let mut mod_path = String :: new ( ) ;
302
- resolved
303
- . canonical_module_path ( db) ?
304
- . flat_map ( |it| it. name ( db) )
305
- . for_each ( |name| format_to ! ( mod_path, "{}/" , name) ) ;
306
- let mut new_url = get_doc_base_url ( db, & krate) ?
307
- . join ( & format ! ( "{}/" , krate. display_name( db) ?) )
308
- . ok ( ) ?
309
- . join ( & mod_path)
310
- . ok ( ) ?;
311
- if let Some ( assoc_item) = resolved. as_assoc_item ( db) {
287
+ let krate = crate_of_def ( db, resolved) ?;
288
+ let mut url = get_doc_base_url ( db, & krate) ?;
289
+
290
+ if let Some ( path) = mod_path_of_def ( db, resolved) {
291
+ url = url. join ( & path) . ok ( ) ?;
292
+ }
293
+
294
+ let ( resolved, frag) = if let Some ( assoc_item) = resolved. as_assoc_item ( db) {
312
295
let resolved = match assoc_item. container ( db) {
313
296
AssocItemContainer :: Trait ( t) => t. into ( ) ,
314
297
AssocItemContainer :: Impl ( i) => i. self_ty ( db) . as_adt ( ) ?. into ( ) ,
315
298
} ;
316
- new_url = new_url. join ( & get_symbol_filename ( db, & resolved) ?) . ok ( ) ?;
317
299
let frag = get_assoc_item_fragment ( db, assoc_item) ?;
318
- new_url . set_fragment ( Some ( & frag) ) ;
300
+ ( resolved , Some ( frag) )
319
301
} else {
320
- new_url = new_url . join ( & get_symbol_filename ( db , & resolved ) ? ) . ok ( ) ? ;
302
+ ( resolved , None )
321
303
} ;
304
+ url = url. join ( & get_symbol_filename ( db, & resolved) ?) . ok ( ) ?;
305
+ url. set_fragment ( frag. as_deref ( ) ) ;
322
306
323
- Some ( ( new_url . into ( ) , strip_prefixes_suffixes ( title) . to_string ( ) ) )
307
+ Some ( ( url . into ( ) , strip_prefixes_suffixes ( title) . to_string ( ) ) )
324
308
}
325
309
326
310
/// Try to resolve path to local documentation via path-based links (i.e. `../gateway/struct.Shard.html`).
@@ -329,21 +313,32 @@ fn rewrite_url_link(db: &RootDatabase, def: ModuleDef, target: &str) -> Option<S
329
313
return None ;
330
314
}
331
315
332
- let module = def. module ( db) ?;
333
- let krate = module. krate ( ) ;
334
- let mut base = krate. display_name ( db) ?. to_string ( ) ;
335
- let is_non_root_module = !matches ! (
336
- def,
337
- ModuleDef :: Module ( module) if krate. root_module( db) == module
338
- ) ;
339
- if is_non_root_module {
340
- def. canonical_module_path ( db) ?
341
- . flat_map ( |it| it. name ( db) )
342
- . for_each ( |name| format_to ! ( base, "/{}" , name) ) ;
316
+ let krate = crate_of_def ( db, def) ?;
317
+ let mut url = get_doc_base_url ( db, & krate) ?;
318
+
319
+ if let Some ( path) = mod_path_of_def ( db, def) {
320
+ url = url. join ( & path) . ok ( ) ?;
343
321
}
344
- base += "/" ;
345
322
346
- get_doc_base_url ( db, & krate) ?. join ( & base) . ok ( ) ?. join ( target) . ok ( ) . map ( Into :: into)
323
+ url = url. join ( & get_symbol_filename ( db, & def) ?) . ok ( ) ?;
324
+ url. join ( target) . ok ( ) . map ( Into :: into)
325
+ }
326
+
327
+ fn crate_of_def ( db : & RootDatabase , def : ModuleDef ) -> Option < Crate > {
328
+ let krate = match def {
329
+ // Definition::module gives back the parent module, we don't want that as it fails for root modules
330
+ ModuleDef :: Module ( module) => module. krate ( ) ,
331
+ _ => def. module ( db) ?. krate ( ) ,
332
+ } ;
333
+ Some ( krate)
334
+ }
335
+
336
+ fn mod_path_of_def ( db : & RootDatabase , def : ModuleDef ) -> Option < String > {
337
+ def. canonical_module_path ( db) . map ( |it| {
338
+ let mut path = String :: new ( ) ;
339
+ it. flat_map ( |it| it. name ( db) ) . for_each ( |name| format_to ! ( path, "{}/" , name) ) ;
340
+ path
341
+ } )
347
342
}
348
343
349
344
/// Rewrites a markdown document, applying 'callback' to each link.
@@ -389,6 +384,7 @@ fn map_links<'e>(
389
384
/// ^^^^^^^^^^^^^^^^^^^^^^^^^^
390
385
/// ```
391
386
fn get_doc_base_url ( db : & RootDatabase , krate : & Crate ) -> Option < Url > {
387
+ let display_name = krate. display_name ( db) ?;
392
388
krate
393
389
. get_html_root_url ( db)
394
390
. or_else ( || {
@@ -397,9 +393,9 @@ fn get_doc_base_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
397
393
//
398
394
// FIXME: clicking on the link should just open the file in the editor,
399
395
// instead of falling back to external urls.
400
- Some ( format ! ( "https://docs.rs/{}/*/" , krate. display_name( db ) ? ) )
396
+ Some ( format ! ( "https://docs.rs/{krate }/*/" , krate = display_name) )
401
397
} )
402
- . and_then ( |s| Url :: parse ( & s) . ok ( ) )
398
+ . and_then ( |s| Url :: parse ( & s) . ok ( ) ? . join ( & format ! ( "{}/" , display_name ) ) . ok ( ) )
403
399
}
404
400
405
401
/// Get the filename and extension generated for a symbol by rustdoc.
0 commit comments