brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 3574108 Raw
68 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "UseToStringCheck.h"10 11using namespace clang::ast_matchers;12 13namespace clang::tidy::boost {14 15namespace {16AST_MATCHER(Type, isStrictlyInteger) {17  return Node.isIntegerType() && !Node.isAnyCharacterType() &&18         !Node.isBooleanType();19}20} // namespace21 22void UseToStringCheck::registerMatchers(MatchFinder *Finder) {23  Finder->addMatcher(24      callExpr(25          hasDeclaration(functionDecl(26              returns(hasDeclaration(classTemplateSpecializationDecl(27                  hasName("std::basic_string"),28                  hasTemplateArgument(0,29                                      templateArgument().bind("char_type"))))),30              hasName("boost::lexical_cast"),31              hasParameter(0, hasType(qualType(has(substTemplateTypeParmType(32                                  isStrictlyInteger()))))))),33          argumentCountIs(1), unless(isInTemplateInstantiation()))34          .bind("to_string"),35      this);36}37 38void UseToStringCheck::check(const MatchFinder::MatchResult &Result) {39  const auto *Call = Result.Nodes.getNodeAs<CallExpr>("to_string");40  auto CharType =41      Result.Nodes.getNodeAs<TemplateArgument>("char_type")->getAsType();42 43  StringRef StringType;44  if (CharType->isSpecificBuiltinType(BuiltinType::Char_S) ||45      CharType->isSpecificBuiltinType(BuiltinType::Char_U))46    StringType = "string";47  else if (CharType->isSpecificBuiltinType(BuiltinType::WChar_S) ||48           CharType->isSpecificBuiltinType(BuiltinType::WChar_U))49    StringType = "wstring";50  else51    return;52 53  auto Loc = Call->getBeginLoc();54  auto Diag =55      diag(Loc, "use std::to_%0 instead of boost::lexical_cast<std::%0>")56      << StringType;57 58  if (Loc.isMacroID())59    return;60 61  Diag << FixItHint::CreateReplacement(62      CharSourceRange::getCharRange(Call->getBeginLoc(),63                                    Call->getArg(0)->getBeginLoc()),64      (llvm::Twine("std::to_") + StringType + "(").str());65}66 67} // namespace clang::tidy::boost68