================ @@ -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