I have the following script that tries to print all AST nodes in a given C ++ file. This works great when used in a simple file with a trivial inclusion (header file in the same directory, etc.).
#!/usr/bin/env python from argparse import ArgumentParser, FileType from clang import cindex def node_info(node): return {'kind': node.kind, 'usr': node.get_usr(), 'spelling': node.spelling, 'location': node.location, 'file': node.location.file.name, 'extent.start': node.extent.start, 'extent.end': node.extent.end, 'is_definition': node.is_definition() } def get_nodes_in_file(node, filename, ls=None): ls = ls if ls is not None else [] for n in node.get_children(): if n.location.file is not None and n.location.file.name == filename: ls.append(n) get_nodes_in_file(n, filename, ls) return ls def main(): arg_parser = ArgumentParser() arg_parser.add_argument('source_file', type=FileType('r+'), help='C++ source file to parse.') arg_parser.add_argument('compilation_database', type=FileType('r+'), help='The compile_commands.json to use to parse the source file.') args = arg_parser.parse_args() compilation_database_path = args.compilation_database.name source_file_path = args.source_file.name clang_args = ['-x', 'c++', '-std=c++11', '-p', compilation_database_path] index = cindex.Index.create() translation_unit = index.parse(source_file_path, clang_args) file_nodes = get_nodes_in_file(translation_unit.cursor, source_file_path) print [p.spelling for p in file_nodes] if __name__ == '__main__': main()
However, when I run the script, I get clang.cindex.TranslationUnitLoadError: Error parsing translation unit. and provide a valid C ++ file with the compile_commands.json file in its parent directory. This code works and builds fine using CMake with clang, but I can't figure out how to pass an argument to correctly point to compile_commands.json.
It is also difficult for me to find this option in the clang documentation and was unable to get -ast-dump to work. However, the clang check works just fine by simply passing the file path!
Lucas source share