Hi Ayush,

First, you need to know the classes associated with each of your target AST
nodes.  These are IfStmt, WhileStmt, ForStmt, BinaryOperator, and
UnaryOperator.  Each of these are sub-classes of Stmt.  IfStmt, WhileStmt,
ForStmt and direct sub-classes while BinaryOperator and UnaryOperator are
sub-classes of Expr, which is a sub-class of ValueStmt, which is a
sub-class of Stmt.  There's also two other related classes, CXXForRangeStmt
and DoStmt, which represent ranged-based for-loops and do/while loops.

Second, pointers can be changed between classes with the cast and dyn_cast
functions and Stmt::getStmtClass() will tell the type of the Stmt.  They
are used as follows:

void VisitStmt(Stmt *S) {
  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(S)) {
    // Process BinaryOperator here
  } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(S)) {
    ...
  } // other checks here
}

void VisitStmt(Stmt *S) {
  switch (S->getStmtClass()) {
  case Stmt::BinaryOperatorClass: {
    BinaryOperator *BO = cast<BinaryOperator>(S);
    // Process BinaryOperator here
  }
  case Stmt::UnaryOperatorClass: {
    UnaryOperator *UO = cast<UnaryOperator>(S);
  }
  // Other cases here
  }
}

The difference between cast and dyn_cast is that cast expects the pointer
is the correct type without checking while dyn_cast does check the target
type and returns a null pointer on a type mismatch.  Chains of dyn_cast's
are used if the list of nodes is short while using a switch on
Stmt::getStmtClass() is used when checking a lot of node types.

There's also a third way.  Since you are already using a visitor, the
visitor will have a visit function for each AST node.  Instead of writing
just VisitStmt, you will write a VisitBinaryOperator(BinaryOperator *),
VisitUnaryOperator(UnaryOperator *), and so on for each one you're
interested in.  Hope this is enough to get you started.

On Tue, Jul 30, 2019 at 4:25 PM Ayush Mittal via cfe-users <
cfe-users@lists.llvm.org> wrote:

> Hello Clangers,
>
> I'm new to clang. I'm writing an AST Consumer plug-in to visit the
> statements node and record the data in one of my table with line numbers.
> I've this function callback ready: *VisitStmt(Stmt *S)*. My question is
> how could I traverse If, while, for loop, boolean and Unary Operators-
> inside this function.
>
> Thanks and Regards.
> _______________________________________________
> cfe-users mailing list
> cfe-users@lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
>
_______________________________________________
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to