@@ -165,13 +165,16 @@ fn compute_import_usage(definitions: &[DefInfo], ei: &ExprInfo) -> ImportUsageIn
165165 }
166166 }
167167
168- let mut changed = true ;
169- while changed {
170- changed = false ;
171- for ( alias, target) in alias_links. iter ( ) {
172- if used. contains ( alias) && !used. contains ( target) {
173- used. insert ( target. clone ( ) ) ;
174- changed = true ;
168+ let mut worklist: Vec < _ > = used
169+ . iter ( )
170+ . filter ( |decl| alias_links. contains_key ( decl) )
171+ . cloned ( )
172+ . collect ( ) ;
173+
174+ while let Some ( alias) = worklist. pop ( ) {
175+ if let Some ( target) = alias_links. get ( & alias) {
176+ if used. insert ( target. clone ( ) ) {
177+ worklist. push ( target. clone ( ) ) ;
175178 }
176179 }
177180 }
@@ -251,37 +254,35 @@ fn is_wildcard_module_import_decl(ei: &ExprInfo, decl: &Interned<Decl>) -> bool
251254
252255fn collect_used_decls ( reference : & RefExpr , used : & mut HashSet < Interned < Decl > > ) {
253256 let mut visited_refs = HashSet :: new ( ) ;
257+ let mut worklist = Vec :: new ( ) ;
258+
254259 if let Some ( step) = reference. step . as_ref ( ) {
255- collect_decl_from_expr ( step, used , & mut visited_refs ) ;
260+ worklist . push ( step) ;
256261 }
257262 if let Some ( root) = reference. root . as_ref ( ) {
258- collect_decl_from_expr ( root, used , & mut visited_refs ) ;
263+ worklist . push ( root) ;
259264 }
260- }
261265
262- fn collect_decl_from_expr (
263- expr : & Expr ,
264- used : & mut HashSet < Interned < Decl > > ,
265- visited_refs : & mut HashSet < Interned < RefExpr > > ,
266- ) {
267- match expr {
268- Expr :: Decl ( decl) => {
269- used. insert ( decl. clone ( ) ) ;
270- }
271- Expr :: Ref ( reference) => {
272- if visited_refs. insert ( reference. clone ( ) ) {
273- if let Some ( step) = reference. step . as_ref ( ) {
274- collect_decl_from_expr ( step, used, visited_refs) ;
275- }
276- if let Some ( root) = reference. root . as_ref ( ) {
277- collect_decl_from_expr ( root, used, visited_refs) ;
266+ while let Some ( expr) = worklist. pop ( ) {
267+ match expr {
268+ Expr :: Decl ( decl) => {
269+ used. insert ( decl. clone ( ) ) ;
270+ }
271+ Expr :: Ref ( reference) => {
272+ if visited_refs. insert ( reference. clone ( ) ) {
273+ if let Some ( step) = reference. step . as_ref ( ) {
274+ worklist. push ( step) ;
275+ }
276+ if let Some ( root) = reference. root . as_ref ( ) {
277+ worklist. push ( root) ;
278+ }
278279 }
279280 }
281+ Expr :: Select ( select) => {
282+ worklist. push ( & select. lhs ) ;
283+ }
284+ _ => { }
280285 }
281- Expr :: Select ( select) => {
282- collect_decl_from_expr ( & select. lhs , used, visited_refs) ;
283- }
284- _ => { }
285286 }
286287}
287288
0 commit comments