Skip to content

Commit

Permalink
improvement(linter/react): use CFG for detecting cyclic subgraphs in …
Browse files Browse the repository at this point in the history
…`rules-of-hooks`.
  • Loading branch information
rzvxa committed Jun 1, 2024
1 parent 41fe4b3 commit 5f4dbf4
Showing 1 changed file with 5 additions and 24 deletions.
29 changes: 5 additions & 24 deletions crates/oxc_linter/src/rules/react/rules_of_hooks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,12 @@ impl Rule for RulesOfHooks {
}

// Is this node cyclic?
if self.is_cyclic(ctx, node, parent_func) {
if semantic.cfg().is_cyclic(node_cfg_id) {
return ctx.diagnostic(diagnostics::loop_hook(span, hook_name));
}

if self.is_conditional(ctx, func_cfg_id, node_cfg_id)
|| self.breaks_early(ctx, func_cfg_id, node_cfg_id)
if Self::is_conditional(ctx, func_cfg_id, node_cfg_id)
|| Self::breaks_early(ctx, func_cfg_id, node_cfg_id)
{
#[allow(clippy::needless_return)]
return ctx.diagnostic(diagnostics::conditional_hook(span, hook_name));
Expand All @@ -252,26 +252,8 @@ impl Rule for RulesOfHooks {

// TODO: all `dijkstra` algorithms can be merged together for better performance.
impl RulesOfHooks {
#![allow(clippy::unused_self, clippy::inline_always)]
#[inline(always)]
fn is_cyclic(&self, ctx: &LintContext, node: &AstNode, func: &AstNode) -> bool {
// TODO: use cfg instead
ctx.nodes().ancestors(node.id()).take_while(|id| *id != func.id()).any(|id| {
let maybe_loop = ctx.nodes().kind(id);
matches! {
maybe_loop,
| AstKind::DoWhileStatement(_)
| AstKind::ForInStatement(_)
| AstKind::ForOfStatement(_)
| AstKind::ForStatement(_)
| AstKind::WhileStatement(_)
}
})
}

#[inline(always)]
#[inline]
fn is_conditional(
&self,
ctx: &LintContext,
func_cfg_id: BasicBlockId,
node_cfg_id: BasicBlockId,
Expand All @@ -288,9 +270,8 @@ impl RulesOfHooks {
.any(|(f, _)| !cfg.is_reachabale(f, node_cfg_id))
}

#[inline(always)]
#[inline]
fn breaks_early(
&self,
ctx: &LintContext,
func_cfg_id: BasicBlockId,
node_cfg_id: BasicBlockId,
Expand Down

0 comments on commit 5f4dbf4

Please sign in to comment.