]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: ast: Add manual dispatch for meta item downcasting
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Tue, 20 Jun 2023 11:26:45 +0000 (13:26 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:55:58 +0000 (18:55 +0100)
Several meta items shall be downcasted in various places, this commit
introduces values to dispatch on.

gcc/rust/ChangeLog:

* ast/rust-ast.h (class MetaItem): Add MetaItem dispatch values.
* ast/rust-expr.h: Add LitExpr and PathLit dispatch.
* ast/rust-macro.h: Add remaining dispatch getters.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/ast/rust-ast.h
gcc/rust/ast/rust-expr.h
gcc/rust/ast/rust-macro.h

index 7989bbe13c11d544114eaaa1ab58df93af0c25b7..faf14fe722b7f156db44c6d3d3c1ce7fc57d5acd 100644 (file)
@@ -681,12 +681,20 @@ protected:
   virtual MetaItemInner *clone_meta_item_inner_impl () const = 0;
 
 public:
+  enum class Kind
+  {
+    LitExpr,
+    MetaItem,
+  };
+
   // Unique pointer custom clone function
   std::unique_ptr<MetaItemInner> clone_meta_item_inner () const
   {
     return std::unique_ptr<MetaItemInner> (clone_meta_item_inner_impl ());
   }
 
+  virtual Kind get_kind () = 0;
+
   virtual ~MetaItemInner ();
 
   virtual location_t get_locus () const = 0;
@@ -897,6 +905,24 @@ class AttrInputLiteral;
 // abstract base meta item class
 class MetaItem : public MetaItemInner
 {
+public:
+  enum class ItemKind
+  {
+    Path,
+    Word,
+    NameValueStr,
+    PathLit,
+    Seq,
+    ListPaths,
+    ListNameValueStr,
+  };
+
+  MetaItemInner::Kind get_kind () override
+  {
+    return MetaItemInner::Kind::MetaItem;
+  }
+
+  virtual ItemKind get_item_kind () const = 0;
 };
 
 // Forward decl - defined in rust-expr.h
index 63c7d1079615aa51a940dc2ac37af80da794bbbe..b3aa41726c4423bd3f4e6728f25b71e993a97672 100644 (file)
@@ -200,6 +200,11 @@ public:
 
   bool check_cfg_predicate (const Session &session) const override;
 
+  MetaItemInner::Kind get_kind () override
+  {
+    return MetaItemInner::Kind::LitExpr;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaItemLitExpr *clone_meta_item_inner_impl () const override
@@ -228,6 +233,11 @@ public:
     return path.as_string () + " = " + lit.as_string ();
   }
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::PathLit;
+  }
+
   // There are two Locations in MetaItemPathLit (path and lit_expr),
   //  we have no idea use which of them, just simply return UNKNOWN_LOCATION
   //  now.
index c63b480de61003f59f802afee8cd1ebee7da858c..db8cf1ef5d450b376bfe0d6d4ebc9f50a66c62af 100644 (file)
@@ -844,6 +844,11 @@ public:
 
   Attribute to_attribute () const override;
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::Path;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaItemPath *clone_meta_item_inner_impl () const override
@@ -902,6 +907,11 @@ public:
 
   Attribute to_attribute () const override;
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::Seq;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaItemSeq *clone_meta_item_inner_impl () const override
@@ -933,6 +943,11 @@ public:
 
   Attribute to_attribute () const override;
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::Word;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaWord *clone_meta_item_inner_impl () const override
@@ -984,6 +999,11 @@ public:
 
   bool is_key_value_pair () const override { return true; }
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::NameValueStr;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaNameValueStr *clone_meta_item_inner_impl () const override
@@ -1021,6 +1041,11 @@ public:
 
   Attribute to_attribute () const override;
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::ListPaths;
+  }
+
 private:
   bool check_path_exists_in_cfg (const Session &session,
                                 const SimplePath &path) const;
@@ -1061,6 +1086,11 @@ public:
 
   Attribute to_attribute () const override;
 
+  MetaItem::ItemKind get_item_kind () const override
+  {
+    return MetaItem::ItemKind::ListNameValueStr;
+  }
+
 protected:
   // Use covariance to implement clone function as returning this type
   MetaListNameValueStr *clone_meta_item_inner_impl () const override