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