Decl iterators

Dear clang developers,

I have a problem when I am trying to do some analysis with clang. I need to get all typedef decls that are inside the class or struct. I need this for my bachelor thesis. The part of source code of the file I want to analyse is:

class state_1 : sc :: simple_state< state_1, DU>
{
     state_1() { cout<<"Chcete zformatovat vas disk (a/n) ? \n";}
     ~state_1() {}
     typedef sc::transition< EvN, state_2 > reactions;
};

It is no problem to get constructor and destructor and other methods in the class. The problem is to reach the typedef decl.

The only way I found was to create my own iterator and to put it into the header files of clang(DeclCXX.h). I created the iterator by using this code:

typedef specific_decl_iterator<TypedefDecl> typedef_iterator;

   /// it_begin - Typedef begin iterator. Iterates in the order the Typedefs
   /// were declared.
   typedef_iterator td_begin() const {
     return typedef_iterator(decls_begin());
   }
   /// it_end - Typedef end iterator.
   typedef_iterator td_end() const {
     return typedef_iterator(decls_end());
   }

My question is whether there is a better way how to iterate through all typedef decls inside the class without updating header files of clang? If it isn't could I ask your to add this part of code to your header files?(To header file DeclCXX.h).

Best regards

Petr Silhavik

Dear clang developers,

I have a problem when I am trying to do some analysis with clang. I
need to get all typedef decls that are inside the class or struct. I
need this for my bachelor thesis. The part of source code of the file
I want to analyse is:

class state_1 : sc :: simple_state< state_1, DU>
{
    state_1() { cout<<"Chcete zformatovat vas disk (a/n) ? \n";}
    ~state_1() {}
    typedef sc::transition< EvN, state_2 > reactions;
};

It is no problem to get constructor and destructor and other methods
in the class. The problem is to reach the typedef decl.

The only way I found was to create my own iterator and to put it into
the header files of clang(DeclCXX.h). I created the iterator by using
this code:

typedef specific_decl_iterator<TypedefDecl> typedef_iterator;

  /// it_begin - Typedef begin iterator. Iterates in the order the Typedefs
  /// were declared.
  typedef_iterator td_begin() const {
    return typedef_iterator(decls_begin());
  }
  /// it_end - Typedef end iterator.
  typedef_iterator td_end() const {
    return typedef_iterator(decls_end());
  }

My question is whether there is a better way how to iterate through
all typedef decls inside the class without updating header files of
clang?

For each iterator D in (decls_begin(), decls_end()), use:

  if (TypedefDecl *Typedef = llvm::dyn_cast<TypedefDecl>(*D)) {
    // Handle the typedef
  }

If it isn't could I ask your to add this part of code to your
header files?(To header file DeclCXX.h).

Using dyn_cast should work well for you; there's no reason to add this specific iterator into Clang.

  - Doug