Spicy
codegen.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <memory>
6 #include <string>
7 #include <unordered_set>
8 #include <utility>
9 #include <vector>
10 
11 #include <hilti/ast/declarations/function.h>
12 #include <hilti/ast/declarations/property.h>
13 #include <hilti/ast/node.h>
14 #include <hilti/base/uniquer.h>
15 #include <hilti/compiler/unit.h>
16 
17 #include <spicy/ast/types/unit-items/field.h>
18 #include <spicy/ast/types/unit.h>
19 #include <spicy/compiler/detail/codegen/grammar-builder.h>
20 #include <spicy/compiler/detail/codegen/parser-builder.h>
21 
22 namespace spicy::detail {
23 
30 class CodeGen {
31 public:
32  CodeGen(std::shared_ptr<hilti::Context> context) : _context(std::move(context)), _gb(this), _pb(this) {}
33 
35  bool compileModule(hilti::Node* root, bool init, hilti::Unit* u);
36 
37  const auto& context() const { return _context; }
38  const auto& options() const { return _context->options(); }
39 
40  hilti::Type compileUnit(const type::Unit& unit,
41  bool declare_only = true); // Compiles a Unit type into its HILTI struct representation.
42 
43  std::optional<hilti::declaration::Function> compileHook(
44  const type::Unit& unit, const ID& id,
45  std::optional<std::reference_wrapper<const type::unit::item::Field>> field, bool foreach, bool debug,
46  std::vector<type::function::Parameter> params, std::optional<hilti::Statement> body,
47  std::optional<Expression> /*priority*/, const hilti::Meta& meta);
48 
49  // These must be called only while a module is being compiled.
50  codegen::ParserBuilder* parserBuilder() { return &_pb; }
51  codegen::GrammarBuilder* grammarBuilder() { return &_gb; }
52  hilti::Unit* hiltiUnit() const; // will abort if not compiling a module.
53  hilti::Module* hiltiModule() const; // will abort if not compiling a module.
54  NodeRef preserveNode(Expression x);
55  NodeRef preserveNode(Statement x);
56  NodeRef preserveNode(Type x);
57  auto uniquer() { return &_uniquer; }
58 
59  const auto& moduleProperties() const { return _properties; }
60  void recordModuleProperty(hilti::declaration::Property p) { _properties.emplace_back(std::move(p)); }
61 
62  void addDeclaration(Declaration d) {
63  _decls_added.insert(d.id());
64  _new_decls.push_back(std::move(d));
65  }
66 
67  bool haveAddedDeclaration(const ID& id) { return _decls_added.find(id) != _decls_added.end(); }
68 
69 
70 private:
71  std::shared_ptr<hilti::Context> _context;
74 
75  std::vector<hilti::declaration::Property> _properties;
76 
77  hilti::Unit* _hilti_unit = nullptr;
78  hilti::Node* _root = nullptr;
79  std::vector<Declaration> _new_decls;
80  std::unordered_set<ID> _decls_added;
82 };
83 
84 } // namespace spicy::detail
Definition: unit.h:51
Definition: parser-builder.h:151
Definition: meta.h:18
Definition: engine.h:16
Definition: grammar-builder.h:25
Definition: property.h:16
Definition: codegen.h:30
Definition: unit.h:43
Definition: module.h:20
Definition: node.h:97
Definition: node_ref.h:44
bool compileModule(hilti::Node *root, bool init, hilti::Unit *u)
Definition: codegen.cc:371
Definition: id.h:18