MACRO_INVOCATION,
};
+class Visitable
+{
+public:
+ virtual void accept_vis (ASTVisitor &vis) = 0;
+};
+
// Abstract base class for all AST elements
-class Node
+class Node : public Visitable
{
public:
/**
class Token;
// A tree of tokens (or a single token) - abstract base class
-class TokenTree
+class TokenTree : public Visitable
{
public:
virtual ~TokenTree () {}
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
/* Converts token tree to a flat token stream. Tokens must be pointer to avoid
* mutual dependency with Token. */
virtual std::vector<std::unique_ptr<Token> > to_token_stream () const = 0;
};
// Abstract base class for a macro match
-class MacroMatch
+class MacroMatch : public Visitable
{
public:
enum MacroMatchType
return std::unique_ptr<MacroMatch> (clone_macro_match_impl ());
}
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual MacroMatchType get_macro_match_type () const = 0;
protected:
};
// Attribute body - abstract base class
-class AttrInput
+class AttrInput : public Visitable
{
public:
enum AttrInputType
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual bool check_cfg_predicate (const Session &session) const = 0;
// Parse attribute input to meta item, if possible
class MetaNameValueStr;
// abstract base meta item inner class
-class MetaItemInner
+class MetaItemInner : public Visitable
{
protected:
// pure virtual as MetaItemInner
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
/* HACK: used to simplify parsing - creates a copy of that type, or returns
* null */
virtual std::unique_ptr<MetaNameValueStr> to_meta_name_value_str () const;
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual Location get_locus () const = 0;
virtual void mark_for_strip () = 0;
// HACK: strictly not needed, but faster than full downcast clone
virtual bool is_expr_without_block () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual void mark_for_strip () = 0;
virtual bool is_marked_for_strip () const = 0;
};
// Pattern base AST node
-class Pattern
+class Pattern : public Visitable
{
public:
// Unique pointer custom clone function
virtual ~Pattern () {}
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
// as only one kind of pattern can be stripped, have default of nothing
virtual void mark_for_strip () {}
/* as pointer, shouldn't require definition beforehand, only forward
* declaration. */
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
// as only two kinds of types can be stripped, have default of nothing
virtual void mark_for_strip () {}
virtual bool is_marked_for_strip () const { return false; }
/* Abstract base class representing a type param bound - Lifetime and TraitBound
* extends it */
-class TypeParamBound
+class TypeParamBound : public Visitable
{
public:
virtual ~TypeParamBound () {}
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
NodeId get_node_id () const { return node_id; }
virtual Location get_locus () const = 0;
/* Base generic parameter in AST. Abstract - can be represented by a Lifetime or
* Type param */
-class GenericParam
+class GenericParam : public Visitable
{
public:
enum class Kind
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual Location get_locus () const = 0;
virtual Kind get_kind () const = 0;
};
// Item used in trait declarations - abstract base class
-class TraitItem
+class TraitItem : public Visitable
{
protected:
TraitItem (Location locus)
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual void mark_for_strip () = 0;
virtual bool is_marked_for_strip () const = 0;
/* Abstract base class for items used within an inherent impl block (the impl
* name {} one) */
-class InherentImplItem
+class InherentImplItem : public Visitable
{
protected:
// Clone function implementation as pure virtual method
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual void mark_for_strip () = 0;
virtual bool is_marked_for_strip () const = 0;
};
// Abstract base class for items used in a trait impl
-class TraitImplItem
+class TraitImplItem : public Visitable
{
protected:
virtual TraitImplItem *clone_trait_impl_item_impl () const = 0;
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual void mark_for_strip () = 0;
virtual bool is_marked_for_strip () const = 0;
};
// Abstract base class for an item used inside an extern block
-class ExternalItem
+class ExternalItem : public Visitable
{
public:
ExternalItem () : node_id (Analysis::Mappings::get ()->get_next_node_id ()) {}
virtual std::string as_string () const = 0;
- virtual void accept_vis (ASTVisitor &vis) = 0;
-
virtual void mark_for_strip () = 0;
virtual bool is_marked_for_strip () const = 0;
}
};
-class SingleASTNode
+class SingleASTNode : public Visitable
{
public:
enum NodeType
return std::move (type);
}
- void accept_vis (ASTVisitor &vis)
+ void accept_vis (ASTVisitor &vis) override
{
switch (kind)
{