Author: etienneb Date: Tue May 10 10:31:15 2016 New Revision: 269065 URL: http://llvm.org/viewvc/llvm-project?rev=269065&view=rev Log: [clang-tidy] Lift parsing of sequence of names functions to utils.
Summary: Lift some common code used by multiple checkers. This function is also used by checkers that are coming. It is quite common for a checker to parse a list of names. Reviewers: alexfh Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D19846 Added: clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.cpp clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.h Modified: clang-tools-extra/trunk/clang-tidy/misc/DanglingHandleCheck.cpp clang-tools-extra/trunk/clang-tidy/misc/SuspiciousStringCompareCheck.cpp clang-tools-extra/trunk/clang-tidy/performance/FasterStringFindCheck.cpp clang-tools-extra/trunk/clang-tidy/utils/CMakeLists.txt Modified: clang-tools-extra/trunk/clang-tidy/misc/DanglingHandleCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/DanglingHandleCheck.cpp?rev=269065&r1=269064&r2=269065&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/DanglingHandleCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/DanglingHandleCheck.cpp Tue May 10 10:31:15 2016 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "DanglingHandleCheck.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" @@ -19,20 +20,6 @@ namespace misc { namespace { -static const char HandleClassesDelimiter[] = ";"; - -std::vector<std::string> parseClasses(StringRef Option) { - SmallVector<StringRef, 4> Classes; - Option.split(Classes, HandleClassesDelimiter); - std::vector<std::string> Result; - for (StringRef &Class : Classes) { - Class = Class.trim(); - if (!Class.empty()) - Result.push_back(Class); - } - return Result; -} - ast_matchers::internal::BindableMatcher<Stmt> handleFrom(ast_matchers::internal::Matcher<RecordDecl> IsAHandle, ast_matchers::internal::Matcher<Expr> Arg) { @@ -97,7 +84,7 @@ makeContainerMatcher(ast_matchers::inter DanglingHandleCheck::DanglingHandleCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - HandleClasses(parseClasses(Options.get( + HandleClasses(utils::options::parseStringList(Options.get( "HandleClasses", "std::basic_string_view;std::experimental::basic_string_view"))), IsAHandle(cxxRecordDecl(hasAnyName(std::vector<StringRef>( @@ -106,8 +93,7 @@ DanglingHandleCheck::DanglingHandleCheck void DanglingHandleCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "HandleClasses", - llvm::join(HandleClasses.begin(), HandleClasses.end(), - HandleClassesDelimiter)); + utils::options::serializeStringList(HandleClasses)); } void DanglingHandleCheck::registerMatchersForVariables(MatchFinder *Finder) { Modified: clang-tools-extra/trunk/clang-tidy/misc/SuspiciousStringCompareCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/SuspiciousStringCompareCheck.cpp?rev=269065&r1=269064&r2=269065&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/SuspiciousStringCompareCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/SuspiciousStringCompareCheck.cpp Tue May 10 10:31:15 2016 @@ -8,10 +8,11 @@ //===----------------------------------------------------------------------===// #include "SuspiciousStringCompareCheck.h" +#include "../utils/Matchers.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Lex/Lexer.h" -#include "../utils/Matchers.h" using namespace clang::ast_matchers; @@ -19,6 +20,9 @@ namespace clang { namespace tidy { namespace misc { + +// Semicolon separated list of known string compare-like functions. The list +// must ends with a semicolon. static const char KnownStringCompareFunctions[] = "__builtin_memcmp;" "__builtin_strcasecmp;" "__builtin_strcmp;" @@ -64,19 +68,6 @@ static const char KnownStringCompareFunc "wcsnicmp;" "wmemcmp;"; -static const char StringCompareLikeFunctionsDelimiter[] = ";"; - -static void ParseFunctionNames(StringRef Option, - std::vector<std::string> *Result) { - SmallVector<StringRef, 4> Functions; - Option.split(Functions, StringCompareLikeFunctionsDelimiter); - for (StringRef &Function : Functions) { - Function = Function.trim(); - if (!Function.empty()) - Result->push_back(Function); - } -} - SuspiciousStringCompareCheck::SuspiciousStringCompareCheck( StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), @@ -102,9 +93,9 @@ void SuspiciousStringCompareCheck::regis // Add the list of known string compare-like functions and add user-defined // functions. - std::vector<std::string> FunctionNames; - ParseFunctionNames(KnownStringCompareFunctions, &FunctionNames); - ParseFunctionNames(StringCompareLikeFunctions, &FunctionNames); + std::vector<std::string> FunctionNames = utils::options::parseStringList( + (llvm::Twine(KnownStringCompareFunctions) + StringCompareLikeFunctions) + .str()); // Match a call to a string compare functions. const auto FunctionCompareDecl = Modified: clang-tools-extra/trunk/clang-tidy/performance/FasterStringFindCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/performance/FasterStringFindCheck.cpp?rev=269065&r1=269064&r2=269065&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/performance/FasterStringFindCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/performance/FasterStringFindCheck.cpp Tue May 10 10:31:15 2016 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "FasterStringFindCheck.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "llvm/ADT/Optional.h" @@ -21,20 +22,6 @@ namespace performance { namespace { -static const char StringLikeClassesDelimiter[] = ";"; - -std::vector<std::string> ParseClasses(StringRef Option) { - SmallVector<StringRef, 4> Classes; - Option.split(Classes, StringLikeClassesDelimiter); - std::vector<std::string> Result; - for (StringRef &Class : Classes) { - Class = Class.trim(); - if (!Class.empty()) - Result.push_back(Class); - } - return Result; -} - llvm::Optional<std::string> MakeCharacterLiteral(const StringLiteral *Literal) { std::string Result; { @@ -64,14 +51,13 @@ AST_MATCHER_FUNCTION(ast_matchers::inter FasterStringFindCheck::FasterStringFindCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), - StringLikeClasses( - ParseClasses(Options.get("StringLikeClasses", "std::basic_string"))) { + StringLikeClasses(utils::options::parseStringList( + Options.get("StringLikeClasses", "std::basic_string"))) { } void FasterStringFindCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "StringLikeClasses", - llvm::join(StringLikeClasses.begin(), StringLikeClasses.end(), - StringLikeClassesDelimiter)); + utils::options::serializeStringList(StringLikeClasses)); } void FasterStringFindCheck::registerMatchers(MatchFinder *Finder) { Modified: clang-tools-extra/trunk/clang-tidy/utils/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/utils/CMakeLists.txt?rev=269065&r1=269064&r2=269065&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/utils/CMakeLists.txt Tue May 10 10:31:15 2016 @@ -3,11 +3,12 @@ set(LLVM_LINK_COMPONENTS support) add_clang_library(clangTidyUtils DeclRefExprUtils.cpp FixItHintUtils.cpp - HeaderGuard.cpp HeaderFileExtensionsUtils.cpp + HeaderGuard.cpp IncludeInserter.cpp IncludeSorter.cpp LexerUtils.cpp + OptionsUtils.cpp TypeTraits.cpp LINK_LIBS Added: clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.cpp?rev=269065&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.cpp (added) +++ clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.cpp Tue May 10 10:31:15 2016 @@ -0,0 +1,38 @@ +//===--- DanglingHandleCheck.cpp - clang-tidy------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "OptionsUtils.h" + +namespace clang { +namespace tidy { +namespace utils { +namespace options { + +static const char StringsDelimiter[] = ";"; + +std::vector<std::string> parseStringList(StringRef Option) { + SmallVector<StringRef, 4> Names; + Option.split(Names, StringsDelimiter); + std::vector<std::string> Result; + for (StringRef &Name : Names) { + Name = Name.trim(); + if (!Name.empty()) + Result.push_back(Name); + } + return Result; +} + +std::string serializeStringList(ArrayRef<std::string> Strings) { + return llvm::join(Strings.begin(), Strings.end(), StringsDelimiter); +} + +} // namespace options +} // namespace utils +} // namespace tidy +} // namespace clang Added: clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.h?rev=269065&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.h (added) +++ clang-tools-extra/trunk/clang-tidy/utils/OptionsUtils.h Tue May 10 10:31:15 2016 @@ -0,0 +1,32 @@ +//===--- DanglingHandleCheck.h - clang-tidy----------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_OPTIONUTILS_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_OPTIONUTILS_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace utils { +namespace options { + +/// \brief Parse a semicolon separated list of strings. +std::vector<std::string> parseStringList(StringRef Option); + +/// \brief Serialize a sequence of names that can be parsed by +/// 'parseStringList'. +std::string serializeStringList(ArrayRef<std::string> Strings); + +} // namespace options +} // namespace utils +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_OPTIONUTILS_H _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits