diff options
Diffstat (limited to 'crates/hir_ty')
-rw-r--r-- | crates/hir_ty/Cargo.toml | 6 | ||||
-rw-r--r-- | crates/hir_ty/src/diagnostics.rs | 2 | ||||
-rw-r--r-- | crates/hir_ty/src/infer/expr.rs | 5 | ||||
-rw-r--r-- | crates/hir_ty/src/method_resolution.rs | 4 | ||||
-rw-r--r-- | crates/hir_ty/src/test_db.rs | 4 | ||||
-rw-r--r-- | crates/hir_ty/src/tests.rs | 10 | ||||
-rw-r--r-- | crates/hir_ty/src/tests/simple.rs | 24 |
7 files changed, 41 insertions, 14 deletions
diff --git a/crates/hir_ty/Cargo.toml b/crates/hir_ty/Cargo.toml index 98434b741..db42a00dc 100644 --- a/crates/hir_ty/Cargo.toml +++ b/crates/hir_ty/Cargo.toml | |||
@@ -17,9 +17,9 @@ ena = "0.14.0" | |||
17 | log = "0.4.8" | 17 | log = "0.4.8" |
18 | rustc-hash = "1.1.0" | 18 | rustc-hash = "1.1.0" |
19 | scoped-tls = "1" | 19 | scoped-tls = "1" |
20 | chalk-solve = { version = "0.47", default-features = false } | 20 | chalk-solve = { version = "0.50", default-features = false } |
21 | chalk-ir = "0.47" | 21 | chalk-ir = "0.50" |
22 | chalk-recursive = "0.47" | 22 | chalk-recursive = "0.50" |
23 | la-arena = { version = "0.2.0", path = "../../lib/arena" } | 23 | la-arena = { version = "0.2.0", path = "../../lib/arena" } |
24 | 24 | ||
25 | stdx = { path = "../stdx", version = "0.0.0" } | 25 | stdx = { path = "../stdx", version = "0.0.0" } |
diff --git a/crates/hir_ty/src/diagnostics.rs b/crates/hir_ty/src/diagnostics.rs index c67a289f2..247da43f2 100644 --- a/crates/hir_ty/src/diagnostics.rs +++ b/crates/hir_ty/src/diagnostics.rs | |||
@@ -409,7 +409,7 @@ mod tests { | |||
409 | let crate_def_map = self.crate_def_map(krate); | 409 | let crate_def_map = self.crate_def_map(krate); |
410 | 410 | ||
411 | let mut fns = Vec::new(); | 411 | let mut fns = Vec::new(); |
412 | for (module_id, _) in crate_def_map.modules.iter() { | 412 | for (module_id, _) in crate_def_map.modules() { |
413 | for decl in crate_def_map[module_id].scope.declarations() { | 413 | for decl in crate_def_map[module_id].scope.declarations() { |
414 | let mut sink = DiagnosticSinkBuilder::new().build(&mut cb); | 414 | let mut sink = DiagnosticSinkBuilder::new().build(&mut cb); |
415 | validate_module_item(self, krate, decl, &mut sink); | 415 | validate_module_item(self, krate, decl, &mut sink); |
diff --git a/crates/hir_ty/src/infer/expr.rs b/crates/hir_ty/src/infer/expr.rs index 9bf3b51b0..d7351d212 100644 --- a/crates/hir_ty/src/infer/expr.rs +++ b/crates/hir_ty/src/infer/expr.rs | |||
@@ -491,7 +491,10 @@ impl<'a> InferenceContext<'a> { | |||
491 | Expr::Box { expr } => { | 491 | Expr::Box { expr } => { |
492 | let inner_ty = self.infer_expr_inner(*expr, &Expectation::none()); | 492 | let inner_ty = self.infer_expr_inner(*expr, &Expectation::none()); |
493 | if let Some(box_) = self.resolve_boxed_box() { | 493 | if let Some(box_) = self.resolve_boxed_box() { |
494 | Ty::apply_one(TypeCtor::Adt(box_), inner_ty) | 494 | let mut sb = Substs::build_for_type_ctor(self.db, TypeCtor::Adt(box_)); |
495 | sb = sb.push(inner_ty); | ||
496 | sb = sb.fill(repeat_with(|| self.table.new_type_var())); | ||
497 | Ty::apply(TypeCtor::Adt(box_), sb.build()) | ||
495 | } else { | 498 | } else { |
496 | Ty::Unknown | 499 | Ty::Unknown |
497 | } | 500 | } |
diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index 8a289f52a..f06aeeb42 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs | |||
@@ -112,7 +112,7 @@ impl TraitImpls { | |||
112 | let mut impls = Self { map: FxHashMap::default() }; | 112 | let mut impls = Self { map: FxHashMap::default() }; |
113 | 113 | ||
114 | let crate_def_map = db.crate_def_map(krate); | 114 | let crate_def_map = db.crate_def_map(krate); |
115 | for (_module_id, module_data) in crate_def_map.modules.iter() { | 115 | for (_module_id, module_data) in crate_def_map.modules() { |
116 | for impl_id in module_data.scope.impls() { | 116 | for impl_id in module_data.scope.impls() { |
117 | let target_trait = match db.impl_trait(impl_id) { | 117 | let target_trait = match db.impl_trait(impl_id) { |
118 | Some(tr) => tr.value.trait_, | 118 | Some(tr) => tr.value.trait_, |
@@ -198,7 +198,7 @@ impl InherentImpls { | |||
198 | let mut map: FxHashMap<_, Vec<_>> = FxHashMap::default(); | 198 | let mut map: FxHashMap<_, Vec<_>> = FxHashMap::default(); |
199 | 199 | ||
200 | let crate_def_map = db.crate_def_map(krate); | 200 | let crate_def_map = db.crate_def_map(krate); |
201 | for (_module_id, module_data) in crate_def_map.modules.iter() { | 201 | for (_module_id, module_data) in crate_def_map.modules() { |
202 | for impl_id in module_data.scope.impls() { | 202 | for impl_id in module_data.scope.impls() { |
203 | let data = db.impl_data(impl_id); | 203 | let data = db.impl_data(impl_id); |
204 | if data.target_trait.is_some() { | 204 | if data.target_trait.is_some() { |
diff --git a/crates/hir_ty/src/test_db.rs b/crates/hir_ty/src/test_db.rs index 646e16bbe..3bbcbc242 100644 --- a/crates/hir_ty/src/test_db.rs +++ b/crates/hir_ty/src/test_db.rs | |||
@@ -81,7 +81,7 @@ impl TestDB { | |||
81 | pub(crate) fn module_for_file(&self, file_id: FileId) -> ModuleId { | 81 | pub(crate) fn module_for_file(&self, file_id: FileId) -> ModuleId { |
82 | for &krate in self.relevant_crates(file_id).iter() { | 82 | for &krate in self.relevant_crates(file_id).iter() { |
83 | let crate_def_map = self.crate_def_map(krate); | 83 | let crate_def_map = self.crate_def_map(krate); |
84 | for (local_id, data) in crate_def_map.modules.iter() { | 84 | for (local_id, data) in crate_def_map.modules() { |
85 | if data.origin.file_id() == Some(file_id) { | 85 | if data.origin.file_id() == Some(file_id) { |
86 | return ModuleId { krate, local_id }; | 86 | return ModuleId { krate, local_id }; |
87 | } | 87 | } |
@@ -95,7 +95,7 @@ impl TestDB { | |||
95 | let crate_graph = self.crate_graph(); | 95 | let crate_graph = self.crate_graph(); |
96 | for krate in crate_graph.iter() { | 96 | for krate in crate_graph.iter() { |
97 | let crate_def_map = self.crate_def_map(krate); | 97 | let crate_def_map = self.crate_def_map(krate); |
98 | for (module_id, _) in crate_def_map.modules.iter() { | 98 | for (module_id, _) in crate_def_map.modules() { |
99 | let file_id = crate_def_map[module_id].origin.file_id(); | 99 | let file_id = crate_def_map[module_id].origin.file_id(); |
100 | files.extend(file_id) | 100 | files.extend(file_id) |
101 | } | 101 | } |
diff --git a/crates/hir_ty/src/tests.rs b/crates/hir_ty/src/tests.rs index 3b1675f0b..4a3fcea8d 100644 --- a/crates/hir_ty/src/tests.rs +++ b/crates/hir_ty/src/tests.rs | |||
@@ -18,7 +18,7 @@ use hir_def::{ | |||
18 | db::DefDatabase, | 18 | db::DefDatabase, |
19 | item_scope::ItemScope, | 19 | item_scope::ItemScope, |
20 | keys, | 20 | keys, |
21 | nameres::CrateDefMap, | 21 | nameres::DefMap, |
22 | AssocItemId, DefWithBodyId, LocalModuleId, Lookup, ModuleDefId, | 22 | AssocItemId, DefWithBodyId, LocalModuleId, Lookup, ModuleDefId, |
23 | }; | 23 | }; |
24 | use hir_expand::{db::AstDatabase, InFile}; | 24 | use hir_expand::{db::AstDatabase, InFile}; |
@@ -26,7 +26,7 @@ use once_cell::race::OnceBool; | |||
26 | use stdx::format_to; | 26 | use stdx::format_to; |
27 | use syntax::{ | 27 | use syntax::{ |
28 | algo, | 28 | algo, |
29 | ast::{self, AstNode}, | 29 | ast::{self, AstNode, NameOwner}, |
30 | SyntaxNode, | 30 | SyntaxNode, |
31 | }; | 31 | }; |
32 | use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; | 32 | use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; |
@@ -153,7 +153,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { | |||
153 | }); | 153 | }); |
154 | for (node, ty) in &types { | 154 | for (node, ty) in &types { |
155 | let (range, text) = if let Some(self_param) = ast::SelfParam::cast(node.value.clone()) { | 155 | let (range, text) = if let Some(self_param) = ast::SelfParam::cast(node.value.clone()) { |
156 | (self_param.self_token().unwrap().text_range(), "self".to_string()) | 156 | (self_param.name().unwrap().syntax().text_range(), "self".to_string()) |
157 | } else { | 157 | } else { |
158 | (node.value.text_range(), node.value.text().to_string().replace("\n", " ")) | 158 | (node.value.text_range(), node.value.text().to_string().replace("\n", " ")) |
159 | }; | 159 | }; |
@@ -221,7 +221,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { | |||
221 | 221 | ||
222 | fn visit_module( | 222 | fn visit_module( |
223 | db: &TestDB, | 223 | db: &TestDB, |
224 | crate_def_map: &CrateDefMap, | 224 | crate_def_map: &DefMap, |
225 | module_id: LocalModuleId, | 225 | module_id: LocalModuleId, |
226 | cb: &mut dyn FnMut(DefWithBodyId), | 226 | cb: &mut dyn FnMut(DefWithBodyId), |
227 | ) { | 227 | ) { |
@@ -249,7 +249,7 @@ fn visit_module( | |||
249 | 249 | ||
250 | fn visit_scope( | 250 | fn visit_scope( |
251 | db: &TestDB, | 251 | db: &TestDB, |
252 | crate_def_map: &CrateDefMap, | 252 | crate_def_map: &DefMap, |
253 | scope: &ItemScope, | 253 | scope: &ItemScope, |
254 | cb: &mut dyn FnMut(DefWithBodyId), | 254 | cb: &mut dyn FnMut(DefWithBodyId), |
255 | ) { | 255 | ) { |
diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs index 8d431b920..16682f76f 100644 --- a/crates/hir_ty/src/tests/simple.rs +++ b/crates/hir_ty/src/tests/simple.rs | |||
@@ -29,6 +29,30 @@ mod boxed { | |||
29 | } | 29 | } |
30 | 30 | ||
31 | #[test] | 31 | #[test] |
32 | fn infer_box_with_allocator() { | ||
33 | check_types( | ||
34 | r#" | ||
35 | //- /main.rs crate:main deps:std | ||
36 | fn test() { | ||
37 | let x = box 1; | ||
38 | let t = (x, box x, box &1, box [1]); | ||
39 | t; | ||
40 | } //^ (Box<i32, {unknown}>, Box<Box<i32, {unknown}>, {unknown}>, Box<&i32, {unknown}>, Box<[i32; _], {unknown}>) | ||
41 | |||
42 | //- /std.rs crate:std | ||
43 | #[prelude_import] use prelude::*; | ||
44 | mod boxed { | ||
45 | #[lang = "owned_box"] | ||
46 | pub struct Box<T: ?Sized, A: Allocator> { | ||
47 | inner: *mut T, | ||
48 | allocator: A, | ||
49 | } | ||
50 | } | ||
51 | "#, | ||
52 | ); | ||
53 | } | ||
54 | |||
55 | #[test] | ||
32 | fn infer_adt_self() { | 56 | fn infer_adt_self() { |
33 | check_types( | 57 | check_types( |
34 | r#" | 58 | r#" |