@@ -153,21 +153,32 @@ impl ReferencesCounter {
153
153
self . names_provider . name_context . len ( ) == 0
154
154
}
155
155
156
- fn maybe_increase_stmt ( & mut self , stmt : & Stmt ) {
156
+ fn maybe_increase_stmt_selective < F > ( & mut self , stmt : & Stmt , predicate : F )
157
+ where
158
+ F : Fn ( & str ) -> bool ,
159
+ {
157
160
for fqn in self . names_provider . get_stmt_fully_qualified_name ( stmt) {
158
- self . increase ( & fqn) ;
161
+ if predicate ( & fqn) {
162
+ self . increase ( & fqn) ;
163
+ }
159
164
}
160
165
161
166
// bump for this node because it is a global name that could be imported somewhere else via star import
162
167
if self . import_star_module_specs . len ( ) > 0 {
163
168
for module_spec in self . import_star_module_specs . to_owned ( ) {
164
169
for full_name in get_full_name_for_stmt ( stmt, & self . get_parent_package ( ) ) {
165
- self . increase ( & format ! ( "{}.{}" , module_spec, full_name) ) ;
170
+ if predicate ( & full_name) {
171
+ self . increase ( & format ! ( "{}.{}" , module_spec, full_name) ) ;
172
+ }
166
173
}
167
174
}
168
175
}
169
176
}
170
177
178
+ fn maybe_increase_stmt ( & mut self , stmt : & Stmt ) {
179
+ self . maybe_increase_stmt_selective ( stmt, |_| true ) ;
180
+ }
181
+
171
182
fn maybe_increase_expr ( & mut self , expr : & Expr ) {
172
183
for fqn in self . names_provider . get_expr_fully_qualified_name ( expr) {
173
184
self . increase ( & fqn) ;
@@ -283,13 +294,51 @@ impl Visitor for ReferencesCounter {
283
294
self . always_bump_context = true ;
284
295
}
285
296
}
286
- Stmt :: ImportFrom ( import_from) => {
287
- if import_from. names . len ( ) == 1
288
- && import_from. names [ 0 ] . name . as_str ( ) == "*"
297
+ Stmt :: Import ( stmt_import) => {
298
+ // check if one of the names defined by this import was imported somewhere else
299
+ // if yes, bump reference of this import
300
+ for alias in & stmt_import. names {
301
+ let defined_name = if let Some ( alias_value) = & alias. asname {
302
+ alias_value
303
+ } else {
304
+ & alias. name
305
+ } ;
306
+ for fqn in self . names_provider . resolve_fully_qualified_name (
307
+ & self . names_provider . resolve_qualified_name ( & defined_name) ,
308
+ ) {
309
+ if self . has_references_for_str ( & fqn) {
310
+ self . maybe_increase_stmt_selective ( & stmt, |n| n == alias. name . as_str ( ) ) ;
311
+ }
312
+ }
313
+ }
314
+ }
315
+
316
+ Stmt :: ImportFrom ( stmt_import_from) => {
317
+ // check if one of the names defined by this import was imported somewhere else
318
+ // if yes, bump reference of this import
319
+ for alias in & stmt_import_from. names {
320
+ let defined_name = if let Some ( alias_value) = & alias. asname {
321
+ alias_value
322
+ } else {
323
+ & alias. name
324
+ } ;
325
+ for fqn in self . names_provider . resolve_fully_qualified_name (
326
+ & self . names_provider . resolve_qualified_name ( & defined_name) ,
327
+ ) {
328
+ if self . has_references_for_str ( & fqn) {
329
+ self . maybe_increase_stmt_selective ( & stmt, |n| {
330
+ n. ends_with ( alias. name . as_str ( ) )
331
+ } ) ;
332
+ }
333
+ }
334
+ }
335
+
336
+ if stmt_import_from. names . len ( ) == 1
337
+ && stmt_import_from. names [ 0 ] . name . as_str ( ) == "*"
289
338
&& self . module_spec_has_references ( )
290
339
{
291
340
if let Ok ( module_specs) = get_import_from_absolute_module_spec (
292
- & import_from ,
341
+ & stmt_import_from ,
293
342
& self . get_parent_package ( ) ,
294
343
) {
295
344
self . import_star_module_specs . extend ( module_specs) ;
0 commit comments