27
27
namespace Rust {
28
28
namespace AST {
29
29
30
+ DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc) {}
31
+
32
+ std::vector<std::unique_ptr<AST::Item>>
33
+ DeriveEq::go (Item &item)
34
+ {
35
+ item.accept_vis (*this );
36
+
37
+ return std::move (expanded);
38
+ }
39
+
30
40
std::unique_ptr<AssociatedItem>
31
41
DeriveEq::assert_receiver_is_total_eq_fn (
32
42
std::vector<std::unique_ptr<Type>> &&types)
@@ -98,33 +108,29 @@ DeriveEq::assert_type_is_eq (std::unique_ptr<Type> &&type)
98
108
return builder.let (builder.wildcard (), std::move (full_path));
99
109
}
100
110
101
- std::unique_ptr<Item>
102
- DeriveEq::eq_impl (
111
+ std::vector<std:: unique_ptr<Item> >
112
+ DeriveEq::eq_impls (
103
113
std::unique_ptr<AssociatedItem> &&fn, std::string name,
104
114
const std::vector<std::unique_ptr<GenericParam>> &type_generics)
105
115
{
106
116
auto eq = builder.type_path ({" core" , " cmp" , " Eq" }, true );
117
+ auto steq = builder.type_path (LangItem::Kind::STRUCTURAL_TEQ);
107
118
108
119
auto trait_items = vec (std::move (fn));
109
120
110
- auto generics
121
+ auto eq_generics
111
122
= setup_impl_generics (name, type_generics, builder.trait_bound (eq));
123
+ auto steq_generics = setup_impl_generics (name, type_generics);
112
124
113
- return builder.trait_impl (eq, std::move (generics.self_type ),
114
- std::move (trait_items),
115
- std::move (generics.impl ));
116
- }
117
-
118
- DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc), expanded (nullptr ) {}
119
-
120
- std::unique_ptr<AST::Item>
121
- DeriveEq::go (Item &item)
122
- {
123
- item.accept_vis (*this );
125
+ auto eq_impl = builder.trait_impl (eq, std::move (eq_generics.self_type ),
126
+ std::move (trait_items),
127
+ std::move (eq_generics.impl ));
128
+ auto steq_impl
129
+ = builder.trait_impl (steq, std::move (steq_generics.self_type ),
130
+ std::move (trait_items),
131
+ std::move (steq_generics.impl ));
124
132
125
- rust_assert (expanded);
126
-
127
- return std::move (expanded);
133
+ return vec (std::move (eq_impl), std::move (steq_impl));
128
134
}
129
135
130
136
void
@@ -135,9 +141,9 @@ DeriveEq::visit_tuple (TupleStruct &item)
135
141
for (auto &field : item.get_fields ())
136
142
types.emplace_back (field.get_field_type ().clone_type ());
137
143
138
- expanded
139
- = eq_impl ( assert_receiver_is_total_eq_fn ( std::move (types) ),
140
- item. get_identifier (). as_string (), item.get_generic_params ());
144
+ expanded = eq_impls ( assert_receiver_is_total_eq_fn ( std::move (types)),
145
+ item. get_identifier (). as_string ( ),
146
+ item.get_generic_params ());
141
147
}
142
148
143
149
void
@@ -148,9 +154,9 @@ DeriveEq::visit_struct (StructStruct &item)
148
154
for (auto &field : item.get_fields ())
149
155
types.emplace_back (field.get_field_type ().clone_type ());
150
156
151
- expanded
152
- = eq_impl ( assert_receiver_is_total_eq_fn ( std::move (types) ),
153
- item. get_identifier (). as_string (), item.get_generic_params ());
157
+ expanded = eq_impls ( assert_receiver_is_total_eq_fn ( std::move (types)),
158
+ item. get_identifier (). as_string ( ),
159
+ item.get_generic_params ());
154
160
}
155
161
156
162
void
@@ -185,9 +191,9 @@ DeriveEq::visit_enum (Enum &item)
185
191
}
186
192
}
187
193
188
- expanded
189
- = eq_impl ( assert_receiver_is_total_eq_fn ( std::move (types) ),
190
- item. get_identifier (). as_string (), item.get_generic_params ());
194
+ expanded = eq_impls ( assert_receiver_is_total_eq_fn ( std::move (types)),
195
+ item. get_identifier (). as_string ( ),
196
+ item.get_generic_params ());
191
197
}
192
198
193
199
void
@@ -198,9 +204,9 @@ DeriveEq::visit_union (Union &item)
198
204
for (auto &field : item.get_variants ())
199
205
types.emplace_back (field.get_field_type ().clone_type ());
200
206
201
- expanded
202
- = eq_impl ( assert_receiver_is_total_eq_fn ( std::move (types) ),
203
- item. get_identifier (). as_string (), item.get_generic_params ());
207
+ expanded = eq_impls ( assert_receiver_is_total_eq_fn ( std::move (types)),
208
+ item. get_identifier (). as_string ( ),
209
+ item.get_generic_params ());
204
210
}
205
211
206
212
} // namespace AST
0 commit comments