ROSE  0.11.145.0
Classes | Functions
sg Namespace Reference

Description

This namespace contains template functions that operate on the ROSE AST.

Classes

struct  AncestorTypeFinder
 helper class for _ancestor More...
 
struct  ConstLike
 projects the constness of T1 on T2 More...
 
struct  ConstLike< const T1, T2 >
 
struct  DefaultHandler
 struct DefaultHandler More...
 
struct  DispatchHandler
 struct DispatchHandler More...
 
struct  DispatchHelper
 
struct  InitNameCloner
 Functor copying an initialized name into a different scope. More...
 
struct  SageInserter
 Generic inserter for sage containers. More...
 
struct  ScopeSetter
 Functor setting the scope of a sage node to a specified (at Functor construction time) scope. More...
 
struct  TraversalClass
 
struct  TraversalFunction
 executes a functor for a specific node type More...
 
struct  TypeRecovery
 
struct  VarRefBuilder
 Functor building a variable reference from an initialized name. More...
 
struct  VisitDispatcher
 

Functions

template<class SageSequenceContainer >
SageInserter< SageSequenceContainer > sage_inserter (SageSequenceContainer &cont)
 generates a SageInserter, adding elements at the end of a sequence More...
 
template<class T >
T & deref (T *ptr, const char *file=0, size_t ln=0)
 dereferences an object (= checked dereference in debug mode)
 
template<class RoseVisitor >
std::remove_const< typename std::remove_reference< RoseVisitor >::type >::type _dispatch (RoseVisitor &&rv, SgNode *n)
 
template<class RoseVisitor >
std::remove_const< typename std::remove_reference< RoseVisitor >::type >::type dispatch (RoseVisitor &&rv, SgNode *n)
 uncovers the type of SgNode and passes it to an function "handle" in RoseVisitor. More...
 
template<class RoseVisitor >
std::remove_const< typename std::remove_reference< RoseVisitor >::type >::type dispatch (RoseVisitor &&rv, const SgNode *n)
 
template<class AncestorNode , class QualSgNode >
AncestorNode * _ancestor (QualSgNode &n)
 implements the ancestor search More...
 
template<class AncestorNode >
AncestorNode * ancestor (SgNode *n)
 finds an ancestor node with a given type More...
 
template<class AncestorNode >
const AncestorNode * ancestor (const SgNode *n)
 
template<class AncestorNode >
AncestorNode & ancestor (SgNode &n)
 
template<class AncestorNode >
const AncestorNode & ancestor (const SgNode &n)
 
template<class SageNode >
auto ancestor_path (const SgNode &n) -> SageNode *
 
template<class SageNode , class... SageNodes>
auto ancestor_path (const SgNode &n) -> decltype(ancestor_path< SageNodes... >(n))
 
template<class SageNode , class SageChild >
void swap_child (SageNode &lhs, SageNode &rhs, SageChild *(SageNode::*getter)() const, void(SageNode::*setter)(SageChild *))
 swaps children (of equal kind) between two ancestor nodes of the same type More...
 
template<class SageParent , class SageChild >
void linkParentChild (SageParent &parent, SageChild &child, void(SageParent::*setter)(SageChild *))
 
void report_error (std::string desc, const char *file=nullptr, size_t ln=0)
 
void unexpected_node (const SgNode &n, const char *file=nullptr, size_t ln=0)
 
template<class SageNode >
SageNode * assert_sage_type (SgNode *n, const char *f=0, size_t ln=0)
 asserts that n has type SageNode More...
 
template<class SageNode >
const SageNode * assert_sage_type (const SgNode *n, const char *f=0, size_t ln=0)
 asserts that n has type SageNode More...
 
template<class SageNode >
SageNode & assert_sage_type (SgNode &n, const char *f=0, size_t ln=0)
 asserts that n has type SageNode More...
 
template<class SageNode >
const SageNode & assert_sage_type (const SgNode &n, const char *f=0, size_t ln=0)
 asserts that n has type SageNode More...
 
template<class SageNode >
SageNode::base_node_type & asBaseType (SageNode &n)
 returns the same node n upcasted to its base type More...
 
template<class SageNode >
const SageNode::base_node_type & asBaseType (const SageNode &n)
 returns the same node n upcasted to its base type More...
 
template<class SageNode >
SageNode::base_node_type * asBaseType (SageNode *n)
 returns the same node n upcasted to its base type More...
 
template<class SageNode >
const SageNode::base_node_type * asBaseType (const SageNode *n)
 returns the same node n upcasted to its base type More...
 

Function Documentation

template<class SageSequenceContainer >
SageInserter<SageSequenceContainer> sg::sage_inserter ( SageSequenceContainer &  cont)

generates a SageInserter, adding elements at the end of a sequence

Template Parameters
SageSequenceContainer,asage container that supports appending an element

Definition at line 140 of file sageFunctors.h.

template<class RoseVisitor >
std::remove_const<typename std::remove_reference<RoseVisitor>::type>::type sg::dispatch ( RoseVisitor &&  rv,
SgNode n 
)
inline

uncovers the type of SgNode and passes it to an function "handle" in RoseVisitor.

which should be overloaded with every possible target node. After the traversal, RoseVisitor should contain the intended return data.

