All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
1 function! s:has_provider(server_name, ...) abort
2 let l:value = lsp#get_server_capabilities(a:server_name)
3 for l:provider in a:000
4 if empty(l:value) || type(l:value) != type({}) || !has_key(l:value, l:provider)
7 let l:value = l:value[l:provider]
9 return (type(l:value) == type(v:true) && l:value == v:true) || type(l:value) == type({})
12 function! lsp#capabilities#has_declaration_provider(server_name) abort
13 return s:has_provider(a:server_name, 'declarationProvider')
16 function! lsp#capabilities#has_definition_provider(server_name) abort
17 return s:has_provider(a:server_name, 'definitionProvider')
20 function! lsp#capabilities#has_references_provider(server_name) abort
21 return s:has_provider(a:server_name, 'referencesProvider')
24 function! lsp#capabilities#has_hover_provider(server_name) abort
25 return s:has_provider(a:server_name, 'hoverProvider')
28 function! lsp#capabilities#has_rename_provider(server_name) abort
29 return s:has_provider(a:server_name, 'renameProvider')
32 function! lsp#capabilities#has_rename_prepare_provider(server_name) abort
33 return s:has_provider(a:server_name, 'renameProvider', 'prepareProvider')
36 function! lsp#capabilities#has_workspace_folders_change_notifications(server_name) abort
37 let l:capabilities = lsp#get_server_capabilities(a:server_name)
38 if type(l:capabilities) == type({}) && !empty(l:capabilities)
39 let l:workspace = get(l:capabilities, 'workspace', {})
40 if type(l:workspace) == type({}) && !empty(l:workspace)
41 let l:workspace_folders = get(l:workspace, 'workspaceFolders', {})
42 if type(l:workspace_folders) == type({}) && !empty(l:workspace_folders)
43 if get(l:workspace_folders, 'supported', v:false) && get(l:workspace_folders, 'changeNotifications', '') ==# 'workspace/didChangeWorkspaceFolders'
52 function! lsp#capabilities#has_document_formatting_provider(server_name) abort
53 return s:has_provider(a:server_name, 'documentFormattingProvider')
56 function! lsp#capabilities#has_document_range_formatting_provider(server_name) abort
57 return s:has_provider(a:server_name, 'documentRangeFormattingProvider')
60 function! lsp#capabilities#has_document_symbol_provider(server_name) abort
61 return s:has_provider(a:server_name, 'documentSymbolProvider')
64 function! lsp#capabilities#has_workspace_symbol_provider(server_name) abort
65 return s:has_provider(a:server_name, 'workspaceSymbolProvider')
68 function! lsp#capabilities#has_implementation_provider(server_name) abort
69 return s:has_provider(a:server_name, 'implementationProvider')
72 function! lsp#capabilities#has_code_action_provider(server_name) abort
73 let l:capabilities = lsp#get_server_capabilities(a:server_name)
74 if !empty(l:capabilities) && has_key(l:capabilities, 'codeActionProvider')
75 if type(l:capabilities['codeActionProvider']) == type({})
76 if has_key(l:capabilities['codeActionProvider'], 'codeActionKinds') && type(l:capabilities['codeActionProvider']['codeActionKinds']) == type([])
77 return len(l:capabilities['codeActionProvider']['codeActionKinds']) != 0
81 return s:has_provider(a:server_name, 'codeActionProvider')
84 function! lsp#capabilities#has_code_lens_provider(server_name) abort
85 let l:capabilities = lsp#get_server_capabilities(a:server_name)
86 if !empty(l:capabilities) && has_key(l:capabilities, 'codeLensProvider')
92 function! lsp#capabilities#has_type_definition_provider(server_name) abort
93 return s:has_provider(a:server_name, 'typeDefinitionProvider')
96 function! lsp#capabilities#has_type_hierarchy_provider(server_name) abort
97 return s:has_provider(a:server_name, 'typeHierarchyProvider')
100 function! lsp#capabilities#has_document_highlight_provider(server_name) abort
101 return s:has_provider(a:server_name, 'documentHighlightProvider')
104 function! lsp#capabilities#has_folding_range_provider(server_name) abort
105 return s:has_provider(a:server_name, 'foldingRangeProvider')
108 function! lsp#capabilities#has_call_hierarchy_provider(server_name) abort
109 return s:has_provider(a:server_name, 'callHierarchyProvider')
112 function! lsp#capabilities#has_semantic_tokens(server_name) abort
113 return s:has_provider(a:server_name, 'semanticTokensProvider')
116 " [supports_did_save (boolean), { 'includeText': boolean }]
117 function! lsp#capabilities#get_text_document_save_registration_options(server_name) abort
118 let l:capabilities = lsp#get_server_capabilities(a:server_name)
119 if !empty(l:capabilities) && has_key(l:capabilities, 'textDocumentSync')
120 if type(l:capabilities['textDocumentSync']) == type({})
121 let l:save_options = get(l:capabilities['textDocumentSync'], 'save', 0)
122 if type(l:save_options) == type({})
123 return [1, {'includeText': get(l:save_options, 'includeText', 0)}]
125 return [l:save_options ? 1 : 0, {'includeText': 0 }]
128 return [1, { 'includeText': 0 }]
131 return [0, { 'includeText': 0 }]
134 " supports_did_change (boolean)
135 function! lsp#capabilities#get_text_document_change_sync_kind(server_name) abort
136 let l:capabilities = lsp#get_server_capabilities(a:server_name)
137 if !empty(l:capabilities) && has_key(l:capabilities, 'textDocumentSync')
138 if type(l:capabilities['textDocumentSync']) == type({})
139 if has_key(l:capabilities['textDocumentSync'], 'change') && type(l:capabilities['textDocumentSync']['change']) == type(1)
140 let l:val = l:capabilities['textDocumentSync']['change']
141 return l:val >= 0 && l:val <= 2 ? l:val : 1
145 elseif type(l:capabilities['textDocumentSync']) == type(1)
146 return l:capabilities['textDocumentSync']
154 function! lsp#capabilities#has_signature_help_provider(server_name) abort
155 let l:capabilities = lsp#get_server_capabilities(a:server_name)
156 if !empty(l:capabilities) && has_key(l:capabilities, 'signatureHelpProvider')
162 function! lsp#capabilities#get_signature_help_trigger_characters(server_name) abort
163 let l:capabilities = lsp#get_server_capabilities(a:server_name)
164 if !empty(l:capabilities) && has_key(l:capabilities, 'signatureHelpProvider')
165 let l:trigger_chars = []
166 if type(l:capabilities['signatureHelpProvider']) == type({})
167 if has_key(l:capabilities['signatureHelpProvider'], 'triggerCharacters')
168 let l:trigger_chars = l:capabilities['signatureHelpProvider']['triggerCharacters']
170 " If retriggerChars exist, just treat them like triggerChars.
171 if has_key(l:capabilities['signatureHelpProvider'], 'retriggerCharacters')
172 let l:trigger_chars += l:capabilities['signatureHelpProvider']['retriggerCharacters']
174 return l:trigger_chars
180 function! lsp#capabilities#get_code_action_kinds(server_name) abort
181 let l:capabilities = lsp#get_server_capabilities(a:server_name)
182 if !empty(l:capabilities) && has_key(l:capabilities, 'codeActionProvider')
183 if type(l:capabilities['codeActionProvider']) == type({})
184 if has_key(l:capabilities['codeActionProvider'], 'codeActionKinds') && type(l:capabilities['codeActionProvider']['codeActionKinds']) == type([])
185 return l:capabilities['codeActionProvider']['codeActionKinds']
192 function! lsp#capabilities#has_completion_provider(server_name) abort
193 return s:has_provider(a:server_name, 'completionProvider')
196 function! lsp#capabilities#has_completion_resolve_provider(server_name) abort
197 return s:has_provider(a:server_name, 'completionProvider', 'resolveProvider')
200 function! lsp#capabilities#has_inlay_hint_provider(server_name) abort
201 return s:has_provider(a:server_name, 'inlayHintProvider')