[clang] [AST matchers] matchers for absl Status / StatusOr (PR #160953)
Florian Mayer via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 26 14:48:37 PDT 2025
https://github.com/fmayer updated https://github.com/llvm/llvm-project/pull/160953
>From e91d339ef678e43fef77bd76ab5db57a86dc1683 Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Fri, 26 Sep 2025 14:46:40 -0700
Subject: [PATCH 1/2] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
---
.../include/clang/ASTMatchers/AbslMatchers.h | 29 +++++++++
clang/lib/ASTMatchers/AbslMatchers.cpp | 26 ++++++++
clang/lib/ASTMatchers/CMakeLists.txt | 1 +
.../ASTMatchers/AbslMatchersTest.cpp | 59 +++++++++++++++++++
clang/unittests/ASTMatchers/CMakeLists.txt | 1 +
5 files changed, 116 insertions(+)
create mode 100644 clang/include/clang/ASTMatchers/AbslMatchers.h
create mode 100644 clang/lib/ASTMatchers/AbslMatchers.cpp
create mode 100644 clang/unittests/ASTMatchers/AbslMatchersTest.cpp
diff --git a/clang/include/clang/ASTMatchers/AbslMatchers.h b/clang/include/clang/ASTMatchers/AbslMatchers.h
new file mode 100644
index 0000000000000..18cc6dd07c9af
--- /dev/null
+++ b/clang/include/clang/ASTMatchers/AbslMatchers.h
@@ -0,0 +1,29 @@
+//===- AbslMatchers.h - AST Matchers for Abseil -----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements matchers specific to structures in Abseil
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_ASTMATCHERS_ABSLMATCHERS_H
+#define LLVM_CLANG_ASTMATCHERS_ABSLMATCHERS_H
+
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+namespace clang {
+namespace ast_matchers {
+namespace absl_matchers {
+
+DeclarationMatcher statusOrClass();
+DeclarationMatcher statusClass();
+
+} // end namespace absl_matchers
+} // end namespace ast_matchers
+} // end namespace clang
+
+#endif // LLVM_CLANG_ASTMATCHERS_ABSLMATCHERS_H
diff --git a/clang/lib/ASTMatchers/AbslMatchers.cpp b/clang/lib/ASTMatchers/AbslMatchers.cpp
new file mode 100644
index 0000000000000..f666733f340ac
--- /dev/null
+++ b/clang/lib/ASTMatchers/AbslMatchers.cpp
@@ -0,0 +1,26 @@
+//===- AbslMatchers.cpp - AST Matchers for Abseil --------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ASTMatchers/AbslMatchers.h"
+
+namespace clang {
+namespace ast_matchers {
+namespace absl_matchers {
+DeclarationMatcher statusOrClass() {
+ return classTemplateSpecializationDecl(
+ hasName("::absl::StatusOr"),
+ hasTemplateArgument(0, refersToType(type().bind("StatusOrValueType"))));
+}
+
+DeclarationMatcher statusClass() {
+ return cxxRecordDecl(hasName("::absl::Status"));
+}
+
+} // end namespace absl_matchers
+} // end namespace ast_matchers
+} // end namespace clang
diff --git a/clang/lib/ASTMatchers/CMakeLists.txt b/clang/lib/ASTMatchers/CMakeLists.txt
index 7769fd656ac06..e7c6b90a3a781 100644
--- a/clang/lib/ASTMatchers/CMakeLists.txt
+++ b/clang/lib/ASTMatchers/CMakeLists.txt
@@ -8,6 +8,7 @@ set(LLVM_LINK_COMPONENTS
add_clang_library(clangASTMatchers
ASTMatchFinder.cpp
ASTMatchersInternal.cpp
+ AbslMatchers.cpp
GtestMatchers.cpp
LowLevelHelpers.cpp
diff --git a/clang/unittests/ASTMatchers/AbslMatchersTest.cpp b/clang/unittests/ASTMatchers/AbslMatchersTest.cpp
new file mode 100644
index 0000000000000..9327a6a3befd7
--- /dev/null
+++ b/clang/unittests/ASTMatchers/AbslMatchersTest.cpp
@@ -0,0 +1,59 @@
+//===- unittests/ASTMatchers/GTestMatchersTest.cpp - GTest matcher unit tests //
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/ASTMatchers/AbslMatchers.h"
+#include "ASTMatchersTest.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+namespace clang {
+namespace ast_matchers {
+namespace absl_matchers {
+
+constexpr llvm::StringLiteral abslMockDecls = R"cc(
+namespace absl {
+template <typename T> class StatusOr {};
+class Status {};
+}
+
+)cc";
+
+static auto wrapAbsl(llvm::StringRef Input) { return abslMockDecls + Input; }
+
+TEST(AbslMatchersTest, StatusOrDecl) {
+ DeclarationMatcher StatusOrDecl =
+ varDecl(hasType(qualType(hasDeclaration(statusOrClass()))));
+ EXPECT_TRUE(matchAndVerifyResultTrue(
+ wrapAbsl("void Test() { absl::StatusOr<int> X; }"), StatusOrDecl,
+ std::make_unique<VerifyIdIsBoundTo<Type>>("StatusOrValueType")));
+ EXPECT_TRUE(notMatches(wrapAbsl("void Test() { int X; }"), StatusOrDecl));
+ EXPECT_TRUE(notMatches(wrapAbsl(R"cc(
+ namespace foo { namespace absl {
+ template <typename T> class StatusOr {};
+ }}
+ void Test() { foo::absl::StatusOr<int> X; }
+ )cc"),
+ StatusOrDecl));
+}
+
+TEST(AbslMatchersTest, StatusDecl) {
+ DeclarationMatcher StatusDecl =
+ varDecl(hasType(recordType(hasDeclaration(statusClass()))));
+ EXPECT_TRUE(matches(wrapAbsl("void Test() { absl::Status X; }"), StatusDecl));
+ EXPECT_TRUE(notMatches(wrapAbsl("void Test() { int X; }"), StatusDecl));
+ EXPECT_TRUE(notMatches(wrapAbsl(R"cc(
+ namespace foo { namespace absl {
+ class Status {};
+ }}
+ void Test() { foo::absl::Status X; }
+ )cc"),
+ StatusDecl));
+}
+
+} // end namespace absl_matchers
+} // end namespace ast_matchers
+} // end namespace clang
diff --git a/clang/unittests/ASTMatchers/CMakeLists.txt b/clang/unittests/ASTMatchers/CMakeLists.txt
index 47bd5c108bb5a..8ecf9dd0445eb 100644
--- a/clang/unittests/ASTMatchers/CMakeLists.txt
+++ b/clang/unittests/ASTMatchers/CMakeLists.txt
@@ -3,6 +3,7 @@ add_clang_unittest(ASTMatchersTests
ASTMatchersNodeTest.cpp
ASTMatchersNarrowingTest.cpp
ASTMatchersTraversalTest.cpp
+ AbslMatchersTest.cpp
GtestMatchersTest.cpp
CLANG_LIBS
clangAST
>From 6a658c13e4b99265477e636e6c5242bc7015a2d9 Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer at google.com>
Date: Fri, 26 Sep 2025 14:48:26 -0700
Subject: [PATCH 2/2] fmt
Created using spr 1.3.4
---
clang/lib/ASTMatchers/AbslMatchers.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/lib/ASTMatchers/AbslMatchers.cpp b/clang/lib/ASTMatchers/AbslMatchers.cpp
index f666733f340ac..e0901f576db4f 100644
--- a/clang/lib/ASTMatchers/AbslMatchers.cpp
+++ b/clang/lib/ASTMatchers/AbslMatchers.cpp
@@ -11,6 +11,7 @@
namespace clang {
namespace ast_matchers {
namespace absl_matchers {
+
DeclarationMatcher statusOrClass() {
return classTemplateSpecializationDecl(
hasName("::absl::StatusOr"),
More information about the cfe-commits
mailing list