Lekensteyn created this revision. This allows the clang-query tool to use matchers like "integerLiteral(equals(32))". The equals function is a template, so some special trickery is needed.
https://reviews.llvm.org/D33094 Files: include/clang/ASTMatchers/ASTMatchers.h include/clang/ASTMatchers/ASTMatchersMacros.h lib/ASTMatchers/Dynamic/Registry.cpp unittests/ASTMatchers/Dynamic/RegistryTest.cpp Index: unittests/ASTMatchers/Dynamic/RegistryTest.cpp =================================================================== --- unittests/ASTMatchers/Dynamic/RegistryTest.cpp +++ unittests/ASTMatchers/Dynamic/RegistryTest.cpp @@ -511,6 +511,21 @@ EXPECT_FALSE(matches("int i = 1;", Value)); } +TEST_F(RegistryTest, EqualsMatcher) { + Matcher<Stmt> IntegerStmt = constructMatcher( + "integerLiteral", constructMatcher("equals", VariantValue(42))) + .getTypedMatcher<Stmt>(); + EXPECT_TRUE(matches("int x = 42;", IntegerStmt)); + EXPECT_FALSE(matches("int x = 1;", IntegerStmt)); + + Matcher<Stmt> BooleanStmt = constructMatcher( + "cxxBoolLiteral", constructMatcher("equals", VariantValue(true))) + .getTypedMatcher<Stmt>(); + EXPECT_TRUE(matches("bool x = true;", BooleanStmt)); + EXPECT_FALSE(matches("bool x = false;", BooleanStmt)); + EXPECT_FALSE(matches("bool x = 0;", BooleanStmt)); +} + } // end anonymous namespace } // end namespace dynamic } // end namespace ast_matchers Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -96,6 +96,9 @@ REGISTER_OVERLOADED_2(references); REGISTER_OVERLOADED_2(thisPointerType); + // TODO add support for floats and char literals + REGISTER_OVERLOADED_2(equals); + REGISTER_MATCHER(accessSpecDecl); REGISTER_MATCHER(addrLabelExpr); REGISTER_MATCHER(alignOfExpr); Index: include/clang/ASTMatchers/ASTMatchersMacros.h =================================================================== --- include/clang/ASTMatchers/ASTMatchersMacros.h +++ include/clang/ASTMatchers/ASTMatchersMacros.h @@ -359,6 +359,17 @@ ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) \ const +/// \brief Defines functions and a type for the \c equals matcher, suitable for +/// comparing a \c ReturnType node against the a \c ParamType value. +#define AST_CONCRETE_EQUALS_MATCHER(ReturnType, ParamType, OverloadId) \ + inline ::clang::ast_matchers::internal::Matcher<ReturnType> equals( \ + ParamType const &Param) { \ + return ::clang::ast_matchers::internal::makeMatcher( \ + new internal::ValueEqualsMatcher<ReturnType, ParamType>(Param)); \ + } \ + typedef ::clang::ast_matchers::internal::Matcher<ReturnType>( \ + &equals_Type##OverloadId)(ParamType const &Param) + /// \brief Creates a variadic matcher for both a specific \c Type as well as /// the corresponding \c TypeLoc. #define AST_TYPE_MATCHER(NodeType, MatcherName) \ Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -3813,7 +3813,7 @@ /// true /// \endcode /// -/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>, +/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>, /// Matcher<FloatingLiteral>, Matcher<IntegerLiteral> template <typename ValueT> internal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT> @@ -3823,6 +3823,13 @@ ValueT>(Value); } +/// \brief Instantiations for the \c equals matcher. +/// TODO add support for FloatingLiteral and CharacterLiteral +/// @{ +AST_CONCRETE_EQUALS_MATCHER(CXXBoolLiteralExpr, bool, 0); +AST_CONCRETE_EQUALS_MATCHER(IntegerLiteral, unsigned, 1); +/// @} + /// \brief Matches the operator Name of operator expressions (binary or /// unary). ///
Index: unittests/ASTMatchers/Dynamic/RegistryTest.cpp =================================================================== --- unittests/ASTMatchers/Dynamic/RegistryTest.cpp +++ unittests/ASTMatchers/Dynamic/RegistryTest.cpp @@ -511,6 +511,21 @@ EXPECT_FALSE(matches("int i = 1;", Value)); } +TEST_F(RegistryTest, EqualsMatcher) { + Matcher<Stmt> IntegerStmt = constructMatcher( + "integerLiteral", constructMatcher("equals", VariantValue(42))) + .getTypedMatcher<Stmt>(); + EXPECT_TRUE(matches("int x = 42;", IntegerStmt)); + EXPECT_FALSE(matches("int x = 1;", IntegerStmt)); + + Matcher<Stmt> BooleanStmt = constructMatcher( + "cxxBoolLiteral", constructMatcher("equals", VariantValue(true))) + .getTypedMatcher<Stmt>(); + EXPECT_TRUE(matches("bool x = true;", BooleanStmt)); + EXPECT_FALSE(matches("bool x = false;", BooleanStmt)); + EXPECT_FALSE(matches("bool x = 0;", BooleanStmt)); +} + } // end anonymous namespace } // end namespace dynamic } // end namespace ast_matchers Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -96,6 +96,9 @@ REGISTER_OVERLOADED_2(references); REGISTER_OVERLOADED_2(thisPointerType); + // TODO add support for floats and char literals + REGISTER_OVERLOADED_2(equals); + REGISTER_MATCHER(accessSpecDecl); REGISTER_MATCHER(addrLabelExpr); REGISTER_MATCHER(alignOfExpr); Index: include/clang/ASTMatchers/ASTMatchersMacros.h =================================================================== --- include/clang/ASTMatchers/ASTMatchersMacros.h +++ include/clang/ASTMatchers/ASTMatchersMacros.h @@ -359,6 +359,17 @@ ::clang::ast_matchers::internal::BoundNodesTreeBuilder *Builder) \ const +/// \brief Defines functions and a type for the \c equals matcher, suitable for +/// comparing a \c ReturnType node against the a \c ParamType value. +#define AST_CONCRETE_EQUALS_MATCHER(ReturnType, ParamType, OverloadId) \ + inline ::clang::ast_matchers::internal::Matcher<ReturnType> equals( \ + ParamType const &Param) { \ + return ::clang::ast_matchers::internal::makeMatcher( \ + new internal::ValueEqualsMatcher<ReturnType, ParamType>(Param)); \ + } \ + typedef ::clang::ast_matchers::internal::Matcher<ReturnType>( \ + &equals_Type##OverloadId)(ParamType const &Param) + /// \brief Creates a variadic matcher for both a specific \c Type as well as /// the corresponding \c TypeLoc. #define AST_TYPE_MATCHER(NodeType, MatcherName) \ Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -3813,7 +3813,7 @@ /// true /// \endcode /// -/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteral>, +/// Usable as: Matcher<CharacterLiteral>, Matcher<CXXBoolLiteralExpr>, /// Matcher<FloatingLiteral>, Matcher<IntegerLiteral> template <typename ValueT> internal::PolymorphicMatcherWithParam1<internal::ValueEqualsMatcher, ValueT> @@ -3823,6 +3823,13 @@ ValueT>(Value); } +/// \brief Instantiations for the \c equals matcher. +/// TODO add support for FloatingLiteral and CharacterLiteral +/// @{ +AST_CONCRETE_EQUALS_MATCHER(CXXBoolLiteralExpr, bool, 0); +AST_CONCRETE_EQUALS_MATCHER(IntegerLiteral, unsigned, 1); +/// @} + /// \brief Matches the operator Name of operator expressions (binary or /// unary). ///
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits