Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===--- DirectoryLookup.h - Info for searching for headers -----*- C++ -*-===// | 
| 2 | // | ||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| 6 | // | ||
| 7 | //===----------------------------------------------------------------------===// | ||
| 8 | // | ||
| 9 | // This file defines the DirectoryLookup interface. | ||
| 10 | // | ||
| 11 | //===----------------------------------------------------------------------===// | ||
| 12 | |||
| 13 | #ifndef LLVM_CLANG_LEX_DIRECTORYLOOKUP_H | ||
| 14 | #define LLVM_CLANG_LEX_DIRECTORYLOOKUP_H | ||
| 15 | |||
| 16 | #include "clang/Basic/LLVM.h" | ||
| 17 | #include "clang/Basic/FileManager.h" | ||
| 18 | #include "clang/Basic/SourceManager.h" | ||
| 19 | #include "clang/Lex/ModuleMap.h" | ||
| 20 | |||
| 21 | namespace clang { | ||
| 22 | class HeaderMap; | ||
| 23 | class HeaderSearch; | ||
| 24 | class Module; | ||
| 25 | |||
| 26 | /// DirectoryLookup - This class represents one entry in the search list that | ||
| 27 | /// specifies the search order for directories in \#include directives.  It | ||
| 28 | /// represents either a directory, a framework, or a headermap. | ||
| 29 | /// | ||
| 30 | class DirectoryLookup { | ||
| 31 | public: | ||
| 32 | enum LookupType_t { | ||
| 33 | LT_NormalDir, | ||
| 34 | LT_Framework, | ||
| 35 | LT_HeaderMap | ||
| 36 | }; | ||
| 37 | private: | ||
| 38 | union DLU { // This union is discriminated by isHeaderMap. | ||
| 39 |     /// Dir - This is the actual directory that we're referring to for a normal | ||
| 40 |     /// directory or a framework. | ||
| 41 |     DirectoryEntryRef Dir; | ||
| 42 | |||
| 43 |     /// Map - This is the HeaderMap if this is a headermap lookup. | ||
| 44 |     /// | ||
| 45 | const HeaderMap *Map; | ||
| 46 | |||
| 47 | DLU(DirectoryEntryRef Dir) : Dir(Dir) {} | ||
| 48 | DLU(const HeaderMap *Map) : Map(Map) {} | ||
| 49 | } u; | ||
| 50 | |||
| 51 |   /// DirCharacteristic - The type of directory this is: this is an instance of | ||
| 52 |   /// SrcMgr::CharacteristicKind. | ||
| 53 | unsigned DirCharacteristic : 3; | ||
| 54 | |||
| 55 |   /// LookupType - This indicates whether this DirectoryLookup object is a | ||
| 56 |   /// normal directory, a framework, or a headermap. | ||
| 57 | unsigned LookupType : 2; | ||
| 58 | |||
| 59 |   /// Whether this is a header map used when building a framework. | ||
| 60 | unsigned IsIndexHeaderMap : 1; | ||
| 61 | |||
| 62 |   /// Whether we've performed an exhaustive search for module maps | ||
| 63 |   /// within the subdirectories of this directory. | ||
| 64 | unsigned SearchedAllModuleMaps : 1; | ||
| 65 | |||
| 66 | public: | ||
| 67 |   /// This ctor *does not take ownership* of 'Dir'. | ||
| 68 | DirectoryLookup(DirectoryEntryRef Dir, SrcMgr::CharacteristicKind DT, | ||
| 69 | bool isFramework) | ||
| 70 | : u(Dir), DirCharacteristic(DT), | ||
| 71 | LookupType(isFramework ? LT_Framework : LT_NormalDir), | ||
| 72 | IsIndexHeaderMap(false), SearchedAllModuleMaps(false) {} | ||
| 73 | |||
| 74 |   /// This ctor *does not take ownership* of 'Map'. | ||
| 75 | DirectoryLookup(const HeaderMap *Map, SrcMgr::CharacteristicKind DT, | ||
| 76 | bool isIndexHeaderMap) | ||
| 77 | : u(Map), DirCharacteristic(DT), LookupType(LT_HeaderMap), | ||
| 78 | IsIndexHeaderMap(isIndexHeaderMap), SearchedAllModuleMaps(false) {} | ||
| 79 | |||
| 80 |   /// getLookupType - Return the kind of directory lookup that this is: either a | ||
| 81 |   /// normal directory, a framework path, or a HeaderMap. | ||
| 82 | LookupType_t getLookupType() const { return (LookupType_t)LookupType; } | ||
| 83 | |||
| 84 |   /// getName - Return the directory or filename corresponding to this lookup | ||
| 85 |   /// object. | ||
| 86 | StringRef getName() const; | ||
| 87 | |||
| 88 |   /// getDir - Return the directory that this entry refers to. | ||
| 89 |   /// | ||
| 90 | const DirectoryEntry *getDir() const { | ||
| 91 | return isNormalDir() ? &u.Dir.getDirEntry() : nullptr; | ||
| 92 |   } | ||
| 93 | |||
| 94 | OptionalDirectoryEntryRef getDirRef() const { | ||
| 95 | return isNormalDir() ? OptionalDirectoryEntryRef(u.Dir) : std::nullopt; | ||
| 96 |   } | ||
| 97 | |||
| 98 |   /// getFrameworkDir - Return the directory that this framework refers to. | ||
| 99 |   /// | ||
| 100 | const DirectoryEntry *getFrameworkDir() const { | ||
| 101 | return isFramework() ? &u.Dir.getDirEntry() : nullptr; | ||
| 102 |   } | ||
| 103 | |||
| 104 | OptionalDirectoryEntryRef getFrameworkDirRef() const { | ||
| 105 | return isFramework() ? OptionalDirectoryEntryRef(u.Dir) : std::nullopt; | ||
| 106 |   } | ||
| 107 | |||
| 108 |   /// getHeaderMap - Return the directory that this entry refers to. | ||
| 109 |   /// | ||
| 110 | const HeaderMap *getHeaderMap() const { | ||
| 111 | return isHeaderMap() ? u.Map : nullptr; | ||
| 112 |   } | ||
| 113 | |||
| 114 |   /// isNormalDir - Return true if this is a normal directory, not a header map. | ||
| 115 | bool isNormalDir() const { return getLookupType() == LT_NormalDir; } | ||
| 116 | |||
| 117 |   /// isFramework - True if this is a framework directory. | ||
| 118 |   /// | ||
| 119 | bool isFramework() const { return getLookupType() == LT_Framework; } | ||
| 120 | |||
| 121 |   /// isHeaderMap - Return true if this is a header map, not a normal directory. | ||
| 122 | bool isHeaderMap() const { return getLookupType() == LT_HeaderMap; } | ||
| 123 | |||
| 124 |   /// Determine whether we have already searched this entire | ||
| 125 |   /// directory for module maps. | ||
| 126 | bool haveSearchedAllModuleMaps() const { return SearchedAllModuleMaps; } | ||
| 127 | |||
| 128 |   /// Specify whether we have already searched all of the subdirectories | ||
| 129 |   /// for module maps. | ||
| 130 | void setSearchedAllModuleMaps(bool SAMM) { | ||
| 131 | SearchedAllModuleMaps = SAMM; | ||
| 132 |   } | ||
| 133 | |||
| 134 |   /// DirCharacteristic - The type of directory this is, one of the DirType enum | ||
| 135 |   /// values. | ||
| 136 | SrcMgr::CharacteristicKind getDirCharacteristic() const { | ||
| 137 | return (SrcMgr::CharacteristicKind)DirCharacteristic; | ||
| 138 |   } | ||
| 139 | |||
| 140 |   /// Whether this describes a system header directory. | ||
| 141 | bool isSystemHeaderDirectory() const { | ||
| 142 | return getDirCharacteristic() != SrcMgr::C_User; | ||
| 143 |   } | ||
| 144 | |||
| 145 |   /// Whether this header map is building a framework or not. | ||
| 146 | bool isIndexHeaderMap() const { | ||
| 147 | return isHeaderMap() && IsIndexHeaderMap; | ||
| 148 |   } | ||
| 149 | |||
| 150 |   /// LookupFile - Lookup the specified file in this search path, returning it | ||
| 151 |   /// if it exists or returning null if not. | ||
| 152 |   /// | ||
| 153 |   /// \param Filename The file to look up relative to the search paths. | ||
| 154 |   /// | ||
| 155 |   /// \param HS The header search instance to search with. | ||
| 156 |   /// | ||
| 157 |   /// \param IncludeLoc the source location of the #include or #import | ||
| 158 |   /// directive. | ||
| 159 |   /// | ||
| 160 |   /// \param SearchPath If not NULL, will be set to the search path relative | ||
| 161 |   /// to which the file was found. | ||
| 162 |   /// | ||
| 163 |   /// \param RelativePath If not NULL, will be set to the path relative to | ||
| 164 |   /// SearchPath at which the file was found. This only differs from the | ||
| 165 |   /// Filename for framework includes. | ||
| 166 |   /// | ||
| 167 |   /// \param RequestingModule The module in which the lookup was performed. | ||
| 168 |   /// | ||
| 169 |   /// \param SuggestedModule If non-null, and the file found is semantically | ||
| 170 |   /// part of a known module, this will be set to the module that should | ||
| 171 |   /// be imported instead of preprocessing/parsing the file found. | ||
| 172 |   /// | ||
| 173 |   /// \param [out] InUserSpecifiedSystemFramework If the file is found, | ||
| 174 |   /// set to true if the file is located in a framework that has been | ||
| 175 |   /// user-specified to be treated as a system framework. | ||
| 176 |   /// | ||
| 177 |   /// \param [out] IsFrameworkFound For a framework directory set to true if | ||
| 178 |   /// specified '.framework' directory is found. | ||
| 179 |   /// | ||
| 180 |   /// \param [out] MappedName if this is a headermap which maps the filename to | ||
| 181 |   /// a framework include ("Foo.h" -> "Foo/Foo.h"), set the new name to this | ||
| 182 |   /// vector and point Filename to it. | ||
| 183 | OptionalFileEntryRef | ||
| 184 | LookupFile(StringRef &Filename, HeaderSearch &HS, SourceLocation IncludeLoc, | ||
| 185 | SmallVectorImpl<char> *SearchPath, | ||
| 186 | SmallVectorImpl<char> *RelativePath, Module *RequestingModule, | ||
| 187 | ModuleMap::KnownHeader *SuggestedModule, | ||
| 188 | bool &InUserSpecifiedSystemFramework, bool &IsFrameworkFound, | ||
| 189 | bool &IsInHeaderMap, SmallVectorImpl<char> &MappedName, | ||
| 190 | bool OpenFile = true) const; | ||
| 191 | |||
| 192 | private: | ||
| 193 |   OptionalFileEntryRef DoFrameworkLookup( | ||
| 194 | StringRef Filename, HeaderSearch &HS, SmallVectorImpl<char> *SearchPath, | ||
| 195 | SmallVectorImpl<char> *RelativePath, Module *RequestingModule, | ||
| 196 | ModuleMap::KnownHeader *SuggestedModule, | ||
| 197 | bool &InUserSpecifiedSystemFramework, bool &IsFrameworkFound) const; | ||
| 198 | }; | ||
| 199 | |||
| 200 | } // end namespace clang | ||
| 201 | |||
| 202 | #endif |