xref: /llvm-project/clang-tools-extra/clang-include-fixer/find-all-symbols/HeaderMapCollector.h (revision adcd02683856c30ba6f349279509acecd90063df)
143356f56SNico Weber //===-- HeaderMapCoolector.h - find all symbols------------------*- C++ -*-===//
243356f56SNico Weber //
343356f56SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
443356f56SNico Weber // See https://llvm.org/LICENSE.txt for license information.
543356f56SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
643356f56SNico Weber //
743356f56SNico Weber //===----------------------------------------------------------------------===//
843356f56SNico Weber 
943356f56SNico Weber #ifndef LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_HEADER_MAP_COLLECTOR_H
1043356f56SNico Weber #define LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_HEADER_MAP_COLLECTOR_H
1143356f56SNico Weber 
1243356f56SNico Weber #include "llvm/ADT/StringMap.h"
1343356f56SNico Weber #include "llvm/Support/Regex.h"
1443356f56SNico Weber #include <string>
1543356f56SNico Weber #include <vector>
1643356f56SNico Weber 
1743356f56SNico Weber namespace clang {
1843356f56SNico Weber namespace find_all_symbols {
1943356f56SNico Weber 
20282dc72cSDmitri Gribenko /// HeaderMappCollector collects all remapping header files. This maps
2143356f56SNico Weber /// complete header names or header name regex patterns to header names.
2243356f56SNico Weber class HeaderMapCollector {
2343356f56SNico Weber public:
2443356f56SNico Weber   typedef llvm::StringMap<std::string> HeaderMap;
2543356f56SNico Weber   typedef std::vector<std::pair<const char *, const char *>> RegexHeaderMap;
2643356f56SNico Weber 
2743356f56SNico Weber   HeaderMapCollector() = default;
2843356f56SNico Weber   explicit HeaderMapCollector(const RegexHeaderMap *RegexHeaderMappingTable);
2943356f56SNico Weber 
addHeaderMapping(llvm::StringRef OrignalHeaderPath,llvm::StringRef MappingHeaderPath)3043356f56SNico Weber   void addHeaderMapping(llvm::StringRef OrignalHeaderPath,
3143356f56SNico Weber                         llvm::StringRef MappingHeaderPath) {
32*adcd0268SBenjamin Kramer     HeaderMappingTable[OrignalHeaderPath] = std::string(MappingHeaderPath);
3343356f56SNico Weber   };
3443356f56SNico Weber 
3543356f56SNico Weber   /// Check if there is a mapping from \p Header or a regex pattern that matches
3643356f56SNico Weber   /// it to another header name.
3743356f56SNico Weber   /// \param Header A header name.
3843356f56SNico Weber   /// \return \p Header itself if there is no mapping for it; otherwise, return
3943356f56SNico Weber   /// a mapped header name.
4043356f56SNico Weber   llvm::StringRef getMappedHeader(llvm::StringRef Header) const;
4143356f56SNico Weber 
4243356f56SNico Weber private:
4343356f56SNico Weber   /// A string-to-string map saving the mapping relationship.
4443356f56SNico Weber   HeaderMap HeaderMappingTable;
4543356f56SNico Weber 
4643356f56SNico Weber   // A map from header patterns to header names.
4743356f56SNico Weber   // The header names are not owned. This is only threadsafe because the regexes
4843356f56SNico Weber   // never fail.
4943356f56SNico Weber   mutable std::vector<std::pair<llvm::Regex, const char *>>
5043356f56SNico Weber       RegexHeaderMappingTable;
5143356f56SNico Weber };
5243356f56SNico Weber 
5343356f56SNico Weber } // namespace find_all_symbols
5443356f56SNico Weber } // namespace clang
5543356f56SNico Weber 
5643356f56SNico Weber #endif // LLVM_CLANG_TOOLS_EXTRA_FIND_ALL_SYMBOLS_HEADER_MAP_COLLECTOR_H
57