Spicy
reference.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <utility>
6 
7 #include <hilti/ast/type.h>
8 #include <hilti/ast/types/unknown.h>
9 
10 namespace hilti {
11 namespace type {
12 
13 /*
14  * AST node for a `strong_ref<T>` type.
15  */
16 class StrongReference : public TypeBase,
21 public:
22  StrongReference(Wildcard /*unused*/, Meta m = Meta()) : TypeBase({type::unknown}, std::move(m)), _wildcard(true) {}
23  StrongReference(Type ct, Meta m = Meta()) : TypeBase(nodes(std::move(ct)), std::move(m)) {}
24  StrongReference(NodeRef ct, Meta m = Meta()) : TypeBase(nodes(node::none), std::move(m)), _type(std::move(ct)) {}
25 
26  const Type& dereferencedType() const {
27  if ( _type )
28  return _type->as<Type>();
29  else
30  return children()[0].as<Type>();
31  }
32 
33  bool operator==(const StrongReference& other) const { return dereferencedType() == other.dereferencedType(); }
34 
36  auto isEqual(const Type& other) const { return node::isEqual(this, other); }
38  auto _isResolved(ResolvedState* rstate) const { return type::detail::isResolved(dereferencedType(), rstate); }
40  auto typeParameters() const { return children(); }
42  auto isWildcard() const { return _wildcard; }
43 
45  auto properties() const { return node::Properties{{"type", _type.renderedRid()}}; }
46 
47 private:
48  bool _wildcard = false;
49  NodeRef _type;
50 };
51 
53 class WeakReference : public TypeBase,
58 public:
59  WeakReference(Wildcard /*unused*/, Meta m = Meta()) : TypeBase({type::unknown}, std::move(m)), _wildcard(true) {}
60  WeakReference(Type ct, Meta m = Meta()) : TypeBase({std::move(ct)}, std::move(m)) {}
61 
62  const Type& dereferencedType() const { return children()[0].as<Type>(); }
63 
64  bool operator==(const WeakReference& other) const { return dereferencedType() == other.dereferencedType(); }
65 
67  auto isEqual(const Type& other) const { return node::isEqual(this, other); }
69  auto _isResolved(ResolvedState* rstate) const { return type::detail::isResolved(dereferencedType(), rstate); }
71  auto typeParameters() const { return children(); }
73  auto isWildcard() const { return _wildcard; }
74 
76  auto properties() const { return node::Properties{}; }
77 
78 private:
79  bool _wildcard = false;
80 };
81 
83 class ValueReference : public TypeBase,
88 public:
89  ValueReference(Wildcard /*unused*/, Meta m = Meta())
90  : TypeBase(nodes(type::unknown), std::move(m)), _wildcard(true) {}
91  ValueReference(Type ct, Meta m = Meta()) : TypeBase(nodes(std::move(ct)), std::move(m)) {}
92  ValueReference(NodeRef ct, Meta m = Meta()) : TypeBase(nodes(type::unknown), std::move(m)), _node(std::move(ct)) {}
93 
94  const Type& dereferencedType() const {
95  if ( _node )
96  return _node->as<Type>();
97  else
98  return children()[0].as<Type>();
99  }
100 
101  bool operator==(const ValueReference& other) const { return dereferencedType() == other.dereferencedType(); }
102 
104  auto isEqual(const Type& other) const { return node::isEqual(this, other); }
106  auto _isResolved(ResolvedState* rstate) const { return type::detail::isResolved(dereferencedType(), rstate); }
108  auto typeParameters() const { return children(); }
110  auto isWildcard() const { return _wildcard; }
111 
113  auto properties() const { return node::Properties{{"rid", (_node ? _node->rid() : 0u)}}; }
114 
115 private:
116  bool _wildcard = false;
117  NodeRef _node;
118 };
119 
120 } // namespace type
121 } // namespace hilti
auto _isResolved(ResolvedState *rstate) const
Definition: reference.h:106
std::string renderedRid() const
Definition: node-ref.h:68
auto isWildcard() const
Definition: reference.h:110
auto _isResolved(ResolvedState *rstate) const
Definition: reference.h:38
const Node none
Definition: node.cc:14
auto typeParameters() const
Definition: reference.h:108
const auto & children() const
Definition: node.h:470
auto isEqual(const Type &other) const
Definition: reference.h:36
auto properties() const
Definition: reference.h:45
Definition: reference.h:16
auto isEqual(const Type &other) const
Definition: reference.h:104
Definition: meta.h:18
Definition: reference.h:83
Definition: type.h:159
auto properties() const
Definition: reference.h:76
auto _isResolved(ResolvedState *rstate) const
Definition: reference.h:69
auto typeParameters() const
Definition: reference.h:71
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:99
auto typeParameters() const
Definition: reference.h:40
Definition: type.h:198
Definition: node-ref.h:44
Definition: type.h:33
Definition: type.h:269
auto isWildcard() const
Definition: reference.h:73
Definition: reference.h:53
auto isWildcard() const
Definition: reference.h:42
auto properties() const
Definition: reference.h:113
auto isEqual(const Type &other) const
Definition: reference.h:67