Spicy
unit-hook.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <string>
6 #include <utility>
7 
8 #include <hilti/ast/declaration.h>
9 #include <hilti/ast/types/reference.h>
10 #include <hilti/ast/types/struct.h>
11 
12 #include <spicy/ast/types/unit-items/unit-hook.h>
13 
14 namespace spicy {
15 namespace declaration {
16 
19 public:
20  UnitHook(ID id, Type unit, const type::unit::Item& hook, Meta m = Meta())
21  : NodeBase(hilti::nodes(std::move(id), std::move(unit), hook), std::move(m)) {
22  if ( ! hook.isA<type::unit::item::UnitHook>() )
23  hilti::logger().internalError("non-unit hook passed into declaration::UnitHook");
24  }
25 
26  std::optional<type::Unit> unitType() const {
27  Type t = type::effectiveType(childs()[1].as<Type>());
28 
29  if ( auto x = t.tryAs<hilti::type::ValueReference>() )
30  t = x->dereferencedType();
31 
32  if ( t.isA<type::Unit>() )
33  return t.as<type::Unit>();
34 
35  if ( t.isA<type::Struct>() )
36  return t.originalNode()->as<type::Unit>();
37 
38  // Not resolved yet.
39  return {};
40  }
41 
42  const auto& unitHook() const { return child<type::unit::item::UnitHook>(2); }
43 
44  bool operator==(const UnitHook& other) const {
45  return unitType() == other.unitType() && unitHook() == other.unitHook();
46  }
47 
49  bool isConstant() const { return true; }
51  const auto& id() const { return child<ID>(0); }
53  Linkage linkage() const { return Linkage::Private; }
55  std::string displayName() const { return "unit hook"; };
57  auto isEqual(const Declaration& other) const { return node::isEqual(this, other); }
58 
60  auto properties() const { return node::Properties{}; }
61 };
62 
63 } // namespace declaration
64 } // namespace spicy
NodeBase(Meta meta)
Definition: node.h:325
auto & childs() const
Definition: node.h:445
Definition: unit.h:51
Definition: struct.h:118
std::string displayName() const
Definition: unit-hook.h:55
bool isConstant() const
Definition: unit-hook.h:49
Definition: meta.h:18
Definition: reference.h:86
Linkage linkage() const
Definition: unit-hook.h:53
auto properties() const
Definition: unit-hook.h:60
const NodeRef & originalNode() const
Definition: node.h:453
const auto & id() const
Definition: unit-hook.h:51
auto isEqual(const Declaration &other) const
Definition: unit-hook.h:57
Definition: unit-hook.h:14
Definition: declaration.h:15
Definition: unit-hook.h:18
Definition: id.h:18
Definition: node.h:318