Spicy
unit.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <algorithm>
6 #include <utility>
7 #include <vector>
8 
9 #include <hilti/ast/ctor.h>
10 #include <hilti/ast/ctors/struct.h>
11 #include <hilti/ast/expression.h>
12 #include <hilti/ast/id.h>
13 #include <hilti/ast/types/auto.h>
14 #include <hilti/ast/types/struct.h>
15 
16 #include <spicy/ast/types/unit.h>
17 
18 namespace spicy::ctor {
19 
20 namespace unit {
22 using Field = hilti::ctor::struct_::Field;
23 } // namespace unit
24 
26 class Unit : public hilti::NodeBase, public hilti::trait::isCtor {
27 public:
28  Unit(std::vector<unit::Field> f, Meta m = Meta())
29  : hilti::NodeBase(nodes(type::auto_, std::move(f)), std::move(m)) {}
30  Unit(std::vector<unit::Field> f, Type t, Meta m = Meta())
31  : NodeBase(nodes(std::move(t), std::move(f)), std::move(m)) {}
32 
34  auto fields() const { return children<unit::Field>(1, -1); }
35 
36  /*** Returns the unit type the constructor is producing. */
37  auto utype() const { return child<type::Unit>(0); }
38 
41  for ( const auto& f : fields() ) {
42  if ( f.id() == id )
43  return f;
44  }
45 
46  return {};
47  }
48 
49  void setType(const Type& x) { children()[0] = x; }
50 
51  bool operator==(const Unit& other) const { return fields() == other.fields(); }
52 
54  const auto& type() const { return child<Type>(0); }
55 
57  bool isConstant() const { return true; }
59  auto isLhs() const { return false; }
61  auto isTemporary() const { return true; }
63  auto isEqual(const Ctor& other) const { return node::isEqual(this, other); }
64 
66  auto properties() const { return node::Properties{}; }
67 };
68 
69 } // namespace spicy::ctor
auto isLhs() const
Definition: unit.h:59
auto isTemporary() const
Definition: unit.h:61
Definition: unit.h:18
auto properties() const
Definition: unit.h:66
Definition: meta.h:19
Definition: type.h:160
bool isConstant() const
Definition: unit.h:57
Definition: optional-ref.h:22
auto isEqual(const Ctor &other) const
Definition: unit.h:63
const auto & type() const
Definition: unit.h:54
Definition: ctor.h:15
Definition: struct.h:19
Definition: unit.h:26
auto fields() const
Definition: unit.h:34
Definition: id.h:18
hilti::optional_ref< const unit::Field > field(const ID &id) const
Definition: unit.h:40
Definition: node.h:359