Template Parameters
RoseVisitor.The visitor that will be called back with the recovered type information. It must implement "handle." The handle function with the most suitable SgNode type will get invoked.
Parameters
rvan instance of a rose visitor; ie any class with a "handle" function. Note: rv is essentially passed by value (similar to STL's for_each).
nThe root of the tree to visit. SgNode
Returns
a copy of the RoseVisitor object, that will contain the intended return data.

The following code has two classes.

  • Counter counts the number of all expression and statement nodes. It implements handlers for SgNode (not interesting nodes), for SgExpression and SgStatement (to count the nodes).
  • Traversal inherits from ASTTraversal and contains a counter. The dispatch function is invoked using a Counter object and a pointer to an AST node. Since the counter object is passed by value we need to store back the result (similar to std::for_each).
    struct Counter
    {
    size_t expr;
    size_t decl;
    Counter() : expr(0), decl(0) {}
    void handle(const SgNode&) {}
    void handle(const SgExpression&) { ++expr; }
    void handle(const SgStatement&) { ++stmt; }
    };
    struct Traversal : ASTTraversal
    {
    Counter ctr;
    void visit(SgNode* n)
    {
    ctr = sg::dispatch(ctr, n);
    }
    void run(SgNode& root)
    {
    traverse(&root, preorder);
    std::cout << "Expr/Stmt ratio = " << ratio(ctr.expr, ctr.stmt) << std::endl;
    }
    static
    float ratio(float a, float b) { return a/b; }
    };

Definition at line 1249 of file sageGeneric.h.

Referenced by _ancestor(), assert_sage_type(), and sg::TraversalClass< GVisitor >::visit().

template<class AncestorNode , class QualSgNode >
AncestorNode* sg::_ancestor ( QualSgNode &  n)

implements the ancestor search

see comments for AncestorTypeFinder

Definition at line 1311 of file sageGeneric.h.

References dispatch().

template<class AncestorNode >
AncestorNode* sg::ancestor ( SgNode n)

finds an ancestor node with a given type

the function family comes in four variants:

  • SgNode* -> AncestorNode* ( result can be NULL )
  • const SgNode* -> const AncestorNode* ( result can be NULL )
  • SgNode& -> AncestorNode& ( assert(false) when an ancestor of the specified type cannot be found )
  • const SgNode& -> const AncestorNode& ( assert(false) when an ancestor of the specified type cannot be found )
    const SgStatement* enclosingStatement(const SgExpression* e) { return sg::ancestor<SgStatement>(e); }

Definition at line 1337 of file sageGeneric.h.

template<class AncestorNode >
const AncestorNode* sg::ancestor ( const SgNode n)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 1346 of file sageGeneric.h.

template<class AncestorNode >
AncestorNode& sg::ancestor ( SgNode n)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 1355 of file sageGeneric.h.

template<class AncestorNode >
const AncestorNode& sg::ancestor ( const SgNode n)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Definition at line 1365 of file sageGeneric.h.

template<class SageNode >
SageNode* sg::assert_sage_type ( SgNode n,
const char *  f = 0,
size_t  ln = 0 
)

asserts that n has type SageNode

the ROSE assert in the following example holds b/c assert_sage_type aborts if the input node is not a SgStatement

SgStatement* stmt = assert_sage_type<SgStatement>(expr.get_parent());
ROSE_ASSERT(stmt);

Definition at line 1414 of file sageGeneric.h.

References dispatch().

template<class SageNode >
const SageNode* sg::assert_sage_type ( const SgNode n,
const char *  f = 0,
size_t  ln = 0 
)

asserts that n has type SageNode

the ROSE assert in the following example holds b/c assert_sage_type aborts if the input node is not a SgStatement

SgStatement* stmt = assert_sage_type<SgStatement>(expr.get_parent());
ROSE_ASSERT(stmt);

Definition at line 1420 of file sageGeneric.h.

References dispatch().

template<class SageNode >
SageNode& sg::assert_sage_type ( SgNode n,
const char *  f = 0,
size_t  ln = 0 
)

asserts that n has type SageNode

the ROSE assert in the following example holds b/c assert_sage_type aborts if the input node is not a SgStatement

SgStatement* stmt = assert_sage_type<SgStatement>(expr.get_parent());
ROSE_ASSERT(stmt);

Definition at line 1426 of file sageGeneric.h.

References dispatch().

template<class SageNode >
const SageNode& sg::assert_sage_type ( const SgNode n,
const char *  f = 0,
size_t  ln = 0 
)

asserts that n has type SageNode

the ROSE assert in the following example holds b/c assert_sage_type aborts if the input node is not a SgStatement

SgStatement* stmt = assert_sage_type<SgStatement>(expr.get_parent());
ROSE_ASSERT(stmt);

Definition at line 1432 of file sageGeneric.h.

References dispatch().

template<class SageNode , class SageChild >
void sg::swap_child ( SageNode &  lhs,
SageNode &  rhs,
SageChild *(SageNode::*)() const  getter,
void(SageNode::*)(SageChild *)  setter 
)

swaps children (of equal kind) between two ancestor nodes of the same type

Template Parameters
SageNodethe parent node type
SageChildthe child node type
Parameters
lhsone parent node
rhsanother parent node
getterthe getter function to extract the child from lhs (and rhs)
setterthe setter function to store the child in lhs (and rhs)

Definition at line 1485 of file sageGeneric.h.

template<class SageNode >
SageNode::base_node_type& sg::asBaseType ( SageNode &  n)

returns the same node n upcasted to its base type

Note
useful for calling an overloaded function

Definition at line 1664 of file sageGeneric.h.

template<class SageNode >
const SageNode::base_node_type& sg::asBaseType ( const SageNode &  n)

returns the same node n upcasted to its base type

Note
useful for calling an overloaded function

Definition at line 1668 of file sageGeneric.h.

template<class SageNode >
SageNode::base_node_type* sg::asBaseType ( SageNode *  n)

returns the same node n upcasted to its base type

Note
useful for calling an overloaded function

Definition at line 1672 of file sageGeneric.h.

template<class SageNode >
const SageNode::base_node_type* sg::asBaseType ( const SageNode *  n)

returns the same node n upcasted to its base type

Note
useful for calling an overloaded function

Definition at line 1676 of file sageGeneric.h.