@@ -2,9 +2,17 @@ import { getIndentUnit, indentUnit } from "@codemirror/language";
22import {
33 LSPClient ,
44 LSPPlugin ,
5- languageServerExtensions ,
5+ findReferencesKeymap ,
6+ formatKeymap ,
7+ hoverTooltips ,
8+ jumpToDefinitionKeymap ,
9+ renameKeymap ,
10+ serverCompletion ,
11+ serverDiagnostics ,
12+ signatureHelp ,
613} from "@codemirror/lsp-client" ;
714import { MapMode } from "@codemirror/state" ;
15+ import { keymap } from "@codemirror/view" ;
816import Uri from "utils/Uri" ;
917import { ensureServerRunning } from "./serverLauncher" ;
1018import serverRegistry from "./serverRegistry" ;
@@ -24,6 +32,35 @@ function safeString(value) {
2432 return value != null ? String ( value ) : "" ;
2533}
2634
35+ const defaultKeymaps = keymap . of ( [
36+ ...formatKeymap ,
37+ ...renameKeymap ,
38+ ...jumpToDefinitionKeymap ,
39+ ...findReferencesKeymap ,
40+ ] ) ;
41+
42+ function buildBuiltinExtensions ( {
43+ includeHover = true ,
44+ includeCompletion = true ,
45+ includeSignature = true ,
46+ includeKeymaps = true ,
47+ includeDiagnostics = true ,
48+ } = { } ) {
49+ const extensions = [ ] ;
50+ let diagnosticsExtension = null ;
51+
52+ if ( includeCompletion ) extensions . push ( serverCompletion ( ) ) ;
53+ if ( includeHover ) extensions . push ( hoverTooltips ( ) ) ;
54+ if ( includeKeymaps ) extensions . push ( defaultKeymaps ) ;
55+ if ( includeSignature ) extensions . push ( signatureHelp ( ) ) ;
56+ if ( includeDiagnostics ) {
57+ diagnosticsExtension = serverDiagnostics ( ) ;
58+ extensions . push ( diagnosticsExtension ) ;
59+ }
60+
61+ return { extensions, diagnosticsExtension } ;
62+ }
63+
2764export class LspClientManager {
2865 constructor ( options = { } ) {
2966 this . options = { ...options } ;
@@ -173,22 +210,35 @@ export class LspClientManager {
173210 } ;
174211
175212 const clientConfig = { ...( server . clientConfig || { } ) } ;
213+ const builtinConfig = clientConfig . builtinExtensions || { } ;
214+ const useDefaultExtensions = clientConfig . useDefaultExtensions !== false ;
215+ const { extensions : defaultExtensions , diagnosticsExtension } =
216+ useDefaultExtensions
217+ ? buildBuiltinExtensions ( {
218+ includeHover : builtinConfig . hover !== false ,
219+ includeCompletion : builtinConfig . completion !== false ,
220+ includeSignature : builtinConfig . signature !== false ,
221+ includeKeymaps : builtinConfig . keymaps !== false ,
222+ includeDiagnostics : builtinConfig . diagnostics !== false ,
223+ } )
224+ : { extensions : [ ] , diagnosticsExtension : null } ;
176225
177226 const extraExtensions = asArray ( this . options . clientExtensions ) ;
178227 const serverExtensions = asArray ( clientConfig . extensions ) ;
179- const builtinExtensions = languageServerExtensions ( ) ;
180228 const wantsCustomDiagnostics = [
181229 ...extraExtensions ,
182230 ...serverExtensions ,
183231 ] . some (
184232 ( ext ) => ! ! ext ?. clientCapabilities ?. textDocument ?. publishDiagnostics ,
185233 ) ;
234+
235+ const filteredBuiltins =
236+ wantsCustomDiagnostics && diagnosticsExtension
237+ ? defaultExtensions . filter ( ( ext ) => ext !== diagnosticsExtension )
238+ : defaultExtensions ;
239+
186240 const mergedExtensions = [
187- ...( wantsCustomDiagnostics
188- ? builtinExtensions . filter (
189- ( ext ) => ! ext ?. clientCapabilities ?. textDocument ?. publishDiagnostics ,
190- )
191- : builtinExtensions ) ,
241+ ...filteredBuiltins ,
192242 ...extraExtensions ,
193243 ...serverExtensions ,
194244 ] ;
0 commit comments