Iterating over AST node objects

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Iterating over AST node objects

Manas via cfe-dev
Hi,

If I dump() a clang::Type object, I can see this AST representation - 

ConstantArrayType 0x555562830ea0 'const char **const [0]' 0
`-QualType 0x555562830c81 'const char **const' const
  `-PointerType 0x555562830c80 'const char **'
    `-PointerType 0x5555627ed2a0 'const char *'
      `-QualType 0x5555627ec7d1 'const char' const
        `-BuiltinType 0x5555627ec7d0 'char'

Is there a way to use the ASTContext to iterate over each node? (Do each of those lines represent a node?)

My motivation is to get the inner most PointerType object.

Regards,

--
Pratyush Das

_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
Reply | Threaded
Open this post in threaded view
|

Re: Iterating over AST node objects

Manas via cfe-dev
Yes those lines represent nodes.  You do not necessarily need ASTContext to look at a node’s descendants: you can just use the node’s methods.  

Were these sugar (= syntax-only) type nodes, you could iterate over the child of each successive node via `desugar()`, and successively desugar while searching for a Type subclass T via `getAs<T>()`.  

But pointee types/array element types are of course not sugar: they are distinct semantic entities, so desugar/getAs won’t will not pass through them.  Hence your problem.

Fortunately there seems to be a `getPointeeOrArrayElementType()` to help peel off the semantic layers you want to look through, analogous to `desugar()` — but unfortunately there is not a `getAs` analog for this case, so you have to write the search manually.  

Something like this should work (not tested):

```
PointerType *getInnermostPointerType(const Type *T) {
  const PointerType *res = nullptr;

  while (true) {
    const Type *pointeeOrElement = T->getPointeeOrArrayElementType();
    if (pointeeOrElement == T)
      // T is neither a pointer nor array type: we’re done.
      break;

    // T is a pointer or array type.
    if (isa<PointerType>(T)) 
      res = cast<PointerType>(T);

   

    // iterate T, keep looking
    T = pointeeOrElement;
  }
  return res;
}
```

On Oct 30, 2020, at 2:12 PM, Pratyush Das via cfe-dev <[hidden email]> wrote:

Hi,

If I dump() a clang::Type object, I can see this AST representation - 

ConstantArrayType 0x555562830ea0 'const char **const [0]' 0
`-QualType 0x555562830c81 'const char **const' const
  `-PointerType 0x555562830c80 'const char **'
    `-PointerType 0x5555627ed2a0 'const char *'
      `-QualType 0x5555627ec7d1 'const char' const
        `-BuiltinType 0x5555627ec7d0 'char'

Is there a way to use the ASTContext to iterate over each node? (Do each of those lines represent a node?)

My motivation is to get the inner most PointerType object.

Regards,

--
Pratyush Das
_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev


_______________________________________________
cfe-dev mailing list
[hidden email]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev