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  std::vector<hilti::rt::filesystem::path> library_paths;
43  std::string cxx_namespace_extern =
44  "hlt";
45  std::string cxx_namespace_intern = "__hlt";
46  std::vector<hilti::rt::filesystem::path>
48  bool keep_tmps = false;
49  std::vector<std::string> cxx_link;
61  template<typename T>
62  T getAuxOption(const std::string& key, T default_) const {
63  auto i = _aux_options.find(key);
64  if ( i != _aux_options.end() )
65  return hilti::rt::any_cast<T>(i->second);
66  else
67  return default_;
68  }
69 
78  template<typename T>
79  void setAuxOption(const std::string& key, T value) {
80  _aux_options[key] = value;
81  }
82 
90  Result<Nothing> parseDebugAddl(const std::string& flags);
91 
93  void print(std::ostream& out) const;
94 
95 private:
96  std::map<std::string, hilti::rt::any> _aux_options;
97 };
98 
99 namespace context {
100 
107 struct CacheIndex {
108  ID id;
110  hilti::rt::filesystem::path path;
112  auto scopedID() const { return scope + id; }
113 
114  CacheIndex() = default;
115  CacheIndex(ID id, const std::optional<ID>& scope, const hilti::rt::filesystem::path& path)
116  : id(std::move(id)), scope(scope ? *scope : ID()), path(util::normalizePath(path)) {}
117 };
118 
125 struct CacheEntry {
126  std::shared_ptr<Unit> unit;
128  CacheEntry() = default;
129  CacheEntry(std::shared_ptr<Unit> unit) : unit(std::move(unit)) {}
130 };
131 
132 } // namespace context
133 
135 class Context {
136 public:
140  explicit Context(Options options);
141 
143  ~Context();
144 
146  const Options& options() const { return _options; }
147 
156  void cacheUnit(const std::shared_ptr<Unit>& unit);
157 
168  std::optional<context::CacheEntry> lookupUnit(const ID& id, const std::optional<ID>& scope,
169  const hilti::rt::filesystem::path& extension);
170 
179  std::optional<context::CacheEntry> lookupUnit(const hilti::rt::filesystem::path& path,
180  const std::optional<ID>& scope,
181  std::optional<hilti::rt::filesystem::path> ast_extension = {});
182 
189  std::optional<context::CacheEntry> lookupUnit(const context::CacheIndex& idx,
190  const std::optional<hilti::rt::filesystem::path>& ast_extension = {});
191 
199  std::vector<std::weak_ptr<Unit>> lookupDependenciesForUnit(const context::CacheIndex& idx,
200  const hilti::rt::filesystem::path& extension);
201 
207  void dumpUnitCache(const hilti::logging::DebugStream& stream);
208 
209 private:
210  Options _options;
211 
212  std::unordered_map<ID, std::shared_ptr<context::CacheEntry>> _unit_cache_by_id;
213  std::unordered_map<std::string, std::shared_ptr<context::CacheEntry>> _unit_cache_by_path;
214 };
215 
216 } // namespace hilti
Definition: context.h:107
ID scope
Definition: context.h:109
bool track_location
Definition: context.h:39
bool keep_tmps
Definition: context.h:48
Definition: context.h:33
ID id
Definition: context.h:108
std::string cxx_namespace_intern
Definition: context.h:45
Definition: optional.h:79
bool debug_flow
Definition: context.h:37
void setAuxOption(const std::string &key, T value)
Definition: context.h:79
Result< Nothing > parseDebugAddl(const std::string &flags)
Definition: context.cc:16
std::vector< hilti::rt::filesystem::path > cxx_include_paths
Definition: context.h:47
std::string cxx_namespace_extern
Definition: context.h:43
std::vector< hilti::rt::filesystem::path > library_paths
Definition: context.h:42
void print(std::ostream &out) const
Definition: context.cc:34
std::shared_ptr< Unit > unit
Definition: context.h:126
Definition: context.h:125
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:62
hilti::rt::filesystem::path path
Definition: context.h:110
std::vector< std::string > cxx_link
Definition: context.h:49
const Options & options() const
Definition: context.h:146
Definition: elements.cc:17
bool skip_validation
Definition: context.h:40
Definition: id.h:18
Definition: result.h:67
Definition: context.h:135
Definition: logger.h:28