swc-project/swc · error · Error

HeadingWhenHeadingOpen

HeadingWhenHeadingOpen

Error message

Heading cannot be a child of another heading

What it means

HTML parse error in 'in body': a start tag h1-h6 was seen while the current node is also a heading element, i.e. a heading nested directly inside another heading, which is invalid. The parser still closes the current heading and inserts the new one.

Source

Thrown at crates/swc_html_parser/src/parser/mod.rs:2799

                    //
                    // Insert an HTML element for the token.
                    Token::StartTag {
                        tag_name,
                        is_self_closing,
                        ..
                    } if matches!(&**tag_name, "h1" | "h2" | "h3" | "h4" | "h5" | "h6") => {
                        if self.open_elements_stack.has_in_button_scope("p") {
                            self.close_p_element(token_and_info, false);
                        }

                        match self.open_elements_stack.items.last() {
                            Some(node)
                                if is_html_element!(
                                    node,
                                    "h1" | "h2" | "h3" | "h4" | "h5" | "h6"
                                ) =>
                            {
                                self.errors.push(Error::new(
                                    token_and_info.span,
                                    ErrorKind::HeadingWhenHeadingOpen,
                                ));

                                self.open_elements_stack.pop();
                            }
                            _ => {}
                        }

                        self.insert_html_element(token_and_info)?;
                        maybe_allow_self_closing!(is_self_closing, tag_name);
                    }
                    // A start tag whose tag name is one of: "pre", "listing"
                    //
                    // If the stack of open elements has a p element in button scope, then close a p
                    // element.
                    //
                    // Insert an HTML element for the token.

View on GitHub (pinned to 5176682b65)

Solutions

  1. Close the outer heading before starting another (e.g. <h1>a<h2>b -> <h1>a</h1><h2>b)
  2. Use a non-heading container element for the nested structure
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/swc_html_parser/src/parser/mod.rs:2799 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of swc-project/swc@5176682b65 (2026-08-17). Data as JSON: /api/errors/1ffef64b9cd47796. Report an issue: GitHub.