[cfe-dev] Proposal: add "replace" functionality to clang-query
Stephen Kelly via cfe-dev
cfe-dev at lists.llvm.org
Fri Mar 27 16:55:44 PDT 2020
Yes, Transformer seems to be what you're looking for. I made a
proof-of-concept GUI tool which integrates Transformer which you can see
here:
https://steveire.wordpress.com/2019/04/30/the-future-of-ast-matching-refactoring-tools
I think a GUI integration makes more sense than clang-query, so you
might find that pursuing a GUI approach would make it easier to expose
Transformer features.
Thanks,
Stephen.
On 25/03/2020 17:47, Alexander Timin via cfe-dev wrote:
> Thanks Yitzhak and Aaron!
>
> As an outsider to the clang land, I wasn't aware of the Transformer —
> thanks for pointing me to it, it looks really exciting.
>
> I think that my proposal can be broken down into two parts:
> a) Adding an option to generate replacements without having to build a
> C++ tool.
> b) Particular syntax to generate these replacements.
>
> I think that Transformer effort covers only the b) part — please
> correct me if I'm wrong.
>
> And out of these two, I (looking at the things from the user
> perspective) think that a) is the most important one, as having to write
> and link C++ code adds a lot of friction to the process (so sed +
> manual edits are still faster). So I think that there is a nice synergy
> potential in the long term — I think that the ideal end state would be
> having the ability to write Transformer-based queries dynamically in
> clang-query, something like that:
>
> $ clang-query
> > transform matcher makeStencil(ifBound("value", true, false))
>
> However (as building the dynamic Stencils sounds non-trivial), I think
> that there is no particular harm in having both options available in
> clang-query, one being easier to write and one being more flexible:
>
> > replace matcher foo = ${foo}
> > transform matcher complexStencil(...)
>
>
> On Wed, 25 Mar 2020 at 17:05, Yitzhak Mandelbaum <yitzhakm at google.com
> <mailto:yitzhakm at google.com>> wrote:
>
> Aaron, thanks for mentioning Clang Transformer. Alexander, you can
> find the original doc here
> <https://docs.google.com/document/d/1ppw0RhjwsrbBcHYhI85pe6ISDbA6r5d00ot3N8cQWeQ/edit#heading=h.qjjywl5dhpsb>.
> The code is under Tooling:
> https://github.com/llvm/llvm-project/tree/master/clang/include/clang/Tooling/Transformer
>
> On Wed, Mar 25, 2020 at 12:52 PM Aaron Ballman
> <aaron at aaronballman.com <mailto:aaron at aaronballman.com>> wrote:
>
> On Tue, Mar 24, 2020 at 4:22 PM Alexander Timin via cfe-dev
> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
> >
> > Hey!
> >
> > I think that medium-scale medium-complexity C++ refactorings
> (like replacing the order of the two arguments of a function
> across a large codebase) are much harder that they should be:
> clang-refactor and clang-rename do not cover them and writing
> a full libTooling tool is not the most time-efficient solution.
> >
> > I propose extending the functionality of clang-query to
> cover this use case and allow generating replacements (which
> can be then applied by clang-apply-replacements) from matches:
> >
> > replace MATCHER NODE PATTERN
> >
> > for example,
> >
> > let f = cxxMethodDecl(hasName("Foo"))
> > let arg1 = hasArgument(0, expr().bind("arg1"))
> > let arg2 = hasArgument(1, expr().bind("arg2"))
> > let m = callExpr(on(f), arg1, arg2)
> > replace m root Foo(${arg2}, ${arg1})
> >
> > A more detailed design doc is available here.
> >
> > An early prototype patch is available here.
> > A real-life example: the query is here, the output in the
> form of a Chromium patch is here.
> >
> > WDYT?
>
> Thank you for bringing up this idea, I've wanted something
> that can do
> this for a while. I think the idea has a lot of merit, but I'm
> wondering whether we want to focus on code transformations within
> clang-query like this as opposed to putting that effort into the
> in-progress Transformer work
> (http://lists.llvm.org/pipermail/cfe-dev/2019-January/060950.html).
> Are you aware of those efforts? If so, how do you see this
> proposal
> coexisting with that functionality?
>
> ~Aaron
>
>
> > Alexander
> > _______________________________________________
> > cfe-dev mailing list
> > cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
> > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://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/20200327/7045cc5d/attachment-0001.html>
More information about the cfe-dev
mailing list