diff options
Diffstat (limited to 'gcc/rust/hir/tree/rust-hir-pattern.h')
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-pattern.h | 324 | 
1 files changed, 241 insertions, 83 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-pattern.h b/gcc/rust/hir/tree/rust-hir-pattern.h index 9c636ca..89b9cc6 100644 --- a/gcc/rust/hir/tree/rust-hir-pattern.h +++ b/gcc/rust/hir/tree/rust-hir-pattern.h @@ -350,6 +350,7 @@ class RangePattern : public Pattern    /* location only stored to avoid a dereference - lower pattern should give     * correct location so maybe change in future */    location_t locus; +  bool is_inclusive;    Analysis::NodeMapping mappings;  public: @@ -359,10 +360,10 @@ public:    RangePattern (Analysis::NodeMapping mappings,  		std::unique_ptr<RangePatternBound> lower,  		std::unique_ptr<RangePatternBound> upper, location_t locus, -		bool has_ellipsis_syntax = false) +		bool is_inclusive, bool has_ellipsis_syntax = false)      : lower (std::move (lower)), upper (std::move (upper)),        has_ellipsis_syntax (has_ellipsis_syntax), locus (locus), -      mappings (mappings) +      is_inclusive (is_inclusive), mappings (mappings)    {}    // Copy constructor with clone @@ -370,7 +371,7 @@ public:      : lower (other.lower->clone_range_pattern_bound ()),        upper (other.upper->clone_range_pattern_bound ()),        has_ellipsis_syntax (other.has_ellipsis_syntax), locus (other.locus), -      mappings (other.mappings) +      is_inclusive (other.is_inclusive), mappings (other.mappings)    {}    // Overloaded assignment operator to clone @@ -380,6 +381,7 @@ public:      upper = other.upper->clone_range_pattern_bound ();      has_ellipsis_syntax = other.has_ellipsis_syntax;      locus = other.locus; +    is_inclusive = other.is_inclusive;      mappings = other.mappings;      return *this; @@ -395,6 +397,7 @@ public:    void accept_vis (HIRPatternVisitor &vis) override;    bool get_has_ellipsis_syntax () { return has_ellipsis_syntax; }; +  bool is_inclusive_range () const { return is_inclusive; }    const Analysis::NodeMapping &get_mappings () const override final    { @@ -680,6 +683,7 @@ protected:  class StructPatternElements  {    std::vector<std::unique_ptr<StructPatternField>> fields; +  bool has_rest_pattern;  public:    // Returns whether there are any struct pattern fields @@ -689,10 +693,18 @@ public:     * no etc). */    bool is_empty () const { return !has_struct_pattern_fields (); } +  bool has_rest () const { return has_rest_pattern; } +    // Constructor for StructPatternElements with both (potentially)    StructPatternElements (      std::vector<std::unique_ptr<StructPatternField>> fields) -    : fields (std::move (fields)) +    : fields (std::move (fields)), has_rest_pattern (false) +  {} + +  StructPatternElements ( +    std::vector<std::unique_ptr<StructPatternField>> fields, +    bool has_rest_pattern) +    : fields (std::move (fields)), has_rest_pattern (has_rest_pattern)    {}    // Copy constructor with vector clone @@ -700,7 +712,8 @@ public:    {      fields.reserve (other.fields.size ());      for (const auto &e : other.fields) -      fields.push_back (e->clone_struct_pattern_field ()); +      fields.emplace_back (e->clone_struct_pattern_field ()); +    has_rest_pattern = other.has_rest_pattern;    }    // Overloaded assignment operator with vector clone @@ -709,8 +722,8 @@ public:      fields.clear ();      fields.reserve (other.fields.size ());      for (const auto &e : other.fields) -      fields.push_back (e->clone_struct_pattern_field ()); - +      fields.emplace_back (e->clone_struct_pattern_field ()); +    has_rest_pattern = other.has_rest_pattern;      return *this;    } @@ -778,24 +791,25 @@ protected:    }  }; -// Base abstract class for TupleStructItems and TuplePatternItems -class TupleItems : public FullVisitable +// Base abstract class for TupleStructItems, TuplePatternItems & +// SlicePatternItems +class PatternItems : public FullVisitable  {  public:    enum ItemType    { -    MULTIPLE, -    RANGED, +    NO_REST, +    HAS_REST,    }; -  virtual ~TupleItems () {} +  virtual ~PatternItems () {}    // TODO: should this store location data?    // Unique pointer custom clone function -  std::unique_ptr<TupleItems> clone_tuple_items () const +  std::unique_ptr<PatternItems> clone_pattern_items () const    { -    return std::unique_ptr<TupleItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<PatternItems> (clone_pattern_items_impl ());    }    virtual ItemType get_item_type () const = 0; @@ -804,36 +818,36 @@ public:  protected:    // pure virtual clone implementation -  virtual TupleItems *clone_tuple_items_impl () const = 0; +  virtual PatternItems *clone_pattern_items_impl () const = 0;  };  // Base abstract class for patterns used in TupleStructPattern -class TupleStructItems : public TupleItems +class TupleStructItems : public PatternItems  {  public:    // Unique pointer custom clone function    std::unique_ptr<TupleStructItems> clone_tuple_struct_items () const    { -    return std::unique_ptr<TupleStructItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<TupleStructItems> (clone_pattern_items_impl ());    }  protected:    // pure virtual clone implementation -  virtual TupleStructItems *clone_tuple_items_impl () const override = 0; +  virtual TupleStructItems *clone_pattern_items_impl () const override = 0;  }; -// Class for non-ranged tuple struct pattern patterns -class TupleStructItemsNoRange : public TupleStructItems +// Class for patterns within a tuple struct pattern, without a rest pattern +class TupleStructItemsNoRest : public TupleStructItems  {    std::vector<std::unique_ptr<Pattern>> patterns;  public: -  TupleStructItemsNoRange (std::vector<std::unique_ptr<Pattern>> patterns) +  TupleStructItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)      : patterns (std::move (patterns))    {}    // Copy constructor with vector clone -  TupleStructItemsNoRange (TupleStructItemsNoRange const &other) +  TupleStructItemsNoRest (TupleStructItemsNoRest const &other)    {      patterns.reserve (other.patterns.size ());      for (const auto &e : other.patterns) @@ -841,7 +855,7 @@ public:    }    // Overloaded assignment operator with vector clone -  TupleStructItemsNoRange &operator= (TupleStructItemsNoRange const &other) +  TupleStructItemsNoRest &operator= (TupleStructItemsNoRest const &other)    {      patterns.clear ();      patterns.reserve (other.patterns.size ()); @@ -852,9 +866,8 @@ public:    }    // move constructors -  TupleStructItemsNoRange (TupleStructItemsNoRange &&other) = default; -  TupleStructItemsNoRange &operator= (TupleStructItemsNoRange &&other) -    = default; +  TupleStructItemsNoRest (TupleStructItemsNoRest &&other) = default; +  TupleStructItemsNoRest &operator= (TupleStructItemsNoRest &&other) = default;    std::string as_string () const override; @@ -866,32 +879,33 @@ public:      return patterns;    } -  ItemType get_item_type () const override final { return ItemType::MULTIPLE; } +  ItemType get_item_type () const override final { return ItemType::NO_REST; }  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TupleStructItemsNoRange *clone_tuple_items_impl () const override +  TupleStructItemsNoRest *clone_pattern_items_impl () const override    { -    return new TupleStructItemsNoRange (*this); +    return new TupleStructItemsNoRest (*this);    }  }; -// Class for ranged tuple struct pattern patterns -class TupleStructItemsRange : public TupleStructItems +// Class for patterns within a tuple struct pattern, with a rest pattern +// included +class TupleStructItemsHasRest : public TupleStructItems  {    std::vector<std::unique_ptr<Pattern>> lower_patterns;    std::vector<std::unique_ptr<Pattern>> upper_patterns;  public: -  TupleStructItemsRange (std::vector<std::unique_ptr<Pattern>> lower_patterns, -			 std::vector<std::unique_ptr<Pattern>> upper_patterns) +  TupleStructItemsHasRest (std::vector<std::unique_ptr<Pattern>> lower_patterns, +			   std::vector<std::unique_ptr<Pattern>> upper_patterns)      : lower_patterns (std::move (lower_patterns)),        upper_patterns (std::move (upper_patterns))    {}    // Copy constructor with vector clone -  TupleStructItemsRange (TupleStructItemsRange const &other) +  TupleStructItemsHasRest (TupleStructItemsHasRest const &other)    {      lower_patterns.reserve (other.lower_patterns.size ());      for (const auto &e : other.lower_patterns) @@ -903,7 +917,7 @@ public:    }    // Overloaded assignment operator to clone -  TupleStructItemsRange &operator= (TupleStructItemsRange const &other) +  TupleStructItemsHasRest &operator= (TupleStructItemsHasRest const &other)    {      lower_patterns.clear ();      lower_patterns.reserve (other.lower_patterns.size ()); @@ -919,8 +933,9 @@ public:    }    // move constructors -  TupleStructItemsRange (TupleStructItemsRange &&other) = default; -  TupleStructItemsRange &operator= (TupleStructItemsRange &&other) = default; +  TupleStructItemsHasRest (TupleStructItemsHasRest &&other) = default; +  TupleStructItemsHasRest &operator= (TupleStructItemsHasRest &&other) +    = default;    std::string as_string () const override; @@ -945,14 +960,14 @@ public:      return upper_patterns;    } -  ItemType get_item_type () const override final { return ItemType::RANGED; } +  ItemType get_item_type () const override final { return ItemType::HAS_REST; }  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TupleStructItemsRange *clone_tuple_items_impl () const override +  TupleStructItemsHasRest *clone_pattern_items_impl () const override    { -    return new TupleStructItemsRange (*this); +    return new TupleStructItemsHasRest (*this);    }  }; @@ -1025,32 +1040,32 @@ protected:  };  // Base abstract class representing TuplePattern patterns -class TuplePatternItems : public TupleItems +class TuplePatternItems : public PatternItems  {  public:    // Unique pointer custom clone function    std::unique_ptr<TuplePatternItems> clone_tuple_pattern_items () const    { -    return std::unique_ptr<TuplePatternItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<TuplePatternItems> (clone_pattern_items_impl ());    }  protected:    // pure virtual clone implementation -  virtual TuplePatternItems *clone_tuple_items_impl () const override = 0; +  virtual TuplePatternItems *clone_pattern_items_impl () const override = 0;  }; -// Class representing TuplePattern patterns where there are multiple patterns -class TuplePatternItemsMultiple : public TuplePatternItems +// Class representing patterns within a TuplePattern, without a rest pattern +class TuplePatternItemsNoRest : public TuplePatternItems  {    std::vector<std::unique_ptr<Pattern>> patterns;  public: -  TuplePatternItemsMultiple (std::vector<std::unique_ptr<Pattern>> patterns) +  TuplePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)      : patterns (std::move (patterns))    {}    // Copy constructor with vector clone -  TuplePatternItemsMultiple (TuplePatternItemsMultiple const &other) +  TuplePatternItemsNoRest (TuplePatternItemsNoRest const &other)    {      patterns.reserve (other.patterns.size ());      for (const auto &e : other.patterns) @@ -1058,7 +1073,7 @@ public:    }    // Overloaded assignment operator to vector clone -  TuplePatternItemsMultiple &operator= (TuplePatternItemsMultiple const &other) +  TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest const &other)    {      patterns.clear ();      patterns.reserve (other.patterns.size ()); @@ -1069,15 +1084,15 @@ public:    }    // move constructors -  TuplePatternItemsMultiple (TuplePatternItemsMultiple &&other) = default; -  TuplePatternItemsMultiple &operator= (TuplePatternItemsMultiple &&other) +  TuplePatternItemsNoRest (TuplePatternItemsNoRest &&other) = default; +  TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest &&other)      = default;    std::string as_string () const override;    void accept_vis (HIRFullVisitor &vis) override; -  ItemType get_item_type () const override { return ItemType::MULTIPLE; } +  ItemType get_item_type () const override { return ItemType::NO_REST; }    std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; }    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const @@ -1088,27 +1103,29 @@ public:  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TuplePatternItemsMultiple *clone_tuple_items_impl () const override +  TuplePatternItemsNoRest *clone_pattern_items_impl () const override    { -    return new TuplePatternItemsMultiple (*this); +    return new TuplePatternItemsNoRest (*this);    }  }; -// Class representing TuplePattern patterns where there are a range of patterns -class TuplePatternItemsRanged : public TuplePatternItems +// Class representing patterns within a TuplePattern, with a rest pattern +// included +class TuplePatternItemsHasRest : public TuplePatternItems  {    std::vector<std::unique_ptr<Pattern>> lower_patterns;    std::vector<std::unique_ptr<Pattern>> upper_patterns;  public: -  TuplePatternItemsRanged (std::vector<std::unique_ptr<Pattern>> lower_patterns, -			   std::vector<std::unique_ptr<Pattern>> upper_patterns) +  TuplePatternItemsHasRest ( +    std::vector<std::unique_ptr<Pattern>> lower_patterns, +    std::vector<std::unique_ptr<Pattern>> upper_patterns)      : lower_patterns (std::move (lower_patterns)),        upper_patterns (std::move (upper_patterns))    {}    // Copy constructor with vector clone -  TuplePatternItemsRanged (TuplePatternItemsRanged const &other) +  TuplePatternItemsHasRest (TuplePatternItemsHasRest const &other)    {      lower_patterns.reserve (other.lower_patterns.size ());      for (const auto &e : other.lower_patterns) @@ -1120,7 +1137,7 @@ public:    }    // Overloaded assignment operator to clone -  TuplePatternItemsRanged &operator= (TuplePatternItemsRanged const &other) +  TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest const &other)    {      lower_patterns.clear ();      lower_patterns.reserve (other.lower_patterns.size ()); @@ -1136,15 +1153,15 @@ public:    }    // move constructors -  TuplePatternItemsRanged (TuplePatternItemsRanged &&other) = default; -  TuplePatternItemsRanged &operator= (TuplePatternItemsRanged &&other) +  TuplePatternItemsHasRest (TuplePatternItemsHasRest &&other) = default; +  TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest &&other)      = default;    std::string as_string () const override;    void accept_vis (HIRFullVisitor &vis) override; -  ItemType get_item_type () const override { return ItemType::RANGED; } +  ItemType get_item_type () const override { return ItemType::HAS_REST; }    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()    { @@ -1167,9 +1184,9 @@ public:  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TuplePatternItemsRanged *clone_tuple_items_impl () const override +  TuplePatternItemsHasRest *clone_pattern_items_impl () const override    { -    return new TuplePatternItemsRanged (*this); +    return new TuplePatternItemsHasRest (*this);    }  }; @@ -1234,10 +1251,161 @@ protected:    }  }; +// Base abstract class representing SlicePattern patterns +class SlicePatternItems : public PatternItems +{ +public: +  // Unique pointer custom clone function +  std::unique_ptr<SlicePatternItems> clone_slice_pattern_items () const +  { +    return std::unique_ptr<SlicePatternItems> (clone_pattern_items_impl ()); +  } + +protected: +  // pure virtual clone implementation +  virtual SlicePatternItems *clone_pattern_items_impl () const override = 0; +}; + +// Class representing patterns within a SlicePattern, without a rest pattern +class SlicePatternItemsNoRest : public SlicePatternItems +{ +  std::vector<std::unique_ptr<Pattern>> patterns; + +public: +  SlicePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns) +    : patterns (std::move (patterns)) +  {} + +  // Copy constructor with vector clone +  SlicePatternItemsNoRest (SlicePatternItemsNoRest const &other) +  { +    patterns.reserve (other.patterns.size ()); +    for (const auto &e : other.patterns) +      patterns.push_back (e->clone_pattern ()); +  } + +  // Overloaded assignment operator to vector clone +  SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest const &other) +  { +    patterns.clear (); +    patterns.reserve (other.patterns.size ()); +    for (const auto &e : other.patterns) +      patterns.push_back (e->clone_pattern ()); + +    return *this; +  } + +  // move constructors +  SlicePatternItemsNoRest (SlicePatternItemsNoRest &&other) = default; +  SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest &&other) +    = default; + +  std::string as_string () const override; + +  void accept_vis (HIRFullVisitor &vis) override; + +  ItemType get_item_type () const override { return ItemType::NO_REST; } + +  std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; } +  const std::vector<std::unique_ptr<Pattern>> &get_patterns () const +  { +    return patterns; +  } + +protected: +  /* Use covariance to implement clone function as returning this object rather +   * than base */ +  SlicePatternItemsNoRest *clone_pattern_items_impl () const override +  { +    return new SlicePatternItemsNoRest (*this); +  } +}; + +// Class representing patterns within a SlicePattern, with a rest pattern +// included +class SlicePatternItemsHasRest : public SlicePatternItems +{ +  std::vector<std::unique_ptr<Pattern>> lower_patterns; +  std::vector<std::unique_ptr<Pattern>> upper_patterns; + +public: +  SlicePatternItemsHasRest ( +    std::vector<std::unique_ptr<Pattern>> lower_patterns, +    std::vector<std::unique_ptr<Pattern>> upper_patterns) +    : lower_patterns (std::move (lower_patterns)), +      upper_patterns (std::move (upper_patterns)) +  {} + +  // Copy constructor with vector clone +  SlicePatternItemsHasRest (SlicePatternItemsHasRest const &other) +  { +    lower_patterns.reserve (other.lower_patterns.size ()); +    for (const auto &e : other.lower_patterns) +      lower_patterns.push_back (e->clone_pattern ()); + +    upper_patterns.reserve (other.upper_patterns.size ()); +    for (const auto &e : other.upper_patterns) +      upper_patterns.push_back (e->clone_pattern ()); +  } + +  // Overloaded assignment operator to clone +  SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest const &other) +  { +    lower_patterns.clear (); +    lower_patterns.reserve (other.lower_patterns.size ()); +    for (const auto &e : other.lower_patterns) +      lower_patterns.push_back (e->clone_pattern ()); + +    lower_patterns.clear (); +    upper_patterns.reserve (other.upper_patterns.size ()); +    for (const auto &e : other.upper_patterns) +      upper_patterns.push_back (e->clone_pattern ()); + +    return *this; +  } + +  // move constructors +  SlicePatternItemsHasRest (SlicePatternItemsHasRest &&other) = default; +  SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest &&other) +    = default; + +  std::string as_string () const override; + +  void accept_vis (HIRFullVisitor &vis) override; + +  ItemType get_item_type () const override { return ItemType::HAS_REST; } + +  std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () +  { +    return lower_patterns; +  } +  const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const +  { +    return lower_patterns; +  } + +  std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () +  { +    return upper_patterns; +  } +  const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const +  { +    return upper_patterns; +  } + +protected: +  /* Use covariance to implement clone function as returning this object rather +   * than base */ +  SlicePatternItemsHasRest *clone_pattern_items_impl () const override +  { +    return new SlicePatternItemsHasRest (*this); +  } +}; +  // HIR node representing patterns that can match slices and arrays  class SlicePattern : public Pattern  { -  std::vector<std::unique_ptr<Pattern>> items; +  std::unique_ptr<SlicePatternItems> items;    location_t locus;    Analysis::NodeMapping mappings; @@ -1245,30 +1413,23 @@ public:    std::string as_string () const override;    SlicePattern (Analysis::NodeMapping mappings, -		std::vector<std::unique_ptr<Pattern>> items, location_t locus) +		std::unique_ptr<SlicePatternItems> items, location_t locus)      : items (std::move (items)), locus (locus), mappings (mappings)    {} -  // Copy constructor with vector clone +  // Copy constructor requires clone    SlicePattern (SlicePattern const &other) -    : locus (other.locus), mappings (other.mappings) -  { -    items.reserve (other.items.size ()); -    for (const auto &e : other.items) -      items.push_back (e->clone_pattern ()); -  } +    : items (other.items->clone_slice_pattern_items ()), locus (other.locus), +      mappings (other.mappings) +  {}    // Overloaded assignment operator to vector clone    SlicePattern &operator= (SlicePattern const &other)    { +    items = other.items->clone_slice_pattern_items ();      locus = other.locus;      mappings = other.mappings; -    items.clear (); -    items.reserve (other.items.size ()); -    for (const auto &e : other.items) -      items.push_back (e->clone_pattern ()); -      return *this;    } @@ -1276,11 +1437,8 @@ public:    SlicePattern (SlicePattern &&other) = default;    SlicePattern &operator= (SlicePattern &&other) = default; -  std::vector<std::unique_ptr<Pattern>> &get_items () { return items; } -  const std::vector<std::unique_ptr<Pattern>> &get_items () const -  { -    return items; -  } +  SlicePatternItems &get_items () { return *items; } +  const SlicePatternItems &get_items () const { return *items; }    location_t get_locus () const override { return locus; }  | 
