From db59a7700e5e42e8b5f6f8e327067a969540ee14 Mon Sep 17 00:00:00 2001
From: Daniel Dunbar <daniel@zuster.org>
Date: Mon, 25 Jan 2010 09:16:41 +0000
Subject: [PATCH] cindex/Python: Support file objects as unsaved_files, albeit
 inefficiently.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94418 91177308-0d34-0410-b5e6-96231b3b80d8
---
 bindings/python/clang/cindex.py                       | 9 +++++++--
 bindings/python/tests/cindex/test_translation_unit.py | 8 ++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py
index 7eab09cf39b..bba7533785e 100644
--- a/bindings/python/clang/cindex.py
+++ b/bindings/python/clang/cindex.py
@@ -553,7 +553,6 @@ class TranslationUnit(ClangObject):
         Construct a translation unit from the given source file, using
         the given command line argument.
         """
-        # TODO: Support unsaved files.
         arg_array = 0
         if len(args):
             arg_array = (c_char_p * len(args))(* args)
@@ -561,7 +560,13 @@ class TranslationUnit(ClangObject):
         if len(unsaved_files):
             unsaved_files_array = (_CXUnsavedFile * len(unsaved_files))()
             for i,(name,value) in enumerate(unsaved_files):
-                # FIXME: Support file objects.
+                if not isinstance(value, str):
+                    # FIXME: It would be great to support an efficient version
+                    # of this, one day.
+                    value = value.read()
+                    print value
+                if not isinstance(value, str):
+                    raise TypeError,'Unexpected unsaved file contents.'
                 unsaved_files_array[i].name = name
                 unsaved_files_array[i].contents = value
                 unsaved_files_array[i].length = len(value)
diff --git a/bindings/python/tests/cindex/test_translation_unit.py b/bindings/python/tests/cindex/test_translation_unit.py
index 9cf7aba3bbf..ec12e689d9f 100644
--- a/bindings/python/tests/cindex/test_translation_unit.py
+++ b/bindings/python/tests/cindex/test_translation_unit.py
@@ -41,3 +41,11 @@ int SOME_DEFINE;
     spellings = [c.spelling for c in tu.cursor.get_children()]
     assert spellings[-2] == 'x'
     assert spellings[-1] == 'y'
+
+def test_unsaved_files_2():
+    import StringIO
+    index = Index.create()
+    tu = index.parse('fake.c', unsaved_files = [
+            ('fake.c', StringIO.StringIO('int x;'))])
+    spellings = [c.spelling for c in tu.cursor.get_children()]
+    assert spellings[-1] == 'x'
-- 
GitLab