[clang] [Clang] [NFC] Introduce `DynamicRecursiveASTVisitor` (PR #110040)

via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 22 05:04:59 PDT 2024


================
@@ -0,0 +1,268 @@
+//===--- DynamicRecursiveASTVisitor.h - Virtual AST Visitor -----*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines the DynamicRecursiveASTVisitor interface, which acts
+//  identically to RecursiveASTVisitor, except that it uses virtual dispatch
+//  instead of CRTP, which greatly improves compile times and  binary size.
+//
+//  However, it also comes with limitations in that some of the more seldom
+//  utilised features of RecursiveASTVisitor are not supported.
+//
+//  Prefer to use this over RecursiveASTVisitor whenever possible.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_CLANG_AST_DYNAMIC_RECURSIVE_AST_VISITOR_H
+#define LLVM_CLANG_AST_DYNAMIC_RECURSIVE_AST_VISITOR_H
+
+#include "clang/AST/Attr.h"
+#include "clang/AST/ExprConcepts.h"
+#include "clang/AST/TypeLoc.h"
+
+namespace clang {
+class ASTContext;
+
+/// Recursive AST visitor that supports extension via dynamic dispatch.
+///
+/// This only supports some of the more common visitation operations; in
+/// particular, it does not support overriding WalkUpFromX or post-order
+/// traversal.
+///
+/// Instead of functions (e.g. shouldVisitImplicitCode()), this class
+/// uses member variables (e.g. ShouldVisitImplicitCode) to control
+/// visitation behaviour.
+///
+/// RAV features that are NOT supported:
+///
+///   - Visiting attributes,
----------------
Sirraide wrote:

> the reason why they’re not supported is because the number of visitors across the entire codebase that use those features

There are also other RAV functions that are not virtual in the DRAV API/implementation (e.g. `TraverseTemplateArguments()`), simply because there is no visitor (that I know of) that overrides them. My plan here was that we can add individual RAV functions to the DRAV API (or make existing ones virtual) on an as-needed basis.

https://github.com/llvm/llvm-project/pull/110040


More information about the cfe-commits mailing list