diff options
author | Florian Diebold <[email protected]> | 2019-03-16 16:29:55 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-03-16 16:29:55 +0000 |
commit | 7faae12311895b20b4dec47825708d15f3aaf034 (patch) | |
tree | dc7298ec39809f520362a5c1fa1dc98ce63900f7 /crates | |
parent | a9ddaba905348897606948658798f9f46854acf7 (diff) |
Remove FnSig from FnDef type
It doesn't need to be in there since it's just information from the def. Another
step towards aligning Ty with Chalk's representation.
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir/src/db.rs | 5 | ||||
-rw-r--r-- | crates/ra_hir/src/ty.rs | 18 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 18 |
4 files changed, 26 insertions, 21 deletions
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index 21d22aa7f..5ad9547f1 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs | |||
@@ -12,7 +12,7 @@ use crate::{ | |||
12 | macros::MacroExpansion, | 12 | macros::MacroExpansion, |
13 | module_tree::ModuleTree, | 13 | module_tree::ModuleTree, |
14 | nameres::{ItemMap, lower::{LoweredModule, ImportSourceMap}}, | 14 | nameres::{ItemMap, lower::{LoweredModule, ImportSourceMap}}, |
15 | ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef}, | 15 | ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef, CallableDef, FnSig}, |
16 | adt::{StructData, EnumData}, | 16 | adt::{StructData, EnumData}, |
17 | impl_block::{ModuleImplBlocks, ImplSourceMap}, | 17 | impl_block::{ModuleImplBlocks, ImplSourceMap}, |
18 | generics::{GenericParams, GenericDef}, | 18 | generics::{GenericParams, GenericDef}, |
@@ -105,6 +105,9 @@ pub trait HirDatabase: PersistentHirDatabase { | |||
105 | #[salsa::invoke(crate::ty::type_for_field)] | 105 | #[salsa::invoke(crate::ty::type_for_field)] |
106 | fn type_for_field(&self, field: StructField) -> Ty; | 106 | fn type_for_field(&self, field: StructField) -> Ty; |
107 | 107 | ||
108 | #[salsa::invoke(crate::ty::callable_item_sig)] | ||
109 | fn callable_item_signature(&self, def: CallableDef) -> FnSig; | ||
110 | |||
108 | #[salsa::invoke(crate::expr::body_with_source_map_query)] | 111 | #[salsa::invoke(crate::expr::body_with_source_map_query)] |
109 | fn body_with_source_map( | 112 | fn body_with_source_map( |
110 | &self, | 113 | &self, |
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 31f726f35..2ea3b341f 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs | |||
@@ -16,7 +16,7 @@ use std::{fmt, mem}; | |||
16 | 16 | ||
17 | use crate::{Name, AdtDef, type_ref::Mutability, db::HirDatabase}; | 17 | use crate::{Name, AdtDef, type_ref::Mutability, db::HirDatabase}; |
18 | 18 | ||
19 | pub(crate) use lower::{TypableDef, CallableDef, type_for_def, type_for_field}; | 19 | pub(crate) use lower::{TypableDef, CallableDef, type_for_def, type_for_field, callable_item_sig}; |
20 | pub(crate) use infer::{infer, InferenceResult, InferTy}; | 20 | pub(crate) use infer::{infer, InferenceResult, InferTy}; |
21 | use display::{HirDisplay, HirFormatter}; | 21 | use display::{HirDisplay, HirFormatter}; |
22 | 22 | ||
@@ -77,8 +77,6 @@ pub enum Ty { | |||
77 | FnDef { | 77 | FnDef { |
78 | /// The definition of the function / constructor. | 78 | /// The definition of the function / constructor. |
79 | def: CallableDef, | 79 | def: CallableDef, |
80 | /// Parameters and return type | ||
81 | sig: FnSig, | ||
82 | /// Substitutions for the generic parameters of the type | 80 | /// Substitutions for the generic parameters of the type |
83 | substs: Substs, | 81 | substs: Substs, |
84 | }, | 82 | }, |
@@ -189,11 +187,7 @@ impl Ty { | |||
189 | } | 187 | } |
190 | sig.ret().walk(f); | 188 | sig.ret().walk(f); |
191 | } | 189 | } |
192 | Ty::FnDef { substs, sig, .. } => { | 190 | Ty::FnDef { substs, .. } => { |
193 | for input in sig.params() { | ||
194 | input.walk(f); | ||
195 | } | ||
196 | sig.ret().walk(f); | ||
197 | for t in substs.0.iter() { | 191 | for t in substs.0.iter() { |
198 | t.walk(f); | 192 | t.walk(f); |
199 | } | 193 | } |
@@ -232,8 +226,7 @@ impl Ty { | |||
232 | Ty::FnPtr(sig) => { | 226 | Ty::FnPtr(sig) => { |
233 | sig.walk_mut(f); | 227 | sig.walk_mut(f); |
234 | } | 228 | } |
235 | Ty::FnDef { substs, sig, .. } => { | 229 | Ty::FnDef { substs, .. } => { |
236 | sig.walk_mut(f); | ||
237 | substs.walk_mut(f); | 230 | substs.walk_mut(f); |
238 | } | 231 | } |
239 | Ty::Adt { substs, .. } => { | 232 | Ty::Adt { substs, .. } => { |
@@ -275,7 +268,7 @@ impl Ty { | |||
275 | pub fn apply_substs(self, substs: Substs) -> Ty { | 268 | pub fn apply_substs(self, substs: Substs) -> Ty { |
276 | match self { | 269 | match self { |
277 | Ty::Adt { def_id, .. } => Ty::Adt { def_id, substs }, | 270 | Ty::Adt { def_id, .. } => Ty::Adt { def_id, substs }, |
278 | Ty::FnDef { def, sig, .. } => Ty::FnDef { def, sig, substs }, | 271 | Ty::FnDef { def, .. } => Ty::FnDef { def, substs }, |
279 | _ => self, | 272 | _ => self, |
280 | } | 273 | } |
281 | } | 274 | } |
@@ -344,7 +337,8 @@ impl HirDisplay for Ty { | |||
344 | f.write_joined(sig.params(), ", ")?; | 337 | f.write_joined(sig.params(), ", ")?; |
345 | write!(f, ") -> {}", sig.ret().display(f.db))?; | 338 | write!(f, ") -> {}", sig.ret().display(f.db))?; |
346 | } | 339 | } |
347 | Ty::FnDef { def, substs, sig, .. } => { | 340 | Ty::FnDef { def, substs, .. } => { |
341 | let sig = f.db.callable_item_signature(*def); | ||
348 | let name = match def { | 342 | let name = match def { |
349 | CallableDef::Function(ff) => ff.name(f.db), | 343 | CallableDef::Function(ff) => ff.name(f.db), |
350 | CallableDef::Struct(s) => s.name(f.db).unwrap_or_else(Name::missing), | 344 | CallableDef::Struct(s) => s.name(f.db).unwrap_or_else(Name::missing), |
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 2eb73726e..c9a5bc7a1 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -725,7 +725,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
725 | let callee_ty = self.infer_expr(*callee, &Expectation::none()); | 725 | let callee_ty = self.infer_expr(*callee, &Expectation::none()); |
726 | let (param_tys, ret_ty) = match &callee_ty { | 726 | let (param_tys, ret_ty) = match &callee_ty { |
727 | Ty::FnPtr(sig) => (sig.params().to_vec(), sig.ret().clone()), | 727 | Ty::FnPtr(sig) => (sig.params().to_vec(), sig.ret().clone()), |
728 | Ty::FnDef { substs, sig, .. } => { | 728 | Ty::FnDef { substs, def, .. } => { |
729 | let sig = self.db.callable_item_signature(*def); | ||
729 | let ret_ty = sig.ret().clone().subst(&substs); | 730 | let ret_ty = sig.ret().clone().subst(&substs); |
730 | let param_tys = | 731 | let param_tys = |
731 | sig.params().iter().map(|ty| ty.clone().subst(&substs)).collect(); | 732 | sig.params().iter().map(|ty| ty.clone().subst(&substs)).collect(); |
@@ -768,7 +769,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
768 | (Ty::Unknown, Vec::new(), sig.ret().clone()) | 769 | (Ty::Unknown, Vec::new(), sig.ret().clone()) |
769 | } | 770 | } |
770 | } | 771 | } |
771 | Ty::FnDef { substs, sig, .. } => { | 772 | Ty::FnDef { substs, def, .. } => { |
773 | let sig = self.db.callable_item_signature(*def); | ||
772 | let ret_ty = sig.ret().clone().subst(&substs); | 774 | let ret_ty = sig.ret().clone().subst(&substs); |
773 | 775 | ||
774 | if !sig.params().is_empty() { | 776 | if !sig.params().is_empty() { |
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index 7d065203a..278f592d3 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -212,6 +212,15 @@ pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace | |||
212 | } | 212 | } |
213 | } | 213 | } |
214 | 214 | ||
215 | /// Build the signature of a callable item (function, struct or enum variant). | ||
216 | pub(crate) fn callable_item_sig(db: &impl HirDatabase, def: CallableDef) -> FnSig { | ||
217 | match def { | ||
218 | CallableDef::Function(f) => fn_sig_for_fn(db, f), | ||
219 | CallableDef::Struct(s) => fn_sig_for_struct_constructor(db, s), | ||
220 | CallableDef::EnumVariant(e) => fn_sig_for_enum_variant_constructor(db, e), | ||
221 | } | ||
222 | } | ||
223 | |||
215 | /// Build the type of a specific field of a struct or enum variant. | 224 | /// Build the type of a specific field of a struct or enum variant. |
216 | pub(crate) fn type_for_field(db: &impl HirDatabase, field: StructField) -> Ty { | 225 | pub(crate) fn type_for_field(db: &impl HirDatabase, field: StructField) -> Ty { |
217 | let parent_def = field.parent_def(db); | 226 | let parent_def = field.parent_def(db); |
@@ -236,10 +245,9 @@ fn fn_sig_for_fn(db: &impl HirDatabase, def: Function) -> FnSig { | |||
236 | /// Build the declared type of a function. This should not need to look at the | 245 | /// Build the declared type of a function. This should not need to look at the |
237 | /// function body. | 246 | /// function body. |
238 | fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty { | 247 | fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty { |
239 | let sig = fn_sig_for_fn(db, def); | ||
240 | let generics = def.generic_params(db); | 248 | let generics = def.generic_params(db); |
241 | let substs = make_substs(&generics); | 249 | let substs = make_substs(&generics); |
242 | Ty::FnDef { def: def.into(), sig, substs } | 250 | Ty::FnDef { def: def.into(), substs } |
243 | } | 251 | } |
244 | 252 | ||
245 | /// Build the declared type of a const. | 253 | /// Build the declared type of a const. |
@@ -279,10 +287,9 @@ fn type_for_struct_constructor(db: &impl HirDatabase, def: Struct) -> Ty { | |||
279 | if var_data.fields().is_none() { | 287 | if var_data.fields().is_none() { |
280 | return type_for_struct(db, def); // Unit struct | 288 | return type_for_struct(db, def); // Unit struct |
281 | } | 289 | } |
282 | let sig = fn_sig_for_struct_constructor(db, def); | ||
283 | let generics = def.generic_params(db); | 290 | let generics = def.generic_params(db); |
284 | let substs = make_substs(&generics); | 291 | let substs = make_substs(&generics); |
285 | Ty::FnDef { def: def.into(), sig, substs } | 292 | Ty::FnDef { def: def.into(), substs } |
286 | } | 293 | } |
287 | 294 | ||
288 | fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) -> FnSig { | 295 | fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) -> FnSig { |
@@ -308,10 +315,9 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) -> | |||
308 | if var_data.fields().is_none() { | 315 | if var_data.fields().is_none() { |
309 | return type_for_enum(db, def.parent_enum(db)); // Unit variant | 316 | return type_for_enum(db, def.parent_enum(db)); // Unit variant |
310 | } | 317 | } |
311 | let sig = fn_sig_for_enum_variant_constructor(db, def); | ||
312 | let generics = def.parent_enum(db).generic_params(db); | 318 | let generics = def.parent_enum(db).generic_params(db); |
313 | let substs = make_substs(&generics); | 319 | let substs = make_substs(&generics); |
314 | Ty::FnDef { def: def.into(), sig, substs } | 320 | Ty::FnDef { def: def.into(), substs } |
315 | } | 321 | } |
316 | 322 | ||
317 | fn make_substs(generics: &GenericParams) -> Substs { | 323 | fn make_substs(generics: &GenericParams) -> Substs { |