|  | //===- ClangTidyPlugin.cpp - clang-tidy as a clang plugin -----------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "../ClangTidy.h" | 
|  | #include "../ClangTidyModule.h" | 
|  | #include "clang/Frontend/CompilerInstance.h" | 
|  | #include "clang/Frontend/FrontendPluginRegistry.h" | 
|  | #include "clang/Frontend/MultiplexConsumer.h" | 
|  |  | 
|  | namespace clang { | 
|  | namespace tidy { | 
|  |  | 
|  | /// The core clang tidy plugin action. This just provides the AST consumer and | 
|  | /// command line flag parsing for using clang-tidy as a clang plugin. | 
|  | class ClangTidyPluginAction : public PluginASTAction { | 
|  | /// Wrapper to grant the context the same lifetime as the action. We use | 
|  | /// MultiplexConsumer to avoid writing out all the forwarding methods. | 
|  | class WrapConsumer : public MultiplexConsumer { | 
|  | std::unique_ptr<ClangTidyContext> Context; | 
|  |  | 
|  | public: | 
|  | WrapConsumer(std::unique_ptr<ClangTidyContext> Context, | 
|  | std::vector<std::unique_ptr<ASTConsumer>> Consumer) | 
|  | : MultiplexConsumer(std::move(Consumer)), Context(std::move(Context)) {} | 
|  | }; | 
|  |  | 
|  | public: | 
|  | std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &Compiler, | 
|  | StringRef File) override { | 
|  | // Insert the current diagnostics engine. | 
|  | Context->setDiagnosticsEngine(&Compiler.getDiagnostics()); | 
|  |  | 
|  | // Create the AST consumer. | 
|  | ClangTidyASTConsumerFactory Factory(*Context); | 
|  | std::vector<std::unique_ptr<ASTConsumer>> Vec; | 
|  | Vec.push_back(Factory.CreateASTConsumer(Compiler, File)); | 
|  |  | 
|  | return llvm::make_unique<WrapConsumer>(std::move(Context), std::move(Vec)); | 
|  | } | 
|  |  | 
|  | bool ParseArgs(const CompilerInstance &, | 
|  | const std::vector<std::string> &Args) override { | 
|  | ClangTidyGlobalOptions GlobalOptions; | 
|  | ClangTidyOptions DefaultOptions; | 
|  | ClangTidyOptions OverrideOptions; | 
|  |  | 
|  | // Parse the extra command line args. | 
|  | // FIXME: This is very limited at the moment. | 
|  | for (StringRef Arg : Args) | 
|  | if (Arg.startswith("-checks=")) | 
|  | OverrideOptions.Checks = Arg.substr(strlen("-checks=")); | 
|  |  | 
|  | auto Options = llvm::make_unique<FileOptionsProvider>( | 
|  | GlobalOptions, DefaultOptions, OverrideOptions); | 
|  | Context = llvm::make_unique<ClangTidyContext>(std::move(Options)); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<ClangTidyContext> Context; | 
|  | }; | 
|  | } // namespace tidy | 
|  | } // namespace clang | 
|  |  | 
|  | // This anchor is used to force the linker to link in the generated object file | 
|  | // and thus register the clang-tidy plugin. | 
|  | volatile int ClangTidyPluginAnchorSource = 0; | 
|  |  | 
|  | static clang::FrontendPluginRegistry::Add<clang::tidy::ClangTidyPluginAction> | 
|  | X("clang-tidy", "clang-tidy"); | 
|  |  | 
|  | namespace clang { | 
|  | namespace tidy { | 
|  |  | 
|  | // This anchor is used to force the linker to link the AbseilModule. | 
|  | extern volatile int AbseilModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED AbseilModuleAnchorDestination = | 
|  | AbseilModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the AndroidModule. | 
|  | extern volatile int AndroidModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED AndroidModuleAnchorDestination = | 
|  | AndroidModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the BoostModule. | 
|  | extern volatile int BoostModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED BoostModuleAnchorDestination = | 
|  | BoostModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the CERTModule. | 
|  | extern volatile int CERTModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED CERTModuleAnchorDestination = | 
|  | CERTModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the CppCoreGuidelinesModule. | 
|  | extern volatile int CppCoreGuidelinesModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED CppCoreGuidelinesModuleAnchorDestination = | 
|  | CppCoreGuidelinesModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the FuchsiaModule. | 
|  | extern volatile int FuchsiaModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED FuchsiaModuleAnchorDestination = | 
|  | FuchsiaModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the GoogleModule. | 
|  | extern volatile int GoogleModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED GoogleModuleAnchorDestination = | 
|  | GoogleModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the HICPPModule. | 
|  | extern volatile int HICPPModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED HICPPModuleAnchorDestination = | 
|  | HICPPModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the LLVMModule. | 
|  | extern volatile int LLVMModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED LLVMModuleAnchorDestination = | 
|  | LLVMModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the MiscModule. | 
|  | extern volatile int MiscModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED MiscModuleAnchorDestination = | 
|  | MiscModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the ModernizeModule. | 
|  | extern volatile int ModernizeModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED ModernizeModuleAnchorDestination = | 
|  | ModernizeModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the MPIModule. | 
|  | extern volatile int MPIModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED MPIModuleAnchorDestination = | 
|  | MPIModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the ObjCModule. | 
|  | extern volatile int ObjCModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED ObjCModuleAnchorDestination = | 
|  | ObjCModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the PerformanceModule. | 
|  | extern volatile int PerformanceModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED PerformanceModuleAnchorDestination = | 
|  | PerformanceModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the PortabilityModule. | 
|  | extern volatile int PortabilityModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED PortabilityModuleAnchorDestination = | 
|  | PortabilityModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the ReadabilityModule. | 
|  | extern volatile int ReadabilityModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED ReadabilityModuleAnchorDestination = | 
|  | ReadabilityModuleAnchorSource; | 
|  |  | 
|  | // This anchor is used to force the linker to link the ZirconModule. | 
|  | extern volatile int ZirconModuleAnchorSource; | 
|  | static int LLVM_ATTRIBUTE_UNUSED ZirconModuleAnchorDestination = | 
|  | ZirconModuleAnchorSource; | 
|  |  | 
|  | } // namespace tidy | 
|  | } // namespace clang |