1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * Based on LLVM/Clang.
6  *
7  * This file is distributed under the University of Illinois Open Source
8  * License. See LICENSE.TXT for details.
9  *
10  */
11 
12 #pragma once
13 
14 #include "config_clang.h"
15 
16 #include "../plugin.hxx"
17 
18 using namespace clang;
19 using namespace llvm;
20 
21 namespace loplugin
22 {
23 
24 // These classes are used as base classes when building with LO_CLANG_SHARED_PLUGINS.
25 // Since plugin classes in that case should use just one shared RecursiveASTVisitor,
26 // sharedvisitor/generator.cxx will make these to be the base classes used, so that
27 // compiling the code doesn't spend a several minutes optimizing instances
28 // of RecursiveASTVisitor that will never get used.
29 
30 template<typename T>
31 class DummyRecursiveASTVisitor
32 {
33 public:
34     // These need to be reimplemented, because plugins contain calls to them,
35     // but they should actually never get called in the shared-visitor mode.
36     // This could be autogenerated too, but it's probably simpler to just extend
37     // manually as needed.
TraverseDecl(Decl *)38     bool TraverseDecl( Decl* ) { return complain(); }
TraverseLinkageSpecDecl(LinkageSpecDecl *)39     bool TraverseLinkageSpecDecl( LinkageSpecDecl* ) { return complain(); }
TraverseStmt(Stmt *)40     bool TraverseStmt( Stmt* ) { return complain(); }
TraverseIfStmt(IfStmt *)41     bool TraverseIfStmt( IfStmt* ) { return complain(); }
TraverseWhileStmt(WhileStmt *)42     bool TraverseWhileStmt( WhileStmt* ) { return complain(); }
TraverseDoStmt(DoStmt *)43     bool TraverseDoStmt( DoStmt* ) { return complain(); }
TraverseForStmt(ForStmt *)44     bool TraverseForStmt( ForStmt* ) { return complain(); }
TraverseCompoundStmt(CompoundStmt *)45     bool TraverseCompoundStmt( CompoundStmt* ) { return complain(); }
TraverseCXXForRangeStmt(CXXForRangeStmt *)46     bool TraverseCXXForRangeStmt( CXXForRangeStmt* ) { return complain(); }
TraverseConditionalOperator(ConditionalOperator *)47     bool TraverseConditionalOperator( ConditionalOperator* ) { return complain(); }
TraverseCXXCatchStmt(CXXCatchStmt *)48     bool TraverseCXXCatchStmt( CXXCatchStmt* ) { return complain(); }
TraverseCXXDestructorDecl(CXXDestructorDecl *)49     bool TraverseCXXDestructorDecl( CXXDestructorDecl* ) { return complain(); }
TraverseFunctionDecl(FunctionDecl *)50     bool TraverseFunctionDecl( FunctionDecl* ) { return complain(); }
TraverseSwitchStmt(SwitchStmt *)51     bool TraverseSwitchStmt( SwitchStmt* ) { return complain(); }
TraverseImplicitCastExpr(ImplicitCastExpr *)52     bool TraverseImplicitCastExpr( ImplicitCastExpr* ) { return complain(); }
TraverseCStyleCastExpr(CStyleCastExpr *)53     bool TraverseCStyleCastExpr( CStyleCastExpr* ) { return complain(); }
TraverseCXXStaticCastExpr(CXXStaticCastExpr *)54     bool TraverseCXXStaticCastExpr( CXXStaticCastExpr* ) { return complain(); }
TraverseCXXFunctionalCastExpr(CXXFunctionalCastExpr *)55     bool TraverseCXXFunctionalCastExpr( CXXFunctionalCastExpr* ) { return complain(); }
TraverseFriendDecl(FriendDecl *)56     bool TraverseFriendDecl( FriendDecl* ) { return complain(); }
TraverseTypeLoc(TypeLoc)57     bool TraverseTypeLoc( TypeLoc ) { return complain(); }
TraverseAlignedAttr(AlignedAttr *)58     bool TraverseAlignedAttr( AlignedAttr* ) { return complain(); }
TraverseVarDecl(VarDecl *)59     bool TraverseVarDecl( VarDecl* ) { return complain(); }
TraverseUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *)60     bool TraverseUnaryExprOrTypeTraitExpr( UnaryExprOrTypeTraitExpr* ) { return complain(); }
61 private:
complain()62     bool complain() { assert(false && "should not be calling this in sharedplugin mode"); abort(); return false; }
63 };
64 
65 template<typename Derived>
66 class DummyFilteringPlugin : public DummyRecursiveASTVisitor<Derived>, public Plugin
67 {
68 public:
DummyFilteringPlugin(const InstantiationData & data)69     explicit DummyFilteringPlugin( const InstantiationData& data ) : Plugin(data) {}
70 };
71 
72 template<typename Derived>
73 class DummyFilteringRewritePlugin : public DummyRecursiveASTVisitor<Derived>, public RewritePlugin
74 {
75 public:
DummyFilteringRewritePlugin(const InstantiationData & data)76     explicit DummyFilteringRewritePlugin( const InstantiationData& data ) : RewritePlugin(data) {}
77 };
78 
79 } // namespace
80 
81 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
82