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