forked from OSchip/llvm-project
cindex/Python: Fix/simplify Index.parse() passing command line arguments.
llvm-svn: 94394
This commit is contained in:
parent
d01592617f
commit
7baaee93e7
|
@ -73,39 +73,6 @@ def get_cindex_library():
|
||||||
else:
|
else:
|
||||||
return cdll.LoadLibrary('libCIndex.so')
|
return cdll.LoadLibrary('libCIndex.so')
|
||||||
|
|
||||||
## Utility Types and Functions ##
|
|
||||||
def alloc_string_vector(strs):
|
|
||||||
"""
|
|
||||||
Allocate a string buffer large enough to accommodate the given list of
|
|
||||||
python strings.
|
|
||||||
"""
|
|
||||||
n = 0
|
|
||||||
for i in strs: n += len(i) + 1
|
|
||||||
return create_string_buffer(n)
|
|
||||||
|
|
||||||
def copy_string_vector(vec, strs):
|
|
||||||
"""
|
|
||||||
Copy the contents of each string into the vector, preserving null
|
|
||||||
terminated elements.
|
|
||||||
"""
|
|
||||||
n = 0
|
|
||||||
for i in strs:
|
|
||||||
# This is terribly inefficient, but I can't figure out how to copy a
|
|
||||||
# chunk of characters into the resultant vector. t should be: something
|
|
||||||
# like this: vec[n:n + len(i)] = i[:]; n += len(i) + 1
|
|
||||||
for j in i:
|
|
||||||
vec[n] = j
|
|
||||||
n += 1
|
|
||||||
n += 1
|
|
||||||
|
|
||||||
def create_string_vector(strs):
|
|
||||||
"""
|
|
||||||
Create a string vector (char *[]) from the given list of strings.
|
|
||||||
"""
|
|
||||||
vec = alloc_string_vector(strs)
|
|
||||||
copy_string_vector(vec, strs)
|
|
||||||
return vec
|
|
||||||
|
|
||||||
# ctypes doesn't implicitly convert c_void_p to the appropriate wrapper
|
# ctypes doesn't implicitly convert c_void_p to the appropriate wrapper
|
||||||
# object. This is a problem, because it means that from_parameter will see an
|
# object. This is a problem, because it means that from_parameter will see an
|
||||||
# integer and pass the wrong value on platforms where int != void*. Work around
|
# integer and pass the wrong value on platforms where int != void*. Work around
|
||||||
|
@ -571,14 +538,20 @@ class TranslationUnit(ClangObject):
|
||||||
return TranslationUnit(ptr) if ptr else None
|
return TranslationUnit(ptr) if ptr else None
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse(ix, path, args = []):
|
def parse(ix, path, args = [], unsaved_files = []):
|
||||||
"""
|
"""
|
||||||
Construct a translation unit from the given source file, applying
|
Construct a translation unit from the given source file, using
|
||||||
the given command line argument.
|
the given command line argument.
|
||||||
"""
|
"""
|
||||||
# TODO: Support unsaved files.
|
# TODO: Support unsaved files.
|
||||||
argc, argv = len(args), create_string_vector(args)
|
arg_array = 0
|
||||||
ptr = TranslationUnit_parse(ix, path, argc, byref(argv), 0, 0)
|
if len(args):
|
||||||
|
arg_array = (c_char_p * len(args))(* args)
|
||||||
|
unsaved_files_array = 0
|
||||||
|
if len(unsaved_files):
|
||||||
|
raise NotImplementedError,'Unsaved files not yet implemented.'
|
||||||
|
ptr = TranslationUnit_parse(ix, path, len(args), arg_array,
|
||||||
|
len(unsaved_files), unsaved_files_array)
|
||||||
return TranslationUnit(ptr) if ptr else None
|
return TranslationUnit(ptr) if ptr else None
|
||||||
|
|
||||||
class File(ClangObject):
|
class File(ClangObject):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
int DECL_ONE = 1;
|
||||||
|
int DECL_TWO = 2;
|
|
@ -16,3 +16,11 @@ def test_cursor():
|
||||||
c = tu.cursor
|
c = tu.cursor
|
||||||
assert isinstance(c, Cursor)
|
assert isinstance(c, Cursor)
|
||||||
assert c.kind is CursorKind.TRANSLATION_UNIT
|
assert c.kind is CursorKind.TRANSLATION_UNIT
|
||||||
|
|
||||||
|
def test_parse_arguments():
|
||||||
|
path = os.path.join(kInputsDir, 'parse_arguments.c')
|
||||||
|
index = Index.create()
|
||||||
|
tu = index.parse(path, ['-DDECL_ONE=hello', '-DDECL_TWO=hi'])
|
||||||
|
spellings = [c.spelling for c in tu.cursor.get_children()]
|
||||||
|
assert spellings[-2] == 'hello'
|
||||||
|
assert spellings[-1] == 'hi'
|
||||||
|
|
Loading…
Reference in New Issue