[cfe-dev] Writing C++ refactoring tools in Common Lisp

Manuel Klimek klimek at google.com
Tue Jan 7 09:12:15 PST 2014

On Tue, Jan 7, 2014 at 5:16 PM, Christian Schafmeister <
chris.schaf at verizon.net> wrote:

> Hey folks,
> I’ve written a new Common Lisp environment/compiler over the past two
> years.
> It uses LLVM as the back-end (by exposing the LLVM C++ library to Common
> Lisp) and interoperates with C++ in that it has a template library like
> boost::python for exposing arbitrary C++ classes/functions to Common Lisp.
> I want to do some automated refactoring to improve my C++ code so I’m
> exposing the Clang ASTMatcher and Refactoring libraries.
> I also think it would be really cool to write refactoring tools in a
> dynamic language like Lisp - without all the exhausting boilerplate
> required by the C++ approach.

C++ refactoring tools actually don't require that much boilerplate...

> So I’m exposing the Clang AST library to this Common Lisp environment with
> the goal of writing a general tool for writing C++ refactoring tools in
> Common Lisp.
> My goal is to mimic C++ ASTMatchers like:
> *recordDecl(hasDescendant(*
> *    ifStmt(hasTrueExpression(*
> *        expr(hasDescendant(*
> *            ifStmt()))))))*
> Using S-expressions: *(record-decl (has-descendent (if-stmt
> (has-true-expression (expr (has-descendant( if-stmt))))))) *
> And the source-to-source translation code will be small lambda functions
> that use the resulting MatchResults.
> That way I don’t have to write a lot of documentation :-).
> Currently I’m looking at calling the ASTMatcher/Dynamic/VariantValue
> interface to build ASTMatchers from S-expressions - does that sound like a
> good idea - or is there a better approach I should be exploring?

Well, if your boost shim can already match "arbitrary C++ classes /
functions", then it should in principle be able to expose the AST matchers
as is (without the need to go through the dynamic parsing).
After all, the matchers are mostly just template functions :)

Otherwise I think going the dynamic matcher route is a good approach.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140107/75c5e264/attachment.html>

More information about the cfe-dev mailing list