aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Poulhiès <dkm@kataplop.net>2023-06-28 22:02:37 +0200
committerPhilip Herron <philip.herron@embecosm.com>2023-06-30 17:15:14 +0000
commit539e4bcd98bcbbc1b60038a5d355eea24f890bb9 (patch)
treec9571fae18e0b06f5e018d0adb6e6d79715330d9 /gcc
parentd96093d97b5ab84005a2bc615dda953a53f97cd1 (diff)
downloadgcc-539e4bcd98bcbbc1b60038a5d355eea24f890bb9.zip
gcc-539e4bcd98bcbbc1b60038a5d355eea24f890bb9.tar.gz
gcc-539e4bcd98bcbbc1b60038a5d355eea24f890bb9.tar.bz2
gccrs: factor out inner attributes in a class
Introduce WithInnerAttrs class that can be inherited instead of duplicating the same data/method in all HIR classes. gcc/rust/ChangeLog: * hir/tree/rust-hir.h (class WithInnerAttrs): New. (class Item): Adjust to new WithInnerAttrs class. (struct Crate): Likewise. * hir/rust-hir-dump.cc (Dump::go): Likewise. (Dump::visit): Likewise. * hir/tree/rust-hir-expr.h (class GroupedExpr): Likewise. (class ArrayExpr): Likewise. (class TupleExpr): Likewise. (class StructExprStruct): Likewise. (class BlockExpr): Likewise. (class MatchExpr): Likewise. * hir/tree/rust-hir-item.h (TypeParam::get_outer_attribute): New. (class Module): Adjust to new WithInnerAttrs class. (struct StructField): change struct to... (class StructField): ... a class. (class ImplBlock): Adjust to new WithInnerAttrs class. (class ExternBlock): Likewise. Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-hir-dump.cc8
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h54
-rw-r--r--gcc/rust/hir/tree/rust-hir-item.h41
-rw-r--r--gcc/rust/hir/tree/rust-hir.h41
4 files changed, 67 insertions, 77 deletions
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index 27138df..5f3db42 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -28,12 +28,12 @@ Dump::go (HIR::Crate &crate)
{
stream << "Crate {" << std::endl;
// inner attributes
- if (!crate.inner_attrs.empty ())
+ if (!crate.get_inner_attrs ().empty ())
{
indentation.increment ();
stream << indentation;
stream << "inner_attrs: [";
- for (auto &attr : crate.inner_attrs)
+ for (auto &attr : crate.get_inner_attrs ())
stream << attr.as_string ();
stream << "]," << std::endl;
indentation.decrement ();
@@ -272,11 +272,11 @@ Dump::visit (BlockExpr &block_expr)
indentation.increment ();
// TODO: inner attributes
- if (!block_expr.inner_attrs.empty ())
+ if (!block_expr.get_inner_attrs ().empty ())
{
stream << indentation << "inner_attrs: [";
indentation.increment ();
- for (auto &attr : block_expr.inner_attrs)
+ for (auto &attr : block_expr.get_inner_attrs ())
{
stream << "\n";
stream << indentation;
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h
index 421ab23..a6a27b8 100644
--- a/gcc/rust/hir/tree/rust-hir-expr.h
+++ b/gcc/rust/hir/tree/rust-hir-expr.h
@@ -761,9 +761,8 @@ protected:
};
// Expression in parentheses (i.e. like literally just any 3 + (2 * 6))
-class GroupedExpr : public ExprWithoutBlock
+class GroupedExpr : public ExprWithoutBlock, public WithInnerAttrs
{
- AST::AttrVec inner_attrs;
std::unique_ptr<Expr> expr_in_parens;
Location locus;
@@ -771,20 +770,18 @@ class GroupedExpr : public ExprWithoutBlock
public:
std::string as_string () const override;
- AST::AttrVec get_inner_attrs () const { return inner_attrs; }
-
GroupedExpr (Analysis::NodeMapping mappings,
std::unique_ptr<Expr> parenthesised_expr,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
Location locus)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
- inner_attrs (std::move (inner_attribs)),
+ WithInnerAttrs (std::move (inner_attribs)),
expr_in_parens (std::move (parenthesised_expr)), locus (locus)
{}
// Copy constructor includes clone for expr_in_parens
GroupedExpr (GroupedExpr const &other)
- : ExprWithoutBlock (other), inner_attrs (other.inner_attrs),
+ : ExprWithoutBlock (other), WithInnerAttrs (other.inner_attrs),
expr_in_parens (other.expr_in_parens->clone_expr ()), locus (other.locus)
{}
@@ -982,9 +979,8 @@ protected:
};
// Array definition-ish expression
-class ArrayExpr : public ExprWithoutBlock
+class ArrayExpr : public ExprWithoutBlock, public WithInnerAttrs
{
- AST::AttrVec inner_attrs;
std::unique_ptr<ArrayElems> internal_elements;
Location locus;
@@ -992,8 +988,6 @@ class ArrayExpr : public ExprWithoutBlock
public:
std::string as_string () const override;
- AST::AttrVec get_inner_attrs () const { return inner_attrs; }
-
// Returns whether array expr has array elems or if it is just empty.
bool has_array_elems () const { return internal_elements != nullptr; }
@@ -1003,13 +997,13 @@ public:
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
Location locus)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
- inner_attrs (std::move (inner_attribs)),
+ WithInnerAttrs (std::move (inner_attribs)),
internal_elements (std::move (array_elems)), locus (locus)
{}
// Copy constructor requires cloning ArrayElems for polymorphism to hold
ArrayExpr (ArrayExpr const &other)
- : ExprWithoutBlock (other), inner_attrs (other.inner_attrs),
+ : ExprWithoutBlock (other), WithInnerAttrs (other.inner_attrs),
locus (other.locus)
{
if (other.has_array_elems ())
@@ -1132,10 +1126,8 @@ protected:
};
// HIR representation of a tuple
-class TupleExpr : public ExprWithoutBlock
+class TupleExpr : public ExprWithoutBlock, public WithInnerAttrs
{
- AST::AttrVec inner_attrs;
-
std::vector<std::unique_ptr<Expr> > tuple_elems;
// replaces (inlined version of) TupleElements
@@ -1144,20 +1136,18 @@ class TupleExpr : public ExprWithoutBlock
public:
std::string as_string () const override;
- AST::AttrVec get_inner_attrs () const { return inner_attrs; }
-
TupleExpr (Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<Expr> > tuple_elements,
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
Location locus)
: ExprWithoutBlock (std::move (mappings), std::move (outer_attribs)),
- inner_attrs (std::move (inner_attribs)),
+ WithInnerAttrs (std::move (inner_attribs)),
tuple_elems (std::move (tuple_elements)), locus (locus)
{}
// copy constructor with vector clone
TupleExpr (TupleExpr const &other)
- : ExprWithoutBlock (other), inner_attrs (other.inner_attrs),
+ : ExprWithoutBlock (other), WithInnerAttrs (other.inner_attrs),
locus (other.locus)
{
tuple_elems.reserve (other.tuple_elems.size ());
@@ -1317,24 +1307,20 @@ public:
};
// Actual HIR node of the struct creator (with no fields). Not abstract!
-class StructExprStruct : public StructExpr
+class StructExprStruct : public StructExpr, public WithInnerAttrs
{
- AST::AttrVec inner_attrs;
-
Location locus;
public:
std::string as_string () const override;
- AST::AttrVec get_inner_attrs () const { return inner_attrs; }
-
// Constructor has to call protected constructor of base class
StructExprStruct (Analysis::NodeMapping mappings,
PathInExpression struct_path, AST::AttrVec inner_attribs,
AST::AttrVec outer_attribs, Location locus)
: StructExpr (std::move (mappings), std::move (struct_path),
std::move (outer_attribs)),
- inner_attrs (std::move (inner_attribs)), locus (locus)
+ WithInnerAttrs (std::move (inner_attribs)), locus (locus)
{}
Location get_locus () const override final { return locus; }
@@ -2156,10 +2142,9 @@ protected:
};
// A block HIR node
-class BlockExpr : public ExprWithBlock
+class BlockExpr : public ExprWithBlock, public WithInnerAttrs
{
public:
- AST::AttrVec inner_attrs;
std::vector<std::unique_ptr<Stmt> > statements;
std::unique_ptr<Expr> expr;
bool tail_reachable;
@@ -2182,7 +2167,7 @@ public:
AST::AttrVec inner_attribs, AST::AttrVec outer_attribs,
Location start_locus, Location end_locus)
: ExprWithBlock (std::move (mappings), std::move (outer_attribs)),
- inner_attrs (std::move (inner_attribs)),
+ WithInnerAttrs (std::move (inner_attribs)),
statements (std::move (block_statements)), expr (std::move (block_expr)),
tail_reachable (tail_reachable), start_locus (start_locus),
end_locus (end_locus)
@@ -2191,7 +2176,7 @@ public:
// Copy constructor with clone
BlockExpr (BlockExpr const &other)
: ExprWithBlock (other), /*statements(other.statements),*/
- inner_attrs (other.inner_attrs), start_locus (other.start_locus),
+ WithInnerAttrs (other.inner_attrs), start_locus (other.start_locus),
end_locus (other.end_locus)
{
// guard to protect from null pointer dereference
@@ -3645,10 +3630,9 @@ public:
};
// Match expression HIR node
-class MatchExpr : public ExprWithBlock
+class MatchExpr : public ExprWithBlock, public WithInnerAttrs
{
std::unique_ptr<Expr> branch_value;
- AST::AttrVec inner_attrs;
std::vector<MatchCase> match_arms;
Location locus;
@@ -3661,16 +3645,16 @@ public:
std::vector<MatchCase> match_arms, AST::AttrVec inner_attrs,
AST::AttrVec outer_attrs, Location locus)
: ExprWithBlock (std::move (mappings), std::move (outer_attrs)),
+ WithInnerAttrs (std::move (inner_attrs)),
branch_value (std::move (branch_value)),
- inner_attrs (std::move (inner_attrs)),
match_arms (std::move (match_arms)), locus (locus)
{}
// Copy constructor requires clone due to unique_ptr
MatchExpr (MatchExpr const &other)
- : ExprWithBlock (other), branch_value (other.branch_value->clone_expr ()),
- inner_attrs (other.inner_attrs), match_arms (other.match_arms),
- locus (other.locus)
+ : ExprWithBlock (other), WithInnerAttrs (other.inner_attrs),
+ branch_value (other.branch_value->clone_expr ()),
+ match_arms (other.match_arms), locus (other.locus)
{
/*match_arms.reserve (other.match_arms.size ());
for (const auto &e : other.match_arms)
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h
index 8932c55..5899444 100644
--- a/gcc/rust/hir/tree/rust-hir-item.h
+++ b/gcc/rust/hir/tree/rust-hir-item.h
@@ -59,6 +59,7 @@ public:
// Returns whether the type param has an outer attribute.
bool has_outer_attribute () const { return !outer_attr.is_empty (); }
+ AST::Attribute &get_outer_attribute () { return outer_attr; }
TypeParam (Analysis::NodeMapping mappings, Identifier type_representation,
Location locus = Location (),
@@ -659,12 +660,10 @@ public:
};
// Rust module item - abstract base class
-class Module : public VisItem
+class Module : public VisItem, public WithInnerAttrs
{
Identifier module_name;
Location locus;
- // bool has_inner_attrs;
- AST::AttrVec inner_attrs;
// bool has_items;
std::vector<std::unique_ptr<Item>> items;
@@ -674,9 +673,6 @@ public:
// Returns whether the module has items in its body.
bool has_items () const { return !items.empty (); }
- // Returns whether the module has any inner attributes.
- bool has_inner_attrs () const { return !inner_attrs.empty (); }
-
// Full constructor
Module (Analysis::NodeMapping mappings, Identifier module_name,
Location locus, std::vector<std::unique_ptr<Item>> items,
@@ -685,13 +681,13 @@ public:
AST::AttrVec outer_attrs = AST::AttrVec ())
: VisItem (std::move (mappings), std::move (visibility),
std::move (outer_attrs)),
- module_name (module_name), locus (locus),
- inner_attrs (std::move (inner_attrs)), items (std::move (items))
+ WithInnerAttrs (std::move (inner_attrs)), module_name (module_name),
+ locus (locus), items (std::move (items))
{}
// Copy constructor with vector clone
Module (Module const &other)
- : VisItem (other), inner_attrs (other.inner_attrs)
+ : VisItem (other), WithInnerAttrs (other.inner_attrs)
{
items.reserve (other.items.size ());
for (const auto &e : other.items)
@@ -1447,7 +1443,7 @@ protected:
};
// A single field in a struct
-struct StructField
+class StructField
{
public:
// bool has_outer_attributes;
@@ -2740,14 +2736,13 @@ protected:
Trait *clone_item_impl () const override { return new Trait (*this); }
};
-class ImplBlock : public VisItem
+class ImplBlock : public VisItem, public WithInnerAttrs
{
std::vector<std::unique_ptr<GenericParam>> generic_params;
std::unique_ptr<Type> impl_type;
std::unique_ptr<TypePath> trait_ref;
WhereClause where_clause;
Polarity polarity;
- AST::AttrVec inner_attrs;
Location locus;
std::vector<std::unique_ptr<ImplItem>> impl_items;
@@ -2760,17 +2755,18 @@ public:
Polarity polarity, Visibility vis, AST::AttrVec inner_attrs,
AST::AttrVec outer_attrs, Location locus)
: VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)),
+ WithInnerAttrs (std::move (inner_attrs)),
generic_params (std::move (generic_params)),
impl_type (std::move (impl_type)), trait_ref (std::move (trait_ref)),
where_clause (std::move (where_clause)), polarity (polarity),
- inner_attrs (std::move (inner_attrs)), locus (locus),
- impl_items (std::move (impl_items))
+ locus (locus), impl_items (std::move (impl_items))
{}
ImplBlock (ImplBlock const &other)
- : VisItem (other), impl_type (other.impl_type->clone_type ()),
+ : VisItem (other), WithInnerAttrs (other.inner_attrs),
+ impl_type (other.impl_type->clone_type ()),
where_clause (other.where_clause), polarity (other.polarity),
- inner_attrs (other.inner_attrs), locus (other.locus)
+ locus (other.locus)
{
generic_params.reserve (other.generic_params.size ());
for (const auto &e : other.generic_params)
@@ -2832,9 +2828,6 @@ public:
// Returns the polarity of the impl.
Polarity get_polarity () const { return polarity; }
- // Returns whether impl has inner attributes.
- bool has_inner_attrs () const { return !inner_attrs.empty (); }
-
Location get_locus () const override final { return locus; }
std::unique_ptr<Type> &get_type () { return impl_type; };
@@ -3153,19 +3146,15 @@ protected:
};
// An extern block HIR node
-class ExternBlock : public VisItem
+class ExternBlock : public VisItem, public WithInnerAttrs
{
ABI abi;
- AST::AttrVec inner_attrs;
std::vector<std::unique_ptr<ExternalItem>> extern_items;
Location locus;
public:
std::string as_string () const override;
- // Returns whether extern block has inner attributes.
- bool has_inner_attrs () const { return !inner_attrs.empty (); }
-
// Returns whether extern block has extern items.
bool has_extern_items () const { return !extern_items.empty (); }
@@ -3176,13 +3165,13 @@ public:
Visibility vis, AST::AttrVec inner_attrs,
AST::AttrVec outer_attrs, Location locus)
: VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)),
- abi (abi), inner_attrs (std::move (inner_attrs)),
+ WithInnerAttrs (std::move (inner_attrs)), abi (abi),
extern_items (std::move (extern_items)), locus (locus)
{}
// Copy constructor with vector clone
ExternBlock (ExternBlock const &other)
- : VisItem (other), abi (other.abi), inner_attrs (other.inner_attrs),
+ : VisItem (other), WithInnerAttrs (other.inner_attrs), abi (other.abi),
locus (other.locus)
{
extern_items.reserve (other.extern_items.size ());
diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h
index 09f5c2c..bc3b094 100644
--- a/gcc/rust/hir/tree/rust-hir.h
+++ b/gcc/rust/hir/tree/rust-hir.h
@@ -41,6 +41,30 @@ class HIRPatternVisitor;
class HIRImplVisitor;
class HIRTypeVisitor;
+class WithOuterAttrs
+{
+protected:
+ AST::AttrVec outer_attrs;
+
+public:
+ AST::AttrVec &get_outer_attrs () { return outer_attrs; }
+ const AST::AttrVec &get_outer_attrs () const { return outer_attrs; }
+
+ WithOuterAttrs (AST::AttrVec outer_attrs)
+ : outer_attrs (std::move (outer_attrs)){};
+};
+
+class WithInnerAttrs
+{
+protected:
+ AST::AttrVec inner_attrs;
+
+public:
+ AST::AttrVec get_inner_attrs () const { return inner_attrs; }
+ WithInnerAttrs (AST::AttrVec inner_attrs)
+ : inner_attrs (std::move (inner_attrs)){};
+};
+
// forward decl for use in token tree method
class Token;
@@ -167,12 +191,9 @@ protected:
};
// Rust "item" HIR node (declaration of top-level/module-level allowed stuff)
-class Item : public Stmt
+class Item : public Stmt, public WithOuterAttrs
{
- AST::AttrVec outer_attrs;
-
// TODO: should outer attrs be defined here or in each derived class?
-
public:
enum class ItemKind
{
@@ -210,16 +231,13 @@ public:
add_crate_name (std::vector<std::string> &names ATTRIBUTE_UNUSED) const
{}
- AST::AttrVec &get_outer_attrs () { return outer_attrs; }
- const AST::AttrVec &get_outer_attrs () const { return outer_attrs; }
-
bool is_item () const override final { return true; }
protected:
// Constructor
Item (Analysis::NodeMapping mappings,
AST::AttrVec outer_attribs = AST::AttrVec ())
- : Stmt (std::move (mappings)), outer_attrs (std::move (outer_attribs))
+ : Stmt (std::move (mappings)), WithOuterAttrs (std::move (outer_attribs))
{}
// Clone function implementation as pure virtual method
@@ -836,9 +854,8 @@ protected:
};
// A crate HIR object - holds all the data for a single compilation unit
-struct Crate
+struct Crate : public WithInnerAttrs
{
- AST::AttrVec inner_attrs;
// dodgy spacing required here
/* TODO: is it better to have a vector of items here or a module (implicit
* top-level one)? */
@@ -850,13 +867,13 @@ public:
// Constructor
Crate (std::vector<std::unique_ptr<Item> > items, AST::AttrVec inner_attrs,
Analysis::NodeMapping mappings)
- : inner_attrs (std::move (inner_attrs)), items (std::move (items)),
+ : WithInnerAttrs (std::move (inner_attrs)), items (std::move (items)),
mappings (mappings)
{}
// Copy constructor with vector clone
Crate (Crate const &other)
- : inner_attrs (other.inner_attrs), mappings (other.mappings)
+ : WithInnerAttrs (other.inner_attrs), mappings (other.mappings)
{
items.reserve (other.items.size ());
for (const auto &e : other.items)