DirectoryLookup.h revision 1eb4433ac451dc16f4133a88af2d002ac26c58ef
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===--- DirectoryLookup.h - Info for searching for headers -----*- C++ -*-===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details. 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This file defines the DirectoryLookup interface. 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_CLANG_LEX_DIRECTORYLOOKUP_H 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_CLANG_LEX_DIRECTORYLOOKUP_H 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/Basic/SourceManager.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace clang { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HeaderMap; 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DirectoryEntry; 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class FileEntry; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class HeaderSearch; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// DirectoryLookup - This class represents one entry in the search list that 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/// specifies the search order for directories in #include directives. It 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/// represents either a directory, a framework, or a headermap. 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/// 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DirectoryLookup { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)public: 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) enum LookupType_t { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LT_NormalDir, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LT_Framework, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LT_HeaderMap 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) union { // This union is discriminated by isHeaderMap. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// Dir - This is the actual directory that we're referring to for a normal 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// directory or a framework. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DirectoryEntry *Dir; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// Map - This is the HeaderMap if this is a headermap lookup. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const HeaderMap *Map; 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } u; 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// DirCharacteristic - The type of directory this is: this is an instance of 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// SrcMgr::CharacteristicKind. 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) unsigned DirCharacteristic : 2; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 51 /// UserSupplied - True if this is a user-supplied directory. 52 /// 53 bool UserSupplied : 1; 54 55 /// LookupType - This indicates whether this DirectoryLookup object is a 56 /// normal directory, a framework, or a headermap. 57 unsigned LookupType : 2; 58public: 59 /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of 60 /// 'dir'. 61 DirectoryLookup(const DirectoryEntry *dir, SrcMgr::CharacteristicKind DT, 62 bool isUser, bool isFramework) 63 : DirCharacteristic(DT), UserSupplied(isUser), 64 LookupType(isFramework ? LT_Framework : LT_NormalDir) { 65 u.Dir = dir; 66 } 67 68 /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of 69 /// 'map'. 70 DirectoryLookup(const HeaderMap *map, SrcMgr::CharacteristicKind DT, 71 bool isUser) 72 : DirCharacteristic(DT), UserSupplied(isUser), LookupType(LT_HeaderMap) { 73 u.Map = map; 74 } 75 76 /// getLookupType - Return the kind of directory lookup that this is: either a 77 /// normal directory, a framework path, or a HeaderMap. 78 LookupType_t getLookupType() const { return (LookupType_t)LookupType; } 79 80 /// getName - Return the directory or filename corresponding to this lookup 81 /// object. 82 const char *getName() const; 83 84 /// getDir - Return the directory that this entry refers to. 85 /// 86 const DirectoryEntry *getDir() const { return isNormalDir() ? u.Dir : 0; } 87 88 /// getFrameworkDir - Return the directory that this framework refers to. 89 /// 90 const DirectoryEntry *getFrameworkDir() const { 91 return isFramework() ? u.Dir : 0; 92 } 93 94 /// getHeaderMap - Return the directory that this entry refers to. 95 /// 96 const HeaderMap *getHeaderMap() const { return isHeaderMap() ? u.Map : 0; } 97 98 /// isNormalDir - Return true if this is a normal directory, not a header map. 99 bool isNormalDir() const { return getLookupType() == LT_NormalDir; } 100 101 /// isFramework - True if this is a framework directory. 102 /// 103 bool isFramework() const { return getLookupType() == LT_Framework; } 104 105 /// isHeaderMap - Return true if this is a header map, not a normal directory. 106 bool isHeaderMap() const { return getLookupType() == LT_HeaderMap; } 107 108 /// DirCharacteristic - The type of directory this is, one of the DirType enum 109 /// values. 110 SrcMgr::CharacteristicKind getDirCharacteristic() const { 111 return (SrcMgr::CharacteristicKind)DirCharacteristic; 112 } 113 114 /// isUserSupplied - True if this is a user-supplied directory. 115 /// 116 bool isUserSupplied() const { return UserSupplied; } 117 118 119 /// LookupFile - Lookup the specified file in this search path, returning it 120 /// if it exists or returning null if not. 121 const FileEntry *LookupFile(const char *FilenameStart, 122 const char *FilenameEnd, HeaderSearch &HS) const; 123 124private: 125 const FileEntry *DoFrameworkLookup(const char *FilenameStart, 126 const char *FilenameEnd, 127 HeaderSearch &HS) const; 128 129}; 130 131} // end namespace clang 132 133#endif 134