================
@@ -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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to