<div dir="ltr">On Tue, Sep 17, 2013 at 3:17 PM, Jesper Eskilson <span dir="ltr"><<a href="mailto:jesper.eskilson@iar.com" target="_blank">jesper.eskilson@iar.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 09/17/2013 02:50 PM, Manuel Klimek wrote:<div><div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Tue, Sep 17, 2013 at 2:24 PM, Jesper Eskilson <<a href="mailto:jesper.eskilson@iar.com" target="_blank">jesper.eskilson@iar.com</a> <mailto:<a href="mailto:jesper.eskilson@iar.com" target="_blank">jesper.eskilson@iar.<u></u>com</a>>> wrote:<br>

<br>
<br>
    Hello,<br>
<br>
    I'm trying to write an AST matcher rule which is able to match<br>
    method definitions. Given the following C++ source code:<br>
<br>
        class B<br>
        {<br>
          void foo();<br>
          void bar() {<br>
            int a_local_variable_in_bar;<br>
          }<br>
        };<br>
<br>
        void B::foo()<br>
        {<br>
          int a_local_variable_in_foo;<br>
        }<br>
<br>
        B b<br>
<br>
        int main()<br>
        {<br>
        }<br>
<br>
<br>
    I would like a matcher which can tell me where instances of B are<br>
    created and also give me the definitions of its methods (in this<br>
    case "foo" and "bar").<br>
<br>
          StatementMatcher m = constructExpr(<br>
              hasType(<br>
                  recordDecl(<u></u>isSameOrDerivedFrom("B"),<br>
        hasMethod(methodDecl(<u></u>isDefinition()).bind("method")<u></u>))));<br>
<br>
<br>
    But it will only give me the definition of "bar", and not the<br>
    defintion of "foo" which is declared outside the class.<br>
<br>
<br>
This is because hasMethod will not give you anything outside of the class definition. The reason is that you often don't see out-of-class method definitions of when you have a class definition.<br>
<br>
If you already know the name of the class (as you specify it in your matcher), why do you want to write this matcher in the first place? You'll not be able to match all constructor calls and method definitions in general, as classes may be instantiated in a translation unit where not all method definitions are visible.<br>

<br>
If you have more details on what you're actually trying to do (on a higher level) we might be able to help more...<br>
<br>
    If I cannot do this with matchers, is there a way to get to the<br>
    definition of "foo" given the declaration of the class B?<br>
<br>
<br>
No, as you might see the class definition in a header where foo is not visible. Usually you'll want to go the other way - find all method definitions of class "B".<br>
<br>
</blockquote>
<br></div></div>
I have a bunch of class instantiations in a large codebase which look like this<br>
<br>
A a1("banana", new B1);<br>
A a2("apple", new B2);<br>
A a3("ananas", new B2);<br>
<br>
B1, B2, B3, all inherit from B which defines a method "foo" (outside the declaration of B). This definition may or may not be overridden in B1/B2/B3.<br>
<br>
I want to be able to generate output on the form:<br>
<br>
banana:<br>
    void foo() { /* this is the foo implementation in class B1 */ }<br>
apple:<br>
    void foo() { /* this is the foo implementation in class B2 */ }<br>
ananas:<br>
    void foo() { /* this is the foo implementation in class B3 */ }<br>
<br>
I was thinking about first matching out all the different definitions of foo, and then in a separate matcher match the construction expressions of a1-a3, but I'm not sure of the best way to "share" information between matchers.</blockquote>
<div><br></div><div>Create intermediate output:</div><div>- output all paremeter combinations ("banana", "B1"), ("apple, "B2")</div><div>- output all method definitions ("B1", "void foo() { ... }"), ...</div>
<div>store the intermediate results. After running over all translation units, do a "reduce" step where you combine the information by using the class as the key</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5"><br>
<br>
-- <br>
*Jesper Eskilson* /Development Engineer/<br>
IAR Systems AB<br>
Box 23051, Strandbodgatan 1<br>
SE-750 23 Uppsala, SWEDEN<br>
E-mail: <a href="mailto:jesper.eskilson@iar.com" target="_blank">jesper.eskilson@iar.com</a> <mailto:<a href="mailto:jesper.eskilson@iar.com" target="_blank">jesper.eskilson@iar.<u></u>com</a>> Website: <a href="http://www.iar.com" target="_blank">www.iar.com</a><br>

<<a href="http://www.iar.com" target="_blank">http://www.iar.com</a>> Twitter: <a href="http://www.twitter.com/iarsystems" target="_blank">www.twitter.com/iarsystems</a> <<a href="http://www.twitter.com/iarsystems" target="_blank">http://www.twitter.com/<u></u>iarsystems</a>><br>

</div></div></blockquote></div><br></div></div>