[LLVMdev] Parsing C++ template parameters using cindex.py

Duncan Sands baldrick at free.fr
Fri Sep 14 00:25:17 PDT 2012


Hi Joel, this looks like a question for the clang mailing list rather than
this one.

Ciao, Duncan.

On 13/09/12 11:06, Joel de Vahl wrote:
> Hi,
>
> I am parsing a C++ file using cindex.py and want to get the template
> parameters to a specific node. However, the tree seems to be different
> depending on if the template parameter is a struct/class or a simple
> type such as int or float. In the first case the template type is
> appended as a child to the VAR_DECL node (the TYPE_REF node seen in
> the example below), but this is not the case with for example int. Any
> hint on where the template type is located for int/float/etc?
>
> /joel de vahl
>
> Example code:
>
> template <typename T>
> class Test
> {
> 	T test;
> };
>
> struct S
> {
> };
>
> Test<int> test_int;
> Test<S> test_struct;
>
> Tree dump script:
>
> def DeepPrintType(node, depth = 0):
>      tabs = " " * depth
>      print tabs + "type"
>      print tabs + " kind", node.kind
>
> def DeepPrint(node, depth = 0):
>      tabs = " " * depth
>      print tabs + "cursor", node.spelling
>      print tabs + " location", node.location
>      node_type_res = node.type.get_result()
>
>      print tabs + " result", node_type_res.kind
>      print tabs + " kind", node.kind
>      DeepPrintType(node.type, depth + 1)
>      print tabs + " xdata", node.xdata
>      print tabs + " data", node.data[0], node.data[1], node.data[2]
>
>      print tabs + " children"
>      children = [c for c in node.get_children()]
>      for c in children:
>          DeepPrint(c, depth + 2)
>
> index = Index.create()
> tu = index.parse(None, ['testfile.cpp'])
> children = [c for c in tu.cursor.get_children() if c.kind ==
> CursorKind.VAR_DECL]
> for c in children:
>      DeepPrint(c)
>
> Dump output:
>
> cursor test_int
>   location <SourceLocation file 'testfile.cpp', line 11, column 11>
>   result TypeKind.INVALID
>   kind CursorKind.VAR_DECL
>   type
>    kind TypeKind.UNEXPOSED
>   xdata 0
>   data 48356112 1 4106544
>   children
>    cursor None
>     location <SourceLocation file 'testfile.cpp', line 11, column 1>
>     result TypeKind.INVALID
>     kind CursorKind.TEMPLATE_REF
>     type
>      kind TypeKind.INVALID
>     xdata 0
>     data 48201424 75 4106544
>     children
>    cursor None
>     location <SourceLocation file 'testfile.cpp', line 11, column 11>
>     result TypeKind.INVALID
>     kind CursorKind.CALL_EXPR
>     type
>      kind TypeKind.UNEXPOSED
>     xdata 0
>     data 48356112 48357480 4106544
>     children
>
> cursor test_struct
>   location <SourceLocation file 'testfile.cpp', line 12, column 9>
>   result TypeKind.INVALID
>   kind CursorKind.VAR_DECL
>   type
>    kind TypeKind.UNEXPOSED
>   xdata 0
>   data 48358032 1 4106544
>   children
>    cursor None
>     location <SourceLocation file 'testfile.cpp', line 12, column 1>
>     result TypeKind.INVALID
>     kind CursorKind.TEMPLATE_REF
>     type
>      kind TypeKind.INVALID
>     xdata 0
>     data 48201424 96 4106544
>     children
>    cursor None
>     location <SourceLocation file 'testfile.cpp', line 12, column 6>
>     result TypeKind.INVALID
>     kind CursorKind.TYPE_REF
>     type
>      kind TypeKind.RECORD
>     xdata 0
>     data 48355056 101 4106544
>     children
>    cursor None
>     location <SourceLocation file 'testfile.cpp', line 12, column 9>
>     result TypeKind.INVALID
>     kind CursorKind.CALL_EXPR
>     type
>      kind TypeKind.UNEXPOSED
>     xdata 0
>     data 48358032 48415208 4106544
>     children
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>




More information about the llvm-dev mailing list