blob: 82821542292bb7fb2e1e00ce1e13b5c4d2fb0e4e [file] [log] [blame]
Piotr Padlewskice18ade2016-05-02 16:56:39 +00001//===--- MakeSmartPtrCheck.h - clang-tidy------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H
11#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H
12
13#include "../ClangTidy.h"
Haojian Wu040c0f92017-07-05 07:49:00 +000014#include "../utils/IncludeInserter.h"
Eugene Zelenkoa19859d2016-05-03 01:13:27 +000015#include "clang/ASTMatchers/ASTMatchFinder.h"
16#include "clang/ASTMatchers/ASTMatchersInternal.h"
17#include "llvm/ADT/StringRef.h"
Piotr Padlewskice18ade2016-05-02 16:56:39 +000018#include <string>
19
20namespace clang {
21namespace tidy {
22namespace modernize {
23
24/// Base class for MakeSharedCheck and MakeUniqueCheck.
25class MakeSmartPtrCheck : public ClangTidyCheck {
26public:
27 MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context,
Haojian Wu040c0f92017-07-05 07:49:00 +000028 StringRef MakeSmartPtrFunctionName);
Eugene Zelenkoa19859d2016-05-03 01:13:27 +000029 void registerMatchers(ast_matchers::MatchFinder *Finder) final;
Haojian Wu040c0f92017-07-05 07:49:00 +000030 void registerPPCallbacks(clang::CompilerInstance &Compiler) override;
Eugene Zelenkoa19859d2016-05-03 01:13:27 +000031 void check(const ast_matchers::MatchFinder::MatchResult &Result) final;
Haojian Wu040c0f92017-07-05 07:49:00 +000032 void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
Piotr Padlewskice18ade2016-05-02 16:56:39 +000033
34protected:
35 using SmartPtrTypeMatcher = ast_matchers::internal::BindableMatcher<QualType>;
36
37 /// Returns matcher that match with different smart pointer types.
38 ///
39 /// Requires to bind pointer type (qualType) with PointerType string declared
40 /// in this class.
41 virtual SmartPtrTypeMatcher getSmartPointerTypeMatcher() const = 0;
42
43 static const char PointerType[];
44 static const char ConstructorCall[];
Malcolm Parsons54c5a542016-10-31 15:48:01 +000045 static const char ResetCall[];
Piotr Padlewskice18ade2016-05-02 16:56:39 +000046 static const char NewExpression[];
47
48private:
Haojian Wu040c0f92017-07-05 07:49:00 +000049 std::unique_ptr<utils::IncludeInserter> Inserter;
50 const utils::IncludeSorter::IncludeStyle IncludeStyle;
51 const std::string MakeSmartPtrFunctionHeader;
52 const std::string MakeSmartPtrFunctionName;
Haojian Wu115b7072017-08-04 11:18:00 +000053 const bool IgnoreMacros;
Malcolm Parsons54c5a542016-10-31 15:48:01 +000054
55 void checkConstruct(SourceManager &SM, const CXXConstructExpr *Construct,
56 const QualType *Type, const CXXNewExpr *New);
57 void checkReset(SourceManager &SM, const CXXMemberCallExpr *Member,
58 const CXXNewExpr *New);
Haojian Wu040c0f92017-07-05 07:49:00 +000059
Haojian Wu4b956cb2017-08-17 10:14:52 +000060 /// Returns true when the fixes for replacing CXXNewExpr are generated.
61 bool replaceNew(DiagnosticBuilder &Diag, const CXXNewExpr *New,
Haojian Wu7663deb2017-06-27 16:25:05 +000062 SourceManager &SM);
Haojian Wu040c0f92017-07-05 07:49:00 +000063 void insertHeader(DiagnosticBuilder &Diag, FileID FD);
Piotr Padlewskice18ade2016-05-02 16:56:39 +000064};
65
66} // namespace modernize
67} // namespace tidy
68} // namespace clang
69
70#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H