Adding parenType() and innerType() AST Matchers
Updated docs and tests. llvm-svn: 178487
This commit is contained in:
parent
c2eddb0d02
commit
ec0748068e
|
@ -1000,6 +1000,18 @@ memberPointerType()
|
|||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('parenTypeLoc0')"><a name="parenTypeLoc0Anchor">parenTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenTypeLoc.html">ParenTypeLoc</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="parenTypeLoc0"><pre>Matches ParenType nodes.
|
||||
|
||||
Given
|
||||
int (*ptr_to_array)[4];
|
||||
int *array_of_ptrs[4];
|
||||
|
||||
varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
|
||||
array_of_ptrs.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('pointerTypeLoc0')"><a name="pointerTypeLoc0Anchor">pointerTypeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer types.
|
||||
|
||||
|
@ -1267,6 +1279,18 @@ memberPointerType()
|
|||
</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('parenType0')"><a name="parenType0Anchor">parenType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="parenType0"><pre>Matches ParenType nodes.
|
||||
|
||||
Given
|
||||
int (*ptr_to_array)[4];
|
||||
int *array_of_ptrs[4];
|
||||
|
||||
varDecl(hasType(pointsTo(parenType()))) matches ptr_to_array but not
|
||||
array_of_ptrs.
|
||||
</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('pointerType0')"><a name="pointerType0Anchor">pointerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerType.html">PointerType</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="pointerType0"><pre>Matches pointer types.
|
||||
|
||||
|
@ -2991,6 +3015,20 @@ nestedNameSpecifier(specifiesType(hasDeclaration(recordDecl(hasName("A")))))
|
|||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>></td><td class="name" onclick="toggle('innerType0')"><a name="innerType0Anchor">innerType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="innerType0"><pre>Matches ParenType nodes where the inner type is a specific type.
|
||||
|
||||
Given
|
||||
int (*ptr_to_array)[4];
|
||||
int (*ptr_to_func)(int);
|
||||
|
||||
varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
|
||||
ptr_to_func but not ptr_to_array.
|
||||
|
||||
Usable as: Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ParenType.html">ParenType</a>>
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>></td><td class="name" onclick="toggle('pointeeLoc1')"><a name="pointeeLoc1Anchor">pointeeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td></tr>
|
||||
<tr><td colspan="4" class="doc" id="pointeeLoc1"><pre>Narrows PointerType (and similar) matchers to those where the
|
||||
pointee matches a given matcher.
|
||||
|
|
|
@ -2894,6 +2894,32 @@ AST_TYPE_TRAVERSE_MATCHER(hasDeducedType, getDeducedType);
|
|||
/// matches "int (*f)(int)" and the type of "g".
|
||||
AST_TYPE_MATCHER(FunctionType, functionType);
|
||||
|
||||
/// \brief Matches \c ParenType nodes.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// int (*ptr_to_array)[4];
|
||||
/// int *array_of_ptrs[4];
|
||||
/// \endcode
|
||||
///
|
||||
/// \c varDecl(hasType(pointsTo(parenType()))) matches \c ptr_to_array but not
|
||||
/// \c array_of_ptrs.
|
||||
AST_TYPE_MATCHER(ParenType, parenType);
|
||||
|
||||
/// \brief Matches \c ParenType nodes where the inner type is a specific type.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// int (*ptr_to_array)[4];
|
||||
/// int (*ptr_to_func)(int);
|
||||
/// \endcode
|
||||
///
|
||||
/// \c varDecl(hasType(pointsTo(parenType(innerType(functionType()))))) matches
|
||||
/// \c ptr_to_func but not \c ptr_to_array.
|
||||
///
|
||||
/// Usable as: Matcher<ParenType>
|
||||
AST_TYPE_TRAVERSE_MATCHER(innerType, getInnerType);
|
||||
|
||||
/// \brief Matches block pointer types, i.e. types syntactically represented as
|
||||
/// "void (^)(int)".
|
||||
///
|
||||
|
|
|
@ -3387,6 +3387,19 @@ TEST(TypeMatching, MatchesFunctionTypes) {
|
|||
EXPECT_TRUE(matches("void f(int i) {}", functionType()));
|
||||
}
|
||||
|
||||
TEST(TypeMatching, MatchesParenType) {
|
||||
EXPECT_TRUE(
|
||||
matches("int (*array)[4];", varDecl(hasType(pointsTo(parenType())))));
|
||||
EXPECT_TRUE(notMatches("int *array[4];", varDecl(hasType(parenType()))));
|
||||
|
||||
EXPECT_TRUE(matches(
|
||||
"int (*ptr_to_func)(int);",
|
||||
varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
|
||||
EXPECT_TRUE(notMatches(
|
||||
"int (*ptr_to_array)[4];",
|
||||
varDecl(hasType(pointsTo(parenType(innerType(functionType())))))));
|
||||
}
|
||||
|
||||
TEST(TypeMatching, PointerTypes) {
|
||||
// FIXME: Reactive when these tests can be more specific (not matching
|
||||
// implicit code on certain platforms), likely when we have hasDescendant for
|
||||
|
|
Loading…
Reference in New Issue