Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/hover/tests.rs')
-rw-r--r--crates/ide/src/hover/tests.rs797
1 files changed, 745 insertions, 52 deletions
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 50d0d4c5df..2e7637e467 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -20,6 +20,7 @@ const HOVER_BASE_CONFIG: HoverConfig = HoverConfig {
max_trait_assoc_items_count: None,
max_fields_count: Some(5),
max_enum_variants_count: Some(5),
+ max_subst_ty_len: super::SubstTyLen::Unlimited,
};
fn check_hover_no_result(ra_fixture: &str) {
@@ -347,7 +348,6 @@ fn main() {
expect![[r#"
*|*
```rust
- {closure#0}
impl Fn(i32) -> i32
```
___
@@ -371,7 +371,6 @@ fn main() {
expect![[r#"
*|*
```rust
- {closure#0}
impl Fn(i32) -> i32
```
___
@@ -406,7 +405,6 @@ fn main() {
expect![[r#"
*|*
```rust
- {closure#0}
impl FnOnce()
```
___
@@ -436,7 +434,6 @@ fn main() {
expect![[r#"
*|*
```rust
- {closure#0}
impl FnMut()
```
___
@@ -462,7 +459,6 @@ fn main() {
"#,
expect![[r#"
```rust
- {closure#0}
impl FnOnce() -> S2
```
___
@@ -2322,6 +2318,53 @@ fn foo(Foo { b$0ar }: &Foo) {}
}
#[test]
+fn test_hover_show_type_def_for_subst() {
+ check_actions(
+ r#"
+fn f<T>(t: T) {
+
+}
+
+struct S;
+
+fn test() {
+ let a = S;
+ f$0(a);
+}
+"#,
+ expect![[r#"
+ [
+ Reference(
+ FilePositionWrapper {
+ file_id: FileId(
+ 0,
+ ),
+ offset: 3,
+ },
+ ),
+ GoToType(
+ [
+ HoverGotoTypeData {
+ mod_path: "ra_test_fixture::S",
+ nav: NavigationTarget {
+ file_id: FileId(
+ 0,
+ ),
+ full_range: 20..29,
+ focus_range: 27..28,
+ name: "S",
+ kind: Struct,
+ description: "struct S",
+ },
+ },
+ ],
+ ),
+ ]
+ "#]],
+ );
+}
+
+#[test]
fn test_hover_non_ascii_space_doc() {
check(
"
@@ -2969,7 +3012,6 @@ fn main() {
expect![[r#"
*|*
```rust
- {closure#0}
impl Fn(i32) -> i32
```
@@ -3212,6 +3254,11 @@ fn foo_$0test() {}
},
},
cfg: None,
+ update_test: UpdateTest {
+ expect_test: false,
+ insta: false,
+ snapbox: false,
+ },
},
),
]
@@ -3229,28 +3276,33 @@ mod tests$0 {
}
"#,
expect![[r#"
- [
- Runnable(
- Runnable {
- use_name_in_title: false,
- nav: NavigationTarget {
- file_id: FileId(
- 0,
- ),
- full_range: 0..46,
- focus_range: 4..9,
- name: "tests",
- kind: Module,
- description: "mod tests",
- },
- kind: TestMod {
- path: "tests",
- },
- cfg: None,
+ [
+ Runnable(
+ Runnable {
+ use_name_in_title: false,
+ nav: NavigationTarget {
+ file_id: FileId(
+ 0,
+ ),
+ full_range: 0..46,
+ focus_range: 4..9,
+ name: "tests",
+ kind: Module,
+ description: "mod tests",
},
- ),
- ]
- "#]],
+ kind: TestMod {
+ path: "tests",
+ },
+ cfg: None,
+ update_test: UpdateTest {
+ expect_test: false,
+ insta: false,
+ snapbox: false,
+ },
+ },
+ ),
+ ]
+ "#]],
);
}
@@ -4720,7 +4772,7 @@ fn hover_type_param_sized_bounds() {
//- minicore: sized
trait Trait {}
struct Foo<T>(T);
-impl<T: Trait> Foo<T$0> {}
+impl<T$0: Trait> Foo<T> {}
"#,
expect![[r#"
*T*
@@ -4735,7 +4787,7 @@ impl<T: Trait> Foo<T$0> {}
//- minicore: sized
trait Trait {}
struct Foo<T>(T);
-impl<T: Trait + ?Sized> Foo<T$0> {}
+impl<T$0: Trait + ?Sized> Foo<T> {}
"#,
expect![[r#"
*T*
@@ -4763,6 +4815,10 @@ fn foo<T$0>() {}
```rust
T
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4780,6 +4836,10 @@ fn foo<T$0: Sized>() {}
```rust
T
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4797,6 +4857,10 @@ fn foo<T$0: ?Sized>() {}
```rust
T: ?Sized
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4815,6 +4879,10 @@ fn foo<T$0: Trait>() {}
```rust
T: Trait
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4833,6 +4901,10 @@ fn foo<T$0: Trait + Sized>() {}
```rust
T: Trait
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4851,6 +4923,10 @@ fn foo<T$0: Trait + ?Sized>() {}
```rust
T: Trait + ?Sized
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4868,6 +4944,10 @@ fn foo<T$0: ?Sized + Sized + Sized>() {}
```rust
T
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -4886,6 +4966,10 @@ fn foo<T$0: Sized + ?Sized + Sized + Trait>() {}
```rust
T: Trait
```
+
+ ---
+
+ invariant
"#]],
);
}
@@ -5176,6 +5260,10 @@ fn main() {
---
+ `Self` = `()`
+
+ ---
+
false
"#]],
);
@@ -5208,6 +5296,10 @@ fn main() {
---
+ `Self` = `i32`
+
+ ---
+
false
"#]],
);
@@ -7285,7 +7377,7 @@ enum Enum {
*field*
```rust
- ra_test_fixture::RecordV
+ ra_test_fixture::Enum::RecordV
```
```rust
@@ -8116,7 +8208,7 @@ fn main() {
```
___
- value of literal: 🦀🦀\A
+ value of literal: ` 🦀🦀\A `
"#]],
);
check(
@@ -8132,7 +8224,7 @@ fn main() {
```
___
- value of literal: 🦀\u{1f980}\\\x41
+ value of literal: ` 🦀\u{1f980}\\\x41 `
"#]],
);
check(
@@ -8154,7 +8246,7 @@ fsdghs";
```
___
- value of literal (truncated up to newline): 🦀\u{1f980}\\\x41
+ value of literal (truncated up to newline): ` 🦀\u{1f980}\\\x41 `
"#]],
);
}
@@ -8174,9 +8266,74 @@ fn main() {
```
___
- value of literal: 🦀🦀\A
+ value of literal: ` 🦀🦀\A `
+ "#]],
+ );
+}
+
+#[test]
+fn rawstring_literal() {
+ check(
+ r#"
+fn main() {
+ $0r"`[^`]*`";
+}"#,
+ expect![[r#"
+ *r"`[^`]*`"*
+ ```rust
+ &str
+ ```
+ ___
+
+ value of literal: ```` `[^`]*` ````
+ "#]],
+ );
+ check(
+ r#"
+fn main() {
+ $0r"`";
+}"#,
+ expect![[r#"
+ *r"`"*
+ ```rust
+ &str
+ ```
+ ___
+
+ value of literal: `` ` ``
+ "#]],
+ );
+ check(
+ r#"
+fn main() {
+ $0r" ";
+}"#,
+ expect![[r#"
+ *r" "*
+ ```rust
+ &str
+ ```
+ ___
+
+ value of literal: ` `
"#]],
);
+ check(
+ r#"
+fn main() {
+ $0r" Hello World ";
+
+}"#,
+ expect![[r#"
+ *r" Hello World "*
+ ```rust
+ &str
+ ```
+ ___
+
+ value of literal: ` Hello World `
+"#]],
+ )
}
#[test]
@@ -8194,7 +8351,7 @@ fn main() {
```
___
- value of literal: [240, 159, 166, 128, 92]
+ value of literal: ` [240, 159, 166, 128, 92] `
"#]],
);
check(
@@ -8210,7 +8367,7 @@ fn main() {
```
___
- value of literal: [92, 120, 70, 48, 92, 120, 57, 70, 92, 120, 65, 54, 92, 120, 56, 48, 92, 92]
+ value of literal: ` [92, 120, 70, 48, 92, 120, 57, 70, 92, 120, 65, 54, 92, 120, 56, 48, 92, 92] `
"#]],
);
}
@@ -8230,7 +8387,7 @@ fn main() {
```
___
- value of literal: 0xF0
+ value of literal: ` 0xF0 `
"#]],
);
check(
@@ -8246,7 +8403,7 @@ fn main() {
```
___
- value of literal: 0x5C
+ value of literal: ` 0x5C `
"#]],
);
}
@@ -8266,7 +8423,7 @@ fn main() {
```
___
- value of literal: A
+ value of literal: ` A `
"#]],
);
check(
@@ -8282,7 +8439,7 @@ fn main() {
```
___
- value of literal: \
+ value of literal: ` \ `
"#]],
);
check(
@@ -8298,7 +8455,7 @@ fn main() {
```
___
- value of literal: 🦀
+ value of literal: ` 🦀 `
"#]],
);
}
@@ -8318,7 +8475,7 @@ fn main() {
```
___
- value of literal: 1 (bits: 0x3FF0000000000000)
+ value of literal: ` 1 (bits: 0x3FF0000000000000) `
"#]],
);
check(
@@ -8334,7 +8491,7 @@ fn main() {
```
___
- value of literal: 1 (bits: 0x3C00)
+ value of literal: ` 1 (bits: 0x3C00) `
"#]],
);
check(
@@ -8350,7 +8507,7 @@ fn main() {
```
___
- value of literal: 1 (bits: 0x3F800000)
+ value of literal: ` 1 (bits: 0x3F800000) `
"#]],
);
check(
@@ -8366,7 +8523,7 @@ fn main() {
```
___
- value of literal: 1 (bits: 0x3FFF0000000000000000000000000000)
+ value of literal: ` 1 (bits: 0x3FFF0000000000000000000000000000) `
"#]],
);
check(
@@ -8382,7 +8539,7 @@ fn main() {
```
___
- value of literal: 134000000000000 (bits: 0x42DE77D399980000)
+ value of literal: ` 134000000000000 (bits: 0x42DE77D399980000) `
"#]],
);
check(
@@ -8398,7 +8555,7 @@ fn main() {
```
___
- value of literal: 1523527134274733600000000 (bits: 0x44F429E9249F629B)
+ value of literal: ` 1523527134274733600000000 (bits: 0x44F429E9249F629B) `
"#]],
);
check(
@@ -8434,7 +8591,7 @@ fn main() {
```
___
- value of literal: 34325236457856836345234 (0x744C659178614489D92|0b111010001001100011001011001000101111000011000010100010010001001110110010010)
+ value of literal: ` 34325236457856836345234 (0x744C659178614489D92|0b111010001001100011001011001000101111000011000010100010010001001110110010010) `
"#]],
);
check(
@@ -8450,7 +8607,7 @@ fn main() {
```
___
- value of literal: 13412342421 (0x31F701A95|0b1100011111011100000001101010010101)
+ value of literal: ` 13412342421 (0x31F701A95|0b1100011111011100000001101010010101) `
"#]],
);
check(
@@ -8466,7 +8623,7 @@ fn main() {
```
___
- value of literal: 306328611 (0x12423423|0b10010010000100011010000100011)
+ value of literal: ` 306328611 (0x12423423|0b10010010000100011010000100011) `
"#]],
);
check(
@@ -8482,7 +8639,7 @@ fn main() {
```
___
- value of literal: 255 (0xFF|0b11111111)
+ value of literal: ` 255 (0xFF|0b11111111) `
"#]],
);
check(
@@ -8498,7 +8655,7 @@ fn main() {
```
___
- value of literal: 5349 (0x14E5|0b1010011100101)
+ value of literal: ` 5349 (0x14E5|0b1010011100101) `
"#]],
);
check(
@@ -9501,3 +9658,539 @@ fn main() {
"#]],
);
}
+
+#[test]
+fn subst_fn() {
+ check(
+ r#"
+struct Foo<T>(T);
+impl<T> Foo<T> {
+ fn foo<U>(v: T, u: U) {}
+}
+
+fn bar() {
+ Foo::fo$0o(123, false);
+}
+ "#,
+ expect![[r#"
+ *foo*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ impl<T> Foo<T>
+ fn foo<U>(v: T, u: U)
+ ```
+
+ ---
+
+ `T` = `i32`, `U` = `bool`
+ "#]],
+ );
+ check(
+ r#"
+fn foo<T>(v: T) {}
+
+fn bar() {
+ fo$0o(123);
+}
+ "#,
+ expect![[r#"
+ *foo*
+
+ ```rust
+ ra_test_fixture
+ ```
+
+ ```rust
+ fn foo<T>(v: T)
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+}
+
+#[test]
+fn subst_record_constructor() {
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = $0Foo { field: 123 };
+}
+ "#,
+ expect![[r#"
+ *Foo*
+
+ ```rust
+ ra_test_fixture
+ ```
+
+ ```rust
+ struct Foo<T> {
+ field: T,
+ }
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = Foo { field: 123 };
+ let $0Foo { field: _ } = v;
+}
+ "#,
+ expect![[r#"
+ *Foo*
+
+ ```rust
+ ra_test_fixture
+ ```
+
+ ```rust
+ struct Foo<T> {
+ field: T,
+ }
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+}
+
+#[test]
+fn subst_method_call() {
+ check(
+ r#"
+struct Foo<T>(T);
+
+impl<U> Foo<U> {
+ fn bar<T>(self, v: T) {}
+}
+
+fn baz() {
+ Foo(123).bar$0("hello");
+}
+ "#,
+ expect![[r#"
+ *bar*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ impl<U> Foo<U>
+ fn bar<T>(self, v: T)
+ ```
+
+ ---
+
+ `U` = `i32`, `T` = `&str`
+ "#]],
+ );
+}
+
+#[test]
+fn subst_type_alias_do_not_work() {
+ // It is very hard to support subst for type aliases properly in all places because they are eagerly evaluated.
+ // We can show the user the subst for the underlying type instead but that'll be very confusing.
+ check(
+ r#"
+struct Foo<T, U> { a: T, b: U }
+type Alias<T> = Foo<T, i32>;
+
+fn foo() {
+ let _ = Alias$0 { a: true, b: 123 };
+}
+ "#,
+ expect![[r#"
+ *Alias*
+
+ ```rust
+ ra_test_fixture
+ ```
+
+ ```rust
+ type Alias<T> = Foo<T, i32>
+ ```
+ "#]],
+ );
+}
+
+#[test]
+fn subst_self() {
+ check(
+ r#"
+trait Trait<T> {
+ fn foo<U>(&self, v: U) {}
+}
+struct Struct<T>(T);
+impl<T> Trait<i64> for Struct<T> {}
+
+fn bar() {
+ Struct(123).foo$0(true);
+}
+ "#,
+ expect![[r#"
+ *foo*
+
+ ```rust
+ ra_test_fixture::Trait
+ ```
+
+ ```rust
+ trait Trait<T>
+ fn foo<U>(&self, v: U)
+ ```
+
+ ---
+
+ `Self` = `Struct<i32>`, `T` = `i64`, `U` = `bool`
+ "#]],
+ );
+}
+
+#[test]
+fn subst_with_lifetimes_and_consts() {
+ check(
+ r#"
+struct Foo<'a, const N: usize, T>(&[T; N]);
+
+impl<'a, T, const N: usize> Foo<'a, N, T> {
+ fn foo<'b, const Z: u32, U>(&self, v: U) {}
+}
+
+fn bar() {
+ Foo(&[1i8]).fo$0o::<456, _>("");
+}
+ "#,
+ expect![[r#"
+ *foo*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ impl<'a, T, const N: usize> Foo<'a, N, T>
+ fn foo<'b, const Z: u32, U>(&self, v: U)
+ ```
+
+ ---
+
+ `T` = `i8`, `U` = `&str`
+ "#]],
+ );
+}
+
+#[test]
+fn subst_field() {
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = Foo { $0field: 123 };
+}
+ "#,
+ expect![[r#"
+ *field*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ field: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let field = 123;
+ let v = Foo { field$0 };
+}
+ "#,
+ expect![[r#"
+ *field*
+
+ ```rust
+ let field: i32
+ ```
+ ---
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ field: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = Foo { field: 123 };
+ let Foo { field$0 } = v;
+}
+ "#,
+ expect![[r#"
+ *field*
+
+ ```rust
+ let field: i32
+ ```
+
+ ---
+
+ size = 4, align = 4
+ ---
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ field: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = Foo { field: 123 };
+ let Foo { field$0: _ } = v;
+}
+ "#,
+ expect![[r#"
+ *field*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ field: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T> { field: T }
+
+fn bar() {
+ let v = Foo { field: 123 };
+ let _ = (&v).$0field;
+}
+ "#,
+ expect![[r#"
+ *field*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ field: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+ check(
+ r#"
+struct Foo<T>(T);
+
+fn bar() {
+ let v = Foo(123);
+ let _ = v.$00;
+}
+ "#,
+ expect![[r#"
+ *0*
+
+ ```rust
+ ra_test_fixture::Foo
+ ```
+
+ ```rust
+ 0: T
+ ```
+
+ ---
+
+ `T` = `i32`
+ "#]],
+ );
+}
+
+#[test]
+fn i128_max() {
+ check(
+ r#"
+//- /core.rs library crate:core
+#![rustc_coherence_is_core]
+impl u128 {
+ pub const MAX: Self = 340_282_366_920_938_463_463_374_607_431_768_211_455u128;
+}
+impl i128 {
+ pub const MAX: Self = (u128::MAX >> 1) as Self;
+}
+
+//- /foo.rs crate:foo deps:core
+fn foo() {
+ let _ = i128::MAX$0;
+}
+ "#,
+ expect![
+ r#"
+ *MAX*
+
+ ```rust
+ core
+ ```
+
+ ```rust
+ pub const MAX: Self = 170141183460469231731687303715884105727 (0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
+ ```
+ "#
+ ],
+ );
+}
+
+#[test]
+fn test_runnables_with_snapshot_tests() {
+ check_actions(
+ r#"
+//- /lib.rs crate:foo deps:expect_test,insta,snapbox
+use expect_test::expect;
+use insta::assert_debug_snapshot;
+use snapbox::Assert;
+
+#[test]
+fn test$0() {
+ let actual = "new25";
+ expect!["new25"].assert_eq(&actual);
+ Assert::new()
+ .action_env("SNAPSHOTS")
+ .eq(actual, snapbox::str!["new25"]);
+ assert_debug_snapshot!(actual);
+}
+
+//- /lib.rs crate:expect_test
+struct Expect;
+
+impl Expect {
+ fn assert_eq(&self, actual: &str) {}
+}
+
+#[macro_export]
+macro_rules! expect {
+ ($e:expr) => Expect; // dummy
+}
+
+//- /lib.rs crate:insta
+#[macro_export]
+macro_rules! assert_debug_snapshot {
+ ($e:expr) => {}; // dummy
+}
+
+//- /lib.rs crate:snapbox
+pub struct Assert;
+
+impl Assert {
+ pub fn new() -> Self { Assert }
+
+ pub fn action_env(&self, env: &str) -> &Self { self }
+
+ pub fn eq(&self, actual: &str, expected: &str) {}
+}
+
+#[macro_export]
+macro_rules! str {
+ ($e:expr) => ""; // dummy
+}
+ "#,
+ expect![[r#"
+ [
+ Reference(
+ FilePositionWrapper {
+ file_id: FileId(
+ 0,
+ ),
+ offset: 92,
+ },
+ ),
+ Runnable(
+ Runnable {
+ use_name_in_title: false,
+ nav: NavigationTarget {
+ file_id: FileId(
+ 0,
+ ),
+ full_range: 81..301,
+ focus_range: 92..96,
+ name: "test",
+ kind: Function,
+ },
+ kind: Test {
+ test_id: Path(
+ "test",
+ ),
+ attr: TestAttr {
+ ignore: false,
+ },
+ },
+ cfg: None,
+ update_test: UpdateTest {
+ expect_test: true,
+ insta: true,
+ snapbox: true,
+ },
+ },
+ ),
+ ]
+ "#]],
+ );
+}