DirectoryLookup.h revision ca63fa00786e51c207c829f4182f11a6c6b552be
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//===--- DirectoryLookup.h - Info for searching for headers -----*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// License. See LICENSE.TXT for details. 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===----------------------------------------------------------------------===// 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file defines the DirectoryLookup interface. 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===----------------------------------------------------------------------===// 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef LLVM_CLANG_LEX_DIRECTORYLOOKUP_H 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define LLVM_CLANG_LEX_DIRECTORYLOOKUP_H 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace clang { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HeaderMap; 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DirectoryEntry; 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class FileEntry; 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HeaderSearch; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// DirectoryLookup - This class represents one entry in the search list that 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// specifies the search order for directories in #include directives. It 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// represents either a directory, a framework, or a headermap. 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DirectoryLookup { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum DirType { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NormalHeaderDir, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SystemHeaderDir, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExternCSystemHeaderDir 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enum LookupType_t { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LT_NormalDir, 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LT_Framework, 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LT_HeaderMap 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochprivate: 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) union { // This union is discriminated by isHeaderMap. 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// Dir - This is the actual directory that we're referring to for a normal 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /// directory or a framework. 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const DirectoryEntry *Dir; 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// Map - This is the HeaderMap if this is a headermap lookup. 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const HeaderMap *Map; 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } u; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // NOTE: VC++ treats enums as signed, avoid using the DirType enum 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// DirCharacteristic - The type of directory this is, one of the DirType enum 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// values. 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned DirCharacteristic : 2; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// UserSupplied - True if this is a user-supplied directory. 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool UserSupplied : 1; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// LookupType - This indicates whether this DirectoryLookup object is a 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// normal directory, a framework, or a headermap. 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsigned LookupType : 2; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)public: 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /// 'dir'. 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DirectoryLookup(const DirectoryEntry *dir, DirType DT, bool isUser, 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool isFramework) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : DirCharacteristic(DT), UserSupplied(isUser), 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LookupType(isFramework ? LT_Framework : LT_NormalDir) { 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) u.Dir = dir; 71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of 74b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /// 'map'. 75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DirectoryLookup(const HeaderMap *map, DirType DT, bool isUser) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : DirCharacteristic(DT), UserSupplied(isUser), LookupType(LT_HeaderMap) { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) u.Map = map; 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// getLookupType - Return the kind of directory lookup that this is: either a 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// normal directory, a framework path, or a HeaderMap. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LookupType_t getLookupType() const { return (LookupType_t)LookupType; } 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// getName - Return the directory or filename corresponding to this lookup 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /// object. 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char *getName() const; 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /// getDir - Return the directory that this entry refers to. 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DirectoryEntry *getDir() const { return isNormalDir() ? u.Dir : 0; } 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /// getFrameworkDir - Return the directory that this framework refers to. 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const DirectoryEntry *getFrameworkDir() const { 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return isFramework() ? u.Dir : 0; 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// getHeaderMap - Return the directory that this entry refers to. 99ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch /// 100ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch const HeaderMap *getHeaderMap() const { return isHeaderMap() ? u.Map : 0; } 101ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// isNormalDir - Return true if this is a normal directory, not a header map. 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool isNormalDir() const { return getLookupType() == LT_NormalDir; } 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// isFramework - True if this is a framework directory. 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool isFramework() const { return getLookupType() == LT_Framework; } 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) /// isHeaderMap - Return true if this is a header map, not a normal directory. 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool isHeaderMap() const { return getLookupType() == LT_HeaderMap; } 1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// DirCharacteristic - The type of directory this is, one of the DirType enum 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// values. 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DirType getDirCharacteristic() const { return DirType(DirCharacteristic); } 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// isUserSupplied - True if this is a user-supplied directory. 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /// 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool isUserSupplied() const { return UserSupplied; } 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch /// LookupFile - Lookup the specified file in this search path, returning it 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch /// if it exists or returning null if not. 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FileEntry *LookupFile(const char *FilenameStart, 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char *FilenameEnd, HeaderSearch &HS) const; 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochprivate: 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const FileEntry *DoFrameworkLookup(const char *FilenameStart, 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const char *FilenameEnd, 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) HeaderSearch &HS) const; 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // end namespace clang 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)