forked from OSchip/llvm-project
Add hasLocalStorage/hasGlobalStorage matchers.
Summary: Add hasLocalStorage/hasGlobalStorage matchers for VarDecl nodes. Update the doc. Also add them to the dynamic registry. Reviewers: klimek Subscribers: klimek, cfe-commits Differential Revision: http://reviews.llvm.org/D4034 llvm-svn: 210278
This commit is contained in:
parent
0d2f580200
commit
f56a29924f
|
@ -1966,6 +1966,31 @@ Example matches a || b (matcher = binaryOperator(hasOperatorName("||")))
|
|||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasGlobalStorage0')"><a name="hasGlobalStorage0Anchor">hasGlobalStorage</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasGlobalStorage0"><pre>Matches a variable declaration that does not have local storage.
|
||||
|
||||
Example matches y and z (matcher = varDecl(hasGlobalStorage())
|
||||
void f() {
|
||||
int x;
|
||||
static int y;
|
||||
}
|
||||
int z;
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('hasLocalStorage0')"><a name="hasLocalStorage0Anchor">hasLocalStorage</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasLocalStorage0"><pre>Matches a variable declaration that has function scope and is a
|
||||
non-static local variable.
|
||||
|
||||
Example matches x (matcher = varDecl(hasLocalStorage())
|
||||
void f() {
|
||||
int x;
|
||||
static int y;
|
||||
}
|
||||
int z;
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html">VarDecl</a>></td><td class="name" onclick="toggle('isDefinition1')"><a name="isDefinition1Anchor">isDefinition</a></td><td></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="isDefinition1"><pre>Matches if a declaration has a body attached.
|
||||
|
||||
|
|
|
@ -2058,6 +2058,35 @@ AST_MATCHER_P(
|
|||
InnerMatcher.matches(*Initializer, Finder, Builder));
|
||||
}
|
||||
|
||||
/// \brief Matches a variable declaration that has function scope and is a
|
||||
/// non-static local variable.
|
||||
///
|
||||
/// Example matches x (matcher = varDecl(hasLocalStorage())
|
||||
/// \code
|
||||
/// void f() {
|
||||
/// int x;
|
||||
/// static int y;
|
||||
/// }
|
||||
/// int z;
|
||||
/// \endcode
|
||||
AST_MATCHER(VarDecl, hasLocalStorage) {
|
||||
return Node.hasLocalStorage();
|
||||
}
|
||||
|
||||
/// \brief Matches a variable declaration that does not have local storage.
|
||||
///
|
||||
/// Example matches y and z (matcher = varDecl(hasGlobalStorage())
|
||||
/// \code
|
||||
/// void f() {
|
||||
/// int x;
|
||||
/// static int y;
|
||||
/// }
|
||||
/// int z;
|
||||
/// \endcode
|
||||
AST_MATCHER(VarDecl, hasGlobalStorage) {
|
||||
return Node.hasGlobalStorage();
|
||||
}
|
||||
|
||||
/// \brief Checks that a call expression or a constructor call expression has
|
||||
/// a specific number of arguments (including absent default arguments).
|
||||
///
|
||||
|
|
|
@ -189,12 +189,14 @@ RegistryMaps::RegistryMaps() {
|
|||
REGISTER_MATCHER(hasEitherOperand);
|
||||
REGISTER_MATCHER(hasElementType);
|
||||
REGISTER_MATCHER(hasFalseExpression);
|
||||
REGISTER_MATCHER(hasGlobalStorage);
|
||||
REGISTER_MATCHER(hasImplicitDestinationType);
|
||||
REGISTER_MATCHER(hasIncrement);
|
||||
REGISTER_MATCHER(hasIndex);
|
||||
REGISTER_MATCHER(hasInitializer);
|
||||
REGISTER_MATCHER(hasLHS);
|
||||
REGISTER_MATCHER(hasLocalQualifiers);
|
||||
REGISTER_MATCHER(hasLocalStorage);
|
||||
REGISTER_MATCHER(hasLoopInit);
|
||||
REGISTER_MATCHER(hasMethod);
|
||||
REGISTER_MATCHER(hasName);
|
||||
|
|
|
@ -1165,6 +1165,18 @@ TEST(Matcher, VariableUsage) {
|
|||
"}", Reference));
|
||||
}
|
||||
|
||||
TEST(Matcher, VarDecl_Storage) {
|
||||
auto M = varDecl(hasName("X"), hasLocalStorage());
|
||||
EXPECT_TRUE(matches("void f() { int X; }", M));
|
||||
EXPECT_TRUE(notMatches("int X;", M));
|
||||
EXPECT_TRUE(notMatches("void f() { static int X; }", M));
|
||||
|
||||
M = varDecl(hasName("X"), hasGlobalStorage());
|
||||
EXPECT_TRUE(notMatches("void f() { int X; }", M));
|
||||
EXPECT_TRUE(matches("int X;", M));
|
||||
EXPECT_TRUE(matches("void f() { static int X; }", M));
|
||||
}
|
||||
|
||||
TEST(Matcher, FindsVarDeclInFunctionParameter) {
|
||||
EXPECT_TRUE(matches(
|
||||
"void f(int i) {}",
|
||||
|
|
Loading…
Reference in New Issue