[clang] [Clang] [NFC] Introduce `DynamicRecursiveASTVisitor` (PR #110040)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 22 05:07:22 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:
> What is the behavior when visiting an attribute?
Ah, no, ‘not supported’ is supposed to mean that *overriding* them is not supported—I should probably make that a bit clearer in the comment. You can still use a DRAV to visit attributes just fine—you just can’t override what happens when one is visited (i.e. the default RAV implementation is called).
https://github.com/llvm/llvm-project/pull/110040
More information about the cfe-commits
mailing list