[clang][ASTMatchers] Add functionTypeLoc matcher (#173668)
To be used in #173340.
This commit is contained in:
parent
dedf1684b3
commit
aaa0d5da73
@ -2461,6 +2461,18 @@ arrayTypeLoc()
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('functionTypeLoc0')"><a name="functionTypeLoc0Anchor">functionTypeLoc</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1FunctionTypeLoc.html">FunctionTypeLoc</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="functionTypeLoc0"><pre>Matches `FunctionTypeLoc`s.
|
||||
|
||||
Given
|
||||
void f(int);
|
||||
using g = double (char, float);
|
||||
char (*fn_ptr)();
|
||||
functionTypeLoc()
|
||||
matches "void (int)", "double (char, float)", and "char ()".
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="https://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="https://clang.llvm.org/doxygen/classclang_1_1PointerTypeLoc.html">PointerTypeLoc</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="pointerTypeLoc0"><pre>Matches pointer `TypeLoc`s.
|
||||
|
||||
|
||||
@ -195,6 +195,7 @@ Fixed Point Support in Clang
|
||||
|
||||
AST Matchers
|
||||
------------
|
||||
- Add ``functionTypeLoc`` matcher for matching ``FunctionTypeLoc``.
|
||||
|
||||
clang-format
|
||||
------------
|
||||
|
||||
@ -7016,6 +7016,19 @@ AST_MATCHER_P(ReferenceTypeLoc, hasReferentLoc, internal::Matcher<TypeLoc>,
|
||||
extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc>
|
||||
arrayTypeLoc;
|
||||
|
||||
/// Matches `FunctionTypeLoc`s.
|
||||
///
|
||||
/// Given
|
||||
/// \code
|
||||
/// void f(int);
|
||||
/// using g = double (char, float);
|
||||
/// char (*fn_ptr)();
|
||||
/// \endcode
|
||||
/// functionTypeLoc()
|
||||
/// matches "void (int)", "double (char, float)", and "char ()".
|
||||
extern const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
|
||||
functionTypeLoc;
|
||||
|
||||
/// Matches template specialization `TypeLoc`s.
|
||||
///
|
||||
/// Given
|
||||
|
||||
@ -815,6 +815,8 @@ const internal::VariadicDynCastAllOfMatcher<TypeLoc, PointerTypeLoc>
|
||||
const internal::VariadicDynCastAllOfMatcher<TypeLoc, ReferenceTypeLoc>
|
||||
referenceTypeLoc;
|
||||
const internal::VariadicDynCastAllOfMatcher<TypeLoc, ArrayTypeLoc> arrayTypeLoc;
|
||||
const internal::VariadicDynCastAllOfMatcher<TypeLoc, FunctionTypeLoc>
|
||||
functionTypeLoc;
|
||||
const internal::VariadicDynCastAllOfMatcher<TypeLoc,
|
||||
TemplateSpecializationTypeLoc>
|
||||
templateSpecializationTypeLoc;
|
||||
|
||||
@ -269,6 +269,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(functionProtoType);
|
||||
REGISTER_MATCHER(functionTemplateDecl);
|
||||
REGISTER_MATCHER(functionType);
|
||||
REGISTER_MATCHER(functionTypeLoc);
|
||||
REGISTER_MATCHER(genericSelectionExpr);
|
||||
REGISTER_MATCHER(gnuNullExpr);
|
||||
REGISTER_MATCHER(gotoStmt);
|
||||
|
||||
@ -2373,6 +2373,26 @@ TEST_P(ASTMatchersTest, ArrayTypeLocTest_DoesNotBindToNonArrayTypeLoc) {
|
||||
EXPECT_TRUE(notMatches("void* x;", matcher));
|
||||
}
|
||||
|
||||
TEST_P(ASTMatchersTest, FunctionTypeLocTest_BindsToAnyFunctionTypeLoc) {
|
||||
auto matcher = functionTypeLoc();
|
||||
EXPECT_TRUE(matches("void f();", matcher));
|
||||
EXPECT_TRUE(matches("void f(void);", matcher));
|
||||
EXPECT_TRUE(matches("void f(int);", matcher));
|
||||
EXPECT_TRUE(matches("typedef double g(char, float);", matcher));
|
||||
EXPECT_TRUE(matches("char (*fn_ptr)();", matcher));
|
||||
if (!GetParam().isCXX11OrLater()) {
|
||||
return;
|
||||
}
|
||||
EXPECT_TRUE(matches("auto f = (void (*)())0;", matcher));
|
||||
}
|
||||
|
||||
TEST_P(ASTMatchersTest, FunctionTypeLocTest_DoesNotBindToNonFunctionTypeLoc) {
|
||||
auto matcher = functionTypeLoc();
|
||||
EXPECT_TRUE(notMatches("int x;", matcher));
|
||||
EXPECT_TRUE(notMatches("void* x;", matcher));
|
||||
EXPECT_TRUE(notMatches("int x[10];", matcher));
|
||||
}
|
||||
|
||||
TEST_P(ASTMatchersTest,
|
||||
TemplateSpecializationTypeLocTest_BindsToVarDeclTemplateSpecialization) {
|
||||
if (!GetParam().isCXX()) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user