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)