Spicy
context.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <map>
6 #include <memory>
7 #include <string>
8 #include <tuple>
9 #include <unordered_map>
10 #include <utility>
11 #include <vector>
12 
13 #include <hilti/rt/any.h>
14 #include <hilti/rt/filesystem.h>
15 
16 #include <hilti/ast/id.h>
17 #include <hilti/autogen/config.h>
18 #include <hilti/base/logger.h>
19 #include <hilti/base/result.h>
20 #include <hilti/base/util.h>
21 
22 namespace hilti {
23 
24 class PluginRegistry;
25 class Unit;
26 
33 struct Options {
34  bool debug = false;
35  bool debug_trace =
36  false;
37  bool debug_flow = false;
39  bool track_location = true;
40  bool skip_validation = false;
42  bool optimize = false;
43  std::vector<hilti::rt::filesystem::path> library_paths;
44  std::string cxx_namespace_extern =
45  "hlt";
46  std::string cxx_namespace_intern = "__hlt";
47  std::vector<hilti::rt::filesystem::path>
60  template<typename T>
61  T getAuxOption(const std::string& key, T default_) const {
62  auto i = _aux_options.find(key);
63  if ( i != _aux_options.end() )
64  return hilti::rt::any_cast<T>(i->second);
65  else
66  return default_;
67  }
68 
77  template<typename T>
78  void setAuxOption(const std::string& key, T value) {
79  _aux_options[key] = value;
80  }
81 
89  Result<Nothing> parseDebugAddl(const std::string& flags);
90 
92  void print(std::ostream& out) const;
93 
94 private:
95  std::map<std::string, hilti::rt::any> _aux_options;
96 };
97 
98 namespace context {
99 
106 struct CacheIndex {
107  ID id;
108  hilti::rt::filesystem::path path;
110  CacheIndex() = default;
111  CacheIndex(ID id, const hilti::rt::filesystem::path& path) : id(std::move(id)), path(util::normalizePath(path)) {}
112  bool operator<(const CacheIndex& other) const { return id < other.id; }
113 };
114 
121 struct CacheEntry {
122  std::shared_ptr<Unit> unit;
124  CacheEntry() = default;
125  CacheEntry(std::shared_ptr<Unit> unit) : unit(std::move(unit)) {}
126 };
127 
128 } // namespace context
129 
131 class Context {
132 public:
136  explicit Context(Options options);
137 
139  ~Context();
140 
142  const Options& options() const { return _options; }
143 
152  void cacheUnit(std::shared_ptr<Unit> unit);
153 
163  std::optional<context::CacheEntry> lookupUnit(const ID& id, const hilti::rt::filesystem::path& extension);
164 
172  std::optional<context::CacheEntry> lookupUnit(const hilti::rt::filesystem::path& path,
173  std::optional<hilti::rt::filesystem::path> ast_extension = {});
174 
179  std::vector<std::weak_ptr<Unit>> lookupDependenciesForUnit(const ID& id,
180  const hilti::rt::filesystem::path& extension);
181 
187  void dumpUnitCache(const hilti::logging::DebugStream& stream);
188 
189 private:
190  Options _options;
191 
192  std::unordered_map<ID, std::shared_ptr<context::CacheEntry>> _unit_cache_by_id;
193  std::unordered_map<std::string, std::shared_ptr<context::CacheEntry>> _unit_cache_by_path;
194 };
195 
196 } // namespace hilti
Definition: context.h:106
bool track_location
Definition: context.h:39
Definition: context.h:33
ID id
Definition: context.h:107
bool optimize
Definition: context.h:42
std::string cxx_namespace_intern
Definition: context.h:46
Definition: optional.h:79
bool debug_flow
Definition: context.h:37
void setAuxOption(const std::string &key, T value)
Definition: context.h:78
Result< Nothing > parseDebugAddl(const std::string &flags)
Definition: context.cc:16
std::vector< hilti::rt::filesystem::path > cxx_include_paths
Definition: context.h:48
std::string cxx_namespace_extern
Definition: context.h:44
std::vector< hilti::rt::filesystem::path > library_paths
Definition: context.h:43
void print(std::ostream &out) const
Definition: context.cc:34
std::shared_ptr< Unit > unit
Definition: context.h:122
Definition: context.h:121
bool debug_trace
Definition: context.h:35
bool debug
Definition: context.h:34
T getAuxOption(const std::string &key, T default_) const
Definition: context.h:61
hilti::rt::filesystem::path path
Definition: context.h:108
const Options & options() const
Definition: context.h:142
Definition: elements.cc:17
bool skip_validation
Definition: context.h:40
Definition: id.h:18
Definition: result.h:67
Definition: context.h:131
Definition: logger.h:28