16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "FindBadConstructsAction.h"
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "clang/Frontend/FrontendPluginRegistry.h"
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "FindBadConstructsConsumer.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using namespace clang;
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace chrome_checker {
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)FindBadConstructsAction::FindBadConstructsAction() {
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::unique_ptr<ASTConsumer> FindBadConstructsAction::CreateASTConsumer(
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    CompilerInstance& instance,
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    llvm::StringRef ref) {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return llvm::make_unique<FindBadConstructsConsumer>(instance, options_);
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool FindBadConstructsAction::ParseArgs(const CompilerInstance& instance,
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                        const std::vector<std::string>& args) {
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  bool parsed = true;
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  for (size_t i = 0; i < args.size() && parsed; ++i) {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (args[i] == "check-base-classes") {
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed.
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      options_.check_base_classes = true;
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    } else if (args[i] == "check-weak-ptr-factory-order") {
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      // TODO(dmichael): Remove this once http://crbug.com/303818 is fixed.
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      options_.check_weak_ptr_factory_order = true;
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    } else if (args[i] == "check-enum-last-value") {
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      // TODO(tsepez): Enable this by default once http://crbug.com/356815
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      // and http://crbug.com/356816 are fixed.
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      options_.check_enum_last_value = true;
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    } else {
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      parsed = false;
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n";
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    }
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return parsed;
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace chrome_checker
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)static FrontendPluginRegistry::Add<chrome_checker::FindBadConstructsAction> X(
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "find-bad-constructs",
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    "Finds bad C++ constructs");
53