Explorar el Código

Handling diags pointing to content not in file

Also handling no location_extent for diags.
Strahinja Val Markovic hace 11 años
padre
commit
6e6e6043c3
Se han modificado 2 ficheros con 34 adiciones y 6 borrados
  1. 12 6
      python/ycm/diagnostic_interface.py
  2. 22 0
      python/ycm/vimsupport.py

+ 12 - 6
python/ycm/diagnostic_interface.py

@@ -76,12 +76,18 @@ def _UpdateSquiggles( buffer_number_to_line_to_diags ):
       location_extent = diag[ 'location_extent' ]
       is_error = _DiagnosticIsError( diag )
 
-      vimsupport.AddDiagnosticSyntaxMatch(
-        location_extent[ 'start' ][ 'line_num' ] + 1,
-        location_extent[ 'start' ][ 'column_num' ] + 1,
-        location_extent[ 'end' ][ 'line_num' ] + 1,
-        location_extent[ 'end' ][ 'column_num' ] + 1,
-        is_error = is_error )
+      if location_extent[ 'start' ][ 'line_num' ] < 0:
+        location = diag[ 'location' ]
+        vimsupport.AddDiagnosticSyntaxMatch(
+            location[ 'line_num' ] + 1,
+            location[ 'column_num' ] + 1 )
+      else:
+        vimsupport.AddDiagnosticSyntaxMatch(
+          location_extent[ 'start' ][ 'line_num' ] + 1,
+          location_extent[ 'start' ][ 'column_num' ] + 1,
+          location_extent[ 'end' ][ 'line_num' ] + 1,
+          location_extent[ 'end' ][ 'column_num' ] + 1,
+          is_error = is_error )
 
       for diag_range in diag[ 'ranges' ]:
         vimsupport.AddDiagnosticSyntaxMatch(

+ 22 - 0
python/ycm/vimsupport.py

@@ -128,6 +128,7 @@ def ClearYcmSyntaxMatches():
 
 
 # Returns the ID of the newly added match
+# Both line and column numbers are 1-based
 def AddDiagnosticSyntaxMatch( line_num,
                               column_num,
                               line_end_num = None,
@@ -138,6 +139,10 @@ def AddDiagnosticSyntaxMatch( line_num,
   if not line_end_num:
     line_end_num = line_num
 
+  line_num, column_num = LineAndColumnNumbersClamped( line_num, column_num )
+  line_end_num, column_end_num = LineAndColumnNumbersClamped( line_end_num,
+                                                              column_end_num )
+
   if not column_end_num:
     return GetIntValue(
       "matchadd('{0}', '\%{1}l\%{2}c')".format( group, line_num, column_num ) )
@@ -147,6 +152,23 @@ def AddDiagnosticSyntaxMatch( line_num,
         group, line_num, column_num, line_end_num, column_end_num ) )
 
 
+# Clamps the line and column numbers so that they are not past the contents of
+# the buffer. Numbers are 1-based.
+def LineAndColumnNumbersClamped( line_num, column_num ):
+  new_line_num = line_num
+  new_column_num = column_num
+
+  max_line = len( vim.current.buffer )
+  if line_num and line_num > max_line:
+    new_line_num = max_line
+
+  max_column = len( vim.current.buffer[ new_line_num - 1 ] )
+  if column_num and column_num > max_column:
+    new_column_num = max_column
+
+  return new_line_num, new_column_num
+
+
 def SetLocationList( diagnostics ):
   """Diagnostics should be in qflist format; see ":h setqflist" for details."""
   vim.eval( 'setloclist( 0, {0} )'.format( json.dumps( diagnostics ) ) )