oxc-project/oxc · warning · OxcDiagnostic
Unexpected `if` as the only statement in an `else` block
Error message
Unexpected `if` as the only statement in an `else` block
What it means
Diagnostic from oxlint's eslint/no-lonely-if rule (crates/oxc_linter/src/rules/eslint/no_lonely_if.rs:10). It reports an if statement that is the only statement inside an else block: 'if (a) {...} else { if (b) {...} }'. The idiomatic form is 'else if', which avoids the extra indentation and brace level. The label is placed on the span of the lonely if keyword.
Source
Thrown at crates/oxc_linter/src/rules/eslint/no_lonely_if.rs:10
use crate::{AstNode, context::LintContext, rule::Rule};
use oxc_ast::AstKind;
use oxc_ast::ast::{IfStatement, Statement};
use oxc_diagnostics::OxcDiagnostic;
use oxc_macros::declare_oxc_lint;
use oxc_span::Span;
fn no_lonely_if_diagnostic(lonely_if: &IfStatement) -> OxcDiagnostic {
let span = Span::sized(lonely_if.span.start, 2);
OxcDiagnostic::warn("Unexpected `if` as the only statement in an `else` block")
.with_help("Consider using `else if` instead.")
.with_label(span)
}
#[derive(Debug, Default, Clone)]
pub struct NoLonelyIf;
declare_oxc_lint!(
/// ### What it does
///
/// Disallow `if` statements as the only statement in `else` blocks.
///
/// ### Why is this bad?
///
/// When an `if` statement is the only statement in an `else` block, it is often clearer to use
/// an `else if` instead.
///
/// ### ExamplesView on GitHub (pinned to e1e7af627c)
Solutions
- Merge into an else-if chain: 'if (a) {...} else if (b) {...}'
- If the nested if has its own else, flatten the whole chain with else-if at each level
- When the chain grows long, consider a lookup table, switch, or early-return guard clauses instead
Example fix
// before
if (a) {
doA();
} else {
if (b) {
doB();
}
}
// after
if (a) {
doA();
} else if (b) {
doB();
} Defensive patterns
Strategy: validation
Prevention
- When adding a condition to an if/else chain, append 'else if' instead of nesting inside the else block
- Prefer guard clauses/early return over growing else chains
- Enable no-lonely-if in the shared config so reviewers see it automatically
When it happens
Trigger: An else clause whose block contains exactly one statement and that statement is an if (with or without its own else chain); commonly produced when adding a new condition to an existing if/else by hand.
Common situations: Incrementally grown conditionals during bug fixes; code formatted with the else block always braced; developers unaware that 'else if' is just else followed by an if statement.
Related errors
- No magic number: {raw}
- Unnecessary `else` after `return`.
- Found identifier '{name}' with the same name as a label.
- Labeled statement is not allowed
- Label in break statement is not allowed
AI-assisted analysis of oxc-project/oxc@e1e7af627c (2026-08-20).
Data as JSON: /api/errors/0f87b44d5a1c750f.
Report an issue: GitHub.