DirectoryLookup.h revision a139481e62fdb209d9d87a54a5733f989d2e8d51
1//===--- DirectoryLookup.h - Info for searching for headers -----*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the DirectoryLookup interface.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_LEX_DIRECTORYLOOKUP_H
15#define LLVM_CLANG_LEX_DIRECTORYLOOKUP_H
16
17#include "clang/Basic/SourceManager.h"
18
19namespace llvm {
20  class StringRef;
21}
22namespace clang {
23class HeaderMap;
24class DirectoryEntry;
25class FileEntry;
26class HeaderSearch;
27
28/// DirectoryLookup - This class represents one entry in the search list that
29/// specifies the search order for directories in #include directives.  It
30/// represents either a directory, a framework, or a headermap.
31///
32class DirectoryLookup {
33public:
34  enum LookupType_t {
35    LT_NormalDir,
36    LT_Framework,
37    LT_HeaderMap
38  };
39private:
40  union {  // This union is discriminated by isHeaderMap.
41    /// Dir - This is the actual directory that we're referring to for a normal
42    /// directory or a framework.
43    const DirectoryEntry *Dir;
44
45    /// Map - This is the HeaderMap if this is a headermap lookup.
46    ///
47    const HeaderMap *Map;
48  } u;
49
50  /// DirCharacteristic - The type of directory this is: this is an instance of
51  /// SrcMgr::CharacteristicKind.
52  unsigned DirCharacteristic : 2;
53
54  /// UserSupplied - True if this is a user-supplied directory.
55  ///
56  bool UserSupplied : 1;
57
58  /// LookupType - This indicates whether this DirectoryLookup object is a
59  /// normal directory, a framework, or a headermap.
60  unsigned LookupType : 2;
61public:
62  /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of
63  /// 'dir'.
64  DirectoryLookup(const DirectoryEntry *dir, SrcMgr::CharacteristicKind DT,
65                  bool isUser, bool isFramework)
66    : DirCharacteristic(DT), UserSupplied(isUser),
67     LookupType(isFramework ? LT_Framework : LT_NormalDir) {
68    u.Dir = dir;
69  }
70
71  /// DirectoryLookup ctor - Note that this ctor *does not take ownership* of
72  /// 'map'.
73  DirectoryLookup(const HeaderMap *map, SrcMgr::CharacteristicKind DT,
74                  bool isUser)
75    : DirCharacteristic(DT), UserSupplied(isUser), LookupType(LT_HeaderMap) {
76    u.Map = map;
77  }
78
79  /// getLookupType - Return the kind of directory lookup that this is: either a
80  /// normal directory, a framework path, or a HeaderMap.
81  LookupType_t getLookupType() const { return (LookupType_t)LookupType; }
82
83  /// getName - Return the directory or filename corresponding to this lookup
84  /// object.
85  const char *getName() const;
86
87  /// getDir - Return the directory that this entry refers to.
88  ///
89  const DirectoryEntry *getDir() const { return isNormalDir() ? u.Dir : 0; }
90
91  /// getFrameworkDir - Return the directory that this framework refers to.
92  ///
93  const DirectoryEntry *getFrameworkDir() const {
94    return isFramework() ? u.Dir : 0;
95  }
96
97  /// getHeaderMap - Return the directory that this entry refers to.
98  ///
99  const HeaderMap *getHeaderMap() const { return isHeaderMap() ? u.Map : 0; }
100
101  /// isNormalDir - Return true if this is a normal directory, not a header map.
102  bool isNormalDir() const { return getLookupType() == LT_NormalDir; }
103
104  /// isFramework - True if this is a framework directory.
105  ///
106  bool isFramework() const { return getLookupType() == LT_Framework; }
107
108  /// isHeaderMap - Return true if this is a header map, not a normal directory.
109  bool isHeaderMap() const { return getLookupType() == LT_HeaderMap; }
110
111  /// DirCharacteristic - The type of directory this is, one of the DirType enum
112  /// values.
113  SrcMgr::CharacteristicKind getDirCharacteristic() const {
114    return (SrcMgr::CharacteristicKind)DirCharacteristic;
115  }
116
117  /// isUserSupplied - True if this is a user-supplied directory.
118  ///
119  bool isUserSupplied() const { return UserSupplied; }
120
121
122  /// LookupFile - Lookup the specified file in this search path, returning it
123  /// if it exists or returning null if not.
124  const FileEntry *LookupFile(llvm::StringRef Filename, HeaderSearch &HS) const;
125
126private:
127  const FileEntry *DoFrameworkLookup(llvm::StringRef Filename,
128                                     HeaderSearch &HS) const;
129
130};
131
132}  // end namespace clang
133
134#endif
135