1+ use std:: ffi:: OsStr ;
2+
13use expect_test:: { expect, Expect } ;
24use hir:: { HasAttrs , Semantics } ;
35use ide_db:: {
@@ -13,11 +15,32 @@ use crate::{
1315 fixture, TryToNav ,
1416} ;
1517
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+ ) {
1724 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) ;
1932
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+ }
2144}
2245
2346fn check_rewrite ( ra_fixture : & str , expect : Expect ) {
@@ -105,7 +128,9 @@ use foo$0::Foo;
105128//- /lib.rs crate:foo
106129pub struct Foo;
107130"# ,
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"# ] ] ) ,
109134 ) ;
110135}
111136
@@ -116,7 +141,9 @@ fn external_docs_doc_url_std_crate() {
116141//- /main.rs crate:std
117142use self$0;
118143"# ,
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 ,
120147 ) ;
121148}
122149
@@ -127,7 +154,35 @@ fn external_docs_doc_url_struct() {
127154//- /main.rs crate:foo
128155pub struct Fo$0o;
129156"# ,
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"# ] ] ) ,
131186 ) ;
132187}
133188
@@ -140,7 +195,9 @@ pub struct Foo {
140195 field$0: ()
141196}
142197"# ,
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 ,
144201 ) ;
145202}
146203
@@ -151,7 +208,9 @@ fn external_docs_doc_url_fn() {
151208//- /main.rs crate:foo
152209pub fn fo$0o() {}
153210"# ,
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 ,
155214 ) ;
156215}
157216
@@ -165,7 +224,9 @@ impl Foo {
165224 pub fn method$0() {}
166225}
167226"# ,
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 ,
169230 ) ;
170231 check_external_docs (
171232 r#"
@@ -175,7 +236,9 @@ impl Foo {
175236 const CONST$0: () = ();
176237}
177238"# ,
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 ,
179242 ) ;
180243}
181244
@@ -192,7 +255,9 @@ impl Trait for Foo {
192255 pub fn method$0() {}
193256}
194257"# ,
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 ,
196261 ) ;
197262 check_external_docs (
198263 r#"
@@ -205,7 +270,9 @@ impl Trait for Foo {
205270 const CONST$0: () = ();
206271}
207272"# ,
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 ,
209276 ) ;
210277 check_external_docs (
211278 r#"
@@ -218,7 +285,9 @@ impl Trait for Foo {
218285 type Type$0 = ();
219286}
220287"# ,
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 ,
222291 ) ;
223292}
224293
@@ -231,7 +300,9 @@ pub trait Foo {
231300 fn method$0();
232301}
233302"# ,
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 ,
235306 ) ;
236307 check_external_docs (
237308 r#"
@@ -240,7 +311,9 @@ pub trait Foo {
240311 const CONST$0: ();
241312}
242313"# ,
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 ,
244317 ) ;
245318 check_external_docs (
246319 r#"
@@ -249,7 +322,9 @@ pub trait Foo {
249322 type Type$0;
250323}
251324"# ,
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 ,
253328 ) ;
254329}
255330
@@ -260,7 +335,9 @@ fn external_docs_trait() {
260335//- /main.rs crate:foo
261336trait Trait$0 {}
262337"# ,
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 ,
264341 )
265342}
266343
@@ -273,7 +350,9 @@ pub mod foo {
273350 pub mod ba$0r {}
274351}
275352"# ,
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 ,
277356 )
278357}
279358
@@ -294,7 +373,9 @@ fn foo() {
294373 let bar: wrapper::It$0em;
295374}
296375 "# ,
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 ,
298379 )
299380}
300381
0 commit comments