diff options
Diffstat (limited to 'crates/ra_hir_def/src/item_scope.rs')
-rw-r--r-- | crates/ra_hir_def/src/item_scope.rs | 20 |
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 | } |