]> granicus.if.org Git - clang/commitdiff
cindex/Python: Fix/simplify Index.parse() passing command line arguments.
authorDaniel Dunbar <daniel@zuster.org>
Mon, 25 Jan 2010 00:43:31 +0000 (00:43 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 25 Jan 2010 00:43:31 +0000 (00:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94394 91177308-0d34-0410-b5e6-96231b3b80d8

bindings/python/clang/cindex.py
bindings/python/tests/cindex/INPUTS/parse_arguments.c [new file with mode: 0644]
bindings/python/tests/cindex/test_translation_unit.py

index 6f36b79736a5515fc5b5f7303b5b9feed21660e0..75f3272dce86d44a636e7e42fd021e4979f6b88c 100644 (file)
@@ -73,39 +73,6 @@ def get_cindex_library():
     else:
         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
 # 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
@@ -571,14 +538,20 @@ class TranslationUnit(ClangObject):
         return TranslationUnit(ptr) if ptr else None
 
     @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.
         """
         # TODO: Support unsaved files.
-        argc, argv = len(args), create_string_vector(args)
-        ptr = TranslationUnit_parse(ix, path, argc, byref(argv), 0, 0)
+        arg_array = 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
 
 class File(ClangObject):
diff --git a/bindings/python/tests/cindex/INPUTS/parse_arguments.c b/bindings/python/tests/cindex/INPUTS/parse_arguments.c
new file mode 100644 (file)
index 0000000..7196486
--- /dev/null
@@ -0,0 +1,2 @@
+int DECL_ONE = 1;
+int DECL_TWO = 2;
index e0b16f5345f95bf16ae1db75f87446b98d969810..9de82a6110cf4a97bbb808670c4eae334e568982 100644 (file)
@@ -16,3 +16,11 @@ def test_cursor():
     c = tu.cursor
     assert isinstance(c, Cursor)
     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'