From 0cb46a9e8d20a5f843e3a7fa6387779d1ff68c3b Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Fri, 5 Mar 2021 14:15:26 +0100 Subject: Use `body.block_scopes` to validate inner items --- crates/hir_ty/src/diagnostics/decl_check.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/diagnostics/decl_check.rs b/crates/hir_ty/src/diagnostics/decl_check.rs index e230f9765..3605ca581 100644 --- a/crates/hir_ty/src/diagnostics/decl_check.rs +++ b/crates/hir_ty/src/diagnostics/decl_check.rs @@ -99,9 +99,14 @@ impl<'a, 'b> DeclValidator<'a, 'b> { let body = self.db.body(func.into()); // Recursively validate inner scope items, such as static variables and constants. - for (item_id, _) in body.item_scope.values() { - let mut validator = DeclValidator::new(self.db, self.krate, self.sink); - validator.validate_item(item_id); + let db = self.db; + for block_def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { + for (_, module) in block_def_map.modules() { + for (def_id, _) in module.scope.values() { + let mut validator = DeclValidator::new(self.db, self.krate, self.sink); + validator.validate_item(def_id); + } + } } // Check whether non-snake case identifiers are allowed for this function. -- cgit v1.2.3 From 1da0a27626559eb74d2398db314df2edca18de70 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Fri, 5 Mar 2021 14:53:32 +0100 Subject: Use `body.block_scopes` in `hir_ty` tests --- crates/hir_ty/src/tests.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/tests.rs b/crates/hir_ty/src/tests.rs index 7386a4e7b..fc770ea60 100644 --- a/crates/hir_ty/src/tests.rs +++ b/crates/hir_ty/src/tests.rs @@ -13,7 +13,7 @@ use std::{env, sync::Arc}; use base_db::{fixture::WithFixture, FileRange, SourceDatabase, SourceDatabaseExt}; use expect_test::Expect; use hir_def::{ - body::{BodySourceMap, SyntheticSyntax}, + body::{Body, BodySourceMap, SyntheticSyntax}, child_by_source::ChildBySource, db::DefDatabase, item_scope::ItemScope, @@ -234,13 +234,13 @@ fn visit_module( let def = it.into(); cb(def); let body = db.body(def); - visit_scope(db, crate_def_map, &body.item_scope, cb); + visit_body(db, &body, cb); } AssocItemId::ConstId(it) => { let def = it.into(); cb(def); let body = db.body(def); - visit_scope(db, crate_def_map, &body.item_scope, cb); + visit_body(db, &body, cb); } AssocItemId::TypeAliasId(_) => (), } @@ -259,19 +259,19 @@ fn visit_module( let def = it.into(); cb(def); let body = db.body(def); - visit_scope(db, crate_def_map, &body.item_scope, cb); + visit_body(db, &body, cb); } ModuleDefId::ConstId(it) => { let def = it.into(); cb(def); let body = db.body(def); - visit_scope(db, crate_def_map, &body.item_scope, cb); + visit_body(db, &body, cb); } ModuleDefId::StaticId(it) => { let def = it.into(); cb(def); let body = db.body(def); - visit_scope(db, crate_def_map, &body.item_scope, cb); + visit_body(db, &body, cb); } ModuleDefId::TraitId(it) => { let trait_data = db.trait_data(it); @@ -288,6 +288,14 @@ fn visit_module( } } } + + fn visit_body(db: &TestDB, body: &Body, cb: &mut dyn FnMut(DefWithBodyId)) { + for def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { + for (mod_id, _) in def_map.modules() { + visit_module(db, &def_map, mod_id, cb); + } + } + } } fn ellipsize(mut text: String, max_len: usize) -> String { -- cgit v1.2.3 From 12f6bdcfd9fe1393887b3be0d0329fcf11492e75 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 9 Mar 2021 18:18:35 +0100 Subject: Check ancestor maps when computing traits in scope --- crates/hir_ty/src/tests/traits.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/tests/traits.rs b/crates/hir_ty/src/tests/traits.rs index 528092082..e185b1c0a 100644 --- a/crates/hir_ty/src/tests/traits.rs +++ b/crates/hir_ty/src/tests/traits.rs @@ -3173,6 +3173,39 @@ fn f() { ); } +#[test] +fn trait_in_scope_with_inner_item() { + check_infer( + r#" +mod m { + pub trait Tr { + fn method(&self) -> u8 { 0 } + } + + impl Tr for () {} +} + +use m::Tr; + +fn f() { + fn inner() { + ().method(); + //^^^^^^^^^^^ u8 + } +} + "#, + expect![[r#" + 46..50 'self': &Self + 58..63 '{ 0 }': u8 + 60..61 '0': u8 + 115..185 '{ ... } }': () + 132..183 '{ ... }': () + 142..144 '()': () + 142..153 '().method()': u8 + "#]], + ); +} + #[test] fn inner_use_in_block() { check_types( -- cgit v1.2.3 From a430549aa6cb78e3a6c9258305b348743c4d7449 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 9 Mar 2021 18:27:16 +0100 Subject: Stop using `ContainerId` in `AssocContainerId` --- crates/hir_ty/src/infer/path.rs | 2 +- crates/hir_ty/src/method_resolution.rs | 2 +- crates/hir_ty/src/utils.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/infer/path.rs b/crates/hir_ty/src/infer/path.rs index 5d541104e..ae3554bac 100644 --- a/crates/hir_ty/src/infer/path.rs +++ b/crates/hir_ty/src/infer/path.rs @@ -260,7 +260,7 @@ impl<'a> InferenceContext<'a> { })); Some(trait_substs) } - AssocContainerId::ContainerId(_) => None, + AssocContainerId::ModuleId(_) => None, }; self.write_assoc_resolution(id, item); diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index 24db33c49..248367267 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs @@ -715,7 +715,7 @@ fn transform_receiver_ty( .fill_with_unknown() .build() } - AssocContainerId::ContainerId(_) => unreachable!(), + AssocContainerId::ModuleId(_) => unreachable!(), }; let sig = db.callable_item_signature(function_id.into()); Some(sig.value.params()[0].clone().subst_bound_vars(&substs)) diff --git a/crates/hir_ty/src/utils.rs b/crates/hir_ty/src/utils.rs index 65b79df0d..7351e4e54 100644 --- a/crates/hir_ty/src/utils.rs +++ b/crates/hir_ty/src/utils.rs @@ -259,6 +259,6 @@ fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option Some(it.into()), AssocContainerId::TraitId(it) => Some(it.into()), - AssocContainerId::ContainerId(_) => None, + AssocContainerId::ModuleId(_) => None, } } -- cgit v1.2.3