@@ -2638,7 +2638,7 @@ def GoToSymbol( self, request_data, args ):
26382638 REQUEST_TIMEOUT_COMMAND )
26392639
26402640 result = response .get ( 'result' ) or []
2641- return _SymbolInfoListToGoTo ( request_data , result )
2641+ return _LspSymbolListToGoTo ( request_data , result )
26422642
26432643
26442644 def GoToDocumentOutline ( self , request_data ):
@@ -2655,12 +2655,11 @@ def GoToDocumentOutline( self, request_data ):
26552655
26562656 result = response .get ( 'result' ) or []
26572657
2658- # We should only receive SymbolInformation (not DocumentSymbol)
26592658 if any ( 'range' in s for s in result ):
2660- raise ValueError (
2661- "Invalid server response; DocumentSymbol not supported" )
2659+ LOGGER . debug ( 'Hierarchical DocumentSymbol not supported.' )
2660+ result = _FlattenDocumentSymbolHierarchy ( result )
26622661
2663- return _SymbolInfoListToGoTo ( request_data , result )
2662+ return _LspSymbolListToGoTo ( request_data , result )
26642663
26652664
26662665 def InitialHierarchy ( self , request_data , args ):
@@ -3396,26 +3395,10 @@ def _LocationListToGoTo( request_data, positions ):
33963395 raise RuntimeError ( 'Cannot jump to location' )
33973396
33983397
3399- def _SymbolInfoListToGoTo ( request_data , symbols ):
3398+ def _LspSymbolListToGoTo ( request_data , symbols ):
34003399 """Convert a list of LSP SymbolInformation into a YCM GoTo response"""
34013400
3402- def BuildGoToLocationFromSymbol ( symbol ):
3403- location , line_value = _LspLocationToLocationAndDescription (
3404- request_data ,
3405- symbol [ 'location' ] )
3406-
3407- description = ( f'{ lsp .SYMBOL_KIND [ symbol [ "kind" ] ] } : '
3408- f'{ symbol [ "name" ] } ' )
3409-
3410- goto = responses .BuildGoToResponseFromLocation ( location ,
3411- description )
3412- goto [ 'extra_data' ] = {
3413- 'kind' : lsp .SYMBOL_KIND [ symbol [ 'kind' ] ],
3414- 'name' : symbol [ 'name' ],
3415- }
3416- return goto
3417-
3418- locations = [ BuildGoToLocationFromSymbol ( s ) for s in
3401+ locations = [ _BuildGoToLocationFromSymbol ( s , request_data ) for s in
34193402 sorted ( symbols ,
34203403 key = lambda s : ( s [ 'kind' ], s [ 'name' ] ) ) ]
34213404
@@ -3427,6 +3410,38 @@ def BuildGoToLocationFromSymbol( symbol ):
34273410 return locations
34283411
34293412
3413+ def _FlattenDocumentSymbolHierarchy ( symbols ):
3414+ result = []
3415+ for s in symbols :
3416+ result .append ( s )
3417+ if children := s .get ( 'children' ):
3418+ result .extend ( _FlattenDocumentSymbolHierarchy ( children ) )
3419+ return result
3420+
3421+
3422+ def _BuildGoToLocationFromSymbol ( symbol , request_data ):
3423+ """ Convert a LSP SymbolInfo or DocumentSymbol into a YCM GoTo response"""
3424+ lsp_location = symbol .get ( 'location' )
3425+ if not lsp_location : # This is a DocumentSymbol
3426+ lsp_location = symbol
3427+ lsp_location [ 'uri' ] = lsp .FilePathToUri ( request_data [ 'filepath' ] )
3428+
3429+ location , line_value = _LspLocationToLocationAndDescription (
3430+ request_data ,
3431+ lsp_location )
3432+
3433+ description = ( f'{ lsp .SYMBOL_KIND [ symbol [ "kind" ] ] } : '
3434+ f'{ symbol [ "name" ] } ' )
3435+
3436+ goto = responses .BuildGoToResponseFromLocation ( location ,
3437+ description )
3438+ goto [ 'extra_data' ] = {
3439+ 'kind' : lsp .SYMBOL_KIND [ symbol [ 'kind' ] ],
3440+ 'name' : symbol [ 'name' ],
3441+ }
3442+ return goto
3443+
3444+
34303445def _LspLocationToLocationAndDescription ( request_data ,
34313446 location ,
34323447 range_property = 'range' ):
0 commit comments