mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-03 15:15:24 +00:00
Clean up RPIT a bit
This commit is contained in:
parent
0718682cff
commit
6787f124b5
5 changed files with 14 additions and 41 deletions
|
@ -144,6 +144,7 @@ fn find_struct_impl(ctx: &AssistCtx, strukt: &ast::StructDef) -> Option<Option<a
|
||||||
let src = InFile { file_id: ctx.frange.file_id.into(), value: impl_blk.clone() };
|
let src = InFile { file_id: ctx.frange.file_id.into(), value: impl_blk.clone() };
|
||||||
let blk = sb.to_def(src)?;
|
let blk = sb.to_def(src)?;
|
||||||
|
|
||||||
|
// TODO this check doesn't work
|
||||||
let same_ty = blk.target_ty(db) == struct_ty;
|
let same_ty = blk.target_ty(db) == struct_ty;
|
||||||
let not_trait_impl = blk.target_trait(db).is_none();
|
let not_trait_impl = blk.target_trait(db).is_none();
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ use hir_expand::{diagnostics::DiagnosticSink, name::name};
|
||||||
use ra_arena::map::ArenaMap;
|
use ra_arena::map::ArenaMap;
|
||||||
use ra_prof::profile;
|
use ra_prof::profile;
|
||||||
use ra_syntax::SmolStr;
|
use ra_syntax::SmolStr;
|
||||||
use test_utils::tested_by;
|
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
primitive::{FloatTy, IntTy},
|
primitive::{FloatTy, IntTy},
|
||||||
|
@ -289,29 +288,6 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Disallowed)
|
self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Disallowed)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces `impl Trait` in `ty` by type variables and obligations for
|
|
||||||
/// those variables. This is done for function arguments when calling a
|
|
||||||
/// function, and for return types when inside the function body, i.e. in
|
|
||||||
/// the cases where the `impl Trait` is 'transparent'. In other cases, `impl
|
|
||||||
/// Trait` is represented by `Ty::Opaque`.
|
|
||||||
fn insert_vars_for_impl_trait(&mut self, ty: Ty) -> Ty {
|
|
||||||
ty.fold(&mut |ty| match ty {
|
|
||||||
Ty::Opaque(preds) => {
|
|
||||||
tested_by!(insert_vars_for_impl_trait);
|
|
||||||
let var = self.table.new_type_var();
|
|
||||||
let var_subst = Substs::builder(1).push(var.clone()).build();
|
|
||||||
self.obligations.extend(
|
|
||||||
preds
|
|
||||||
.iter()
|
|
||||||
.map(|pred| pred.clone().subst_bound_vars(&var_subst))
|
|
||||||
.filter_map(Obligation::from_predicate),
|
|
||||||
);
|
|
||||||
var
|
|
||||||
}
|
|
||||||
_ => ty,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replaces Ty::Unknown by a new type var, so we can maybe still infer it.
|
/// Replaces Ty::Unknown by a new type var, so we can maybe still infer it.
|
||||||
fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty {
|
fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty {
|
||||||
match ty {
|
match ty {
|
||||||
|
@ -487,8 +463,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
|
|
||||||
self.infer_pat(*pat, &ty, BindingMode::default());
|
self.infer_pat(*pat, &ty, BindingMode::default());
|
||||||
}
|
}
|
||||||
let return_ty = self.make_ty_with_mode(&data.ret_type, ImplTraitLoweringMode::Variable);
|
let return_ty = self.make_ty_with_mode(&data.ret_type, ImplTraitLoweringMode::Disallowed); // FIXME implement RPIT
|
||||||
self.return_ty = self.insert_vars_for_impl_trait(return_ty);
|
self.return_ty = return_ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn infer_body(&mut self) {
|
fn infer_body(&mut self) {
|
||||||
|
|
|
@ -635,7 +635,6 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let param_ty = self.insert_vars_for_impl_trait(param_ty);
|
|
||||||
let param_ty = self.normalize_associated_types_in(param_ty);
|
let param_ty = self.normalize_associated_types_in(param_ty);
|
||||||
self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone()));
|
self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,5 +6,4 @@ test_utils::marks!(
|
||||||
type_var_resolves_to_int_var
|
type_var_resolves_to_int_var
|
||||||
match_ergonomics_ref
|
match_ergonomics_ref
|
||||||
coerce_merge_fail_fallback
|
coerce_merge_fail_fallback
|
||||||
insert_vars_for_impl_trait
|
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use insta::assert_snapshot;
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
use ra_db::fixture::WithFixture;
|
use ra_db::fixture::WithFixture;
|
||||||
use test_utils::covers;
|
|
||||||
|
|
||||||
use super::{infer, infer_with_mismatches, type_at, type_at_pos};
|
use super::{infer, infer_with_mismatches, type_at, type_at_pos};
|
||||||
use crate::test_db::TestDB;
|
use crate::test_db::TestDB;
|
||||||
|
@ -1650,7 +1649,6 @@ fn test<T, U>() where T: Trait<U::Item>, U: Trait<T::Item> {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn unify_impl_trait() {
|
fn unify_impl_trait() {
|
||||||
covers!(insert_vars_for_impl_trait);
|
|
||||||
assert_snapshot!(
|
assert_snapshot!(
|
||||||
infer_with_mismatches(r#"
|
infer_with_mismatches(r#"
|
||||||
trait Trait<T> {}
|
trait Trait<T> {}
|
||||||
|
@ -1682,26 +1680,26 @@ fn test() -> impl Trait<i32> {
|
||||||
[172; 183) '{ loop {} }': T
|
[172; 183) '{ loop {} }': T
|
||||||
[174; 181) 'loop {}': !
|
[174; 181) 'loop {}': !
|
||||||
[179; 181) '{}': ()
|
[179; 181) '{}': ()
|
||||||
[214; 310) '{ ...t()) }': S<i32>
|
[214; 310) '{ ...t()) }': S<{unknown}>
|
||||||
[224; 226) 's1': S<u32>
|
[224; 226) 's1': S<u32>
|
||||||
[229; 230) 'S': S<u32>(T) -> S<T>
|
[229; 230) 'S': S<u32>(u32) -> S<u32>
|
||||||
[229; 241) 'S(default())': S<u32>
|
[229; 241) 'S(default())': S<u32>
|
||||||
[231; 238) 'default': fn default<u32>() -> T
|
[231; 238) 'default': fn default<u32>() -> u32
|
||||||
[231; 240) 'default()': u32
|
[231; 240) 'default()': u32
|
||||||
[247; 250) 'foo': fn foo(impl Trait<u32>) -> ()
|
[247; 250) 'foo': fn foo<S<u32>>(S<u32>) -> ()
|
||||||
[247; 254) 'foo(s1)': ()
|
[247; 254) 'foo(s1)': ()
|
||||||
[251; 253) 's1': S<u32>
|
[251; 253) 's1': S<u32>
|
||||||
[264; 265) 'x': i32
|
[264; 265) 'x': i32
|
||||||
[273; 276) 'bar': fn bar<i32>(impl Trait<T>) -> T
|
[273; 276) 'bar': fn bar<i32, S<i32>>(S<i32>) -> i32
|
||||||
[273; 290) 'bar(S(...lt()))': i32
|
[273; 290) 'bar(S(...lt()))': i32
|
||||||
[277; 278) 'S': S<i32>(T) -> S<T>
|
[277; 278) 'S': S<i32>(i32) -> S<i32>
|
||||||
[277; 289) 'S(default())': S<i32>
|
[277; 289) 'S(default())': S<i32>
|
||||||
[279; 286) 'default': fn default<i32>() -> T
|
[279; 286) 'default': fn default<i32>() -> i32
|
||||||
[279; 288) 'default()': i32
|
[279; 288) 'default()': i32
|
||||||
[296; 297) 'S': S<i32>(T) -> S<T>
|
[296; 297) 'S': S<{unknown}>({unknown}) -> S<{unknown}>
|
||||||
[296; 308) 'S(default())': S<i32>
|
[296; 308) 'S(default())': S<{unknown}>
|
||||||
[298; 305) 'default': fn default<i32>() -> T
|
[298; 305) 'default': fn default<{unknown}>() -> {unknown}
|
||||||
[298; 307) 'default()': i32
|
[298; 307) 'default()': {unknown}
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue