• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "FindBadConstructsAction.h"
6 
7 #include "clang/AST/ASTConsumer.h"
8 #include "clang/Frontend/FrontendPluginRegistry.h"
9 
10 #include "FindBadConstructsConsumer.h"
11 
12 using namespace clang;
13 
14 namespace chrome_checker {
15 
16 namespace {
17 
18 class PluginConsumer : public ASTConsumer {
19  public:
PluginConsumer(CompilerInstance * instance,const Options & options)20   PluginConsumer(CompilerInstance* instance, const Options& options)
21       : visitor_(*instance, options) {}
22 
HandleTranslationUnit(clang::ASTContext & context)23   void HandleTranslationUnit(clang::ASTContext& context) override {
24     visitor_.Traverse(context);
25   }
26 
27  private:
28   FindBadConstructsConsumer visitor_;
29 };
30 
31 }  // namespace
32 
FindBadConstructsAction()33 FindBadConstructsAction::FindBadConstructsAction() {
34 }
35 
CreateASTConsumer(CompilerInstance & instance,llvm::StringRef ref)36 std::unique_ptr<ASTConsumer> FindBadConstructsAction::CreateASTConsumer(
37     CompilerInstance& instance,
38     llvm::StringRef ref) {
39   return llvm::make_unique<PluginConsumer>(&instance, options_);
40 }
41 
ParseArgs(const CompilerInstance & instance,const std::vector<std::string> & args)42 bool FindBadConstructsAction::ParseArgs(const CompilerInstance& instance,
43                                         const std::vector<std::string>& args) {
44   bool parsed = true;
45 
46   for (size_t i = 0; i < args.size() && parsed; ++i) {
47     if (args[i] == "check-base-classes") {
48       // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed.
49       options_.check_base_classes = true;
50     } else if (args[i] == "enforce-in-thirdparty-webkit") {
51       options_.enforce_in_thirdparty_webkit = true;
52     } else if (args[i] == "check-enum-last-value") {
53       // TODO(tsepez): Enable this by default once http://crbug.com/356815
54       // and http://crbug.com/356816 are fixed.
55       options_.check_enum_last_value = true;
56     } else if (args[i] == "no-realpath") {
57       options_.no_realpath = true;
58     } else if (args[i] == "check-ipc") {
59       options_.check_ipc = true;
60     } else if (args[i] == "check-auto-raw-pointer") {
61       options_.check_auto_raw_pointer = true;
62     } else {
63       parsed = false;
64       llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
65     }
66   }
67 
68   return parsed;
69 }
70 
71 }  // namespace chrome_checker
72 
73 static FrontendPluginRegistry::Add<chrome_checker::FindBadConstructsAction> X(
74     "find-bad-constructs",
75     "Finds bad C++ constructs");
76