Skip to content

Commit ef621f4

Browse files
committedFeb 10, 2015
Add translationUnitDecl matcher.
Summary: Add translationUnitDecl matcher. Reviewers: alexfh Subscribers: klimek, cfe-commits Differential Revision: http://reviews.llvm.org/D7512 llvm-svn: 228694
1 parent 5d9862f commit ef621f4

File tree

4 files changed

+84
-31
lines changed

4 files changed

+84
-31
lines changed
 

‎clang/docs/LibASTMatchersReference.html

+54-31
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,19 @@ <h2 id="decl-matchers">Node Matchers</h2>
307307
</pre></td></tr>
308308

309309

310+
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>&gt;...</td></tr>
311+
<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
312+
313+
Given
314+
int X;
315+
namespace NS {
316+
int Y;
317+
} namespace NS
318+
decl(hasDeclContext(translationUnitDecl()))
319+
matches "int X", but not "int Y".
320+
</pre></td></tr>
321+
322+
310323
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>&gt;...</td></tr>
311324
<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
312325

@@ -1525,7 +1538,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
15251538
</pre></td></tr>
15261539

15271540

1528-
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>StringRef BaseName</td></tr>
1541+
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
15291542
<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
15301543
</pre></td></tr>
15311544

@@ -1544,7 +1557,7 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
15441557
</pre></td></tr>
15451558

15461559

1547-
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>StringRef BaseName</td></tr>
1560+
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;</td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
15481561
<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
15491562
isSameOrDerivedFrom(hasName(...)).
15501563
</pre></td></tr>
@@ -1721,19 +1734,6 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
17211734
</pre></td></tr>
17221735

17231736

1724-
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
1725-
<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
1726-
template instantiations.
1727-
1728-
Given
1729-
template&lt;typename T&gt; void A(T t) { T i; }
1730-
A(0);
1731-
A(0U);
1732-
functionDecl(isInstantiated())
1733-
matches 'A(int) {...};' and 'A(unsigned) {...}'.
1734-
</pre></td></tr>
1735-
1736-
17371737
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;</td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
17381738
<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
17391739

@@ -2093,22 +2093,6 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
20932093
</pre></td></tr>
20942094

20952095

2096-
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
2097-
<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2098-
2099-
Given
2100-
int j;
2101-
template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2102-
A(0);
2103-
A(0U);
2104-
declStmt(isInTemplateInstantiation())
2105-
matches 'int i;' and 'unsigned i'.
2106-
unless(stmt(isInTemplateInstantiation()))
2107-
will NOT match j += 42; as it's shared between the template definition and
2108-
instantiation.
2109-
</pre></td></tr>
2110-
2111-
21122096
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>&gt;</td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
21132097
<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
21142098

@@ -2229,6 +2213,16 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
22292213
</pre></td></tr>
22302214

22312215

2216+
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
2217+
<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
2218+
2219+
Given
2220+
struct S { void func(); };
2221+
functionDecl(returns(voidType()))
2222+
matches "void func();"
2223+
</pre></td></tr>
2224+
2225+
22322226
<tr><td>Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>&gt;</td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
22332227
<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
22342228

@@ -2323,6 +2317,35 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
23232317
Usable as: Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>&gt;, Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>&gt;
23242318
</pre></td></tr>
23252319

2320+
2321+
<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>&gt;&gt;</td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
2322+
<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
2323+
template instantiations.
2324+
2325+
Given
2326+
template&lt;typename T&gt; void A(T t) { T i; }
2327+
A(0);
2328+
A(0U);
2329+
functionDecl(isInstantiated())
2330+
matches 'A(int) {...};' and 'A(unsigned) {...}'.
2331+
</pre></td></tr>
2332+
2333+
2334+
<tr><td>Matcher&lt;internal::Matcher&lt<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>&gt;&gt;</td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
2335+
<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
2336+
2337+
Given
2338+
int j;
2339+
template&lt;typename T&gt; void A(T t) { T i; j += 42;}
2340+
A(0);
2341+
A(0U);
2342+
declStmt(isInTemplateInstantiation())
2343+
matches 'int i;' and 'unsigned i'.
2344+
unless(stmt(isInTemplateInstantiation()))
2345+
will NOT match j += 42; as it's shared between the template definition and
2346+
instantiation.
2347+
</pre></td></tr>
2348+
23262349
<!--END_NARROWING_MATCHERS -->
23272350
</table>
23282351

‎clang/include/clang/ASTMatchers/ASTMatchers.h

+14
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,20 @@ typedef internal::Matcher<NestedNameSpecifierLoc> NestedNameSpecifierLocMatcher;
143143
/// Usable as: Any Matcher
144144
inline internal::TrueMatcher anything() { return internal::TrueMatcher(); }
145145

146+
/// \brief Matches the top declaration context.
147+
///
148+
/// Given
149+
/// \code
150+
/// int X;
151+
/// namespace NS {
152+
/// int Y;
153+
/// } // namespace NS
154+
/// \endcode
155+
/// decl(hasDeclContext(translationUnitDecl()))
156+
/// matches "int X", but not "int Y".
157+
const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
158+
translationUnitDecl;
159+
146160
/// \brief Matches typedef declarations.
147161
///
148162
/// Given

‎clang/lib/ASTMatchers/Dynamic/Registry.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ RegistryMaps::RegistryMaps() {
315315
REGISTER_MATCHER(throughUsingDecl);
316316
REGISTER_MATCHER(throwExpr);
317317
REGISTER_MATCHER(to);
318+
REGISTER_MATCHER(translationUnitDecl);
318319
REGISTER_MATCHER(tryStmt);
319320
REGISTER_MATCHER(type);
320321
REGISTER_MATCHER(typedefDecl);

‎clang/unittests/ASTMatchers/ASTMatchersTest.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,21 @@ TEST(DeclarationMatcher, hasDeclContext) {
379379
EXPECT_TRUE(matches("class D{};", decl(hasDeclContext(decl()))));
380380
}
381381

382+
TEST(DeclarationMatcher, translationUnitDecl) {
383+
const std::string Code = "int MyVar1;\n"
384+
"namespace NameSpace {\n"
385+
"int MyVar2;\n"
386+
"} // namespace NameSpace\n";
387+
EXPECT_TRUE(matches(
388+
Code, varDecl(hasName("MyVar1"), hasDeclContext(translationUnitDecl()))));
389+
EXPECT_FALSE(matches(
390+
Code, varDecl(hasName("MyVar2"), hasDeclContext(translationUnitDecl()))));
391+
EXPECT_TRUE(matches(
392+
Code,
393+
varDecl(hasName("MyVar2"),
394+
hasDeclContext(decl(hasDeclContext(translationUnitDecl()))))));
395+
}
396+
382397
TEST(DeclarationMatcher, LinkageSpecification) {
383398
EXPECT_TRUE(matches("extern \"C\" { void foo() {}; }", linkageSpecDecl()));
384399
EXPECT_TRUE(notMatches("void foo() {};", linkageSpecDecl()));

0 commit comments

Comments
 (0)
Please sign in to comment.