<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 13, 2014 at 3:18 PM, Christian Schafmeister <span dir="ltr"><<a href="mailto:meister@temple.edu" target="_blank" class="cremed">meister@temple.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>So, I managed to hack/rewrite parts of Registry.cpp, Registry.h, Marshaller.h and Diagnostics.h so that they work with Common Lisp Symbols and Conses.</div>
<div class="im"><div>I can now assemble ASTMatchers from s-expressions.   </div></div><div>I exposed the entire ASTMatcher interface in one go - so I can write any ASTMatcher using S-expressions that can be written with the C++ DSL.</div>
<div><br></div><div>Using the C++ DSL you would use:</div><div>fieldDecl(hasType(recordDecl(isDerivedFrom(recordDecl(hasName(“GCObject”)))))).bind(“all”)</div><div><br></div><div>In Common Lisp I would use:</div><div>(:bind :all (:field-decl (:has-type (:record-decl (:is-derived-from (:record-decl (:has-name "GCObject"))))))))</div>
<div><br></div><div><br></div><div>Question:</div><div><br></div><div>How do you get proficient at writing these matchers?   I still struggle with it.   </div></div></blockquote><div><br></div><div>In theory, they should read as english (with some bad grammar =P).</div>
<div>In your example, it reads as:</div><div>"A <fieldDecl> that a <hasType> that is a <recordDecl> which <isDerivedFrom> ..."</div><div>In my experience, the hardest part is figuring out which matchers to use (which basically requires knowing about them), not how to assemble them. <br>
</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>Do you have some way of looking at the AST dumps and then inverting them in your head into queries?</div>
</div></blockquote><div><br></div><div>I don't see what you mean by inverting.</div><div>There are two types of matchers: filters and traversal.</div><div>The filters check properties on the nodes, like "hasName()".</div>
<div>The traversal matchers help you reach other nodes in the AST, like "hasType()".</div><div><br></div><div>There are various trees that are interconnected; expressions, declarations and types. Matchers allow you to go from one to the other.</div>
<div>Eg. you can go from an expression (like &a->foo) to its type, from a type to some expression (like getting the initializer for a member field), etc.</div><div>In each tree you can also go up and down the hierarchies. Eg. you can go from Foo[] type to Foo, or from "1+foo->bar()" to "1" and "foo->bar()".</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I’ll build something like the “clang-query” tool and practice.</div>
<div><br></div><div>I’m going to expose the refactoring classes/functions next and try some interactive source-to-source translation of C++ in Common Lisp.</div><div><br></div><div>Best,</div><div><br></div><div>.Chris.</div>
<div><div class="h5"><div><br></div><div><br></div><div><br></div><div><br></div><div><br>
<br><div><div>On Jan 9, 2014, at 6:16 PM, Christian Schafmeister <<a href="mailto:meister@temple.edu" target="_blank" class="cremed">meister@temple.edu</a>> wrote:</div><br><blockquote type="cite"><div style="word-wrap:break-word">
<br><div><div>On Jan 9, 2014, at 5:41 PM, Samuel Benzaquen <<a href="mailto:sbenza@google.com" target="_blank" class="cremed">sbenza@google.com</a>> wrote:</div><br><blockquote type="cite"><div dir="ltr"><br><div class="gmail_extra">
<br><br><div class="gmail_quote">On Wed, Jan 8, 2014 at 2:44 AM, Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank" class="cremed">klimek@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">+Sam, who has written the dynamic registry stuff for ideas...</div>

<div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jan 7, 2014 at 7:50 PM, Christian Schafmeister <span dir="ltr"><<a href="mailto:chris.schaf@verizon.net" target="_blank" class="cremed">chris.schaf@verizon.net</a>></span> wrote:<br>


</div></div></div></div></blockquote><div><br></div><div><div>Most of them are simple functions, but there are also a lot that are "polymorphic". That is, they return a proxy type that allows late binding of the real matcher type.</div>

<div>During the implementation of the dynamic matcher registry I changed all these polymorphic/adaptative types to provide extra type information that allowed the registry to instantiate all the required functions.</div>
</div>
<div><br></div><div>What about this?</div><div>Instead of wrapping the actual matchers the way it is done in C++, you could make meta matchers that really only know their name and their arguments.</div><div>Basically all matchers would be functions that return an object that has a name() method and a list of their arguments.<br>

</div><div>Then you can generate the C++ matcher string and use the C++ matcher parser to generate the actual matcher.</div><div>This way you only wrap a few [simple] functions from C++ and are shielded from the template metaprogramming craziness.</div>

<div>Hadn't thought this through, so it might be too simple to work =P.</div><div><br></div></div></div></div></blockquote><div><br></div>I think I solved the problem by hacking the Registry.cpp, Registry.h, Marshaller.h and Diagnostics.h files to deal with Symbols and Conses.  I can now assemble ASTMatchers from s-expressions.</div>
<div><br></div><div>However, when I upgraded to the TOT LLVM/CLANG build to get access to the MatchFinder::addDynamicMatcher function all hell broke loose with my exception handling code.</div><div><br></div><div>For some reason the TOT LLVM/CLANG build is hiding my RTTI typeinfo for some exception classes that I define in my executable and need to catch in my generated code (loaded from bitcode files).</div>
<div><br></div><div>I’ll post a question about this to the group shortly.</div><div><br></div><div><br></div><div><br></div><div><br><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">
<div>_Sam</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div><div><div class="gmail_extra"><div class="gmail_quote"></div><br></div>
</div></div></blockquote></div><br></div></div>
</blockquote></div><br></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div></div>