Skip to content

Commit 308bc94

Browse files
powerboat9P-E-P
authored andcommitted
Add wrapper class for automatic node cloning
This patch adds a wrapper class called Cloneable, which can be used to automatically perform polymorphic copying. This should greatly reduce the need for error-prone user defined copy constructors and assignment operators. As a demonstration/first step, this patch also uses Cloneable to simplify the pattern nodes described in gcc/rust/ast/rust-pattern.h. gcc/rust/ChangeLog: * ast/rust-ast.h: Include "rust-cloneable.h". (struct CloneableDelegate<std::unique_ptr<AST::Pattern>>): Add specialization. * ast/rust-pattern.cc (IdentifierPattern::as_string): Handle field type changes. (RangePattern::as_string): Likewise. (ReferencePattern::as_string): Likewise. (StructPatternFieldTuplePat::as_string): Likewise. (StructPatternFieldIdentPat::as_string): Likewise. (StructPatternElements::as_string): Likewise. (TupleStructItemsNoRest::as_string): Likewise. (TupleStructItemsHasRest::as_string): Likewise. (TupleStructPattern::as_string): Likewise. (TuplePatternItemsNoRest::as_string): Likewise. (TuplePatternItemsHasRest::as_string): Likewise. (TuplePattern::as_string): Likewise. (SlicePatternItemsNoRest::as_string): Likewise. (SlicePatternItemsHasRest::as_string): Likewise. (SlicePattern::as_string): Likewise. (AltPattern::as_string): Likewise. * ast/rust-pattern.h: Include "rust-cloneable.h". (class IdentifierPattern): Use Cloneable to simplify copying. (class RangePattern): Likewise. (class ReferencePattern): Likewise. (class StructPatternFieldTuplePat): Likewise. (class StructPatternFieldIdentPat): Likewise. (class StructPatternElements): Likewise. (class TupleStructItemsNoRest): Likewise. (class TupleStructItemsHasRest): Likewise. (class TupleStructPattern): Likewise. (class TuplePatternItemsNoRest): Likewise. (class TuplePatternItemsHasRest): Likewise. (class TuplePattern): Likewise. (class GroupedPattern): Likewise. (class SlicePatternItemsNoRest): Likewise. (class SlicePatternItemsHasRest): Likewise. (class SlicePattern): Likewise. (class AltPattern): Likewise. (struct CloneableDelegate<std::unique_ptr<AST::RangePatternBound>>): Add specialization. (struct CloneableDelegate<std::unique_ptr<AST::TupleStructItems>>): Likewise. (struct CloneableDelegate<std::unique_ptr<AST::TuplePatternItems>>): Likewise. (struct CloneableDelegate<std::unique_ptr<AST::SlicePatternItems>>): Likewise. (struct CloneableDelegate<std::unique_ptr<AST::StructPatternField>>): Likewise. * util/rust-cloneable.h: New file. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
1 parent 6eec7e7 commit 308bc94

File tree

4 files changed

+257
-555
lines changed

4 files changed

+257
-555
lines changed

gcc/rust/ast/rust-ast.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "rust-location.h"
2727
#include "rust-diagnostics.h"
2828
#include "rust-keyword-values.h"
29+
#include "rust-cloneable.h"
2930

3031
namespace Rust {
3132
// TODO: remove typedefs and make actual types for these
@@ -2139,6 +2140,19 @@ struct Crate final : public GlobContainer
21392140
};
21402141

21412142
} // namespace AST
2143+
2144+
template <> struct CloneableDelegate<std::unique_ptr<AST::Pattern>>
2145+
{
2146+
static std::unique_ptr<AST::Pattern>
2147+
clone (const std::unique_ptr<AST::Pattern> &other)
2148+
{
2149+
if (other == nullptr)
2150+
return nullptr;
2151+
else
2152+
return other->clone_pattern ();
2153+
}
2154+
};
2155+
21422156
} // namespace Rust
21432157

21442158
namespace std {

gcc/rust/ast/rust-pattern.cc

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ IdentifierPattern::as_string () const
6666
str += variable_ident.as_string ();
6767

6868
if (has_subpattern ())
69-
str += " @ " + subpattern->as_string ();
69+
str += " @ " + subpattern.get ()->as_string ();
7070

7171
return str;
7272
}
@@ -91,11 +91,11 @@ RangePattern::as_string () const
9191
switch (range_kind)
9292
{
9393
case RangeKind::EXCLUDED:
94-
return lower->as_string () + ".." + upper->as_string ();
94+
return lower.get ()->as_string () + ".." + upper.get ()->as_string ();
9595
case RangeKind::INCLUDED:
96-
return lower->as_string () + "..=" + upper->as_string ();
96+
return lower.get ()->as_string () + "..=" + upper.get ()->as_string ();
9797
case RangeKind::ELLIPSIS:
98-
return lower->as_string () + "..." + upper->as_string ();
98+
return lower.get ()->as_string () + "..." + upper.get ()->as_string ();
9999
default:
100100
rust_unreachable ();
101101
}
@@ -113,7 +113,7 @@ ReferencePattern::as_string () const
113113
if (is_mut)
114114
str += "mut ";
115115

116-
str += pattern->as_string ();
116+
str += pattern.get ()->as_string ();
117117

118118
return str;
119119
}
@@ -135,7 +135,7 @@ StructPatternFieldTuplePat::as_string () const
135135

136136
str += "\n";
137137

138-
str += std::to_string (index) + " : " + tuple_pattern->as_string ();
138+
str += std::to_string (index) + " : " + tuple_pattern.get ()->as_string ();
139139

