| Index: tools/clang/plugins/FindBadConstructsAction.cpp
 | 
| diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..5595cde3037840351962e4b81cf27f89333d6a7f
 | 
| --- /dev/null
 | 
| +++ b/tools/clang/plugins/FindBadConstructsAction.cpp
 | 
| @@ -0,0 +1,77 @@
 | 
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "FindBadConstructsAction.h"
 | 
| +
 | 
| +#include "clang/AST/ASTConsumer.h"
 | 
| +#include "clang/Frontend/FrontendPluginRegistry.h"
 | 
| +
 | 
| +#include "FindBadConstructsConsumer.h"
 | 
| +
 | 
| +using namespace clang;
 | 
| +
 | 
| +namespace chrome_checker {
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +class PluginConsumer : public ASTConsumer {
 | 
| + public:
 | 
| +  PluginConsumer(CompilerInstance* instance, const Options& options)
 | 
| +      : visitor_(*instance, options) {}
 | 
| +
 | 
| +  void HandleTranslationUnit(clang::ASTContext& context) override {
 | 
| +    visitor_.TraverseDecl(context.getTranslationUnitDecl());
 | 
| +  }
 | 
| +
 | 
| + private:
 | 
| +  FindBadConstructsConsumer visitor_;
 | 
| +};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +FindBadConstructsAction::FindBadConstructsAction() {
 | 
| +}
 | 
| +
 | 
| +std::unique_ptr<ASTConsumer> FindBadConstructsAction::CreateASTConsumer(
 | 
| +    CompilerInstance& instance,
 | 
| +    llvm::StringRef ref) {
 | 
| +  if (options_.with_ast_visitor)
 | 
| +    return llvm::make_unique<PluginConsumer>(&instance, options_);
 | 
| +  return llvm::make_unique<FindBadConstructsConsumer>(instance, options_);
 | 
| +}
 | 
| +
 | 
| +bool FindBadConstructsAction::ParseArgs(const CompilerInstance& instance,
 | 
| +                                        const std::vector<std::string>& args) {
 | 
| +  bool parsed = true;
 | 
| +
 | 
| +  for (size_t i = 0; i < args.size() && parsed; ++i) {
 | 
| +    if (args[i] == "check-base-classes") {
 | 
| +      // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed.
 | 
| +      options_.check_base_classes = true;
 | 
| +    } else if (args[i] == "enforce-blink") {
 | 
| +      options_.enforce_blink = true;
 | 
| +    } else if (args[i] == "check-enum-last-value") {
 | 
| +      // TODO(tsepez): Enable this by default once http://crbug.com/356815
 | 
| +      // and http://crbug.com/356816 are fixed.
 | 
| +      options_.check_enum_last_value = true;
 | 
| +    } else if (args[i] == "with-ast-visitor") {
 | 
| +      options_.with_ast_visitor = true;
 | 
| +    } else if (args[i] == "check-templates") {
 | 
| +      options_.check_templates = true;
 | 
| +    } else if (args[i] == "warn-only") {
 | 
| +      options_.warn_only = true;
 | 
| +    } else {
 | 
| +      parsed = false;
 | 
| +      llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  return parsed;
 | 
| +}
 | 
| +
 | 
| +}  // namespace chrome_checker
 | 
| +
 | 
| +static FrontendPluginRegistry::Add<chrome_checker::FindBadConstructsAction> X(
 | 
| +    "find-bad-constructs",
 | 
| +    "Finds bad C++ constructs");
 | 
| 
 |