Spicy
plugin.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <iostream>
6 #include <ranges>
7 #include <string>
8 #include <vector>
9 
10 #include <hilti/ast/ctor.h>
11 #include <hilti/ast/node.h>
12 #include <hilti/ast/type.h>
13 #include <hilti/base/logger.h>
14 #include <hilti/base/result.h>
15 #include <hilti/base/util.h>
16 #include <hilti/compiler/coercer.h>
17 #include <hilti/compiler/context.h>
18 
19 namespace hilti {
20 
21 class ASTContext;
22 class Context;
23 class Unit;
24 
25 namespace type_unifier {
26 class Unifier;
27 }
28 
47 struct Plugin {
49  template<typename Result, typename... Args>
50  using Hook = Result (*)(Args...);
51 
53  std::string component;
54 
59  int order = 0;
60 
62  hilti::rt::filesystem::path extension;
63 
68  std::vector<hilti::rt::filesystem::path> cxx_includes;
69 
78 
89 
98  Hook<Result<declaration::Module*>, hilti::Builder*, std::istream&, const hilti::rt::filesystem::path&> parse =
99  nullptr;
100 
114 
131 
139 
148 
157 
167 
176 
187 
198 
208 };
209 
210 class PluginRegistry;
211 
212 namespace plugin {
214 PluginRegistry& registry();
215 } // namespace plugin
216 
222 public:
223  PluginRegistry();
224 
229  const std::vector<Plugin>& plugins() const { return _plugins; }
230 
238  Result<std::reference_wrapper<const Plugin>> pluginForExtension(const hilti::rt::filesystem::path& ext) const;
239 
244  const Plugin& hiltiPlugin() const;
245 
252  template<typename PluginMember>
253  bool hasHookFor(PluginMember hook) {
254  for ( const auto& p : plugin::registry().plugins() ) {
255  if ( p.*hook )
256  return true;
257  }
258 
259  return false;
260  }
261 
268  bool supportsExtension(const hilti::rt::filesystem::path& ext) const { return pluginForExtension(ext).hasValue(); }
269 
271  auto supportedExtensions() const {
272  return _plugins | std::views::transform([](auto& p) { return p.extension; });
273  }
274 
283  void register_(const Plugin& p);
284 
285 private:
286  std::vector<Plugin> _plugins;
287 };
288 
289 namespace detail {
290 
291 Plugin createHiltiPlugin();
292 
293 } // namespace detail
294 
295 } // namespace hilti
Definition: builder.h:36
Definition: context.h:120
Definition: plugin.h:221
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:253
bool supportsExtension(const hilti::rt::filesystem::path &ext) const
Definition: plugin.h:268
const std::vector< Plugin > & plugins() const
Definition: plugin.h:229
auto supportedExtensions() const
Definition: plugin.h:271
Definition: result.h:73
Definition: plugin.h:47
std::string component
Definition: plugin.h:53
Hook< QualifiedType *, Builder *, QualifiedType *, QualifiedType *, bitmask< CoercionStyle > > coerce_type
Definition: plugin.h:130
Hook< bool, Node *, printer::Stream & > ast_print
Definition: plugin.h:186
Hook< bool, Builder *, ASTRoot * > ast_transform
Definition: plugin.h:207
Result(*)(Args...) Hook
Definition: plugin.h:50
Hook< bool, Builder *, ASTRoot * > ast_validate_pre
Definition: plugin.h:166
std::vector< hilti::rt::filesystem::path > cxx_includes
Definition: plugin.h:68
int order
Definition: plugin.h:59
Hook< bool, Builder *, Node * > ast_resolve
Definition: plugin.h:156
Hook< bool, type_unifier::Unifier *, UnqualifiedType * > unify_type
Definition: plugin.h:88
Hook< bool, Builder *, ASTRoot * > ast_build_scopes
Definition: plugin.h:147
hilti::rt::filesystem::path extension
Definition: plugin.h:62
Hook< void, Builder *, ASTRoot * > ast_init
Definition: plugin.h:138
Hook< bool, const ID &, printer::Stream & > ast_print_id
Definition: plugin.h:197
Hook< Ctor *, Builder *, Ctor *, QualifiedType *, bitmask< CoercionStyle > > coerce_ctor
Definition: plugin.h:113
Hook< bool, Builder *, ASTRoot * > ast_validate_post
Definition: plugin.h:175
Hook< std::vector< hilti::rt::filesystem::path >, Context * > library_paths
Definition: plugin.h:77
Hook< Result< declaration::Module * >, hilti::Builder *, std::istream &, const hilti::rt::filesystem::path & > parse
Definition: plugin.h:98