140140
return str;
141141
}
@@ -148,7 +148,7 @@ StructPatternFieldIdentPat::as_string () const
148148

149149
str += "\n";
150150

151-
str += ident.as_string () + " : " + ident_pattern->as_string ();
151+
str += ident.as_string () + " : " + ident_pattern.get ()->as_string ();
152152

153153
return str;
154154
}
@@ -182,7 +182,7 @@ StructPatternElements::as_string () const
182182
}
183183
else
184184
{
185-
for (const auto &field : fields)
185+
for (const auto &field : fields.get ())
186186
str += "\n " + field->as_string ();
187187
}
188188

@@ -216,7 +216,7 @@ TupleStructItemsNoRest::as_string () const
216216
{
217217
std::string str;
218218

219-
for (const auto &pattern : patterns)
219+
for (const auto &pattern : patterns.get ())
220220
str += "\n " + pattern->as_string ();
221221

222222
return str;
@@ -227,24 +227,24 @@ TupleStructItemsHasRest::as_string () const
227227
{
228228
std::string str ("\n Lower patterns: ");
229229

230-
if (lower_patterns.empty ())
230+
if (lower_patterns.get ().empty ())
231231
{
232232
str += "none";
233233
}
234234
else
235235
{
236-
for (const auto &lower : lower_patterns)
236+
for (const auto &lower : lower_patterns.get ())
237237
str += "\n " + lower->as_string ();
238238
}
239239

240240
str += "\n Upper patterns: ";
241-
if (upper_patterns.empty ())
241+
if (upper_patterns.get ().empty ())
242242
{
243243
str += "none";
244244
}
245245
else
246246
{
247-
for (const auto &upper : upper_patterns)
247+
for (const auto &upper : upper_patterns.get ())
248248
str += "\n " + upper->as_string ();
249249
}
250250

@@ -258,7 +258,7 @@ TupleStructPattern::as_string () const
258258

259259
str += path.as_string ();
260260

261-
str += "\n Tuple struct items: " + items->as_string ();
261+
str += "\n Tuple struct items: " + items.get ()->as_string ();
262262

263263
return str;
264264
}
@@ -268,7 +268,7 @@ TuplePatternItemsNoRest::as_string () const
268268
{
269269
std::string str;
270270

271-
for (const auto &pattern : patterns)
271+
for (const auto &pattern : patterns.get ())
272272
str += "\n " + pattern->as_string ();
273273

274274
return str;
@@ -280,24 +280,24 @@ TuplePatternItemsHasRest::as_string () const
280280
std::string str;
281281

282282
str += "\n Lower patterns: ";
283-
if (lower_patterns.empty ())
283+
if (lower_patterns.get ().empty ())
284284
{
285285
str += "none";
286286
}
287287
else
288288
{
289-
for (const auto &lower : lower_patterns)
289+
for (const auto &lower : lower_patterns.get ())
290290
str += "\n " + lower->as_string ();
291291
}
292292

293293
str += "\n Upper patterns: ";
294-
if (upper_patterns.empty ())
294+
if (upper_patterns.get ().empty ())
295295
{
296296
str += "none";
297297
}
298298
else
299299
{
300-
for (const auto &upper : upper_patterns)
300+
for (const auto &upper : upper_patterns.get ())
301301
str += "\n " + upper->as_string ();
302302
}
303303

@@ -307,7 +307,7 @@ TuplePatternItemsHasRest::as_string () const
307307
std::string
308308
TuplePattern::as_string () const
309309
{
310-
return "TuplePattern: " + items->as_string ();
310+
return "TuplePattern: " + items.get ()->as_string ();
311311
}
312312

313313
std::string
@@ -331,7 +331,7 @@ SlicePatternItemsNoRest::as_string () const
331331
{
332332
std::string str;
333333

334-
for (const auto &pattern : patterns)
334+
for (const auto &pattern : patterns.get ())
335335
str += "\n " + pattern->as_string ();
336336

337337
return str;
@@ -343,24 +343,24 @@ SlicePatternItemsHasRest::as_string () const
343343
std::string str;
344344

345345
str += "\n Lower patterns: ";
346-
if (lower_patterns.empty ())
346+
if (lower_patterns.get ().empty ())
347347
{
348348
str += "none";
349349
}
350350
else
351351
{
352-
for (const auto &lower : lower_patterns)
352+
for (const auto &lower : lower_patterns.get ())
353353
str += "\n " + lower->as_string ();
354354
}
355355

356356
str += "\n Upper patterns: ";
357-
if (upper_patterns.empty ())
357+
if (upper_patterns.get ().empty ())
358358
{
359359
str += "none";
360360
}
361361
else
362362
{
363-
for (const auto &upper : upper_patterns)
363+
for (const auto &upper : upper_patterns.get ())
364364
str += "\n " + upper->as_string ();
365365
}
366366

@@ -370,15 +370,15 @@ SlicePatternItemsHasRest::as_string () const
370370
std::string
371371
SlicePattern::as_string () const
372372
{
373-
return "SlicePattern: " + items->as_string ();
373+
return "SlicePattern: " + items.get ()->as_string ();
374374
}
375375

376376
std::string
377377
AltPattern::as_string () const
378378
{
379379
std::string str ("AltPattern: ");
380380

381-
for (const auto &pattern : alts)
381+
for (const auto &pattern : alts.get ())
382382
str += "\n " + pattern->as_string ();
383383

384384
return str;

0 commit comments

Comments
 (0)