xref: /llvm-project/clang-tools-extra/clang-include-fixer/find-all-symbols/HeaderMapCollector.cpp (revision 43356f56bd2ede05c70db537e3f8b50a31444487)
1*43356f56SNico Weber //===-- HeaderMapCoolector.h - find all symbols------------------*- C++ -*-===//
2*43356f56SNico Weber //
3*43356f56SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*43356f56SNico Weber // See https://llvm.org/LICENSE.txt for license information.
5*43356f56SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*43356f56SNico Weber //
7*43356f56SNico Weber //===----------------------------------------------------------------------===//
8*43356f56SNico Weber 
9*43356f56SNico Weber #include "HeaderMapCollector.h"
10*43356f56SNico Weber #include "llvm/Support/Regex.h"
11*43356f56SNico Weber 
12*43356f56SNico Weber namespace clang {
13*43356f56SNico Weber namespace find_all_symbols {
14*43356f56SNico Weber 
HeaderMapCollector(const RegexHeaderMap * RegexHeaderMappingTable)15*43356f56SNico Weber HeaderMapCollector::HeaderMapCollector(
16*43356f56SNico Weber     const RegexHeaderMap *RegexHeaderMappingTable) {
17*43356f56SNico Weber   assert(RegexHeaderMappingTable);
18*43356f56SNico Weber   this->RegexHeaderMappingTable.reserve(RegexHeaderMappingTable->size());
19*43356f56SNico Weber   for (const auto &Entry : *RegexHeaderMappingTable) {
20*43356f56SNico Weber     this->RegexHeaderMappingTable.emplace_back(llvm::Regex(Entry.first),
21*43356f56SNico Weber                                                Entry.second);
22*43356f56SNico Weber   }
23*43356f56SNico Weber }
24*43356f56SNico Weber 
25*43356f56SNico Weber llvm::StringRef
getMappedHeader(llvm::StringRef Header) const26*43356f56SNico Weber HeaderMapCollector::getMappedHeader(llvm::StringRef Header) const {
27*43356f56SNico Weber   auto Iter = HeaderMappingTable.find(Header);
28*43356f56SNico Weber   if (Iter != HeaderMappingTable.end())
29*43356f56SNico Weber     return Iter->second;
30*43356f56SNico Weber   // If there is no complete header name mapping for this header, check the
31*43356f56SNico Weber   // regex header mapping.
32*43356f56SNico Weber   for (auto &Entry : RegexHeaderMappingTable) {
33*43356f56SNico Weber #ifndef NDEBUG
34*43356f56SNico Weber     std::string Dummy;
35*43356f56SNico Weber     assert(Entry.first.isValid(Dummy) && "Regex should never be invalid!");
36*43356f56SNico Weber #endif
37*43356f56SNico Weber     if (Entry.first.match(Header))
38*43356f56SNico Weber       return Entry.second;
39*43356f56SNico Weber   }
40*43356f56SNico Weber   return Header;
41*43356f56SNico Weber }
42*43356f56SNico Weber 
43*43356f56SNico Weber } // namespace find_all_symbols
44*43356f56SNico Weber } // namespace clang
45