aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r--crates/ra_hir/src/ty/tests.rs175
1 files changed, 175 insertions, 0 deletions
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index 57fd5492d..c5818b738 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -3273,6 +3273,181 @@ fn test<T: ApplyL>(t: T) {
3273 assert_eq!(t, "{unknown}"); 3273 assert_eq!(t, "{unknown}");
3274} 3274}
3275 3275
3276#[test]
3277fn impl_trait() {
3278 assert_snapshot_matches!(
3279 infer(r#"
3280trait Trait<T> {
3281 fn foo(&self) -> T;
3282 fn foo2(&self) -> i64;
3283}
3284fn bar() -> impl Trait<u64> {}
3285
3286fn test(x: impl Trait<u64>, y: &impl Trait<u64>) {
3287 x;
3288 y;
3289 let z = bar();
3290 x.foo();
3291 y.foo();
3292 z.foo();
3293 x.foo2();
3294 y.foo2();
3295 z.foo2();
3296}
3297"#),
3298 @r###"
3299
3300 ⋮[30; 34) 'self': &Self
3301 ⋮[55; 59) 'self': &Self
3302 ⋮[99; 101) '{}': ()
3303 ⋮[111; 112) 'x': impl Trait<u64>
3304 ⋮[131; 132) 'y': &impl Trait<u64>
3305 ⋮[152; 269) '{ ...2(); }': ()
3306 ⋮[158; 159) 'x': impl Trait<u64>
3307 ⋮[165; 166) 'y': &impl Trait<u64>
3308 ⋮[176; 177) 'z': impl Trait<u64>
3309 ⋮[180; 183) 'bar': fn bar() -> impl Trait<u64>
3310 ⋮[180; 185) 'bar()': impl Trait<u64>
3311 ⋮[191; 192) 'x': impl Trait<u64>
3312 ⋮[191; 198) 'x.foo()': {unknown}
3313 ⋮[204; 205) 'y': &impl Trait<u64>
3314 ⋮[204; 211) 'y.foo()': {unknown}
3315 ⋮[217; 218) 'z': impl Trait<u64>
3316 ⋮[217; 224) 'z.foo()': {unknown}
3317 ⋮[230; 231) 'x': impl Trait<u64>
3318 ⋮[230; 238) 'x.foo2()': i64
3319 ⋮[244; 245) 'y': &impl Trait<u64>
3320 ⋮[244; 252) 'y.foo2()': i64
3321 ⋮[258; 259) 'z': impl Trait<u64>
3322 ⋮[258; 266) 'z.foo2()': i64
3323 "###
3324 );
3325}
3326
3327#[test]
3328fn dyn_trait() {
3329 assert_snapshot_matches!(
3330 infer(r#"
3331trait Trait<T> {
3332 fn foo(&self) -> T;
3333 fn foo2(&self) -> i64;
3334}
3335fn bar() -> dyn Trait<u64> {}
3336
3337fn test(x: dyn Trait<u64>, y: &dyn Trait<u64>) {
3338 x;
3339 y;
3340 let z = bar();
3341 x.foo();
3342 y.foo();
3343 z.foo();
3344 x.foo2();
3345 y.foo2();
3346 z.foo2();
3347}
3348"#),
3349 @r###"
3350
3351 ⋮[30; 34) 'self': &Self
3352 ⋮[55; 59) 'self': &Self
3353 ⋮[98; 100) '{}': ()
3354 ⋮[110; 111) 'x': dyn Trait<u64>
3355 ⋮[129; 130) 'y': &dyn Trait<u64>
3356 ⋮[149; 266) '{ ...2(); }': ()
3357 ⋮[155; 156) 'x': dyn Trait<u64>
3358 ⋮[162; 163) 'y': &dyn Trait<u64>
3359 ⋮[173; 174) 'z': dyn Trait<u64>
3360 ⋮[177; 180) 'bar': fn bar() -> dyn Trait<u64>
3361 ⋮[177; 182) 'bar()': dyn Trait<u64>
3362 ⋮[188; 189) 'x': dyn Trait<u64>
3363 ⋮[188; 195) 'x.foo()': {unknown}
3364 ⋮[201; 202) 'y': &dyn Trait<u64>
3365 ⋮[201; 208) 'y.foo()': {unknown}
3366 ⋮[214; 215) 'z': dyn Trait<u64>
3367 ⋮[214; 221) 'z.foo()': {unknown}
3368 ⋮[227; 228) 'x': dyn Trait<u64>
3369 ⋮[227; 235) 'x.foo2()': i64
3370 ⋮[241; 242) 'y': &dyn Trait<u64>
3371 ⋮[241; 249) 'y.foo2()': i64
3372 ⋮[255; 256) 'z': dyn Trait<u64>
3373 ⋮[255; 263) 'z.foo2()': i64
3374 "###
3375 );
3376}
3377
3378#[test]
3379fn dyn_trait_bare() {
3380 assert_snapshot_matches!(
3381 infer(r#"
3382trait Trait {
3383 fn foo(&self) -> u64;
3384}
3385fn bar() -> Trait {}
3386
3387fn test(x: Trait, y: &Trait) -> u64 {
3388 x;
3389 y;
3390 let z = bar();
3391 x.foo();
3392 y.foo();
3393 z.foo();
3394}
3395"#),
3396 @r###"
3397
3398 ⋮[27; 31) 'self': &Self
3399 ⋮[61; 63) '{}': ()
3400 ⋮[73; 74) 'x': {unknown}
3401 ⋮[83; 84) 'y': &{unknown}
3402 ⋮[101; 176) '{ ...o(); }': ()
3403 ⋮[107; 108) 'x': {unknown}
3404 ⋮[114; 115) 'y': &{unknown}
3405 ⋮[125; 126) 'z': {unknown}
3406 ⋮[129; 132) 'bar': fn bar() -> {unknown}
3407 ⋮[129; 134) 'bar()': {unknown}
3408 ⋮[140; 141) 'x': {unknown}
3409 ⋮[140; 147) 'x.foo()': {unknown}
3410 ⋮[153; 154) 'y': &{unknown}
3411 ⋮[153; 160) 'y.foo()': {unknown}
3412 ⋮[166; 167) 'z': {unknown}
3413 ⋮[166; 173) 'z.foo()': {unknown}
3414 "###
3415 );
3416}
3417
3418#[test]
3419fn weird_bounds() {
3420 assert_snapshot_matches!(
3421 infer(r#"
3422trait Trait {}
3423fn test() {
3424 let a: impl Trait + 'lifetime = foo;
3425 let b: impl 'lifetime = foo;
3426 let b: impl (Trait) = foo;
3427 let b: impl ('lifetime) = foo;
3428 let d: impl ?Sized = foo;
3429 let e: impl Trait + ?Sized = foo;
3430}
3431"#),
3432 @r###"
3433
3434 ⋮[26; 237) '{ ...foo; }': ()
3435 ⋮[36; 37) 'a': impl Trait + {error}
3436 ⋮[64; 67) 'foo': impl Trait + {error}
3437 ⋮[77; 78) 'b': impl {error}
3438 ⋮[97; 100) 'foo': impl {error}
3439 ⋮[110; 111) 'b': impl Trait
3440 ⋮[128; 131) 'foo': impl Trait
3441 ⋮[141; 142) 'b': impl {error}
3442 ⋮[163; 166) 'foo': impl {error}
3443 ⋮[176; 177) 'd': impl {error}
3444 ⋮[193; 196) 'foo': impl {error}
3445 ⋮[206; 207) 'e': impl Trait + {error}
3446 ⋮[231; 234) 'foo': impl Trait + {error}
3447 "###
3448 );
3449}
3450
3276fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { 3451fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String {
3277 let file = db.parse(pos.file_id).ok().unwrap(); 3452 let file = db.parse(pos.file_id).ok().unwrap();
3278 let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); 3453 let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap();