blob: cb9b8a0ef9f65d5e61fae680d514a104abc21152 [file] [log] [blame]
Wei Yi Tee543af742022-06-01 06:52:24 -07001// Part of the Crubit project, under the Apache License v2.0 with LLVM
2// Exceptions. See /LICENSE for license information.
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
5#include "nullability_verification/pointer_nullability_matchers.h"
6
Wei Yi Tee1cd62af2022-06-09 00:56:46 -07007#include "clang/AST/OperationKinds.h"
Wei Yi Tee543af742022-06-01 06:52:24 -07008#include "clang/ASTMatchers/ASTMatchers.h"
Wei Yi Tee543af742022-06-01 06:52:24 -07009
10namespace clang {
11namespace tidy {
12namespace nullability {
13
Wei Yi Teef02698e2022-06-10 04:25:48 -070014using ast_matchers::anyOf;
Wei Yi Tee543af742022-06-01 06:52:24 -070015using ast_matchers::binaryOperator;
Wei Yi Teec1e1d862022-08-19 14:11:28 -070016using ast_matchers::callExpr;
Wei Yi Teeafbca012022-09-19 11:54:28 -070017using ast_matchers::cxxConstructExpr;
Wei Yi Tee566e2df2022-09-19 11:59:03 -070018using ast_matchers::cxxCtorInitializer;
Wei Yi Teecebc2262022-06-10 04:27:57 -070019using ast_matchers::cxxThisExpr;
Wei Yi Tee1cd62af2022-06-09 00:56:46 -070020using ast_matchers::declRefExpr;
Wei Yi Tee543af742022-06-01 06:52:24 -070021using ast_matchers::expr;
Wei Yi Tee1cd62af2022-06-09 00:56:46 -070022using ast_matchers::hasAnyOperatorName;
Wei Yi Tee264ee4d2022-06-10 04:20:10 -070023using ast_matchers::hasCastKind;
Wei Yi Tee543af742022-06-01 06:52:24 -070024using ast_matchers::hasOperands;
25using ast_matchers::hasOperatorName;
Wei Yi Teeed480d62022-08-26 03:19:54 -070026using ast_matchers::hasReturnValue;
Wei Yi Tee543af742022-06-01 06:52:24 -070027using ast_matchers::hasType;
28using ast_matchers::hasUnaryOperand;
Wei Yi Tee543af742022-06-01 06:52:24 -070029using ast_matchers::implicitCastExpr;
30using ast_matchers::isAnyPointer;
Wei Yi Teef02698e2022-06-10 04:25:48 -070031using ast_matchers::isArrow;
Wei Yi Tee566e2df2022-09-19 11:59:03 -070032using ast_matchers::isMemberInitializer;
Wei Yi Teee314ca62022-06-10 04:23:08 -070033using ast_matchers::memberExpr;
Wei Yi Teeed480d62022-08-26 03:19:54 -070034using ast_matchers::returnStmt;
Wei Yi Tee543af742022-06-01 06:52:24 -070035using ast_matchers::unaryOperator;
36using ast_matchers::internal::Matcher;
37
38Matcher<Stmt> isPointerExpr() { return expr(hasType(isAnyPointer())); }
Wei Yi Tee1cd62af2022-06-09 00:56:46 -070039Matcher<Stmt> isNullPointerLiteral() {
Wei Yi Tee9f558172022-07-25 08:34:56 -070040 return implicitCastExpr(anyOf(hasCastKind(CK_NullToPointer),
41 hasCastKind(CK_NullToMemberPointer)));
Wei Yi Tee1cd62af2022-06-09 00:56:46 -070042}
43Matcher<Stmt> isAddrOf() { return unaryOperator(hasOperatorName("&")); }
Wei Yi Tee543af742022-06-01 06:52:24 -070044Matcher<Stmt> isPointerDereference() {
45 return unaryOperator(hasOperatorName("*"), hasUnaryOperand(isPointerExpr()));
46}
Wei Yi Tee1cd62af2022-06-09 00:56:46 -070047Matcher<Stmt> isPointerCheckBinOp() {
48 return binaryOperator(hasAnyOperatorName("!=", "=="),
49 hasOperands(isPointerExpr(), isPointerExpr()));
50}
51Matcher<Stmt> isImplicitCastPointerToBool() {
Wei Yi Tee264ee4d2022-06-10 04:20:10 -070052 return implicitCastExpr(hasCastKind(CK_PointerToBoolean));
Wei Yi Tee543af742022-06-01 06:52:24 -070053}
Wei Yi Tee8b58e192022-08-02 10:15:40 -070054Matcher<Stmt> isMemberOfPointerType() {
55 return memberExpr(hasType(isAnyPointer()));
Wei Yi Teee314ca62022-06-10 04:23:08 -070056}
Wei Yi Tee8b58e192022-08-02 10:15:40 -070057Matcher<Stmt> isPointerArrow() { return memberExpr(isArrow()); }
Wei Yi Teecebc2262022-06-10 04:27:57 -070058Matcher<Stmt> isCXXThisExpr() { return cxxThisExpr(); }
Wei Yi Teec1e1d862022-08-19 14:11:28 -070059Matcher<Stmt> isCallExpr() { return callExpr(); }
Wei Yi Teeed480d62022-08-26 03:19:54 -070060Matcher<Stmt> isPointerReturn() {
61 return returnStmt(hasReturnValue(hasType(isAnyPointer())));
62}
Wei Yi Teeafbca012022-09-19 11:54:28 -070063Matcher<Stmt> isConstructExpr() { return cxxConstructExpr(); }
Wei Yi Tee566e2df2022-09-19 11:59:03 -070064Matcher<CXXCtorInitializer> isCtorMemberInitializer() {
65 return cxxCtorInitializer(isMemberInitializer());
66}
Wei Yi Teec1e1d862022-08-19 14:11:28 -070067
Wei Yi Tee543af742022-06-01 06:52:24 -070068} // namespace nullability
69} // namespace tidy
70} // namespace clang