@@ -1496,7 +1496,8 @@ def SignatureHelpAvailable( self ):
14961496 if not self .ServerIsReady ():
14971497 return responses .SignatureHelpAvailalability .PENDING
14981498
1499- if bool ( self ._server_capabilities .get ( 'signatureHelpProvider' ) ):
1499+ if _IsCapabilityProvided ( self ._server_capabilities ,
1500+ 'signatureHelpProvider' ):
15001501 return responses .SignatureHelpAvailalability .AVAILABLE
15011502 else :
15021503 return responses .SignatureHelpAvailalability .NOT_AVAILABLE
@@ -1506,7 +1507,8 @@ def ComputeSignaturesInner( self, request_data ):
15061507 if not self .ServerIsReady ():
15071508 return {}
15081509
1509- if not self ._server_capabilities .get ( 'signatureHelpProvider' ):
1510+ if not _IsCapabilityProvided ( self ._server_capabilities ,
1511+ 'signatureHelpProvider' ):
15101512 return {}
15111513
15121514 self ._UpdateServerWithCurrentFileContents ( request_data )
@@ -1551,8 +1553,9 @@ def ComputeSemanticTokens( self, request_data ):
15511553 if not self ._semantic_token_atlas :
15521554 return {}
15531555
1554- range_supported = self ._server_capabilities [ 'semanticTokensProvider' ].get (
1555- 'range' , False )
1556+ range_supported = _IsCapabilityProvided (
1557+ self ._server_capabilities [ 'semanticTokensProvider' ],
1558+ 'range' )
15561559
15571560 self ._UpdateServerWithCurrentFileContents ( request_data )
15581561
@@ -1588,7 +1591,8 @@ def ComputeInlayHints( self, request_data ):
15881591 if not self ._ServerIsInitialized ():
15891592 return []
15901593
1591- if 'inlayHintProvider' not in self ._server_capabilities :
1594+ if not _IsCapabilityProvided ( self ._server_capabilities ,
1595+ 'inlayHintProvider' ):
15921596 return []
15931597
15941598 self ._UpdateServerWithCurrentFileContents ( request_data )
@@ -1763,7 +1767,8 @@ def GetSubcommandsMap( self ):
17631767 )
17641768
17651769 if ( self ._server_capabilities and
1766- 'callHierarchyProvider' in self ._server_capabilities ):
1770+ _IsCapabilityProvided ( self ._server_capabilities ,
1771+ 'callHierarchyProvider' ) ):
17671772 commands [ 'GoToCallees' ] = (
17681773 lambda self , request_data , args :
17691774 self .CallHierarchy ( request_data , [ 'outgoing' ] )
@@ -1787,9 +1792,10 @@ def _GetSubcommandProvider( self, provider_list ):
17871792
17881793 for providers in provider_list :
17891794 if isinstance ( providers , tuple ):
1790- if all ( capabilities .get ( provider ) for provider in providers ):
1795+ if all ( _IsCapabilityProvided ( capabilities , provider )
1796+ for provider in providers ):
17911797 return providers
1792- if capabilities . get ( providers ):
1798+ if _IsCapabilityProvided ( capabilities , providers ):
17931799 return providers
17941800 return None
17951801
@@ -2202,9 +2208,9 @@ def OnFileSave( self, request_data ):
22022208 if not self .ServerIsReady ():
22032209 return
22042210
2205- if 'textDocumentSync' in self ._server_capabilities :
2206- sync = self . _server_capabilities [ 'textDocumentSync' ]
2207- if isinstance ( sync , dict ) and sync . get ( 'save' ) not in [ None , False ] :
2211+ sync = self ._server_capabilities . get ( 'textDocumentSync' )
2212+ if sync is not None :
2213+ if isinstance ( sync , dict ) and _IsCapabilityProvided ( sync , 'save' ):
22082214 save = sync [ 'save' ]
22092215 file_name = request_data [ 'filepath' ]
22102216 contents = None
@@ -2345,11 +2351,7 @@ def _SetUpSemanticTokenAtlas( self, capabilities: dict ):
23452351 if server_config is None :
23462352 return
23472353
2348- server_full_support = server_config .get ( 'full' )
2349- if server_full_support == {}:
2350- server_full_support = True
2351-
2352- if not server_full_support :
2354+ if not _IsCapabilityProvided ( server_config , 'full' ):
23532355 return
23542356
23552357 self ._semantic_token_atlas = TokenAtlas ( server_config [ 'legend' ] )
@@ -2374,8 +2376,8 @@ def _HandleInitializeInPollThread( self, response ):
23742376
23752377 self ._SetUpSemanticTokenAtlas ( self ._server_capabilities )
23762378
2377- if 'textDocumentSync' in self ._server_capabilities :
2378- sync = self . _server_capabilities [ 'textDocumentSync' ]
2379+ sync = self ._server_capabilities . get ( 'textDocumentSync' )
2380+ if sync is not None :
23792381 SYNC_TYPE = [
23802382 'None' ,
23812383 'Full' ,
@@ -3539,6 +3541,11 @@ def DecodeModifiers( self, tokenModifiers ):
35393541 return tokens
35403542
35413543
3544+ def _IsCapabilityProvided ( capabilities , query ):
3545+ capability = capabilities .get ( query )
3546+ return bool ( capability ) or capability == {}
3547+
3548+
35423549def RetryOnFailure ( expected_error_codes , num_retries = 3 ):
35433550 for i in range ( num_retries ):
35443551 try :
0 commit comments