================ @@ -0,0 +1,84 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "UseStringViewCheck.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/ASTMatchers/ASTMatchers.h" + +using namespace clang::ast_matchers; + +namespace clang::tidy::modernize { + +namespace { +AST_MATCHER(NamedDecl, isOperatorDecl) { + const DeclarationName::NameKind NK = Node.getDeclName().getNameKind(); + return NK != DeclarationName::Identifier && + NK != DeclarationName::CXXConstructorName && + NK != DeclarationName::CXXDestructorName; +} +} // namespace + +static llvm::StringRef toStringViewTypeStr(StringRef Type) { + if (Type.contains("wchar_t")) + return "std::wstring_view"; + if (Type.contains("char8_t")) + return "std::u8string_view"; + if (Type.contains("char16_t")) + return "std::u16string_view"; + if (Type.contains("char32_t")) + return "std::u32string_view"; + return "std::string_view"; +} + +static auto getStringTypeMatcher(StringRef CharType) { + return hasCanonicalType(hasDeclaration(cxxRecordDecl(hasName(CharType)))); +} + +void UseStringViewCheck::registerMatchers(MatchFinder *Finder) { + const auto IsStdString = getStringTypeMatcher("::std::basic_string"); + const auto IsStdStringView = getStringTypeMatcher("::std::basic_string_view"); + + Finder->addMatcher( + functionDecl( + isDefinition(), + unless(cxxMethodDecl(anyOf(isOperatorDecl(), isVirtual()))), + returns(IsStdString), hasDescendant(returnStmt()), + unless(anyOf( + ast_matchers::isTemplateInstantiation(), + isExplicitTemplateSpecialization(), + hasDescendant(returnStmt(hasReturnValue(unless(ignoringImplicit( + anyOf(stringLiteral(), hasType(IsStdStringView), + cxxConstructExpr( + hasType(IsStdString), + anyOf(argumentCountIs(0), + hasArgument( + 0, + ignoringParenImpCasts(anyOf( + stringLiteral(), + hasType(IsStdStringView))))))))))))))) + .bind("func"), + this); +} + +void UseStringViewCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("func"); + assert(MatchedDecl); + const llvm::StringRef DestReturnTypeStr = toStringViewTypeStr( ---------------- vbvictor wrote:
```suggestion const StringRef DestReturnTypeStr = toStringViewTypeStr( ``` https://github.com/llvm/llvm-project/pull/172170 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
