diff options
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 3b0a99460..3ac1fbdd5 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -2740,17 +2740,17 @@ fn test() { | |||
2740 | [202; 203) 't': T | 2740 | [202; 203) 't': T |
2741 | [221; 223) '{}': () | 2741 | [221; 223) '{}': () |
2742 | [234; 300) '{ ...(S); }': () | 2742 | [234; 300) '{ ...(S); }': () |
2743 | [244; 245) 'x': {unknown} | 2743 | [244; 245) 'x': u32 |
2744 | [248; 252) 'foo1': fn foo1<S>(T) -> {unknown} | 2744 | [248; 252) 'foo1': fn foo1<S>(T) -> <T as Iterable>::Item |
2745 | [248; 255) 'foo1(S)': {unknown} | 2745 | [248; 255) 'foo1(S)': u32 |
2746 | [253; 254) 'S': S | 2746 | [253; 254) 'S': S |
2747 | [265; 266) 'y': u32 | 2747 | [265; 266) 'y': u32 |
2748 | [269; 273) 'foo2': fn foo2<S>(T) -> <T as Iterable>::Item | 2748 | [269; 273) 'foo2': fn foo2<S>(T) -> <T as Iterable>::Item |
2749 | [269; 276) 'foo2(S)': u32 | 2749 | [269; 276) 'foo2(S)': u32 |
2750 | [274; 275) 'S': S | 2750 | [274; 275) 'S': S |
2751 | [286; 287) 'z': {unknown} | 2751 | [286; 287) 'z': u32 |
2752 | [290; 294) 'foo3': fn foo3<S>(T) -> {unknown} | 2752 | [290; 294) 'foo3': fn foo3<S>(T) -> <T as Iterable>::Item |
2753 | [290; 297) 'foo3(S)': {unknown} | 2753 | [290; 297) 'foo3(S)': u32 |
2754 | [295; 296) 'S': S | 2754 | [295; 296) 'S': S |
2755 | "### | 2755 | "### |
2756 | ); | 2756 | ); |
@@ -4080,7 +4080,7 @@ fn test<F: FnOnce(u32) -> u64>(f: F) { | |||
4080 | } | 4080 | } |
4081 | 4081 | ||
4082 | #[test] | 4082 | #[test] |
4083 | fn unselected_projection_in_trait_env() { | 4083 | fn unselected_projection_in_trait_env_1() { |
4084 | let t = type_at( | 4084 | let t = type_at( |
4085 | r#" | 4085 | r#" |
4086 | //- /main.rs | 4086 | //- /main.rs |
@@ -4102,7 +4102,33 @@ fn test<T: Trait>() where T::Item: Trait2 { | |||
4102 | } | 4102 | } |
4103 | 4103 | ||
4104 | #[test] | 4104 | #[test] |
4105 | fn unselected_projection_in_trait_env_cycle() { | 4105 | fn unselected_projection_in_trait_env_2() { |
4106 | let t = type_at( | ||
4107 | r#" | ||
4108 | //- /main.rs | ||
4109 | trait Trait<T> { | ||
4110 | type Item; | ||
4111 | } | ||
4112 | |||
4113 | trait Trait2 { | ||
4114 | fn foo(&self) -> u32; | ||
4115 | } | ||
4116 | |||
4117 | fn test<T, U>() where T::Item: Trait2, T: Trait<U::Item>, U: Trait<()> { | ||
4118 | let x: T::Item = no_matter; | ||
4119 | x.foo()<|>; | ||
4120 | } | ||
4121 | "#, | ||
4122 | ); | ||
4123 | assert_eq!(t, "u32"); | ||
4124 | } | ||
4125 | |||
4126 | #[test] | ||
4127 | // FIXME this is currently a Salsa panic; it would be nicer if it just returned | ||
4128 | // in Unknown, and we should be able to do that once Salsa allows us to handle | ||
4129 | // the cycle. But at least it doesn't overflow for now. | ||
4130 | #[should_panic] | ||
4131 | fn unselected_projection_in_trait_env_cycle_1() { | ||
4106 | let t = type_at( | 4132 | let t = type_at( |
4107 | r#" | 4133 | r#" |
4108 | //- /main.rs | 4134 | //- /main.rs |
@@ -4121,6 +4147,28 @@ fn test<T: Trait>() where T: Trait2<T::Item> { | |||
4121 | assert_eq!(t, "{unknown}"); | 4147 | assert_eq!(t, "{unknown}"); |
4122 | } | 4148 | } |
4123 | 4149 | ||
4150 | #[test] | ||
4151 | // FIXME this is currently a Salsa panic; it would be nicer if it just returned | ||
4152 | // in Unknown, and we should be able to do that once Salsa allows us to handle | ||
4153 | // the cycle. But at least it doesn't overflow for now. | ||
4154 | #[should_panic] | ||
4155 | fn unselected_projection_in_trait_env_cycle_2() { | ||
4156 | let t = type_at( | ||
4157 | r#" | ||
4158 | //- /main.rs | ||
4159 | trait Trait<T> { | ||
4160 | type Item; | ||
4161 | } | ||
4162 | |||
4163 | fn test<T, U>() where T: Trait<U::Item>, U: Trait<T::Item> { | ||
4164 | let x: T::Item = no_matter<|>; | ||
4165 | } | ||
4166 | "#, | ||
4167 | ); | ||
4168 | // this is a legitimate cycle | ||
4169 | assert_eq!(t, "{unknown}"); | ||
4170 | } | ||
4171 | |||
4124 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { | 4172 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { |
4125 | let file = db.parse(pos.file_id).ok().unwrap(); | 4173 | let file = db.parse(pos.file_id).ok().unwrap(); |
4126 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); | 4174 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); |