[cfe-dev] RFC: What does this matcher mean to you?

Manuel Klimek klimek at google.com
Wed Jun 5 09:23:54 PDT 2013


On Wed, Jun 5, 2013 at 5:53 PM, Vane, Edwin <edwin.vane at intel.com> wrote:

>
>
> > -----Original Message-----
> > From: Daniel Jasper [mailto:djasper at google.com]
> > Sent: Tuesday, June 04, 2013 5:22 AM
> > To: Vane, Edwin
> > Cc: Manuel Klimek; Gábor Kozár; Clang Dev List (cfe-dev at cs.uiuc.edu)
> > Subject: Re: [cfe-dev] RFC: What does this matcher mean to you?
> >
> > I think this question is basically not about equalsBoundNodes() at all.
> >
> > The questions that needs answering are:
> > - What should stmt(forEachDescendant(varDecl().bind("var")),
> > forEachDescendant(declRefExpr().bind("decl"))) do?
> > - What should stmt(forEachDescendant(varDecl().bind("var")),
> > has(declRefExpr().bind("decl"))) do?
> >
> > I think the first should call the callback for each pair (VarDecl,
> DeclRefExpr)
> > under each Stmt. And the second should call the callback once for each
> VarDecl
> > under a Stmt that has a DeclRefExpr-child.
>
> I agree. This is in line with the current definition and behaviour of the
> involved matchers. I interpret the 'filtering' behaviour as something new
> that, if we want to implement it, needs a different matcher to expose. I
> think the equalsBoundNode() matcher is independent of the filtering
> behaviour.
>

I think with the proposed change to how we match, the equalsBoundNode would
naturally fit in as filtering matcher...


>
> > The matchers themselves match, if the callback was invoked at least once.
> >
> > I think we need to answer these questions first and then the behavior of
> > equalsBoundNodes() will follow naturally.
> >
> >
> > On Thu, May 23, 2013 at 3:01 PM, Vane, Edwin <edwin.vane at intel.com>
> wrote:
> >
> >
> >       To help stimulate discussion, let me present the two ways this
> matcher
> > has been interpreted:
> >
> >       1) An "all or nothing" matcher. equalsBoundNode("X") returns true
> if
> > there exists any previously bound node called "X" and that node
> satisfies an
> > identity relationship with the node passed to equalsBoundNode. If no
> such node
> > exists, the matcher just returns false and the match fails, much like
> any other
> > matcher.
> >       2) As a filter. Consider the matches found by forEach*() as the
> set of
> > matches. Then the has() matcher containing equalsBoundNode() is used as a
> > filter over this set. Whenever equalsBoundNode() locates a previously
> bound
> > node with the correct name and satisfying the identity condition, it's
> really
> > referring to a node in the match set. If the has() matcher fails, the
> node gets
> > removed from the match set.
> >
> >       The difference can be seen by looking at what matches get returned
> > from either interpretation. With #1, as long as a functionDecl has at
> least one
> > call statement to a function returning a type that matches any of the
> varDecls
> > found within ifStmt's, the function will match and the set of bound
> nodes will be
> > *every* varDecl found within ifStmts.
> >
> >       With #2, the matcher will match (When? Same as #1? Only if the set
> of
> > bound nodes is non-empty?) and the set of bound nodes will be only those
> > varDecls whose type matches the return type of a function called
> somewhere in
> > the function.
> >
> >       I have my thoughts on both but don't want to influence anybody
> before
> > hearing opinions first.
> >
> >
> >       > -----Original Message-----
> >       > From: Manuel Klimek [mailto:klimek at google.com]
> >       > Sent: Thursday, May 23, 2013 5:42 AM
> >       > To: Gábor Kozár
> >       > Cc: Vane, Edwin; Clang Dev List (cfe-dev at cs.uiuc.edu)
> >       > Subject: Re: [cfe-dev] RFC: What does this matcher mean to you?
> >       >
> >
> >       > For clarification: the problem is less "whether it matches", but
> for
> > which
> >       > matches you get callbacks with what bound nodes.
> >       >
> >       > The forEachDescendant(... .bind("declType")) part in the matcher
> on
> > its own will
> >       > result in a callback for each found declType child, with the
> node bound
> > to
> >       > "declType".
> >       >
> >       > The question is: given that there are multiple matches for
> > forEachDescendant,
> >       > what is the behavior of the has(... equalsBoundNode("declType"))
> > part:
> >       > How many callbacks with which bound nodes do you expect?
> >       >
> >       > Cheers,
> >       > /Manuel
> >       >
> >       >
> >       >
> >       > On Tue, May 21, 2013 at 7:35 PM, Gábor Kozár
> > <kozargabor at gmail.com>
> >       > wrote:
> >       >
> >       >
> >       >       I would expect it the equalsBoundNode("declType") to
> either:
> >       >
> >       >        - raise an error (assertion failure or exception) or
> >       >        - check all nodes bound to "declType", and return true if
> any of
> > them is
> >       > equal
> >       >
> >       >       Perhaps different variants could be introduced with both
> > behaviors? For
> >       > example, equalsBoundNode(string) would only work if there is
> exactly
> > one node
> >       > bound to the specified name, while equalsAnyBoundNode(string)
> > would look for
> >       > equality in any node bound to the specified name.
> >       >
> >       >
> >       >       2013/5/21 Vane, Edwin <edwin.vane at intel.com>
> >       >
> >       >
> >       >               We're trying to determine the semantics of the
> proposed new
> >       > 'equalsBoundNode()' matcher. Before I present the aforementioned
> > matcher
> >       > expression let me illustrate what this new matcher does. Given
> that
> > you've
> >       > bound a node earlier in a matcher expression with a name "X",
> >       > equalsBoundNode("X") allows you to refer back to that bound node
> > and test for
> >       > identity. For example, here's a matcher finding VarDecl's where
> the
> > type
> >       > matches the initializer type:
> >       >
> >       >               varDecl(hasType(qualType().bind("type")),
> >       >
> >       >
> >
> hasInitializer(ignoringParenImpCasts(hasType(qualType(equalsBoundNode("type
> >       > "))))))));
> >       >
> >       >               Semantics get more interesting where forEach*()
> matchers are
> >       > concerned. So this is where I ask: What would you expect the
> > following matcher
> >       > to do? How would you expect it to behave?
> >       >
> >       >                   functionDecl(
> >       >                     forEachDescendant(
> >       >                       ifStmt(
> >       >                         forEachDescendant(
> >       >
> varDecl(hasType(qualType().bind("declType")))
> >       >                         )
> >       >                       )
> >       >                     ),
> >       >                     has(compoundStmt(has(
> >       >                       callExpr(
> >       >                         callee(
> >       >                           functionDecl(
> >       >
> returns(qualType(equalsBoundNode("declType")))
> >       >                           )
> >       >                         )
> >       >                       )
> >       >                     )))
> >       >                   );
> >       >
> >       >
> >       >               --
> >       >               Edwin Vane
> >       >                 Software Developer
> >       >                 Intel of Canada, Inc.
> >       >
> >       >
> >       >               _______________________________________________
> >       >               cfe-dev mailing list
> >       >               cfe-dev at cs.uiuc.edu
> >       >               http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >       >
> >       >
> >       >
> >       >
> >       >       _______________________________________________
> >       >       cfe-dev mailing list
> >       >       cfe-dev at cs.uiuc.edu
> >       >       http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >       >
> >       >
> >       >
> >
> >
> >       _______________________________________________
> >       cfe-dev mailing list
> >       cfe-dev at cs.uiuc.edu
> >       http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130605/6a67f355/attachment.html>


More information about the cfe-dev mailing list