Spicy
plugin.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <algorithm>
6 #include <iostream>
7 #include <memory>
8 #include <optional>
9 #include <string>
10 #include <utility>
11 #include <vector>
12 
13 #include <hilti/rt/3rdparty/ArticleEnumClass-v2/EnumClass.h>
14 
15 #include <hilti/ast/ctor.h>
16 #include <hilti/ast/node.h>
17 #include <hilti/ast/type.h>
18 #include <hilti/base/logger.h>
19 #include <hilti/base/result.h>
20 #include <hilti/base/util.h>
21 #include <hilti/compiler/coercer.h>
22 #include <hilti/compiler/context.h>
23 
24 namespace hilti {
25 
26 class ASTContext;
27 class Context;
28 class Unit;
29 
30 namespace type_unifier {
31 class Unifier;
32 }
33 
52 struct Plugin {
54  template<typename Result, typename... Args>
55  using Hook = Result (*)(Args...);
56 
58  std::string component;
59 
64  int order = 0;
65 
67  hilti::rt::filesystem::path extension;
68 
73  std::vector<hilti::rt::filesystem::path> cxx_includes;
74 
83 
94 
103  Hook<Result<declaration::Module*>, hilti::Builder*, std::istream&, const hilti::rt::filesystem::path&> parse =
104  nullptr;
105 
119 
136 
144 
153 
162 
172 
181 
192 
203 
213 };
214 
215 class PluginRegistry;
216 
217 namespace plugin {
219 PluginRegistry& registry();
220 } // namespace plugin
221 
227 public:
228  PluginRegistry();
229 
234  const std::vector<Plugin>& plugins() const { return _plugins; }
235 
243  Result<std::reference_wrapper<const Plugin>> pluginForExtension(const hilti::rt::filesystem::path& ext) const;
244 
249  const Plugin& hiltiPlugin() const;
250 
257  template<typename PluginMember>
258  bool hasHookFor(PluginMember hook) {
259  for ( const auto& p : plugin::registry().plugins() ) {
260  if ( p.*hook )
261  return true;
262  }
263 
264  return false;
265  }
266 
273  bool supportsExtension(const hilti::rt::filesystem::path& ext) const { return pluginForExtension(ext).hasValue(); }
274 
276  auto supportedExtensions() const {
277  return util::transform(_plugins, [](auto& p) { return p.extension; });
278  }
279 
288  void register_(const Plugin& p);
289 
290 private:
291  std::vector<Plugin> _plugins;
292 };
293 
294 namespace detail {
295 
296 Plugin createHiltiPlugin();
297 
298 } // namespace detail
299 
300 } // namespace hilti
Definition: builder.h:36
Definition: context.h:108
Definition: plugin.h:226
Result< std::reference_wrapper< const Plugin > > pluginForExtension(const hilti::rt::filesystem::path &ext) const
Definition: plugin.cc:21
const Plugin & hiltiPlugin() const
Definition: plugin.cc:30
void register_(const Plugin &p)
Definition: plugin.cc:49
bool hasHookFor(PluginMember hook)
Definition: plugin.h:258
bool supportsExtension(const hilti::rt::filesystem::path &ext) const
Definition: plugin.h:273
const std::vector< Plugin > & plugins() const
Definition: plugin.h:234
auto supportedExtensions() const
Definition: plugin.h:276
Definition: result.h:71
Definition: plugin.h:52
std::string component
Definition: plugin.h:58
Hook< QualifiedType *, Builder *, QualifiedType *, QualifiedType *, bitmask< CoercionStyle > > coerce_type
Definition: plugin.h:135
Hook< bool, Node *, printer::Stream & > ast_print
Definition: plugin.h:191
Hook< bool, Builder *, ASTRoot * > ast_transform
Definition: plugin.h:212
Result(*)(Args...) Hook
Definition: plugin.h:55
Hook< bool, Builder *, ASTRoot * > ast_validate_pre
Definition: plugin.h:171
std::vector< hilti::rt::filesystem::path > cxx_includes
Definition: plugin.h:73
int order
Definition: plugin.h:64
Hook< bool, Builder *, Node * > ast_resolve
Definition: plugin.h:161
Hook< bool, type_unifier::Unifier *, UnqualifiedType * > unify_type
Definition: plugin.h:93
Hook< bool, Builder *, ASTRoot * > ast_build_scopes
Definition: plugin.h:152
hilti::rt::filesystem::path extension
Definition: plugin.h:67
Hook< void, Builder *, ASTRoot * > ast_init
Definition: plugin.h:143
Hook< bool, const ID &, printer::Stream & > ast_print_id
Definition: plugin.h:202
Hook< Ctor *, Builder *, Ctor *, QualifiedType *, bitmask< CoercionStyle > > coerce_ctor
Definition: plugin.h:118
Hook< bool, Builder *, ASTRoot * > ast_validate_post
Definition: plugin.h:180
Hook< std::vector< hilti::rt::filesystem::path >, Context * > library_paths
Definition: plugin.h:82
Hook< Result< declaration::Module * >, hilti::Builder *, std::istream &, const hilti::rt::filesystem::path & > parse
Definition: plugin.h:103