jcking1034 updated this revision to Diff 390429.
jcking1034 added a comment.
Chang `withTag` to `withIntrospection`
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113943/new/
https://reviews.llvm.org/D113943
Files:
clang/include/clang/ASTMatchers/ASTMatchers.h
clang/include/clang/ASTMatchers/ASTMatchersInternal.h
Index: clang/include/clang/ASTMatchers/ASTMatchersInternal.h
===================================================================
--- clang/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ clang/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -43,6 +43,7 @@
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/PrettyPrinter.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
@@ -1057,6 +1058,46 @@
std::vector<std::string> Names;
};
+template <typename T>
+class WithIntrospectionMatcher : public MatcherInterface<T> {
+public:
+ explicit WithIntrospectionMatcher(std::string _BeforeTag,
+ std::string _AfterTag,
+ internal::Matcher<T> _InnerMatcher)
+ : BeforeTag(std::move(_BeforeTag)), AfterTag(std::move(_AfterTag)),
+ InnerMatcher(_InnerMatcher) {}
+ explicit WithIntrospectionMatcher(internal::Matcher<T> _InnerMatcher)
+ : BeforeTag("â Attempting new match"),
+ AfterTag("âï¸ Concluding attempt"), InnerMatcher(_InnerMatcher) {}
+ bool matches(const T &Node, ASTMatchFinder *Finder,
+ BoundNodesTreeBuilder *Builder) const override {
+ DynTypedNode DTN = DynTypedNode::create(Node);
+
+ llvm::errs() << BeforeTag << "\n";
+
+ llvm::errs() << "Matcher Name: " << InnerMatcher.getName() << "\n";
+
+ llvm::errs() << "Node Kind: " << DTN.getNodeKind().asStringRef() << "\n"
+ << "Node Value:\n```\n";
+ DTN.print(llvm::errs(), PrintingPolicy(LangOptions()));
+ llvm::errs() << "\n```\n"
+ << "Node AST:\n";
+ DTN.dump(llvm::errs(), Finder->getASTContext());
+
+ bool result = InnerMatcher.matches(Node, Finder, Builder);
+ llvm::errs() << "Result: " << (result ? "Successful\n" : "Unsuccessful\n");
+
+ llvm::errs() << AfterTag << "\n\n";
+
+ return result;
+ }
+
+private:
+ std::string BeforeTag;
+ std::string AfterTag;
+ internal::Matcher<T> InnerMatcher;
+};
+
/// Matches named declarations with a specific name.
///
/// See \c hasName() and \c hasAnyName() in ASTMatchers.h for details.
@@ -1734,6 +1775,38 @@
std::tuple<ParamTypes...> Params;
};
+template <template <typename T, typename... Params> class MatcherT,
+ typename ReturnTypesF, typename... ParamTypes>
+class PolymorphicWithIntrospectionMatcher {
+public:
+ PolymorphicWithIntrospectionMatcher(
+ internal::PolymorphicMatcher<MatcherT, ReturnTypesF, ParamTypes...>
+ _InnerMatcher)
+ : InnerMatcher(_InnerMatcher) {}
+
+ using ReturnTypes = typename ExtractFunctionArgMeta<ReturnTypesF>::type;
+
+ template <typename T> operator Matcher<T>() const LLVM_LVALUE_FUNCTION {
+ static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
+ "right polymorphic conversion");
+ return internal::Matcher<T>(new internal::WithIntrospectionMatcher<T>(
+ internal::Matcher<T>(InnerMatcher)));
+ }
+
+#if LLVM_HAS_RVALUE_REFERENCE_THIS
+ template <typename T> operator Matcher<T>() && {
+ static_assert(TypeListContainsSuperOf<ReturnTypes, T>::value,
+ "right polymorphic conversion");
+ return internal::Matcher<T>(new internal::WithIntrospectionMatcher<T>(
+ internal::Matcher<T>(std::move(InnerMatcher))));
+ }
+#endif
+
+private:
+ internal::PolymorphicMatcher<MatcherT, ReturnTypesF, ParamTypes...>
+ InnerMatcher;
+};
+
/// Matches nodes of type T that have child nodes of type ChildT for
/// which a specified child matcher matches.
///
Index: clang/include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- clang/include/clang/ASTMatchers/ASTMatchers.h
+++ clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -2993,6 +2993,46 @@
new internal::HasNameMatcher({std::string(Name)}));
}
+template <typename T>
+inline internal::Matcher<T>
+withIntrospection(std::string BeforeTag, std::string AfterTag,
+ const internal::Matcher<T> &InnerMatcher) {
+ return internal::Matcher<T>(new internal::WithIntrospectionMatcher<T>(
+ BeforeTag, AfterTag, InnerMatcher));
+}
+
+template <typename T, template <typename, typename... Params> class MatcherT,
+ typename ReturnTypesF, typename... ParamTypes>
+inline internal::PolymorphicWithIntrospectionMatcher<MatcherT, ReturnTypesF,
+ ParamTypes...>
+withIntrospection(
+ std::string BeforeTag, std::string AfterTag,
+ const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, ParamTypes...>
+ &InnerMatcher) {
+ return internal::PolymorphicWithIntrospectionMatcher<MatcherT, ReturnTypesF,
+ ParamTypes...>(
+ BeforeTag, AfterTag, InnerMatcher);
+}
+
+template <typename T>
+inline internal::Matcher<T>
+withIntrospection(const internal::Matcher<T> &InnerMatcher) {
+ return internal::Matcher<T>(
+ new internal::WithIntrospectionMatcher<T>(InnerMatcher));
+}
+
+template <template <typename, typename... Params> class MatcherT,
+ typename ReturnTypesF, typename... ParamTypes>
+inline internal::PolymorphicWithIntrospectionMatcher<MatcherT, ReturnTypesF,
+ ParamTypes...>
+withIntrospection(
+ const internal::PolymorphicMatcher<MatcherT, ReturnTypesF, ParamTypes...>
+ &InnerMatcher) {
+ return internal::PolymorphicWithIntrospectionMatcher<MatcherT, ReturnTypesF,
+ ParamTypes...>(
+ InnerMatcher);
+}
+
/// Matches NamedDecl nodes that have any of the specified names.
///
/// This matcher is only provided as a performance optimization of hasName.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits