aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2020-01-24 13:32:47 +0000
committerFlorian Diebold <[email protected]>2020-02-07 17:28:10 +0000
commit22a65b11b3a69b3dae561b34c6b28cb2107169d1 (patch)
treedd4a2174d664267fbfe93f0d737975670d3030d0 /crates/ra_hir/src
parent5397f05bfe7f3b18229a65040c6685e762b2f9a3 (diff)
Introduce TyLoweringContext
Diffstat (limited to 'crates/ra_hir/src')
-rw-r--r--crates/ra_hir/src/code_model.rs11
-rw-r--r--crates/ra_hir/src/source_analyzer.rs9
2 files changed, 14 insertions, 6 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index eaacf8c9e..837a3ed6d 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -733,7 +733,8 @@ impl Local {
733 let ty = infer[self.pat_id].clone(); 733 let ty = infer[self.pat_id].clone();
734 let resolver = def.resolver(db); 734 let resolver = def.resolver(db);
735 let krate = def.module(db).krate; 735 let krate = def.module(db).krate;
736 let environment = TraitEnvironment::lower(db, &resolver); 736 let ctx = hir_ty::TyLoweringContext { db, resolver: &resolver };
737 let environment = TraitEnvironment::lower(&ctx);
737 Type { krate, ty: InEnvironment { value: ty, environment } } 738 Type { krate, ty: InEnvironment { value: ty, environment } }
738 } 739 }
739 740
@@ -789,8 +790,9 @@ impl ImplBlock {
789 pub fn target_ty(&self, db: &impl HirDatabase) -> Type { 790 pub fn target_ty(&self, db: &impl HirDatabase) -> Type {
790 let impl_data = db.impl_data(self.id); 791 let impl_data = db.impl_data(self.id);
791 let resolver = self.id.resolver(db); 792 let resolver = self.id.resolver(db);
792 let environment = TraitEnvironment::lower(db, &resolver); 793 let ctx = hir_ty::TyLoweringContext { db, resolver: &resolver };
793 let ty = Ty::from_hir(db, &resolver, &impl_data.target_type); 794 let environment = TraitEnvironment::lower(&ctx);
795 let ty = Ty::from_hir(&ctx, &impl_data.target_type);
794 Type { 796 Type {
795 krate: self.id.lookup(db).container.module(db).krate, 797 krate: self.id.lookup(db).container.module(db).krate,
796 ty: InEnvironment { value: ty, environment }, 798 ty: InEnvironment { value: ty, environment },
@@ -844,7 +846,8 @@ pub struct Type {
844impl Type { 846impl Type {
845 fn new(db: &impl HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type { 847 fn new(db: &impl HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type {
846 let resolver = lexical_env.resolver(db); 848 let resolver = lexical_env.resolver(db);
847 let environment = TraitEnvironment::lower(db, &resolver); 849 let ctx = hir_ty::TyLoweringContext { db, resolver: &resolver };
850 let environment = TraitEnvironment::lower(&ctx);
848 Type { krate, ty: InEnvironment { value: ty, environment } } 851 Type { krate, ty: InEnvironment { value: ty, environment } }
849 } 852 }
850 853
diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs
index 4f8fc9602..9cfd52856 100644
--- a/crates/ra_hir/src/source_analyzer.rs
+++ b/crates/ra_hir/src/source_analyzer.rs
@@ -178,6 +178,11 @@ impl SourceAnalyzer {
178 } 178 }
179 } 179 }
180 180
181 fn trait_env(&self, db: &impl HirDatabase) -> Arc<TraitEnvironment> {
182 let ctx = hir_ty::TyLoweringContext { db, resolver: &self.resolver };
183 TraitEnvironment::lower(&ctx)
184 }
185
181 pub fn type_of(&self, db: &impl HirDatabase, expr: &ast::Expr) -> Option<Type> { 186 pub fn type_of(&self, db: &impl HirDatabase, expr: &ast::Expr) -> Option<Type> {
182 let expr_id = if let Some(expr) = self.expand_expr(db, InFile::new(self.file_id, expr)) { 187 let expr_id = if let Some(expr) = self.expand_expr(db, InFile::new(self.file_id, expr)) {
183 self.body_source_map.as_ref()?.node_expr(expr.as_ref())? 188 self.body_source_map.as_ref()?.node_expr(expr.as_ref())?
@@ -186,14 +191,14 @@ impl SourceAnalyzer {
186 }; 191 };
187 192
188 let ty = self.infer.as_ref()?[expr_id].clone(); 193 let ty = self.infer.as_ref()?[expr_id].clone();
189 let environment = TraitEnvironment::lower(db, &self.resolver); 194 let environment = self.trait_env(db);
190 Some(Type { krate: self.resolver.krate()?, ty: InEnvironment { value: ty, environment } }) 195 Some(Type { krate: self.resolver.krate()?, ty: InEnvironment { value: ty, environment } })
191 } 196 }
192 197
193 pub fn type_of_pat(&self, db: &impl HirDatabase, pat: &ast::Pat) -> Option<Type> { 198 pub fn type_of_pat(&self, db: &impl HirDatabase, pat: &ast::Pat) -> Option<Type> {
194 let pat_id = self.pat_id(pat)?; 199 let pat_id = self.pat_id(pat)?;
195 let ty = self.infer.as_ref()?[pat_id].clone(); 200 let ty = self.infer.as_ref()?[pat_id].clone();
196 let environment = TraitEnvironment::lower(db, &self.resolver); 201 let environment = self.trait_env(db);
197 Some(Type { krate: self.resolver.krate()?, ty: InEnvironment { value: ty, environment } }) 202 Some(Type { krate: self.resolver.krate()?, ty: InEnvironment { value: ty, environment } })
198 } 203 }
199 204