oxc-project/oxc · error · OxcDiagnostic
Unexpected duplicate `super()`.
Error message
Unexpected duplicate `super()`.
What it means
The duplicate_super variant of constructor-super (crates/oxc_linter/src/rules/eslint/constructor_super.rs:32). It reports a second super() call reachable after an earlier one on the same execution path; the engine itself rejects this with 'Super constructor may only be called once'. The diagnostic carries two labels: the duplicate site ('This path may call super() after it was already called.') and the span of the first call ('`super()` was first called here.').
Source
Thrown at crates/oxc_linter/src/rules/eslint/constructor_super.rs:33
use oxc_semantic::NodeId;
use oxc_span::{GetSpan, Span};
use crate::{AstNode, context::LintContext, rule::Rule};
fn missing_super_all(span: Span) -> OxcDiagnostic {
OxcDiagnostic::warn("Expected to call `super()`.")
.with_help("Add a `super()` call to the constructor")
.with_label(span)
}
fn missing_super_some(span: Span) -> OxcDiagnostic {
OxcDiagnostic::warn("Lacked a call of `super()` in some code paths.")
.with_help("Ensure `super()` is called in all code paths")
.with_label(span)
}
fn duplicate_super(span: Span, first_super_span: Span) -> OxcDiagnostic {
OxcDiagnostic::warn("Unexpected duplicate `super()`.")
.with_help("Remove the duplicate `super()` call")
.with_labels([
span.primary_label("This path may call `super()` after it was already called."),
first_super_span.label("`super()` was first called here."),
])
}
#[derive(Clone, Copy)]
struct SuperClassContext {
span: Span,
label: &'static str,
}
fn bad_super(span: Span, super_class_context: Option<SuperClassContext>) -> OxcDiagnostic {
let mut labels = vec![span.primary_label("This `super()` call is invalid here.")];
if let Some(context) = super_class_context {
labels.push(context.span.label(context.label));
}View on GitHub (pinned to e1e7af627c)
Solutions
- Delete the later duplicate super() call.
- Keep exactly one super() as the first statement and pass all required arguments to it.
Example fix
// before
constructor() {
super();
if (cond) super();
}
// after
constructor() {
super();
} Defensive patterns
Strategy: validation
Validate before calling
// .oxlintrc.json
{
"rules": {
"constructor-super": "error"
}
} Prevention
- Keep exactly one super() call per derived constructor.
- Review constructor merges from copy-paste for duplicated super() calls.
- Remember the engine itself throws on a second super() — the lint is the early warning.
When it happens
Trigger: super() appearing twice sequentially, or an unconditional super() followed by another reachable super() (e.g. inside an if or loop) in a derived-class constructor.
Common situations: Copy-paste merges of two constructors each containing super(); refactoring that moves super() into a branch while leaving the original call.
Related errors
- Expected to call `super()`.
- Lacked a call of `super()` in some code paths.
- Unexpected `super()` because `super` is not a constructor.
- Redundant super call in constructor
- Expected method{method_name_str} to have this.
AI-assisted analysis of oxc-project/oxc@e1e7af627c (2026-08-20).
Data as JSON: /api/errors/392cc5d4c96082d6.
Report an issue: GitHub.