Let clang-format move the cursor appropriately.

With this patch, clang-format will try to keep the cursor at the
original code position in editor integrations (implemented for emacs and
vim). This means, after formatting, clang-format will try to keep the
cursor on the same character of the same token.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182373 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-format/clang-format.py b/tools/clang-format/clang-format.py
index d90c62a..bc47fcb 100644
--- a/tools/clang-format/clang-format.py
+++ b/tools/clang-format/clang-format.py
@@ -17,8 +17,9 @@
 # It operates on the current, potentially unsaved buffer and does not create
 # or save any files. To revert a formatting, just undo.
 
-import vim
+import json
 import subprocess
+import vim
 
 # Change this to the full path if clang-format is not on the path.
 binary = 'clang-format'
@@ -29,9 +30,10 @@
 
 # Get the current text.
 buf = vim.current.buffer
-text = "\n".join(buf)
+text = '\n'.join(buf)
 
 # Determine range to format.
+cursor = int(vim.eval('line2byte(line("."))+col(".")')) - 2
 offset = int(vim.eval('line2byte(' +
                       str(vim.current.range.start + 1) + ')')) - 1
 length = int(vim.eval('line2byte(' +
@@ -39,7 +41,7 @@
 
 # Call formatter.
 p = subprocess.Popen([binary, '-offset', str(offset), '-length', str(length),
-                      '-style', style],
+                      '-style', style, '-cursor', str(cursor)],
                      stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                      stdin=subprocess.PIPE)
 stdout, stderr = p.communicate(input=text)
@@ -56,10 +58,14 @@
 if not stdout:
   print ('No output from clang-format (crashed?).\n' +
       'Please report to bugs.llvm.org.')
-elif stdout != text:
+else:
   lines = stdout.split('\n')
-  for i in range(min(len(buf), len(lines))):
-    buf[i] = lines[i]
-  for line in lines[len(buf):]:
-    buf.append(line)
-  del buf[len(lines):]
+  output = json.loads(lines[0])
+  lines = lines[1:]
+  if '\n'.join(lines) != text:
+    for i in range(min(len(buf), len(lines))):
+      buf[i] = lines[i]
+    for line in lines[len(buf):]:
+      buf.append(line)
+    del buf[len(lines):]
+    vim.command('goto %d' % (output['Cursor'] + 1))