Skip to content

Commit 5624e5f

Browse files
committed
refactor(lint): optimize dead code detection implementation
1 parent d08c625 commit 5624e5f

File tree

1 file changed

+31
-30
lines changed

1 file changed

+31
-30
lines changed

crates/tinymist-lint/src/dead_code.rs

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

252255
fn 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

Comments
 (0)