diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-01-30 23:59:14 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-01-30 23:59:14 +0000 |
commit | 6d32cb85ee7252c4bb34ca5a65636b85447cbf62 (patch) | |
tree | a306babb909384184762a31bd8bf122686c996c1 /bindings | |
parent | 532fc63b51cd0eb795df36d3fe306645b8b980e4 (diff) | |
download | clang-6d32cb85ee7252c4bb34ca5a65636b85447cbf62.tar.gz |
cindex/Python: Add a simple example which dumps assorted information about a translation unit.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94934 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings')
-rw-r--r-- | bindings/python/examples/cindex/cindex-dump.py | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/bindings/python/examples/cindex/cindex-dump.py b/bindings/python/examples/cindex/cindex-dump.py new file mode 100644 index 0000000000..2357f0506e --- /dev/null +++ b/bindings/python/examples/cindex/cindex-dump.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +#===- cindex-dump.py - cindex/Python Source Dump -------------*- python -*--===# +# +# The LLVM Compiler Infrastructure +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +#===------------------------------------------------------------------------===# + +""" +A simple command line tool for dumping a source file using the Clang Index +Library. +""" + +def get_diag_info(diag): + return { 'severity' : diag.severity, + 'location' : diag.location, + 'spelling' : diag.spelling, + 'ranges' : diag.ranges, + 'fixits' : diag.fixits } + +def get_cursor_id(cursor, cursor_list = []): + if cursor is None: + return None + + # FIXME: This is really slow. It would be nice if the index API exposed + # something that let us hash cursors. + for i,c in enumerate(cursor_list): + if cursor == c: + return i + cursor_list.append(cursor) + return len(cursor_list) - 1 + +def get_info(node): + return { 'id' : get_cursor_id(node), + 'kind' : node.kind, + 'usr' : node.get_usr(), + 'spelling' : node.spelling, + 'location' : node.location, + 'extent.start' : node.extent.start, + 'extent.end' : node.extent.end, + 'is_definition' : node.is_definition(), + 'definition id' : get_cursor_id(node.get_definition()), + 'children' : map(get_info, node.get_children()) } + +def main(): + from clang.cindex import Index + from pprint import pprint + + from optparse import OptionParser, OptionGroup + parser = OptionParser("usage: %prog [options] {filename} [clang-args*]") + parser.disable_interspersed_args() + (opts, args) = parser.parse_args() + + if len(args) == 0: + parser.error('invalid number arguments') + + input_path = args.pop(0) + + index = Index.create() + tu = index.parse(input_path, args) + if not tu: + parser.error("unable to load input") + + pprint(('diags', map(get_diag_info, tu.diagnostics))) + pprint(('nodes', map(get_info, tu.cursor.get_children()))) + +if __name__ == '__main__': + main() + |