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(const std::shared_ptr<hilti::Context>& context) : _context(context), _gb(this), _pb(this) {}
33 
35  bool compileModule(hilti::Node* root, hilti::Unit* u);
36 
37  auto context() const { return _context.lock(); }
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  auto uniquer() { return &_uniquer; }
55 
56  const auto& moduleProperties() const { return _properties; }
57  void recordModuleProperty(hilti::declaration::Property p) { _properties.emplace_back(std::move(p)); }
58 
59  void addDeclaration(Declaration d) {
60  _decls_added.insert(d.id());
61  _new_decls.push_back(std::move(d));
62  }
63 
64  bool haveAddedDeclaration(const ID& id) { return _decls_added.find(id) != _decls_added.end(); }
65 
66 
67 private:
68  std::weak_ptr<hilti::Context> _context;
71 
72  std::vector<hilti::declaration::Property> _properties;
73 
74  hilti::Unit* _hilti_unit = nullptr;
75  hilti::Node* _root = nullptr;
76  std::vector<Declaration> _new_decls;
77  std::unordered_set<ID> _decls_added;
79 };
80 
81 } // namespace spicy::detail
Definition: declaration.h:54
Definition: unit.h:57
Definition: parser-builder.h:163
Definition: meta.h:19
Definition: engine.h:16
Definition: type.h:160
Definition: grammar-builder.h:25
Definition: property.h:15
Definition: codegen.h:30
Definition: unit.h:49
bool compileModule(hilti::Node *root, hilti::Unit *u)
Definition: codegen.cc:417
Definition: module.h:21
Definition: node.h:112
Definition: id.h:18