Skip to content

Commit f11236e

Browse files
Merge #4019
4019: Add two more tests for associated types r=matklad a=flodiebold Co-authored-by: Florian Diebold <[email protected]>
2 parents 690a0b2 + fbd9578 commit f11236e

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed

crates/ra_hir_ty/src/tests/traits.rs

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,3 +2204,177 @@ fn test(x: Box<dyn Trait>) {
22042204
);
22052205
assert_eq!(t, "()");
22062206
}
2207+
2208+
#[test]
2209+
fn string_to_owned() {
2210+
let t = type_at(
2211+
r#"
2212+
//- /main.rs
2213+
struct String {}
2214+
pub trait ToOwned {
2215+
type Owned;
2216+
fn to_owned(&self) -> Self::Owned;
2217+
}
2218+
impl ToOwned for str {
2219+
type Owned = String;
2220+
}
2221+
fn test() {
2222+
"foo".to_owned()<|>;
2223+
}
2224+
"#,
2225+
);
2226+
assert_eq!(t, "String");
2227+
}
2228+
2229+
#[test]
2230+
fn iterator_chain() {
2231+
assert_snapshot!(
2232+
infer(r#"
2233+
//- /main.rs
2234+
#[lang = "fn_once"]
2235+
trait FnOnce<Args> {
2236+
type Output;
2237+
}
2238+
#[lang = "fn_mut"]
2239+
trait FnMut<Args>: FnOnce<Args> { }
2240+
2241+
enum Option<T> { Some(T), None }
2242+
use Option::*;
2243+
2244+
pub trait Iterator {
2245+
type Item;
2246+
2247+
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
2248+
where
2249+
F: FnMut(Self::Item) -> Option<B>,
2250+
{ loop {} }
2251+
2252+
fn for_each<F>(self, f: F)
2253+
where
2254+
F: FnMut(Self::Item),
2255+
{ loop {} }
2256+
}
2257+
2258+
pub trait IntoIterator {
2259+
type Item;
2260+
type IntoIter: Iterator<Item = Self::Item>;
2261+
fn into_iter(self) -> Self::IntoIter;
2262+
}
2263+
2264+
pub struct FilterMap<I, F> { }
2265+
impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
2266+
where
2267+
F: FnMut(I::Item) -> Option<B>,
2268+
{
2269+
type Item = B;
2270+
}
2271+
2272+
#[stable(feature = "rust1", since = "1.0.0")]
2273+
impl<I: Iterator> IntoIterator for I {
2274+
type Item = I::Item;
2275+
type IntoIter = I;
2276+
2277+
fn into_iter(self) -> I {
2278+
self
2279+
}
2280+
}
2281+
2282+
struct Vec<T> {}
2283+
impl<T> Vec<T> {
2284+
fn new() -> Self { loop {} }
2285+
}
2286+
2287+
impl<T> IntoIterator for Vec<T> {
2288+
type Item = T;
2289+
type IntoIter = IntoIter<T>;
2290+
}
2291+
2292+
pub struct IntoIter<T> { }
2293+
impl<T> Iterator for IntoIter<T> {
2294+
type Item = T;
2295+
}
2296+
2297+
fn main() {
2298+
Vec::<i32>::new().into_iter()
2299+
.filter_map(|x| if x > 0 { Some(x as u32) } else { None })
2300+
.for_each(|y| { y; });
2301+
}
2302+
"#),
2303+
@r###"
2304+
[240; 244) 'self': Self
2305+
[246; 247) 'f': F
2306+
[331; 342) '{ loop {} }': FilterMap<Self, F>
2307+
[333; 340) 'loop {}': !
2308+
[338; 340) '{}': ()
2309+
[363; 367) 'self': Self
2310+
[369; 370) 'f': F
2311+
[419; 430) '{ loop {} }': ()
2312+
[421; 428) 'loop {}': !
2313+
[426; 428) '{}': ()
2314+
[539; 543) 'self': Self
2315+
[868; 872) 'self': I
2316+
[879; 899) '{ ... }': I
2317+
[889; 893) 'self': I
2318+
[958; 969) '{ loop {} }': Vec<T>
2319+
[960; 967) 'loop {}': !
2320+
[965; 967) '{}': ()
2321+
[1156; 1287) '{ ... }); }': ()
2322+
[1162; 1177) 'Vec::<i32>::new': fn new<i32>() -> Vec<i32>
2323+
[1162; 1179) 'Vec::<...:new()': Vec<i32>
2324+
[1162; 1191) 'Vec::<...iter()': IntoIter<i32>
2325+
[1162; 1256) 'Vec::<...one })': FilterMap<IntoIter<i32>, |i32| -> Option<u32>>
2326+
[1162; 1284) 'Vec::<... y; })': ()
2327+
[1210; 1255) '|x| if...None }': |i32| -> Option<u32>
2328+
[1211; 1212) 'x': i32
2329+
[1214; 1255) 'if x >...None }': Option<u32>
2330+
[1217; 1218) 'x': i32
2331+
[1217; 1222) 'x > 0': bool
2332+
[1221; 1222) '0': i32
2333+
[1223; 1241) '{ Some...u32) }': Option<u32>
2334+
[1225; 1229) 'Some': Some<u32>(u32) -> Option<u32>
2335+
[1225; 1239) 'Some(x as u32)': Option<u32>
2336+
[1230; 1231) 'x': i32
2337+
[1230; 1238) 'x as u32': u32
2338+
[1247; 1255) '{ None }': Option<u32>
2339+
[1249; 1253) 'None': Option<u32>
2340+
[1273; 1283) '|y| { y; }': |u32| -> ()
2341+
[1274; 1275) 'y': u32
2342+
[1277; 1283) '{ y; }': ()
2343+
[1279; 1280) 'y': u32
2344+
"###
2345+
);
2346+
}
2347+
2348+
#[test]
2349+
fn nested_assoc() {
2350+
let t = type_at(
2351+
r#"
2352+
//- /main.rs
2353+
struct Bar;
2354+
struct Foo;
2355+
2356+
trait A {
2357+
type OutputA;
2358+
}
2359+
2360+
impl A for Bar {
2361+
type OutputA = Foo;
2362+
}
2363+
2364+
trait B {
2365+
type Output;
2366+
fn foo() -> Self::Output;
2367+
}
2368+
2369+
impl<T:A> B for T {
2370+
type Output = T::OutputA;
2371+
fn foo() -> Self::Output { loop {} }
2372+
}
2373+
2374+
fn main() {
2375+
Bar::foo()<|>;
2376+
}
2377+
"#,
2378+
);
2379+
assert_eq!(t, "Foo");
2380+
}

0 commit comments

Comments
 (0)