| //===--- VirtualNearMissCheck.h - clang-tidy---------------------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_VIRTUAL_NEAR_MISS_H | |
| #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_VIRTUAL_NEAR_MISS_H | |
| #include "../ClangTidyCheck.h" | |
| #include "llvm/ADT/DenseMap.h" | |
| namespace clang::tidy::bugprone { | |
| /// Checks for near miss of virtual methods. | |
| /// | |
| /// For a method in a derived class, this check looks for virtual method with a | |
| /// very similar name and an identical signature defined in a base class. | |
| /// | |
| /// For the user-facing documentation see: | |
| /// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/virtual-near-miss.html | |
| class VirtualNearMissCheck : public ClangTidyCheck { | |
| public: | |
| VirtualNearMissCheck(StringRef Name, ClangTidyContext *Context) | |
| : ClangTidyCheck(Name, Context) {} | |
| bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { | |
| return LangOpts.CPlusPlus; | |
| } | |
| void registerMatchers(ast_matchers::MatchFinder *Finder) override; | |
| void check(const ast_matchers::MatchFinder::MatchResult &Result) override; | |
| private: | |
| /// Check if the given method is possible to be overridden by some other | |
| /// method. Operators and destructors are excluded. | |
| /// | |
| /// Results are memoized in PossibleMap. | |
| bool isPossibleToBeOverridden(const CXXMethodDecl *BaseMD); | |
| /// Check if the given base method is overridden by some methods in the given | |
| /// derived class. | |
| /// | |
| /// Results are memoized in OverriddenMap. | |
| bool isOverriddenByDerivedClass(const CXXMethodDecl *BaseMD, | |
| const CXXRecordDecl *DerivedRD); | |
| /// Key: the unique ID of a method. | |
| /// Value: whether the method is possible to be overridden. | |
| llvm::DenseMap<const CXXMethodDecl *, bool> PossibleMap; | |
| /// Key: <unique ID of base method, name of derived class> | |
| /// Value: whether the base method is overridden by some method in the derived | |
| /// class. | |
| llvm::DenseMap<std::pair<const CXXMethodDecl *, const CXXRecordDecl *>, bool> | |
| OverriddenMap; | |
| const unsigned EditDistanceThreshold = 1; | |
| }; | |
| } // namespace clang::tidy::bugprone | |
| #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_VIRTUAL_NEAR_MISS_H |