[cfe-dev] Parsing C++ template parameters using cindex.py
Joel de Vahl
joel.de.vahl at avalanchestudios.com
Thu Nov 15 01:11:42 PST 2012
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20121115/d46ca282/attachment.html>
More information about the cfe-dev
mailing list