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;
// 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
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
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.
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
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
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
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
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;
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