[clang-tools-extra] [clang-doc] Add Markdown AST node type definitions (PR #205609)
Paul Kirth via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 29 19:05:36 PDT 2026
================
@@ -0,0 +1,247 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Defines the Markdown AST node hierarchy for the clang-doc Markdown parser.
+///
+/// Block nodes represent structural constructs (paragraphs, headings, lists,
+/// fenced code blocks, etc). Inline nodes represent span-level content (text,
+/// emphasis, inline code) that appears inside block nodes.
+///
+/// All nodes are arena-allocated via ASTContext, which owns their lifetime.
+/// The parser builds the tree by calling push_back() on simple_ilist members.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_SUPPORT_MARKDOWN_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_SUPPORT_MARKDOWN_H
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/simple_ilist.h"
+#include "llvm/Support/Casting.h"
+#include "llvm/Support/Compiler.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace clang::doc::markdown {
+
+enum class NodeKind {
+ // Inline nodes
+ NK_Text,
+ NK_InlineCode,
+ NK_Emphasis,
+ NK_Strong,
+ // Block nodes
+ NK_Paragraph,
+ NK_Heading,
+ NK_FencedCode,
+ NK_Table, // TODO: add TableNode
+ NK_UnorderedList,
+ NK_OrderedList,
+ NK_BlockQuote,
+ NK_ThematicBreak,
+ NK_Document,
+};
+
+struct InlineNode;
+struct BlockNode;
+
+//===----------------------------------------------------------------------===//
+// Inline nodes -- span-level content inside block nodes
+//===----------------------------------------------------------------------===//
+
+/// Base class for all inline nodes. Inline nodes represent span-level content
+/// such as text, emphasis, and inline code. They live in InlineList members
+/// of block nodes.
+struct InlineNode : llvm::ilist_node<InlineNode> {
+ NodeKind Kind;
+ explicit InlineNode(NodeKind K) : Kind(K) {}
+ virtual ~InlineNode() = default;
+ virtual void print(llvm::raw_ostream &OS) const = 0;
+ LLVM_DUMP_METHOD void dump() const;
+};
+
+using InlineList = llvm::simple_ilist<InlineNode>;
+
+/// A plain text run.
+struct TextNode : InlineNode {
+private:
----------------
ilovepi wrote:
> I never understood why in the LLVM codebase the "public" members section is declared first when we can just take advantage of the fact that classes default to private.
This is just the typical C++ convention. public methods, then protected and private methods, then data members at the bottom of the class, in descending order of public -> private. I normally would prefer all data at the top, so I can easily inspect layout, but this is sort of the convention we have, and I think my preference is the minority opinion.
https://github.com/llvm/llvm-project/pull/205609
More information about the cfe-commits
mailing list