[llvm-branch-commits] [clang-tools-extra] 922a5b8 - [clang-tidy] Add test for Transformer-based checks with diagnostics.
Author: Yitzhak Mandelbaum Date: 2021-01-12T20:15:22Z New Revision: 922a5b894114defb5302e514973de8c9cd23af6a URL: https://github.com/llvm/llvm-project/commit/922a5b894114defb5302e514973de8c9cd23af6a DIFF: https://github.com/llvm/llvm-project/commit/922a5b894114defb5302e514973de8c9cd23af6a.diff LOG: [clang-tidy] Add test for Transformer-based checks with diagnostics. Adds a test that checks the diagnostic output of the tidy. Differential Revision: https://reviews.llvm.org/D94453 Added: Modified: clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp Removed: diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp index e8df4bb60071..24b6bea98787 100644 --- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp @@ -10,8 +10,10 @@ #include "ClangTidyTest.h" #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Tooling/Transformer/RangeSelector.h" +#include "clang/Tooling/Transformer/RewriteRule.h" #include "clang/Tooling/Transformer/Stencil.h" #include "clang/Tooling/Transformer/Transformer.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" namespace clang { @@ -25,20 +27,21 @@ using transformer::change; using transformer::IncludeFormat; using transformer::makeRule; using transformer::node; +using transformer::noopEdit; using transformer::RewriteRule; +using transformer::RootID; using transformer::statement; // Invert the code of an if-statement, while maintaining its semantics. RewriteRule invertIf() { StringRef C = "C", T = "T", E = "E"; - RewriteRule Rule = - makeRule(ifStmt(hasCondition(expr().bind(C)), hasThen(stmt().bind(T)), - hasElse(stmt().bind(E))), - change(statement(std::string(RewriteRule::RootID)), - cat("if(!(", node(std::string(C)), ")) ", - statement(std::string(E)), " else ", - statement(std::string(T, - cat("negate condition and reverse `then` and `else` branches")); + RewriteRule Rule = makeRule( + ifStmt(hasCondition(expr().bind(C)), hasThen(stmt().bind(T)), + hasElse(stmt().bind(E))), + change(statement(RootID), cat("if(!(", node(std::string(C)), ")) ", +statement(std::string(E)), " else ", +statement(std::string(T, + cat("negate condition and reverse `then` and `else` branches")); return Rule; } @@ -68,6 +71,25 @@ TEST(TransformerClangTidyCheckTest, Basic) { EXPECT_EQ(Expected, test::runCheckOnCode(Input)); } +TEST(TransformerClangTidyCheckTest, DiagnosticsCorrectlyGenerated) { + class DiagOnlyCheck : public TransformerClangTidyCheck { + public: +DiagOnlyCheck(StringRef Name, ClangTidyContext *Context) +: TransformerClangTidyCheck( + makeRule(returnStmt(), noopEdit(node(RootID)), cat("message")), + Name, Context) {} + }; + std::string Input = "int h() { return 5; }"; + std::vector Errors; + EXPECT_EQ(Input, test::runCheckOnCode(Input, &Errors)); + EXPECT_EQ(Errors.size(), 1U); + EXPECT_EQ(Errors[0].Message.Message, "message"); + EXPECT_THAT(Errors[0].Ranges, testing::IsEmpty()); + + // The diagnostic is anchored to the match, "return 5". + EXPECT_EQ(Errors[0].Message.FileOffset, 10U); +} + class IntLitCheck : public TransformerClangTidyCheck { public: IntLitCheck(StringRef Name, ClangTidyContext *Context) ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang] 1fabe6e - [libTooling] Change `addInclude` to use expansion locs.
Author: Yitzhak Mandelbaum Date: 2021-01-15T03:08:56Z New Revision: 1fabe6e51917bcd7a1242294069c682fe6dffa45 URL: https://github.com/llvm/llvm-project/commit/1fabe6e51917bcd7a1242294069c682fe6dffa45 DIFF: https://github.com/llvm/llvm-project/commit/1fabe6e51917bcd7a1242294069c682fe6dffa45.diff LOG: [libTooling] Change `addInclude` to use expansion locs. This patch changes the default range used to anchor the include insertion to use an expansion loc. This ensures that the location is valid, when the user relies on the default range. Driveby: extend a FIXME for a problem that was emphasized by this change; fix some spellings. Differential Revision: https://reviews.llvm.org/D93703 Added: Modified: clang/include/clang/Tooling/Transformer/RewriteRule.h clang/lib/Tooling/Transformer/RewriteRule.cpp Removed: diff --git a/clang/include/clang/Tooling/Transformer/RewriteRule.h b/clang/include/clang/Tooling/Transformer/RewriteRule.h index 355b3249d3bc..ac93db8446df 100644 --- a/clang/include/clang/Tooling/Transformer/RewriteRule.h +++ b/clang/include/clang/Tooling/Transformer/RewriteRule.h @@ -213,10 +213,12 @@ ASTEdit addInclude(RangeSelector Target, StringRef Header, IncludeFormat Format = IncludeFormat::Quoted); /// Adds an include directive for the given header to the file associated with -/// `RootID`. +/// `RootID`. If `RootID` matches inside a macro expansion, will add the +/// directive to the file in which the macro was expanded (as opposed to the +/// file in which the macro is defined). inline ASTEdit addInclude(StringRef Header, IncludeFormat Format = IncludeFormat::Quoted) { - return addInclude(node(RootID), Header, Format); + return addInclude(expansion(node(RootID)), Header, Format); } // FIXME: If `Metadata` returns an `llvm::Expected` the `AnyGenerator` will @@ -312,8 +314,8 @@ inline RewriteRule makeRule(ast_matchers::internal::DynTypedMatcher M, /// \code /// auto R = makeRule(callExpr(callee(functionDecl(hasName("foo", ///changeTo(cat("bar()"))); -/// AddInclude(R, "path/to/bar_header.h"); -/// AddInclude(R, "vector", IncludeFormat::Angled); +/// addInclude(R, "path/to/bar_header.h"); +/// addInclude(R, "vector", IncludeFormat::Angled); /// \endcode void addInclude(RewriteRule &Rule, llvm::StringRef Header, IncludeFormat Format = IncludeFormat::Quoted); diff --git a/clang/lib/Tooling/Transformer/RewriteRule.cpp b/clang/lib/Tooling/Transformer/RewriteRule.cpp index acff1e83c4e1..93bd7e91dba7 100644 --- a/clang/lib/Tooling/Transformer/RewriteRule.cpp +++ b/clang/lib/Tooling/Transformer/RewriteRule.cpp @@ -42,7 +42,12 @@ translateEdits(const MatchResult &Result, ArrayRef ASTEdits) { llvm::Optional EditRange = tooling::getRangeForEdit(*Range, *Result.Context); // FIXME: let user specify whether to treat this case as an error or ignore -// it as is currently done. +// it as is currently done. This behavior is problematic in that it hides +// failures from bad ranges. Also, the behavior here diff ers from +// `flatten`. Here, we abort (without error), whereas flatten, if it hits an +// empty list, does not abort. As a result, `editList({A,B})` is not +// equivalent to `flatten(edit(A), edit(B))`. The former will abort if `A` +// produces a bad range, whereas the latter will simply ignore A. if (!EditRange) return SmallVector(); auto Replacement = E.Replacement->eval(Result); ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
[llvm-branch-commits] [clang-tools-extra] 9eb2284 - [clang-tidy] Update uses of deprecated Transformer APIs in StringFindStrContainsCheck.
Author: Yitzhak Mandelbaum Date: 2021-01-05T16:49:29Z New Revision: 9eb2284f60391eca246f12398d247fc1555d6bf5 URL: https://github.com/llvm/llvm-project/commit/9eb2284f60391eca246f12398d247fc1555d6bf5 DIFF: https://github.com/llvm/llvm-project/commit/9eb2284f60391eca246f12398d247fc1555d6bf5.diff LOG: [clang-tidy] Update uses of deprecated Transformer APIs in StringFindStrContainsCheck. Migrates `change` to `changeTo`; changes to new constructor API (2-arg construct + `setRule`); refactors use of `addInclude` to newer version. Differential Revision: https://reviews.llvm.org/D93695 Added: Modified: clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp Removed: diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp index 977c1919cee3..3054689c9653 100644 --- a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp @@ -24,9 +24,10 @@ namespace clang { namespace tidy { namespace abseil { +using ::clang::transformer::addInclude; using ::clang::transformer::applyFirst; using ::clang::transformer::cat; -using ::clang::transformer::change; +using ::clang::transformer::changeTo; using ::clang::transformer::makeRule; using ::clang::transformer::node; using ::clang::transformer::RewriteRule; @@ -38,22 +39,9 @@ static const char DefaultStringLikeClasses[] = "::std::basic_string;" "::absl::string_view"; static const char DefaultAbseilStringsMatchHeader[] = "absl/strings/match.h"; -static llvm::Optional -MakeRule(const LangOptions &LangOpts, - const ClangTidyCheck::OptionsView &Options) { - // Parse options. - // - // FIXME(tdl-g): These options are being parsed redundantly with the - // constructor because TransformerClangTidyCheck forces us to provide MakeRule - // before "this" is fully constructed, but StoreOptions requires us to store - // the parsed options in "this". We need to fix TransformerClangTidyCheck and - // then we can clean this up. - const std::vector StringLikeClassNames = - utils::options::parseStringList( - Options.get("StringLikeClasses", DefaultStringLikeClasses)); - const std::string AbseilStringsMatchHeader = - Options.get("AbseilStringsMatchHeader", DefaultAbseilStringsMatchHeader); - +static transformer::RewriteRule +makeRewriteRule(const std::vector &StringLikeClassNames, +StringRef AbseilStringsMatchHeader) { auto StringLikeClass = cxxRecordDecl(hasAnyName(SmallVector( StringLikeClassNames.begin(), StringLikeClassNames.end(; auto StringType = @@ -75,29 +63,36 @@ MakeRule(const LangOptions &LangOpts, onImplicitObjectArgument(expr().bind("string_being_searched"))); RewriteRule rule = applyFirst( - {makeRule(binaryOperator(hasOperatorName("=="), - hasOperands(ignoringParenImpCasts(StringNpos), - ignoringParenImpCasts(StringFind))), -change(cat("!absl::StrContains(", node("string_being_searched"), - ", ", node("parameter_to_find"), ")")), -cat("use !absl::StrContains instead of find() == npos")), - makeRule(binaryOperator(hasOperatorName("!="), - hasOperands(ignoringParenImpCasts(StringNpos), - ignoringParenImpCasts(StringFind))), -change(cat("absl::StrContains(", node("string_being_searched"), - ", ", node("parameter_to_find"), ")")), -cat("use absl::StrContains instead of find() != npos"))}); - addInclude(rule, AbseilStringsMatchHeader); + {makeRule( + binaryOperator(hasOperatorName("=="), + hasOperands(ignoringParenImpCasts(StringNpos), + ignoringParenImpCasts(StringFind))), + {changeTo(cat("!absl::StrContains(", node("string_being_searched"), + ", ", node("parameter_to_find"), ")")), +addInclude(AbseilStringsMatchHeader)}, + cat("use !absl::StrContains instead of find() == npos")), + makeRule( + binaryOperator(hasOperatorName("!="), + hasOperands(ignoringParenImpCasts(StringNpos), + ignoringParenImpCasts(StringFind))), + {changeTo(cat("absl::StrContains(", node("string_being_searched"), + ", ", node("parameter_to_find"), ")")), +addInclude(AbseilStringsMatchHeader)}, + cat("use absl::StrContains instead " + "of find() != npos"))}); return rule; } StringFindStrContainsCheck::StringFindStrContainsCheck(
[llvm-branch-commits] [clang] 675a297 - [libTooling] Add support for smart pointers to relevant Transformer `Stencil`s.
Author: Yitzhak Mandelbaum Date: 2021-01-05T17:57:41Z New Revision: 675a2973ee7745d1859e3b72be40a803dd349e55 URL: https://github.com/llvm/llvm-project/commit/675a2973ee7745d1859e3b72be40a803dd349e55 DIFF: https://github.com/llvm/llvm-project/commit/675a2973ee7745d1859e3b72be40a803dd349e55.diff LOG: [libTooling] Add support for smart pointers to relevant Transformer `Stencil`s. Stencils `maybeDeref` and `maybeAddressOf` are designed to handle nodes that may be pointers. Currently, they only handle native pointers. This patch extends the support to recognize smart pointers and handle them as well. Differential Revision: https://reviews.llvm.org/D93637 Added: Modified: clang/include/clang/Tooling/Transformer/Stencil.h clang/lib/Tooling/Transformer/Stencil.cpp clang/unittests/Tooling/StencilTest.cpp Removed: diff --git a/clang/include/clang/Tooling/Transformer/Stencil.h b/clang/include/clang/Tooling/Transformer/Stencil.h index b729c826c808..1b7495eb0262 100644 --- a/clang/include/clang/Tooling/Transformer/Stencil.h +++ b/clang/include/clang/Tooling/Transformer/Stencil.h @@ -82,7 +82,6 @@ Stencil deref(llvm::StringRef ExprId); /// If \p ExprId is of pointer type, constructs an idiomatic dereferencing of /// the expression bound to \p ExprId, including wrapping it in parentheses, if /// needed. Otherwise, generates the original expression source. -/// FIXME: Identify smart-pointers as pointer types. Stencil maybeDeref(llvm::StringRef ExprId); /// Constructs an expression that idiomatically takes the address of the @@ -94,7 +93,6 @@ Stencil addressOf(llvm::StringRef ExprId); /// idiomatically takes the address of the expression bound to \p ExprId, /// including wrapping \p ExprId in parentheses, if needed. Otherwise, generates /// the original expression source. -/// FIXME: Identify smart-pointers as pointer types. Stencil maybeAddressOf(llvm::StringRef ExprId); /// Constructs a `MemberExpr` that accesses the named member (\p Member) of the diff --git a/clang/lib/Tooling/Transformer/Stencil.cpp b/clang/lib/Tooling/Transformer/Stencil.cpp index 56f145393691..d46087e4b04b 100644 --- a/clang/lib/Tooling/Transformer/Stencil.cpp +++ b/clang/lib/Tooling/Transformer/Stencil.cpp @@ -195,6 +195,24 @@ Error evalData(const DebugPrintNodeData &Data, return printNode(Data.Id, Match, Result); } +// FIXME: Consider memoizing this function using the `ASTContext`. +static bool isSmartPointerType(QualType Ty, ASTContext &Context) { + using namespace ::clang::ast_matchers; + + // Optimization: hard-code common smart-pointer types. This can/should be + // removed if we start caching the results of this function. + auto KnownSmartPointer = + cxxRecordDecl(hasAnyName("::std::unique_ptr", "::std::shared_ptr")); + const auto QuacksLikeASmartPointer = cxxRecordDecl( + hasMethod(cxxMethodDecl(hasOverloadedOperatorName("->"), + returns(qualType(pointsTo(type()), + hasMethod(cxxMethodDecl(hasOverloadedOperatorName("*"), + returns(qualType(references(type())); + const auto SmartPointer = qualType(hasDeclaration( + cxxRecordDecl(anyOf(KnownSmartPointer, QuacksLikeASmartPointer; + return match(SmartPointer, Ty, Context).size() > 0; +} + Error evalData(const UnaryOperationData &Data, const MatchFinder::MatchResult &Match, std::string *Result) { // The `Describe` operation can be applied to any node, not just expressions, @@ -215,17 +233,37 @@ Error evalData(const UnaryOperationData &Data, Source = tooling::buildDereference(*E, *Match.Context); break; case UnaryNodeOperator::MaybeDeref: -if (!E->getType()->isAnyPointerType()) { - *Result += tooling::getText(*E, *Match.Context); - return Error::success(); +if (E->getType()->isAnyPointerType() || +isSmartPointerType(E->getType(), *Match.Context)) { + // Strip off any operator->. This can only occur inside an actual arrow + // member access, so we treat it as equivalent to an actual object + // expression. + if (const auto *OpCall = dyn_cast(E)) { +if (OpCall->getOperator() == clang::OO_Arrow && +OpCall->getNumArgs() == 1) { + E = OpCall->getArg(0); +} + } + Source = tooling::buildDereference(*E, *Match.Context); + break; } -Source = tooling::buildDereference(*E, *Match.Context); -break; +*Result += tooling::getText(*E, *Match.Context); +return Error::success(); case UnaryNodeOperator::AddressOf: Source = tooling::buildAddressOf(*E, *Match.Context); break; case UnaryNodeOperator::MaybeAddressOf: -if (E->getType()->isAnyPointerType()) { +if (E->getType()->isAnyPointerType() || +isSmartPointerType(E->getType(), *Match.Context)) { + // Strip off any operator->. This can only occ
[llvm-branch-commits] [clang] fdff677 - [libTooling] Remove deprecated Clang Transformer declarations
Author: Yitzhak Mandelbaum Date: 2020-11-30T20:15:26Z New Revision: fdff677a955730b3e85b870ff1b30d7f8ea5719c URL: https://github.com/llvm/llvm-project/commit/fdff677a955730b3e85b870ff1b30d7f8ea5719c DIFF: https://github.com/llvm/llvm-project/commit/fdff677a955730b3e85b870ff1b30d7f8ea5719c.diff LOG: [libTooling] Remove deprecated Clang Transformer declarations A number of declarations were leftover after the move from `clang::tooling` to `clang::transformer`. This patch removes those declarations and upgrades the handful of references to the deprecated declarations. Differential Revision: https://reviews.llvm.org/D92340 Added: Modified: clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp clang/include/clang/Tooling/Transformer/RangeSelector.h clang/include/clang/Tooling/Transformer/RewriteRule.h clang/lib/Tooling/Transformer/RewriteRule.cpp clang/unittests/Tooling/TransformerTest.cpp Removed: diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp index 87af9ea6cd5a..cd890e4837e0 100644 --- a/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp @@ -29,6 +29,7 @@ using ::clang::transformer::cat; using ::clang::transformer::change; using ::clang::transformer::makeRule; using ::clang::transformer::node; +using ::clang::transformer::RewriteRule; static const char DefaultStringLikeClasses[] = "::std::basic_string;" "::std::basic_string_view;" @@ -69,7 +70,7 @@ MakeRule(const LangOptions &LangOpts, hasArgument(1, cxxDefaultArgExpr())), onImplicitObjectArgument(expr().bind("string_being_searched"))); - tooling::RewriteRule rule = applyFirst( + RewriteRule rule = applyFirst( {makeRule(binaryOperator(hasOperatorName("=="), hasOperands(ignoringParenImpCasts(StringNpos), ignoringParenImpCasts(StringFind))), diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp index 536d6f8ef275..e8df4bb60071 100644 --- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp @@ -23,6 +23,7 @@ using namespace ::clang::ast_matchers; using transformer::cat; using transformer::change; using transformer::IncludeFormat; +using transformer::makeRule; using transformer::node; using transformer::RewriteRule; using transformer::statement; @@ -30,14 +31,14 @@ using transformer::statement; // Invert the code of an if-statement, while maintaining its semantics. RewriteRule invertIf() { StringRef C = "C", T = "T", E = "E"; - RewriteRule Rule = tooling::makeRule( - ifStmt(hasCondition(expr().bind(C)), hasThen(stmt().bind(T)), - hasElse(stmt().bind(E))), - change(statement(std::string(RewriteRule::RootID)), - cat("if(!(", node(std::string(C)), ")) ", - statement(std::string(E)), " else ", - statement(std::string(T, - cat("negate condition and reverse `then` and `else` branches")); + RewriteRule Rule = + makeRule(ifStmt(hasCondition(expr().bind(C)), hasThen(stmt().bind(T)), + hasElse(stmt().bind(E))), + change(statement(std::string(RewriteRule::RootID)), + cat("if(!(", node(std::string(C)), ")) ", + statement(std::string(E)), " else ", + statement(std::string(T, + cat("negate condition and reverse `then` and `else` branches")); return Rule; } @@ -70,10 +71,9 @@ TEST(TransformerClangTidyCheckTest, Basic) { class IntLitCheck : public TransformerClangTidyCheck { public: IntLitCheck(StringRef Name, ClangTidyContext *Context) - : TransformerClangTidyCheck(tooling::makeRule(integerLiteral(), -change(cat("LIT")), -cat("no message")), - Name, Context) {} + : TransformerClangTidyCheck( +makeRule(integerLiteral(), change(cat("LIT")), cat("no message")), +Name, Context) {} }; // Tests that two changes in a single macro expansion do not lead to conflicts @@ -95,7 +95,7 @@ class BinOpCheck : public TransformerClangTidyCheck { public: BinOpCheck(StringRef Name, ClangTidyContext *Context) : TransformerClangTidyCheck( -tooling::makeRule( +makeRule( binaryOperator(h
[llvm-branch-commits] [clang] e6bc4a7 - [libTooling] Add `describe` combinator for formatting AST nodes for diagnostics.
Author: Yitzhak Mandelbaum Date: 2020-12-07T16:08:05Z New Revision: e6bc4a71e3450d7230205683f63d6e22fbf9bf05 URL: https://github.com/llvm/llvm-project/commit/e6bc4a71e3450d7230205683f63d6e22fbf9bf05 DIFF: https://github.com/llvm/llvm-project/commit/e6bc4a71e3450d7230205683f63d6e22fbf9bf05.diff LOG: [libTooling] Add `describe` combinator for formatting AST nodes for diagnostics. This new stencil combinator is intended for use in diagnostics and the like. Differential Revision: https://reviews.llvm.org/D92658 Added: Modified: clang/include/clang/Tooling/Transformer/Stencil.h clang/lib/Tooling/Transformer/Stencil.cpp clang/unittests/Tooling/StencilTest.cpp Removed: diff --git a/clang/include/clang/Tooling/Transformer/Stencil.h b/clang/include/clang/Tooling/Transformer/Stencil.h index 1b50a670f70b..b729c826c808 100644 --- a/clang/include/clang/Tooling/Transformer/Stencil.h +++ b/clang/include/clang/Tooling/Transformer/Stencil.h @@ -123,6 +123,15 @@ inline Stencil ifBound(llvm::StringRef Id, llvm::StringRef TrueText, /// Stencil. This supports user-defined extensions to the \c Stencil language. Stencil run(MatchConsumer C); +/// Produces a human-readable rendering of the node bound to `Id`, suitable for +/// diagnostics and debugging. This operator can be applied to any node, but is +/// targeted at those whose source cannot be printed directly, including: +/// +/// * Types. represented based on their structure. Note that namespace +/// qualifiers are always printed, with the anonymous namespace represented +/// explicitly. No desugaring or canonicalization is applied. +Stencil describe(llvm::StringRef Id); + /// For debug use only; semantics are not guaranteed. /// /// \returns the string resulting from calling the node's print() method. diff --git a/clang/lib/Tooling/Transformer/Stencil.cpp b/clang/lib/Tooling/Transformer/Stencil.cpp index 2670bf7adabf..56f145393691 100644 --- a/clang/lib/Tooling/Transformer/Stencil.cpp +++ b/clang/lib/Tooling/Transformer/Stencil.cpp @@ -63,6 +63,7 @@ enum class UnaryNodeOperator { MaybeDeref, AddressOf, MaybeAddressOf, + Describe, }; // Generic container for stencil operations with a (single) node-id argument. @@ -133,6 +134,9 @@ std::string toStringData(const UnaryOperationData &Data) { case UnaryNodeOperator::MaybeAddressOf: OpName = "maybeAddressOf"; break; + case UnaryNodeOperator::Describe: +OpName = "describe"; +break; } return (OpName + "(\"" + Data.Id + "\")").str(); } @@ -174,11 +178,11 @@ Error evalData(const RawTextData &Data, const MatchFinder::MatchResult &, return Error::success(); } -Error evalData(const DebugPrintNodeData &Data, - const MatchFinder::MatchResult &Match, std::string *Result) { +static Error printNode(StringRef Id, const MatchFinder::MatchResult &Match, + std::string *Result) { std::string Output; llvm::raw_string_ostream Os(Output); - auto NodeOrErr = getNode(Match.Nodes, Data.Id); + auto NodeOrErr = getNode(Match.Nodes, Id); if (auto Err = NodeOrErr.takeError()) return Err; NodeOrErr->print(Os, PrintingPolicy(Match.Context->getLangOpts())); @@ -186,8 +190,18 @@ Error evalData(const DebugPrintNodeData &Data, return Error::success(); } +Error evalData(const DebugPrintNodeData &Data, + const MatchFinder::MatchResult &Match, std::string *Result) { + return printNode(Data.Id, Match, Result); +} + Error evalData(const UnaryOperationData &Data, const MatchFinder::MatchResult &Match, std::string *Result) { + // The `Describe` operation can be applied to any node, not just expressions, + // so it is handled here, separately. + if (Data.Op == UnaryNodeOperator::Describe) +return printNode(Data.Id, Match, Result); + const auto *E = Match.Nodes.getNodeAs(Data.Id); if (E == nullptr) return llvm::make_error( @@ -217,6 +231,8 @@ Error evalData(const UnaryOperationData &Data, } Source = tooling::buildAddressOf(*E, *Match.Context); break; + case UnaryNodeOperator::Describe: +llvm_unreachable("This case is handled at the start of the function"); } if (!Source) return llvm::make_error( @@ -359,6 +375,11 @@ Stencil transformer::maybeAddressOf(llvm::StringRef ExprId) { UnaryNodeOperator::MaybeAddressOf, std::string(ExprId)); } +Stencil transformer::describe(StringRef Id) { + return std::make_shared>( + UnaryNodeOperator::Describe, std::string(Id)); +} + Stencil transformer::access(StringRef BaseId, Stencil Member) { return std::make_shared>(BaseId, std::move(Member)); } diff --git a/clang/unittests/Tooling/StencilTest.cpp b/clang/unittests/Tooling/StencilTest.cpp index c843e33dd0da..56e81431e558 100644 --- a/clang/unittests/Tooling/StencilTest.cpp +++ b/clang/unittests/Tooling/StencilTest.cpp @@ -30,7 +30,9 @@ using
[llvm-branch-commits] [clang] [LifetimeSafety] Add script for performance benchmarking (PR #147315)
ymand wrote: Looks good overall, but I'm not terribly familiar with Python. I'm comfortable relying on Gabor's approval, though. https://github.com/llvm/llvm-project/pull/147315 ___ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits