diff --git a/crates/oxc_linter/examples/linter.rs b/crates/oxc_linter/examples/linter.rs index 5f26841e4cdc2..be0ae5575bd2b 100644 --- a/crates/oxc_linter/examples/linter.rs +++ b/crates/oxc_linter/examples/linter.rs @@ -34,7 +34,7 @@ fn main() -> std::io::Result<()> { let mut errors: Vec = vec![]; - for node in semantic_ret.semantic.nodes().iter() { + for node in semantic_ret.semantic.nodes() { match node.kind() { AstKind::DebuggerStatement(stmt) => { errors.push(no_debugger(stmt.span)); diff --git a/crates/oxc_linter/src/lib.rs b/crates/oxc_linter/src/lib.rs index c685dbb202915..a9f042f950020 100644 --- a/crates/oxc_linter/src/lib.rs +++ b/crates/oxc_linter/src/lib.rs @@ -136,7 +136,7 @@ impl Linter { } } - for node in semantic.nodes().iter() { + for node in semantic.nodes() { for (rule, ctx) in &rules { rule.run(node, ctx); } diff --git a/crates/oxc_linter/src/rules/eslint/func_names.rs b/crates/oxc_linter/src/rules/eslint/func_names.rs index 07593de4356d3..ca2f6d8a82b1c 100644 --- a/crates/oxc_linter/src/rules/eslint/func_names.rs +++ b/crates/oxc_linter/src/rules/eslint/func_names.rs @@ -372,7 +372,7 @@ impl Rule for FuncNames { fn run_once(&self, ctx: &LintContext<'_>) { let mut invalid_funcs: Vec<(&Function, &AstNode)> = vec![]; - for node in ctx.nodes().iter() { + for node in ctx.nodes() { match node.kind() { // check function if it invalid, do not report it because maybe later the function is calling itself AstKind::Function(func) => { diff --git a/crates/oxc_linter/src/rules/eslint/no_this_before_super.rs b/crates/oxc_linter/src/rules/eslint/no_this_before_super.rs index 19d392d8936fb..c8c51f5ea8be4 100644 --- a/crates/oxc_linter/src/rules/eslint/no_this_before_super.rs +++ b/crates/oxc_linter/src/rules/eslint/no_this_before_super.rs @@ -63,7 +63,7 @@ impl Rule for NoThisBeforeSuper { let mut wanted_nodes = Vec::new(); let mut basic_blocks_with_super_called = HashSet::::new(); let mut basic_blocks_with_local_violations = HashMap::>::new(); - for node in semantic.nodes().iter() { + for node in semantic.nodes() { match node.kind() { AstKind::Function(_) | AstKind::ArrowFunctionExpression(_) => { if Self::is_wanted_node(node, ctx).unwrap_or_default() { diff --git a/crates/oxc_linter/src/rules/eslint/no_unreachable.rs b/crates/oxc_linter/src/rules/eslint/no_unreachable.rs index 839bb714a8a24..776a68828beac 100644 --- a/crates/oxc_linter/src/rules/eslint/no_unreachable.rs +++ b/crates/oxc_linter/src/rules/eslint/no_unreachable.rs @@ -124,7 +124,7 @@ impl Rule for NoUnreachable { _ => Control::Continue, }); } - for node in ctx.nodes().iter() { + for node in ctx.nodes() { // exit early if we are not visiting a statement. if !node.kind().is_statement() { continue; diff --git a/crates/oxc_linter/src/rules/import/no_named_as_default_member.rs b/crates/oxc_linter/src/rules/import/no_named_as_default_member.rs index 8095a7afedc55..b54259d16b341 100644 --- a/crates/oxc_linter/src/rules/import/no_named_as_default_member.rs +++ b/crates/oxc_linter/src/rules/import/no_named_as_default_member.rs @@ -114,7 +114,7 @@ impl Rule for NoNamedAsDefaultMember { }; }; - for item in ctx.semantic().nodes().iter() { + for item in ctx.semantic().nodes() { match item.kind() { AstKind::MemberExpression(member_expr) => process_member_expr(member_expr), AstKind::VariableDeclarator(decl) => { diff --git a/crates/oxc_linter/src/rules/jest/prefer_hooks_in_order.rs b/crates/oxc_linter/src/rules/jest/prefer_hooks_in_order.rs index 9de0e4c6d6e47..c5adcdee5748e 100644 --- a/crates/oxc_linter/src/rules/jest/prefer_hooks_in_order.rs +++ b/crates/oxc_linter/src/rules/jest/prefer_hooks_in_order.rs @@ -142,7 +142,7 @@ impl Rule for PreferHooksInOrder { fn run_once(&self, ctx: &LintContext) { let mut hook_groups: FxHashMap> = FxHashMap::default(); - for node in ctx.nodes().iter() { + for node in ctx.nodes() { hook_groups.entry(node.scope_id()).or_default().push(*node); } diff --git a/crates/oxc_linter/src/rules/jsdoc/require_returns.rs b/crates/oxc_linter/src/rules/jsdoc/require_returns.rs index dc38443871969..2decaedcc4ffe 100644 --- a/crates/oxc_linter/src/rules/jsdoc/require_returns.rs +++ b/crates/oxc_linter/src/rules/jsdoc/require_returns.rs @@ -111,7 +111,7 @@ impl Rule for RequireReturns { // Value of map: (AstNode, Span, Attrs: (isAsync, hasReturnValue)) let mut functions_to_check = FxHashMap::default(); - 'visit_node: for node in ctx.nodes().iter() { + 'visit_node: for node in ctx.nodes() { match node.kind() { AstKind::Function(func) => { functions_to_check.insert(node.id(), (node, func.span, (func.r#async, false))); diff --git a/crates/oxc_semantic/examples/cfg.rs b/crates/oxc_semantic/examples/cfg.rs index 3739ed8a0748f..4cfe951170319 100644 --- a/crates/oxc_semantic/examples/cfg.rs +++ b/crates/oxc_semantic/examples/cfg.rs @@ -77,7 +77,7 @@ fn main() -> std::io::Result<()> { .expect("we set semantic to build the control flow (`with_cfg`) for us so it should always be `Some`"); let mut ast_nodes_by_block = HashMap::<_, Vec<_>>::new(); - for node in semantic.semantic.nodes().iter() { + for node in semantic.semantic.nodes() { let block = node.cfg_id(); let block_ix = cfg.graph.node_weight(block).unwrap(); ast_nodes_by_block.entry(*block_ix).or_default().push(node); diff --git a/crates/oxc_semantic/src/lib.rs b/crates/oxc_semantic/src/lib.rs index eb8f356f38b75..bb384397ac268 100644 --- a/crates/oxc_semantic/src/lib.rs +++ b/crates/oxc_semantic/src/lib.rs @@ -288,7 +288,7 @@ mod tests { "; let allocator = Allocator::default(); let semantic = get_semantic(&allocator, source, SourceType::default()); - for node in semantic.nodes().iter() { + for node in semantic.nodes() { if let AstKind::IdentifierReference(id) = node.kind() { assert!(!semantic.is_reference_to_global_variable(id)); } diff --git a/crates/oxc_semantic/src/node.rs b/crates/oxc_semantic/src/node.rs index cf056ec0296c1..833a7a764148e 100644 --- a/crates/oxc_semantic/src/node.rs +++ b/crates/oxc_semantic/src/node.rs @@ -266,6 +266,15 @@ impl<'a> AstNodes<'a> { } } +impl<'ast, 'a> IntoIterator for &'ast AstNodes<'a> { + type Item = &'ast AstNode<'a>; + type IntoIter = std::slice::Iter<'ast, AstNode<'a>>; + + fn into_iter(self) -> Self::IntoIter { + self.nodes.iter() + } +} + #[derive(Debug, Clone)] pub struct AstNodeParentIter<'s, 'a> { current_node_id: Option,