aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/item_scope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/item_scope.rs')
-rw-r--r--crates/ra_hir_def/src/item_scope.rs20
1 files changed, 12 insertions, 8 deletions
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs
index c81b966c3..0184b6af9 100644
--- a/crates/ra_hir_def/src/item_scope.rs
+++ b/crates/ra_hir_def/src/item_scope.rs
@@ -128,15 +128,19 @@ impl ItemScope {
128 let existing = self.visible.entry(name).or_default(); 128 let existing = self.visible.entry(name).or_default();
129 129
130 macro_rules! check_changed { 130 macro_rules! check_changed {
131 ($changed:ident, $existing:expr, $def:expr) => { 131 ($changed:ident, ($existing:ident/$def:ident).$field:ident) => {
132 match ($existing, $def) { 132 match ($existing.$field, $def.$field) {
133 (None, Some(_)) => { 133 (None, Some(_)) => {
134 $existing = $def; 134 $existing.from_glob = $def.from_glob;
135 $existing.$field = $def.$field;
135 $changed = true; 136 $changed = true;
136 } 137 }
137 (Some(e), Some(d)) if e.0 != d.0 => { 138 // Only update if the new def came from a specific import and the existing
139 // import came from a glob import.
140 (Some(_), Some(_)) if $existing.from_glob && !$def.from_glob => {
138 mark::hit!(import_shadowed); 141 mark::hit!(import_shadowed);
139 $existing = $def; 142 $existing.from_glob = $def.from_glob;
143 $existing.$field = $def.$field;
140 $changed = true; 144 $changed = true;
141 } 145 }
142 _ => {} 146 _ => {}
@@ -144,9 +148,9 @@ impl ItemScope {
144 }; 148 };
145 } 149 }
146 150
147 check_changed!(changed, existing.types, def.types); 151 check_changed!(changed, (existing / def).types);
148 check_changed!(changed, existing.values, def.values); 152 check_changed!(changed, (existing / def).values);
149 check_changed!(changed, existing.macros, def.macros); 153 check_changed!(changed, (existing / def).macros);
150 154
151 changed 155 changed
152 } 156 }