瀏覽代碼

Fix error when filetype is a number

The VimExpressionToPythonType function automatically convert a number
represented as a string to an integer. This causes an error when used to
evaluate a filetype set to a number as the result is split on the dot character
to get a list of filetypes and an integer cannot be split. Use vim.eval and
ToUnicode instead.
micbou 7 年之前
父節點
當前提交
67d2a0fbf8
共有 2 個文件被更改,包括 13 次插入4 次删除
  1. 10 1
      python/ycm/tests/vimsupport_test.py
  2. 3 3
      python/ycm/vimsupport.py

+ 10 - 1
python/ycm/tests/vimsupport_test.py

@@ -32,7 +32,7 @@ MockVimModule()
 
 from ycm import vimsupport
 from nose.tools import eq_
-from hamcrest import assert_that, calling, equal_to, has_entry, raises
+from hamcrest import assert_that, calling, contains, equal_to, has_entry, raises
 from mock import MagicMock, call, patch
 from ycmd.utils import ToBytes
 import os
@@ -1553,6 +1553,15 @@ def SelectFromList_Negative_test( vim_eval ):
                raises( RuntimeError, vimsupport.NO_SELECTION_MADE_MSG ) )
 
 
+def Filetypes_IntegerFiletype_test():
+  current_buffer = VimBuffer( 'buffer', number = 1, filetype = '42' )
+  with MockVimBuffers( [ current_buffer ], current_buffer ):
+    assert_that( vimsupport.CurrentFiletypes(), contains( '42' ) )
+    assert_that( vimsupport.GetBufferFiletypes( 1 ), contains( '42' ) )
+    assert_that( vimsupport.FiletypesForBuffer( current_buffer ),
+                 contains( '42' ) )
+
+
 @patch( 'ycm.vimsupport.VariableExists', return_value = False )
 @patch( 'ycm.vimsupport.SearchInCurrentBuffer', return_value = 0 )
 @patch( 'vim.current' )

+ 3 - 3
python/ycm/vimsupport.py

@@ -589,18 +589,18 @@ def EscapeForVim( text ):
 
 
 def CurrentFiletypes():
-  return VimExpressionToPythonType( "&filetype" ).split( '.' )
+  return ToUnicode( vim.eval( "&filetype" ) ).split( '.' )
 
 
 def GetBufferFiletypes( bufnr ):
   command = 'getbufvar({0}, "&ft")'.format( bufnr )
-  return VimExpressionToPythonType( command ).split( '.' )
+  return ToUnicode( vim.eval( command ) ).split( '.' )
 
 
 def FiletypesForBuffer( buffer_object ):
   # NOTE: Getting &ft for other buffers only works when the buffer has been
   # visited by the user at least once, which is true for modified buffers
-  return GetBufferOption( buffer_object, 'ft' ).split( '.' )
+  return ToUnicode( GetBufferOption( buffer_object, 'ft' ) ).split( '.' )
 
 
 def VariableExists( variable ):