Author: klimek
Date: Mon Feb 24 04:40:22 2014
New Revision: 202019

URL: http://llvm.org/viewvc/llvm-project?rev=202019&view=rev
Log:
Fix AST matcher documentation for overloaded matchers.

Before this patch we would only use the fist occurance of a matcher
function in the documentation, for example leaving out
hasType(Matcher<QualType>).

Modified:
    cfe/trunk/docs/LibASTMatchersReference.html
    cfe/trunk/docs/tools/dump_ast_matchers.py

Modified: cfe/trunk/docs/LibASTMatchersReference.html
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=202019&r1=202018&r2=202019&view=diff
==============================================================================
--- cfe/trunk/docs/LibASTMatchersReference.html (original)
+++ cfe/trunk/docs/LibASTMatchersReference.html Mon Feb 24 04:40:22 2014
@@ -2043,24 +2043,6 @@ Usable as: Any Matcher
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a 
name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
-<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have 
child AST nodes that match the
-provided matcher.
-
-Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
-  class X {};  Matches X, because X::X is a class of name X inside X.
-  class Y { class X {}; };
-  class Z { class Y { class X {}; }; };  Does not match Z.
-
-ChildT must be an AST base type.
-
-As opposed to 'has', 'forEach' will cause a match for each result that
-matches instead of only on the first one.
-
-Usable as: Any Matcher
-</pre></td></tr>
-
-
 <tr><td>Matcher&lt;*&gt;</td><td class="name" 
onclick="toggle('forEachDescendant0')"><a 
name="forEachDescendant0Anchor">forEachDescendant</a></td><td>Matcher&lt;*&gt;</td></tr>
 <tr><td colspan="4" class="doc" id="forEachDescendant0"><pre>Matches AST nodes 
that have descendant AST nodes that match the
 provided matcher.
@@ -2085,17 +2067,20 @@ Usable as: Any Matcher
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a 
name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
-<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have 
child AST nodes that match the
+<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('forEach0')"><a 
name="forEach0Anchor">forEach</a></td><td>Matcher&lt;*&gt;</td></tr>
+<tr><td colspan="4" class="doc" id="forEach0"><pre>Matches AST nodes that have 
child AST nodes that match the
 provided matcher.
 
-Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
+Example matches X, Y (matcher = recordDecl(forEach(recordDecl(hasName("X")))
   class X {};  Matches X, because X::X is a class of name X inside X.
   class Y { class X {}; };
   class Z { class Y { class X {}; }; };  Does not match Z.
 
 ChildT must be an AST base type.
 
+As opposed to 'has', 'forEach' will cause a match for each result that
+matches instead of only on the first one.
+
 Usable as: Any Matcher
 </pre></td></tr>
 
@@ -2129,6 +2114,21 @@ Usable as: Any Matcher
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt;*&gt;</td><td class="name" onclick="toggle('has0')"><a 
name="has0Anchor">has</a></td><td>Matcher&lt;*&gt;</td></tr>
+<tr><td colspan="4" class="doc" id="has0"><pre>Matches AST nodes that have 
child AST nodes that match the
+provided matcher.
+
+Example matches X, Y (matcher = recordDecl(has(recordDecl(hasName("X")))
+  class X {};  Matches X, because X::X is a class of name X inside X.
+  class Y { class X {}; };
+  class Z { class Y { class X {}; }; };  Does not match Z.
+
+ChildT must be an AST base type.
+
+Usable as: Any Matcher
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt;*&gt;</td><td class="name" 
onclick="toggle('hasParent0')"><a 
name="hasParent0Anchor">hasParent</a></td><td>Matcher&lt;*&gt;</td></tr>
 <tr><td colspan="4" class="doc" id="hasParent0"><pre>Matches AST nodes that 
have a parent that matches the provided
 matcher.
@@ -2403,6 +2403,10 @@ matches 'int x' in
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>&gt;</td><td
 class="name" onclick="toggle('onImplicitObjectArgument0')"><a 
name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt<a
 href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" 
id="onImplicitObjectArgument0"><pre></pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>&gt;</td><td
 class="name" onclick="toggle('on0')"><a 
name="on0Anchor">on</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="on0"><pre>Matches on the implicit object 
argument of a member call expression.
 
@@ -2414,15 +2418,17 @@ FIXME: Overload to allow directly matchi
 </pre></td></tr>
 
 
-<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>&gt;</td><td
 class="name" onclick="toggle('onImplicitObjectArgument0')"><a 
name="onImplicitObjectArgument0Anchor">onImplicitObjectArgument</a></td><td>Matcher&lt<a
 href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
-<tr><td colspan="4" class="doc" 
id="onImplicitObjectArgument0"><pre></pre></td></tr>
-
-
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>&gt;</td><td
 class="name" onclick="toggle('thisPointerType1')"><a 
name="thisPointerType1Anchor">thisPointerType</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="thisPointerType1"><pre>Overloaded to match 
the type's declaration.
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMemberCallExpr.html";>CXXMemberCallExpr</a>&gt;</td><td
 class="name" onclick="toggle('thisPointerType0')"><a 
name="thisPointerType0Anchor">thisPointerType</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
 InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="thisPointerType0"><pre>Matches if the 
expression's type either matches the specified
+matcher, or is a pointer to a type that matches the InnerMatcher.
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXMethodDecl.html";>CXXMethodDecl</a>&gt;</td><td
 class="name" onclick="toggle('ofClass0')"><a 
name="ofClass0Anchor">ofClass</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html";>CXXRecordDecl</a>&gt;
 InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="ofClass0"><pre>Matches the class 
declaration that the given method declaration
 belongs to.
@@ -2491,6 +2497,24 @@ Example matches y.x() (matcher = callExp
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;</td><td
 class="name" onclick="toggle('callee0')"><a 
name="callee0Anchor">callee</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html";>Stmt</a>&gt; 
InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="callee0"><pre>Matches if the call 
expression's callee expression matches.
+
+Given
+  class Y { void x() { this-&gt;x(); x(); Y y; y.x(); } };
+  void f() { f(); }
+callExpr(callee(expr()))
+  matches this-&gt;x(), x(), y.x(), f()
+with callee(...)
+  matching this-&gt;x, x, y.x, f respectively
+
+Note: Callee cannot take the more general internal::Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt;
+because this introduces ambiguous overloads with calls to Callee taking a
+internal::Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;, as 
the matcher hierarchy is purely
+implemented in terms of implicit casts.
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html";>CallExpr</a>&gt;</td><td
 class="name" onclick="toggle('hasAnyArgument0')"><a 
name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument 
of a call expression or a constructor call
 expression.
@@ -2871,6 +2895,17 @@ Usable as: Matcher&lt<a href="http://cla
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt;</td><td
 class="name" onclick="toggle('hasType0')"><a 
name="hasType0Anchor">hasType</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
 InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasType0"><pre>Matches if the expression's 
or declaration's type matches a type
+matcher.
+
+Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
+ class X {};
+ void y(X &amp;x) { x; X z; }
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt;</td><td
 class="name" onclick="toggle('ignoringImpCasts0')"><a 
name="ignoringImpCasts0Anchor">ignoringImpCasts</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="ignoringImpCasts0"><pre>Matches 
expressions that match InnerMatcher after any implicit casts
 are stripped off.
@@ -3318,11 +3353,36 @@ Usable as: Matcher&lt<a href="http://cla
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;</td><td
 class="name" onclick="toggle('pointsTo0')"><a 
name="pointsTo0Anchor">pointsTo</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
 InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="pointsTo0"><pre>Matches if the matched 
type is a pointer type and the pointee type
+matches the specified matcher.
+
+Example matches y-&gt;x()
+    (matcher = callExpr(on(hasType(pointsTo(recordDecl(hasName("Y")))))))
+  class Y { public: void x(); };
+  void z() { Y *y; y-&gt;x(); }
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;</td><td
 class="name" onclick="toggle('references1')"><a 
name="references1Anchor">references</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="references1"><pre>Overloaded to match the 
referenced type's declaration.
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;</td><td
 class="name" onclick="toggle('references0')"><a 
name="references0Anchor">references</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
 InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="references0"><pre>Matches if the matched 
type is a reference type and the referenced
+type matches the specified matcher.
+
+Example matches X &amp;x and const X &amp;y
+    (matcher = varDecl(hasType(references(recordDecl(hasName("X"))))))
+  class X {
+    void a(X b) {
+      X &amp;x = b;
+      const X &amp;y = b;
+  };
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1RecordType.html";>RecordType</a>&gt;</td><td
 class="name" onclick="toggle('hasDeclaration5')"><a 
name="hasDeclaration5Anchor">hasDeclaration</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html";>Decl</a>&gt;  
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="hasDeclaration5"><pre>Matches a node if 
the declaration associated with that node
 matches the given matcher.
@@ -3662,6 +3722,17 @@ Usable as: Matcher&lt<a href="http://cla
 </pre></td></tr>
 
 
+<tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1ValueDecl.html";>ValueDecl</a>&gt;</td><td
 class="name" onclick="toggle('hasType1')"><a 
name="hasType1Anchor">hasType</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html";>QualType</a>&gt;
 InnerMatcher</td></tr>
+<tr><td colspan="4" class="doc" id="hasType1"><pre>Matches if the expression's 
or declaration's type matches a type
+matcher.
+
+Example matches x (matcher = expr(hasType(recordDecl(hasName("X")))))
+            and z (matcher = varDecl(hasType(recordDecl(hasName("X")))))
+ class X {};
+ void y(X &amp;x) { x; X z; }
+</pre></td></tr>
+
+
 <tr><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html";>VarDecl</a>&gt;</td><td
 class="name" onclick="toggle('hasInitializer0')"><a 
name="hasInitializer0Anchor">hasInitializer</a></td><td>Matcher&lt<a 
href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html";>Expr</a>&gt; 
InnerMatcher</td></tr>
 <tr><td colspan="4" class="doc" id="hasInitializer0"><pre>Matches a variable 
declaration that has an initializer expression
 that matches the given matcher.

Modified: cfe/trunk/docs/tools/dump_ast_matchers.py
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/tools/dump_ast_matchers.py?rev=202019&r1=202018&r2=202019&view=diff
==============================================================================
--- cfe/trunk/docs/tools/dump_ast_matchers.py (original)
+++ cfe/trunk/docs/tools/dump_ast_matchers.py Mon Feb 24 04:40:22 2014
@@ -119,9 +119,9 @@ def add_matcher(result_type, name, args,
   # arguments.
   elif ('Matcher<' not in args or
         name in ['allOf', 'anyOf', 'anything', 'unless']):
-    narrowing_matchers[result_type + name] = matcher_html
+    narrowing_matchers[result_type + name + esc(args)] = matcher_html
   else:
-    traversal_matchers[result_type + name] = matcher_html
+    traversal_matchers[result_type + name + esc(args)] = matcher_html
 
 def act_on_decl(declaration, comment, allowed_types):
   """Parse the matcher out of the given declaration and comment.


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to