mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 12:36:10 +00:00
Add translationUnitDecl matcher.
Summary: Add translationUnitDecl matcher. Reviewers: alexfh Subscribers: klimek, cfe-commits Differential Revision: http://reviews.llvm.org/D7512 llvm-svn: 228694
This commit is contained in:
parent
5d9862f071
commit
ef621f43ff
@ -307,6 +307,19 @@ Example matches X, Z
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('translationUnitDecl0')"><a name="translationUnitDecl0Anchor">translationUnitDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TranslationUnitDecl.html">TranslationUnitDecl</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="translationUnitDecl0"><pre>Matches the top declaration context.
|
||||
|
||||
Given
|
||||
int X;
|
||||
namespace NS {
|
||||
int Y;
|
||||
} namespace NS
|
||||
decl(hasDeclContext(translationUnitDecl()))
|
||||
matches "int X", but not "int Y".
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('typedefDecl0')"><a name="typedefDecl0Anchor">typedefDecl</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypedefDecl.html">TypedefDecl</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="typedefDecl0"><pre>Matches typedef declarations.
|
||||
|
||||
@ -1525,7 +1538,7 @@ Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOpe
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>StringRef BaseName</td></tr>
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isDerivedFrom1')"><a name="isDerivedFrom1Anchor">isDerivedFrom</a></td><td>std::string BaseName</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isDerivedFrom1"><pre>Overloaded method as shortcut for isDerivedFrom(hasName(...)).
|
||||
</pre></td></tr>
|
||||
|
||||
@ -1544,7 +1557,7 @@ Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Functi
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>StringRef BaseName</td></tr>
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('isSameOrDerivedFrom1')"><a name="isSameOrDerivedFrom1Anchor">isSameOrDerivedFrom</a></td><td>std::string BaseName</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isSameOrDerivedFrom1"><pre>Overloaded method as shortcut for
|
||||
isSameOrDerivedFrom(hasName(...)).
|
||||
</pre></td></tr>
|
||||
@ -1721,19 +1734,6 @@ by the compiler (eg. implicit defaultcopy constructors).
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
|
||||
template instantiations.
|
||||
|
||||
Given
|
||||
template<typename T> void A(T t) { T i; }
|
||||
A(0);
|
||||
A(0U);
|
||||
functionDecl(isInstantiated())
|
||||
matches 'A(int) {...};' and 'A(unsigned) {...}'.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>></td><td class="name" onclick="toggle('isPrivate0')"><a name="isPrivate0Anchor">isPrivate</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isPrivate0"><pre>Matches private C++ declarations.
|
||||
|
||||
@ -2093,22 +2093,6 @@ Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.h
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
|
||||
|
||||
Given
|
||||
int j;
|
||||
template<typename T> void A(T t) { T i; j += 42;}
|
||||
A(0);
|
||||
A(0U);
|
||||
declStmt(isInTemplateInstantiation())
|
||||
matches 'int i;' and 'unsigned i'.
|
||||
unless(stmt(isInTemplateInstantiation()))
|
||||
will NOT match j += 42; as it's shared between the template definition and
|
||||
instantiation.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TagDecl.html">TagDecl</a>></td><td class="name" onclick="toggle('isDefinition0')"><a name="isDefinition0Anchor">isDefinition</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isDefinition0"><pre>Matches if a declaration has a body attached.
|
||||
|
||||
@ -2229,6 +2213,16 @@ and reference to that variable declaration within a compound statement.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('voidType0')"><a name="voidType0Anchor">voidType</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="voidType0"><pre>Matches type void.
|
||||
|
||||
Given
|
||||
struct S { void func(); };
|
||||
functionDecl(returns(voidType()))
|
||||
matches "void func();"
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1UnaryExprOrTypeTraitExpr.html">UnaryExprOrTypeTraitExpr</a>></td><td class="name" onclick="toggle('ofKind0')"><a name="ofKind0Anchor">ofKind</a></td><td>UnaryExprOrTypeTrait Kind</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="ofKind0"><pre>Matches unary expressions of a certain kind.
|
||||
|
||||
@ -2323,6 +2317,35 @@ recordDecl(hasName("::X"), isTemplateInstantiation())
|
||||
Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html">FunctionDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>>, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>>
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Decl.html">Decl</a>>></td><td class="name" onclick="toggle('isInstantiated0')"><a name="isInstantiated0Anchor">isInstantiated</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isInstantiated0"><pre>Matches declarations that are template instantiations or are inside
|
||||
template instantiations.
|
||||
|
||||
Given
|
||||
template<typename T> void A(T t) { T i; }
|
||||
A(0);
|
||||
A(0U);
|
||||
functionDecl(isInstantiated())
|
||||
matches 'A(int) {...};' and 'A(unsigned) {...}'.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<internal::Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>>></td><td class="name" onclick="toggle('isInTemplateInstantiation0')"><a name="isInTemplateInstantiation0Anchor">isInTemplateInstantiation</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isInTemplateInstantiation0"><pre>Matches statements inside of a template instantiation.
|
||||
|
||||
Given
|
||||
int j;
|
||||
template<typename T> void A(T t) { T i; j += 42;}
|
||||
A(0);
|
||||
A(0U);
|
||||
declStmt(isInTemplateInstantiation())
|
||||
matches 'int i;' and 'unsigned i'.
|
||||
unless(stmt(isInTemplateInstantiation()))
|
||||
will NOT match j += 42; as it's shared between the template definition and
|
||||
instantiation.
|
||||
</pre></td></tr>
|
||||
|
||||
<!--END_NARROWING_MATCHERS -->
|
||||
</table>
|
||||
|
||||
|
@ -143,6 +143,20 @@ typedef internal::Matcher<NestedNameSpecifierLoc> NestedNameSpecifierLocMatcher;
|
||||
/// Usable as: Any Matcher
|
||||
inline internal::TrueMatcher anything() { return internal::TrueMatcher(); }
|
||||
|
||||
/// \brief Matches the top declaration context.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// int X;
|
||||
/// namespace NS {
|
||||
/// int Y;
|
||||
/// } // namespace NS
|
||||
/// \endcode
|
||||
/// decl(hasDeclContext(translationUnitDecl()))
|
||||
/// matches "int X", but not "int Y".
|
||||
const internal::VariadicDynCastAllOfMatcher<Decl, TranslationUnitDecl>
|
||||
translationUnitDecl;
|
||||
|
||||
/// \brief Matches typedef declarations.
|
||||
///
|
||||
/// Given
|
||||
|
@ -315,6 +315,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(throughUsingDecl);
|
||||
REGISTER_MATCHER(throwExpr);
|
||||
REGISTER_MATCHER(to);
|
||||
REGISTER_MATCHER(translationUnitDecl);
|
||||
REGISTER_MATCHER(tryStmt);
|
||||
REGISTER_MATCHER(type);
|
||||
REGISTER_MATCHER(typedefDecl);
|
||||
|
@ -379,6 +379,21 @@ TEST(DeclarationMatcher, hasDeclContext) {
|
||||
EXPECT_TRUE(matches("class D{};", decl(hasDeclContext(decl()))));
|
||||
}
|
||||
|
||||
TEST(DeclarationMatcher, translationUnitDecl) {
|
||||
const std::string Code = "int MyVar1;\n"
|
||||
"namespace NameSpace {\n"
|
||||
"int MyVar2;\n"
|
||||
"} // namespace NameSpace\n";
|
||||
EXPECT_TRUE(matches(
|
||||
Code, varDecl(hasName("MyVar1"), hasDeclContext(translationUnitDecl()))));
|
||||
EXPECT_FALSE(matches(
|
||||
Code, varDecl(hasName("MyVar2"), hasDeclContext(translationUnitDecl()))));
|
||||
EXPECT_TRUE(matches(
|
||||
Code,
|
||||
varDecl(hasName("MyVar2"),
|
||||
hasDeclContext(decl(hasDeclContext(translationUnitDecl()))))));
|
||||
}
|
||||
|
||||
TEST(DeclarationMatcher, LinkageSpecification) {
|
||||
EXPECT_TRUE(matches("extern \"C\" { void foo() {}; }", linkageSpecDecl()));
|
||||
EXPECT_TRUE(notMatches("void foo() {};", linkageSpecDecl()));
|
||||
|
Loading…
x
Reference in New Issue
Block a user