1 //===--- ConfusableIdentifierCheck.h - clang-tidy 2 //-------------------------------*- C++ -*-===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_CONFUSABLE_IDENTIFIER_CHECK_H 11 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_CONFUSABLE_IDENTIFIER_CHECK_H 12 13 #include "../ClangTidyCheck.h" 14 #include <unordered_map> 15 16 namespace clang::tidy::misc { 17 18 /// Finds symbol which have confusable identifiers, i.e. identifiers that look 19 /// the same visually but have a different Unicode representation. 20 /// If symbols are confusable but don't live in conflicting namespaces, they are 21 /// not reported. 22 class ConfusableIdentifierCheck : public ClangTidyCheck { 23 public: 24 ConfusableIdentifierCheck(StringRef Name, ClangTidyContext *Context); 25 ~ConfusableIdentifierCheck(); 26 27 void registerMatchers(ast_matchers::MatchFinder *Finder) override; 28 void check(const ast_matchers::MatchFinder::MatchResult &Result) override; 29 void onEndOfTranslationUnit() override; getCheckTraversalKind()30 std::optional<TraversalKind> getCheckTraversalKind() const override { 31 return TK_IgnoreUnlessSpelledInSource; 32 } 33 34 struct ContextInfo { 35 const DeclContext *PrimaryContext; 36 const DeclContext *NonTransparentContext; 37 llvm::SmallVector<const DeclContext *> PrimaryContexts; 38 llvm::SmallVector<const CXXRecordDecl *> Bases; 39 }; 40 41 private: 42 struct Entry { 43 const NamedDecl *Declaration; 44 const ContextInfo *Info; 45 }; 46 47 const ContextInfo *getContextInfo(const DeclContext *DC); 48 49 llvm::StringMap<llvm::SmallVector<Entry>> Mapper; 50 std::unordered_map<const DeclContext *, ContextInfo> ContextInfos; 51 }; 52 53 } // namespace clang::tidy::misc 54 55 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_CONFUSABLE_IDENTIFIER_CHECK_H 56