[cfe-dev] [RFC] Easier source-to-source transformations with clang tooling
Jonas Toth via cfe-dev
cfe-dev at lists.llvm.org
Wed Feb 13 11:42:57 PST 2019
Hi Yitzhak,
you had positive reactions from Manuel, so I think that the proposed API
is in principle interesting.
The API should go into libTooling? And I assume it will be parallel to
what we have already?
Having patches on phabricator is probably a good idea. But I am not an
authorative figure in the libTooling space,
in the end the code-owner (manuel?!) has the power to deny entry. IMHO
its a good direction.
Best, Jonas
Am 13.02.19 um 17:18 schrieb Yitzhak Mandelbaum:
> Jonas,
>
> I've updated the revision (https://reviews.llvm.org/D56933) with two
> example clang tidies ported to Transformer. These are not ideal
> checks, because they are very particular in their handling of
> whitespace, but I think they're good demonstrations both of
> Transformers strengths and its (current) limitations. Additionally,
> below are to versions of simple example that isn't a tidy check yet.
> Please let me know what you think.
>
> Also, what are the next steps towards considering these libraries for
> acceptance to clang? Should I put together a diff(s) for review, or
> is that still premature?
>
>
> // Simplify `e.emplace_back(std::make_pair(e1, e2))` to
> `e.emplace_back(e1, e2)`.
> // We elide the extra matching required to check that `e` is in a
> container like std::vector and that
> // the element type is the same as that constructed by the call to
> make_pair.
>
> using extra_matchers::isFunctionNamed;
> using extra_matchers::isMethodNamed;
>
> // Version 1
> // This version has three metavariables -- one for the container and
> two for the
> // arguments to `make_pair`.
> ExprId Call, Arg0, Arg1;
> auto MakePairCall =
> callExpr(callee(isFunctionNamed("::std::make_pair")),
> argumentCountIs(2), hasArgument(0, Arg0.bind()),
> hasArgument(1, Arg1.bind()));
> auto Rule1 = RewriteRule()
> .matching(cxxMemberCallExpr(
> callee(isMethodNamed("emplace_back")),
> argumentCountIs(1), hasArgument(0, bind(Call,
> make_pair_call))))
> .change(Call)
> .replaceWith(Arg0, ",", Arg1));
>
> // Version 2
> // In this version, we extract the source code of the arguments
> using the `arg()`
> // stencil operator on the node bound to `Call`.
> auto Rule2 = RewriteRule()
> .matching(cxxMemberCallExpr(
> callee(isMethodNamed("emplace_back")), argumentCountIs(1),
> hasArgument(0, bind(Call, callExpr(callee(isFunctionNamed(
> "::std::make_tuple")))))))
> .change(Call)
> .replaceWith(tooling::stencil_generators::args(Call)));
>
> Thanks!
> Yitzhak
>
> On Fri, Jan 18, 2019 at 4:43 PM Yitzhak Mandelbaum
> <yitzhakm at google.com <mailto:yitzhakm at google.com>> wrote:
>
> Thanks! I've added it to a revision
> (https://reviews.llvm.org/D56933), but I wasn't sure what lists to
> subscribe it to (if any) given that I don't intend it yet for
> proper review.
>
> I haven't ported check, but do have a demo check (using
> Transformer as a whole) that I can add. I'll ping the thread when
> that's done.
>
> On Fri, Jan 18, 2019 at 3:19 PM Jonas Toth
> <development at jonas-toth.eu <mailto:development at jonas-toth.eu>> wrote:
>
> Hi Yitzhak,
>
> your code looks very interesting.
>
> It might be a good fit for uitlity that clang-refactor can
> use, too. (not sure about the state of clang-refactor though)
> I would be interested how your framework integrates into
> clang-tidy, do you have a reference check that you ported to
> your approach (i have seen some references to clang-tidy code)?
>
> P.S. It might be a good idea to make your diff a full
> revision, as right now the discussion feature can not be used.
>
> Best, Jonas
>
> Am 18.01.19 um 19:29 schrieb Yitzhak Mandelbaum via cfe-dev:
>> After some delay, I've created a diff to accompany the doc.
>> In particular, here's the Stencil library, which provides for
>> generating code in a format-string style:
>>
>> https://reviews.llvm.org/differential/diff/182553/
>>
>> Please see the tests for various examples and the doc for
>> more explanation.
>>
>> On Fri, Nov 16, 2018 at 10:22 AM Yitzhak Mandelbaum
>> <yitzhakm at google.com <mailto:yitzhakm at google.com>> wrote:
>>
>> Hi all,
>>
>> I have a proposal for a framework that makes it easier to
>> write source to source transformations with the
>> clang::Tooling libraries, including clang-tidy checks.
>>
>> The full proposal is in this doc:
>>
>> https://docs.google.com/document/d/1ppw0RhjwsrbBcHYhI85pe6ISDbA6r5d00ot3N8cQWeQ/edit?usp=sharing
>>
>> From the doc:
>> Transformer is a framework that aims to simplify
>> development of clang-based source-to-source
>> transformations. It focuses on the particular class of
>> transformations that act only locally — that is, use
>> local information about the code and make local changes
>> (like a syntax-aware “find-and-replace”); and at scale —
>> that is, will be carried out on many source files. The
>> target audience is users that are comfortable with, or
>> willing to become comfortable with, the clang AST
>> matchers library.
>>
>> I have a working prototype of this library which I've
>> used on small examples inside Google. I plan to put
>> together a patch for reference next week, although the
>> doc should stand on its own.
>>
>> Thanks!
>> Yitzhak Mandelbaum
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190213/1f7b49b7/attachment.html>
More information about the cfe-dev
mailing list