1
+ use std:: ffi:: OsStr ;
2
+
1
3
use expect_test:: { expect, Expect } ;
2
4
use hir:: { HasAttrs , Semantics } ;
3
5
use ide_db:: {
@@ -13,11 +15,32 @@ use crate::{
13
15
fixture, TryToNav ,
14
16
} ;
15
17
16
- fn check_external_docs ( ra_fixture : & str , expect : Expect ) {
18
+ fn check_external_docs (
19
+ ra_fixture : & str ,
20
+ target_dir : Option < & OsStr > ,
21
+ expect_web_url : Option < Expect > ,
22
+ expect_local_url : Option < Expect > ,
23
+ ) {
17
24
let ( analysis, position) = fixture:: position ( ra_fixture) ;
18
- let url = analysis. external_docs ( position) . unwrap ( ) . expect ( "could not find url for symbol" ) ;
25
+ let links = analysis. external_docs ( position, target_dir) . unwrap ( ) ;
26
+
27
+ let web_url = links. web_url ;
28
+ let local_url = links. local_url ;
29
+
30
+ println ! ( "web_url: {:?}" , web_url) ;
31
+ println ! ( "local_url: {:?}" , local_url) ;
19
32
20
- expect. assert_eq ( & url)
33
+ match ( expect_web_url, web_url) {
34
+ ( Some ( expect) , Some ( url) ) => expect. assert_eq ( & url) ,
35
+ ( None , None ) => ( ) ,
36
+ _ => panic ! ( "Unexpected web url" ) ,
37
+ }
38
+
39
+ match ( expect_local_url, local_url) {
40
+ ( Some ( expect) , Some ( url) ) => expect. assert_eq ( & url) ,
41
+ ( None , None ) => ( ) ,
42
+ _ => panic ! ( "Unexpected local url" ) ,
43
+ }
21
44
}
22
45
23
46
fn check_rewrite ( ra_fixture : & str , expect : Expect ) {
@@ -105,7 +128,9 @@ use foo$0::Foo;
105
128
//- /lib.rs crate:foo
106
129
pub struct Foo;
107
130
"# ,
108
- expect ! [ [ r#"https://docs.rs/foo/*/foo/index.html"# ] ] ,
131
+ Some ( & OsStr :: new ( "/home/user/project/" ) ) ,
132
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/index.html"# ] ] ) ,
133
+ Some ( expect ! [ [ r#"file:///home/user/project/doc/foo/index.html"# ] ] ) ,
109
134
) ;
110
135
}
111
136
@@ -116,7 +141,9 @@ fn external_docs_doc_url_std_crate() {
116
141
//- /main.rs crate:std
117
142
use self$0;
118
143
"# ,
119
- expect ! [ "https://doc.rust-lang.org/stable/std/index.html" ] ,
144
+ Some ( & OsStr :: new ( "/home/user/project/" ) ) ,
145
+ Some ( expect ! [ "https://doc.rust-lang.org/stable/std/index.html" ] ) ,
146
+ None ,
120
147
) ;
121
148
}
122
149
@@ -127,7 +154,35 @@ fn external_docs_doc_url_struct() {
127
154
//- /main.rs crate:foo
128
155
pub struct Fo$0o;
129
156
"# ,
130
- expect ! [ [ r#"https://docs.rs/foo/*/foo/struct.Foo.html"# ] ] ,
157
+ Some ( & OsStr :: new ( "/home/user/project/" ) ) ,
158
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/struct.Foo.html"# ] ] ) ,
159
+ Some ( expect ! [ [ r#"file:///home/user/project/doc/foo/struct.Foo.html"# ] ] ) ,
160
+ ) ;
161
+ }
162
+
163
+ #[ test]
164
+ fn external_docs_doc_url_windows_backslash_path ( ) {
165
+ check_external_docs (
166
+ r#"
167
+ //- /main.rs crate:foo
168
+ pub struct Fo$0o;
169
+ "# ,
170
+ Some ( & OsStr :: new ( r"C:\Users\user\project" ) ) ,
171
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/struct.Foo.html"# ] ] ) ,
172
+ Some ( expect ! [ [ r#"file:///C:\Users\user\project/doc/foo/struct.Foo.html"# ] ] ) ,
173
+ ) ;
174
+ }
175
+
176
+ #[ test]
177
+ fn external_docs_doc_url_windows_slash_path ( ) {
178
+ check_external_docs (
179
+ r#"
180
+ //- /main.rs crate:foo
181
+ pub struct Fo$0o;
182
+ "# ,
183
+ Some ( & OsStr :: new ( r"C:/Users/user/project" ) ) ,
184
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/struct.Foo.html"# ] ] ) ,
185
+ Some ( expect ! [ [ r#"file:///C:/Users/user/project/doc/foo/struct.Foo.html"# ] ] ) ,
131
186
) ;
132
187
}
133
188
@@ -140,7 +195,9 @@ pub struct Foo {
140
195
field$0: ()
141
196
}
142
197
"# ,
143
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"## ] ] ,
198
+ None ,
199
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#structfield.field"## ] ] ) ,
200
+ None ,
144
201
) ;
145
202
}
146
203
@@ -151,7 +208,9 @@ fn external_docs_doc_url_fn() {
151
208
//- /main.rs crate:foo
152
209
pub fn fo$0o() {}
153
210
"# ,
154
- expect ! [ [ r#"https://docs.rs/foo/*/foo/fn.foo.html"# ] ] ,
211
+ None ,
212
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/fn.foo.html"# ] ] ) ,
213
+ None ,
155
214
) ;
156
215
}
157
216
@@ -165,7 +224,9 @@ impl Foo {
165
224
pub fn method$0() {}
166
225
}
167
226
"# ,
168
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"## ] ] ,
227
+ None ,
228
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"## ] ] ) ,
229
+ None ,
169
230
) ;
170
231
check_external_docs (
171
232
r#"
@@ -175,7 +236,9 @@ impl Foo {
175
236
const CONST$0: () = ();
176
237
}
177
238
"# ,
178
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"## ] ] ,
239
+ None ,
240
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"## ] ] ) ,
241
+ None ,
179
242
) ;
180
243
}
181
244
@@ -192,7 +255,9 @@ impl Trait for Foo {
192
255
pub fn method$0() {}
193
256
}
194
257
"# ,
195
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"## ] ] ,
258
+ None ,
259
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#method.method"## ] ] ) ,
260
+ None ,
196
261
) ;
197
262
check_external_docs (
198
263
r#"
@@ -205,7 +270,9 @@ impl Trait for Foo {
205
270
const CONST$0: () = ();
206
271
}
207
272
"# ,
208
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"## ] ] ,
273
+ None ,
274
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedconstant.CONST"## ] ] ) ,
275
+ None ,
209
276
) ;
210
277
check_external_docs (
211
278
r#"
@@ -218,7 +285,9 @@ impl Trait for Foo {
218
285
type Type$0 = ();
219
286
}
220
287
"# ,
221
- expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"## ] ] ,
288
+ None ,
289
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/struct.Foo.html#associatedtype.Type"## ] ] ) ,
290
+ None ,
222
291
) ;
223
292
}
224
293
@@ -231,7 +300,9 @@ pub trait Foo {
231
300
fn method$0();
232
301
}
233
302
"# ,
234
- expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"## ] ] ,
303
+ None ,
304
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#tymethod.method"## ] ] ) ,
305
+ None ,
235
306
) ;
236
307
check_external_docs (
237
308
r#"
@@ -240,7 +311,9 @@ pub trait Foo {
240
311
const CONST$0: ();
241
312
}
242
313
"# ,
243
- expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"## ] ] ,
314
+ None ,
315
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedconstant.CONST"## ] ] ) ,
316
+ None ,
244
317
) ;
245
318
check_external_docs (
246
319
r#"
@@ -249,7 +322,9 @@ pub trait Foo {
249
322
type Type$0;
250
323
}
251
324
"# ,
252
- expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"## ] ] ,
325
+ None ,
326
+ Some ( expect ! [ [ r##"https://docs.rs/foo/*/foo/trait.Foo.html#associatedtype.Type"## ] ] ) ,
327
+ None ,
253
328
) ;
254
329
}
255
330
@@ -260,7 +335,9 @@ fn external_docs_trait() {
260
335
//- /main.rs crate:foo
261
336
trait Trait$0 {}
262
337
"# ,
263
- expect ! [ [ r#"https://docs.rs/foo/*/foo/trait.Trait.html"# ] ] ,
338
+ None ,
339
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/trait.Trait.html"# ] ] ) ,
340
+ None ,
264
341
)
265
342
}
266
343
@@ -273,7 +350,9 @@ pub mod foo {
273
350
pub mod ba$0r {}
274
351
}
275
352
"# ,
276
- expect ! [ [ r#"https://docs.rs/foo/*/foo/foo/bar/index.html"# ] ] ,
353
+ None ,
354
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/foo/bar/index.html"# ] ] ) ,
355
+ None ,
277
356
)
278
357
}
279
358
@@ -294,7 +373,9 @@ fn foo() {
294
373
let bar: wrapper::It$0em;
295
374
}
296
375
"# ,
297
- expect ! [ [ r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"# ] ] ,
376
+ None ,
377
+ Some ( expect ! [ [ r#"https://docs.rs/foo/*/foo/wrapper/module/struct.Item.html"# ] ] ) ,
378
+ None ,
298
379
)
299
380
}
300
381
0 commit comments