[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