@@ -133,38 +133,37 @@ pub(crate) fn external_docs(
133
133
db : & RootDatabase ,
134
134
position : & FilePosition ,
135
135
target_dir : Option < & OsStr > ,
136
- ) -> DocumentationLinks {
136
+ ) -> Option < DocumentationLinks > {
137
137
let sema = & Semantics :: new ( db) ;
138
138
let file = sema. parse ( position. file_id ) . syntax ( ) . clone ( ) ;
139
139
let token = pick_best_token ( file. token_at_offset ( position. offset ) , |kind| match kind {
140
140
IDENT | INT_NUMBER | T ! [ self ] => 3 ,
141
141
T ! [ '(' ] | T ! [ ')' ] => 2 ,
142
142
kind if kind. is_trivia ( ) => 0 ,
143
143
_ => 1 ,
144
- } ) ;
145
- let Some ( token) = token else { return Default :: default ( ) } ;
144
+ } ) ?;
146
145
let token = sema. descend_into_macros_single ( token) ;
147
146
148
- let Some ( node) = token. parent ( ) else { return Default :: default ( ) } ;
147
+ let node = token. parent ( ) ? ;
149
148
let definition = match_ast ! {
150
149
match node {
151
150
ast:: NameRef ( name_ref) => match NameRefClass :: classify( sema, & name_ref) {
152
151
Some ( NameRefClass :: Definition ( def) ) => def,
153
152
Some ( NameRefClass :: FieldShorthand { local_ref: _, field_ref } ) => {
154
153
Definition :: Field ( field_ref)
155
154
}
156
- None => return Default :: default ( ) ,
155
+ None => return None ,
157
156
} ,
158
157
ast:: Name ( name) => match NameClass :: classify( sema, & name) {
159
158
Some ( NameClass :: Definition ( it) | NameClass :: ConstReference ( it) ) => it,
160
159
Some ( NameClass :: PatFieldShorthand { local_def: _, field_ref } ) => Definition :: Field ( field_ref) ,
161
- None => return Default :: default ( ) ,
160
+ None => return None ,
162
161
} ,
163
- _ => return Default :: default ( ) ,
162
+ _ => return None
164
163
}
165
164
} ;
166
165
167
- get_doc_links ( db, definition, target_dir)
166
+ Some ( get_doc_links ( db, definition, target_dir) )
168
167
}
169
168
170
169
/// Extracts all links from a given markdown text returning the definition text range, link-text
@@ -327,6 +326,10 @@ fn get_doc_links(
327
326
def : Definition ,
328
327
target_dir : Option < & OsStr > ,
329
328
) -> DocumentationLinks {
329
+ let join_url = |base_url : Option < Url > , path : & str | -> Option < Url > {
330
+ base_url. and_then ( |url| url. join ( path) . ok ( ) )
331
+ } ;
332
+
330
333
let Some ( ( target, file, frag) ) = filename_and_frag_for_def ( db, def) else { return Default :: default ( ) ; } ;
331
334
332
335
let ( mut web_url, mut local_url) = get_doc_base_urls ( db, target, target_dir) ;
@@ -339,21 +342,13 @@ fn get_doc_links(
339
342
web_url = join_url ( web_url, & file) ;
340
343
local_url = join_url ( local_url, & file) ;
341
344
342
- set_fragment_for_url ( web_url. as_mut ( ) , frag. as_deref ( ) ) ;
343
- set_fragment_for_url ( local_url. as_mut ( ) , frag. as_deref ( ) ) ;
345
+ web_url. as_mut ( ) . map ( |url| url . set_fragment ( frag. as_deref ( ) ) ) ;
346
+ local_url. as_mut ( ) . map ( |url| url . set_fragment ( frag. as_deref ( ) ) ) ;
344
347
345
348
return DocumentationLinks {
346
349
web_url : web_url. map ( |it| it. into ( ) ) ,
347
350
local_url : local_url. map ( |it| it. into ( ) ) ,
348
351
} ;
349
-
350
- fn join_url ( base_url : Option < Url > , path : & str ) -> Option < Url > {
351
- base_url. and_then ( |url| url. join ( path) . ok ( ) )
352
- }
353
-
354
- fn set_fragment_for_url ( url : Option < & mut Url > , frag : Option < & str > ) {
355
- url. map ( |url| url. set_fragment ( frag) ) ;
356
- }
357
352
}
358
353
359
354
fn rewrite_intra_doc_link (
@@ -467,8 +462,14 @@ fn get_doc_base_urls(
467
462
def : Definition ,
468
463
target_dir : Option < & OsStr > ,
469
464
) -> ( Option < Url > , Option < Url > ) {
470
- let local_doc_path =
471
- target_dir. and_then ( create_url_from_os_str) . and_then ( |it| it. join ( "doc/" ) . ok ( ) ) ;
465
+ let local_doc_path = target_dir
466
+ . and_then ( |path : & OsStr | -> Option < Url > {
467
+ let mut with_prefix = OsStr :: new ( "file:///" ) . to_os_string ( ) ;
468
+ with_prefix. push ( path) ;
469
+ with_prefix. push ( "/" ) ;
470
+ with_prefix. to_str ( ) . and_then ( |s| Url :: parse ( s) . ok ( ) )
471
+ } )
472
+ . and_then ( |it| it. join ( "doc/" ) . ok ( ) ) ;
472
473
// special case base url of `BuiltinType` to core
473
474
// https://github.com/rust-lang/rust-analyzer/issues/12250
474
475
if let Definition :: BuiltinType ( ..) = def {
@@ -533,14 +534,7 @@ fn get_doc_base_urls(
533
534
. and_then ( |it| it. join ( & format ! ( "{display_name}/" ) ) . ok ( ) ) ;
534
535
let local_base = local_base. and_then ( |it| it. join ( & format ! ( "{display_name}/" ) ) . ok ( ) ) ;
535
536
536
- return ( web_base, local_base) ;
537
-
538
- fn create_url_from_os_str ( path : & OsStr ) -> Option < Url > {
539
- let mut with_prefix = OsStr :: new ( "file:///" ) . to_os_string ( ) ;
540
- with_prefix. push ( path) ;
541
- with_prefix. push ( "/" ) ;
542
- with_prefix. to_str ( ) . and_then ( |s| Url :: parse ( s) . ok ( ) )
543
- }
537
+ ( web_base, local_base)
544
538
}
545
539
546
540
/// Get the filename and extension generated for a symbol by rustdoc.
0 commit comments