forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLSPClient.js
More file actions
1 lines (1 loc) · 23 KB
/
Copy pathLSPClient.js
File metadata and controls
1 lines (1 loc) · 23 KB
1
define(function(require,exports,module){const NodeConnector=require("NodeConnector"),NodeUtils=require("utils/NodeUtils"),ProjectManager=require("project/ProjectManager"),DocumentManager=require("document/DocumentManager"),FileUtils=require("file/FileUtils"),PathConverters=require("languageTools/PathConverters"),DefaultProviders=require("languageTools/DefaultProviders"),HoverProvider=require("languageTools/HoverProvider"),DocumentSync=require("languageTools/DocumentSync"),DocumentHighlight=require("languageTools/DocumentHighlight"),LanguageManager=require("language/LanguageManager"),CodeHintManager=require("editor/CodeHintManager"),ParameterHintsManager=require("features/ParameterHintsManager"),JumpToDefManager=require("features/JumpToDefManager"),FindReferencesManager=require("features/FindReferencesManager"),QuickViewManager=require("features/QuickViewManager"),CodeInspection=require("language/CodeInspection"),EventDispatcher=require("utils/EventDispatcher"),PreferencesManager=require("preferences/PreferencesManager"),Strings=require("strings"),StringUtils=require("utils/StringUtils"),Metrics=require("utils/Metrics");EventDispatcher.makeEventDispatcher(exports);const EVENT_LANGUAGE_SERVER_STARTED="languageServerStarted",EVENT_LANGUAGE_SERVER_STOPPED="languageServerStopped",LSP_CONNECTOR_ID="ph-lsp",NODE_LSP_MODULE="./lsp-client",DEFAULT_PRIORITY=1;let connectorPromise=null,connector=null;const clients=new Map;function _toPlatformPath(vfsPath){if(window.fs&&window.fs.getTauriPlatformPath){const platformPath=window.fs.getTauriPlatformPath(vfsPath);if(platformPath)return platformPath}return vfsPath}function _toVirtualPath(platformPath){return window.fs&&window.fs.getTauriVirtualPath?window.fs.getTauriVirtualPath(platformPath):platformPath}function pathToServerUri(vfsPath){return PathConverters.pathToUri(_toPlatformPath(vfsPath))}function serverUriToVfsUri(serverUri){let platformPath=PathConverters.uriToPath(serverUri);return"win"===brackets.platform&&/^[a-z]:/.test(platformPath)&&(platformPath=platformPath.charAt(0).toUpperCase()+platformPath.substr(1)),PathConverters.pathToUri(_toVirtualPath(platformPath))}function _markupToString(documentation){return documentation?"string"==typeof documentation?documentation:documentation.value||"":""}function _paramLabel(signatureLabel,paramLabel){return Array.isArray(paramLabel)?signatureLabel.substring(paramLabel[0],paramLabel[1]):paramLabel}function _normalizeLocation(loc){if(!loc)return null;const uri=loc.uri||loc.targetUri,range=loc.range||loc.targetSelectionRange||loc.targetRange;return uri&&range?{uri:serverUriToVfsUri(uri),range:range}:null}function getConnector(){return connectorPromise||(connectorPromise=async function(){return await NodeUtils._loadNodeExtensionModule(NODE_LSP_MODULE),(connector=NodeConnector.createNodeConnector(LSP_CONNECTOR_ID,{})).on("lspNotification",_onLspNotification),connector.on("serverExit",_onServerExit),connector.on("serverError",_onServerError),connector}()),connectorPromise}function _onLspNotification(_event,data){if(!data)return;const client=clients.get(data.serverId);if(client&&!client._stopping&&"textDocument/publishDiagnostics"===data.method&&client.lintingProvider){const params=data.params||{},vfsUri=serverUriToVfsUri(params.uri),vfsPath=PathConverters.uriToPath(vfsUri),language=LanguageManager.getLanguageForPath(vfsPath),langId=language&&language.getId();let diagnostics=params.diagnostics||[];const filterFn=client.config&&client.config.filterDiagnostics;filterFn&&diagnostics.length&&(diagnostics=filterFn(diagnostics,{languageId:langId,filePath:vfsPath})),diagnostics=diagnostics.filter(function(d){return 4!==d.severity||d.tags&&d.tags.length}),client.lintingProvider.setInspectionResults({uri:vfsUri,diagnostics:diagnostics}),client.lintingProvider.updateQuickFixes(vfsPath,diagnostics)}}const MAX_AUTO_RESTARTS=3;function _onServerExit(_event,data){const client=data&&clients.get(data.serverId);if(client&&!(data.pid&&client._pid&&data.pid!==client._pid||(client.capabilities=null,DocumentSync.clearServer(client),client._stopping||client._restarting||_isDisabledByPref(client.serverId)))){if(console.error("[LSP] server '"+data.serverId+"' exited unexpectedly (code="+data.code+(data.signal?", signal="+data.signal:"")+")."+(data.stderr?"\n--- server stderr ---\n"+data.stderr:"")),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","Crash."+client._metricLabel),window.logger.leaveTrail("[LSP] "+client.serverId+" crashed, code="+data.code),client._crashCount=(client._crashCount||0)+1,client._crashCount>MAX_AUTO_RESTARTS)return console.error("[LSP]",client.serverId,"exited repeatedly; not restarting"),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","Gaveup."+client._metricLabel),void window.logger.reportErrorOnce("lspGaveup."+client.serverId,new Error("code="+data.code+" signal="+(data.signal||"none")+_stderrSnippet(data.stderr)),"[LSP] server crashed repeatedly, gave up: "+client.serverId);setTimeout(function(){!clients.has(client.serverId)||client.capabilities||_isDisabledByPref(client.serverId)||_startAndInit(client).then(function(){client._crashCount=0,_announceServerStarted(client),DocumentSync.openSupportedDocuments(client)}).catch(function(err){console.error("[LSP] auto-restart failed",client.serverId,err&&(err.message||err)),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","RstErr."+client._metricLabel)})},1e3*client._crashCount)}}function _stderrSnippet(stderr){const lines=String(stderr||"").split("\n");for(let i=0;i<lines.length;i++){const line=lines[i].trim();if(line)return" stderr: "+line.substring(0,200)}return""}function _onServerError(_event,data){data&&(console.error("[LSP] server error",data.serverId,data.error),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","Err."+_srvLabel(data.serverId)))}function _srvLabel(serverId){const cleaned=String(serverId||"").replace(/[^a-zA-Z0-9]/g,"");return cleaned.substring(0,10)||"ukn"}const METRIC_METHOD_GROUPS={"textDocument/completion":"Comp","textDocument/signatureHelp":"Sig","textDocument/hover":"Hover","textDocument/definition":"Def","textDocument/references":"Ref","textDocument/codeAction":"Fix","completionItem/resolve":"Res","textDocument/documentHighlight":"Hlt"};function LanguageClient(serverId,languages,config){this.serverId=serverId,this.languages=languages,this.config=config,this.capabilities=null,this._metricLabel=_srvLabel(serverId)}function _positionOf(cursorPos){return{line:cursorPos.line,character:cursorPos.ch}}function _completionContext(filePath,pos){const doc=DocumentManager.getOpenDocumentForPath(filePath);if(!doc)return null;const lineText=doc.getLine(pos.line)||"";let start=pos.ch;for(;start>0&&/[\w$]/.test(lineText.charAt(start-1));)start--;return{key:filePath+"|"+pos.line+"|"+lineText.substring(0,start),query:lineText.substring(start,pos.ch),anchored:start>0&&/\S/.test(lineText.charAt(start-1))}}function _projectRootPath(){const root=ProjectManager.getProjectRoot();return root?root.fullPath:null}function _clientCapabilities(config){return{textDocument:{synchronization:{dynamicRegistration:!1,didSave:!0,willSave:!1,willSaveWaitUntil:!1},completion:{dynamicRegistration:!1,completionItem:{snippetSupport:!(!config||!config.completionSnippetSupport),documentationFormat:["markdown","plaintext"],resolveSupport:{properties:["documentation","detail"]},labelDetailsSupport:!0}},hover:{dynamicRegistration:!1,contentFormat:["markdown","plaintext"]},signatureHelp:{dynamicRegistration:!1,signatureInformation:{documentationFormat:["markdown","plaintext"]}},definition:{dynamicRegistration:!1},references:{dynamicRegistration:!1},publishDiagnostics:{relatedInformation:!1},codeAction:{dynamicRegistration:!1,codeActionLiteralSupport:{codeActionKind:{valueSet:["quickfix"]}}}},workspace:{workspaceFolders:!0,configuration:!1}}}function _uiLocale(){return"undefined"!=typeof brackets&&brackets.getLocale&&brackets.getLocale()||"en"}async function _startAndInit(client){const startTime=Date.now(),config=client.config,conn=await getConnector(),rootVfsPath=config.rootUriProvider&&config.rootUriProvider()||_projectRootPath(),rootUri=rootVfsPath?pathToServerUri(rootVfsPath):null,rootName=rootVfsPath?FileUtils.getBaseName(rootVfsPath):"root";client.rootUri=rootUri,client.rootName=rootName;const startResult=await conn.execPeer("startServer",{serverId:client.serverId,command:config.command,args:config.args||["--stdio"],rootUri:rootUri,workspaceConfiguration:config.workspaceConfiguration,suppressStderrPattern:config.suppressStderrPattern});client._pid=startResult&&startResult.pid||null;const initResult=await conn.execPeer("sendRequest",{serverId:client.serverId,method:"initialize",params:{processId:null,locale:_uiLocale(),rootUri:rootUri,workspaceFolders:rootUri?[{uri:rootUri,name:rootName}]:null,capabilities:_clientCapabilities(config),initializationOptions:config.initializationOptions||{}}});client.capabilities=initResult&&initResult.capabilities||{},await conn.execPeer("sendNotification",{serverId:client.serverId,method:"initialized",params:{}}),Metrics.valueEvent(Metrics.EVENT_TYPE.LSP,"time","Init."+client._metricLabel,Date.now()-startTime)}function _registerProviders(client){const langs=client.languages;client.codeHints=new DefaultProviders.CodeHintsProvider(client),client.parameterHints=new DefaultProviders.ParameterHintsProvider(client),client.jumpToDef=new DefaultProviders.JumpToDefProvider(client),client.references=new DefaultProviders.ReferencesProvider(client),client.lintingProvider=new DefaultProviders.LintingProvider,client.lintingProvider._validateOnType=!0,client.lintingProvider._inspectionProviderName=client.serverId,client.lintingProvider._quickFixClient=client,client.hover=new HoverProvider.HoverProvider(client),CodeHintManager.registerHintProvider(client.codeHints,langs,DEFAULT_PRIORITY),ParameterHintsManager.registerHintProvider(client.parameterHints,langs,DEFAULT_PRIORITY),JumpToDefManager.registerJumpToDefProvider(client.jumpToDef,langs,DEFAULT_PRIORITY),FindReferencesManager.registerFindReferencesProvider(client.references,langs,DEFAULT_PRIORITY),QuickViewManager.registerQuickViewProvider(client.hover,langs),langs.forEach(function(lang){CodeInspection.register(lang,{name:client.lintingProvider._inspectionProviderName,scanFileAsync:function(text,fullPath){const cached=client.lintingProvider.getInspectionResults(text,fullPath);return $.Deferred().resolve(cached||{errors:[]}).promise()}})})}function _announceServerStarted(client){Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","Start."+client._metricLabel),exports.trigger(EVENT_LANGUAGE_SERVER_STARTED,{serverId:client.serverId,languages:client.languages}),CodeInspection.requestRun()}function _codeIntelPrefKey(serverId){return"codeIntelligence."+serverId}function _isDisabledByPref(serverId){return!1===PreferencesManager.get(_codeIntelPrefKey(serverId))}LanguageClient.prototype.getServerCapabilities=function(){return this.capabilities},LanguageClient.prototype.uriForPath=function(vfsPath){return pathToServerUri(vfsPath)},LanguageClient.prototype.servesDocument=function(editor){return!(!editor||-1===this.languages.indexOf(editor.document.getLanguage().getId()))&&!(this.config&&"function"==typeof this.config.documentFilter&&!this.config.documentFilter(editor.document.file.fullPath))},LanguageClient.prototype._request=function(method,params){const serverId=this.serverId,metricLabel=this._metricLabel,startTime=Date.now();return getConnector().then(function(conn){return conn.execPeer("sendRequest",{serverId:serverId,method:method,params:params})}).then(function(result){return Metrics.valueEventBatched(Metrics.EVENT_TYPE.LSP,"time",(METRIC_METHOD_GROUPS[method]||"Oth")+"."+metricLabel,Date.now()-startTime),result})},LanguageClient.prototype._notify=function(method,params){const serverId=this.serverId;return getConnector().then(function(conn){return conn.execPeer("sendNotification",{serverId:serverId,method:method,params:params})}).catch(function(err){throw console.warn("[LSP] notification '"+method+"' failed:",err&&(err.message||err)),err})},LanguageClient.prototype.sendCustomNotification=function(method,params){return this._notify(method,params).catch(function(){})},LanguageClient.prototype.notifyDidOpen=function(uri,languageId,version,text){return this._notify("textDocument/didOpen",{textDocument:{uri:uri,languageId:languageId,version:version,text:text}})},LanguageClient.prototype.notifyDidChange=function(uri,version,contentChanges){return this._notify("textDocument/didChange",{textDocument:{uri:uri,version:version},contentChanges:contentChanges})},LanguageClient.prototype.notifyDidClose=function(uri){return this._notify("textDocument/didClose",{textDocument:{uri:uri}}).catch(function(){})},LanguageClient.prototype.requestHints=function(params){const self=this,deferred=$.Deferred();return async function(){try{const ctx=_completionContext(params.filePath,params.cursorPos),cached=self._completionCache;if(ctx&&cached&&cached.key===ctx.key&&ctx.query.startsWith(cached.query)&&(cached.query||cached.anchored))return void deferred.resolve({items:cached.items});await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/completion",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos)}),isIncomplete=!(!result||Array.isArray(result)||!result.isIncomplete),items=result&&(result.items||result)||[];items.forEach(function(item){item.documentation=_markupToString(item.documentation)}),self._completionCache=ctx&&!isIncomplete&&items.length?{key:ctx.key,query:ctx.query,anchored:ctx.anchored,items:items}:null,deferred.resolve({items:items})}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.requestParameterHints=function(params){const self=this,deferred=$.Deferred();return async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/signatureHelp",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos)});if(!result||!result.signatures||!result.signatures.length)return void deferred.reject();const signatures=result.signatures.map(function(sig){return{label:sig.label,documentation:_markupToString(sig.documentation)||sig.label,parameters:(sig.parameters||[]).map(function(p){return{label:_paramLabel(sig.label,p.label),documentation:_markupToString(p.documentation)}})}});deferred.resolve({signatures:signatures,activeSignature:result.activeSignature,activeParameter:result.activeParameter})}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.gotoDefinition=function(params){const self=this,deferred=$.Deferred();return async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/definition",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos)});if(!result||Array.isArray(result)&&!result.length)return void deferred.reject();if(Array.isArray(result)){const locations=result.map(_normalizeLocation).filter(Boolean);if(!locations.length)return void deferred.reject();deferred.resolve(locations)}else deferred.resolve(_normalizeLocation(result))}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.findReferences=function(params){const self=this,deferred=$.Deferred();return async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/references",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos),context:{includeDeclaration:!0}}),locations=Array.isArray(result)?result.map(_normalizeLocation).filter(Boolean):[];deferred.resolve(locations)}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.resolveCompletion=function(item){const deferred=$.Deferred();return this.capabilities&&this.capabilities.completionProvider&&this.capabilities.completionProvider.resolveProvider?(this._request("completionItem/resolve",item).then(function(resolved){const out=resolved||item;out.documentation=_markupToString(out.documentation),deferred.resolve(out)},function(){deferred.resolve(item)}),deferred.promise()):deferred.resolve(item).promise()},LanguageClient.prototype.documentHighlight=function(params){const self=this,deferred=$.Deferred();return async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/documentHighlight",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos)});deferred.resolve(Array.isArray(result)?result:[])}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.requestHover=function(params){const self=this,deferred=$.Deferred();return async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/hover",{textDocument:{uri:self.uriForPath(params.filePath)},position:_positionOf(params.cursorPos)});deferred.resolve(result)}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()},LanguageClient.prototype.requestCodeActions=function(params){const self=this,deferred=$.Deferred();return this.capabilities&&this.capabilities.codeActionProvider?(async function(){try{await DocumentSync.flush(self,params.filePath);const result=await self._request("textDocument/codeAction",{textDocument:{uri:self.uriForPath(params.filePath)},range:params.range,context:{diagnostics:params.diagnostics||[],only:["quickfix"]}});deferred.resolve(Array.isArray(result)?result:[])}catch(err){console.warn("[LSP] request failed:",err&&(err.message||err)),deferred.reject(err)}}(),deferred.promise()):deferred.resolve([]).promise()},LanguageClient.prototype.resolveCodeAction=function(action){const deferred=$.Deferred(),provider=this.capabilities&&this.capabilities.codeActionProvider;return provider&&provider.resolveProvider?(this._request("codeAction/resolve",action).then(function(resolved){deferred.resolve(resolved||action)},function(){deferred.resolve(action)}),deferred.promise()):deferred.resolve(action).promise()};const _prefWatchedServers=new Set;function _watchServerPref(serverId){if(_prefWatchedServers.has(serverId))return;_prefWatchedServers.add(serverId);let lastDisabled=_isDisabledByPref(serverId);PreferencesManager.on("change",_codeIntelPrefKey(serverId),function(){const disabledNow=_isDisabledByPref(serverId);if(disabledNow===lastDisabled)return;lastDisabled=disabledNow;const client=clients.get(serverId);client&&(disabledNow?(Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","PrefOff."+client._metricLabel),client.capabilities&&stopServerProcess(client).then(function(){CodeInspection.requestRun()})):restartLanguageServer(serverId))})}async function registerLanguageServer(config){if(clients.has(config.serverId))return clients.get(config.serverId);if(PreferencesManager.getPreference(_codeIntelPrefKey(config.serverId))||PreferencesManager.definePreference(_codeIntelPrefKey(config.serverId),"boolean",!0,{description:StringUtils.format(Strings.DESCRIPTION_LSP_CODE_INTELLIGENCE,config.serverId)}),_watchServerPref(config.serverId),_isDisabledByPref(config.serverId))return Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","OffBoot."+_srvLabel(config.serverId)),null;const client=new LanguageClient(config.serverId,config.languages,config);clients.set(config.serverId,client);try{return await _startAndInit(client),_registerProviders(client),DocumentSync.init(),DocumentSync.registerClient(client),DocumentSync.openSupportedDocuments(client),DocumentHighlight.init(),DocumentHighlight.registerClient(client),_announceServerStarted(client),client}catch(err){return console.error("[LSP] failed to start server",config.serverId,err&&(err.message||err)),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","StartErr."+client._metricLabel),window.logger.reportErrorOnce("lspStart."+config.serverId,err,"[LSP] start failed: "+config.serverId),clients.delete(config.serverId),null}}const SHUTDOWN_TIMEOUT_MS=3e3;function _withTimeout(promise,ms){return new Promise(function(resolve,reject){const timer=setTimeout(function(){reject(new Error("timeout"))},ms);promise.then(function(value){clearTimeout(timer),resolve(value)},function(err){clearTimeout(timer),reject(err)})})}async function changeWorkspaceRoot(serverId){const client=clients.get(serverId);if(!client||_isDisabledByPref(serverId))return;const newVfsPath=client.config.rootUriProvider&&client.config.rootUriProvider()||_projectRootPath(),newUri=newVfsPath?pathToServerUri(newVfsPath):null,oldUri=client.rootUri||null;if(newUri===oldUri)return;if(!client.capabilities)return restartLanguageServer(serverId);const wf=client.capabilities.workspace&&client.capabilities.workspace.workspaceFolders,supportsLiveChange=!!(wf&&wf.supported&&wf.changeNotifications);if(!supportsLiveChange)return restartLanguageServer(serverId);const conn=await getConnector(),added=newUri?[{uri:newUri,name:FileUtils.getBaseName(newVfsPath)}]:[],removed=oldUri?[{uri:oldUri,name:client.rootName||FileUtils.getBaseName(oldUri)}]:[];await conn.execPeer("sendNotification",{serverId:serverId,method:"workspace/didChangeWorkspaceFolders",params:{event:{added:added,removed:removed}}}),client.rootUri=newUri,client.rootName=newVfsPath?FileUtils.getBaseName(newVfsPath):null,FindReferencesManager.setMenuItemStateForLanguage()}async function restartLanguageServer(serverId){const client=clients.get(serverId);if(client&&!_isDisabledByPref(serverId)){client._restarting=!0;try{await stopServerProcess(client),await _startAndInit(client),_announceServerStarted(client),DocumentSync.openSupportedDocuments(client),FindReferencesManager.setMenuItemStateForLanguage()}catch(err){console.error("[LSP] failed to restart server",serverId,err&&(err.message||err)),Metrics.countEvent(Metrics.EVENT_TYPE.LSP,"srv","RstErr."+client._metricLabel),window.logger.reportErrorOnce("lspStart."+serverId,err,"[LSP] restart failed: "+serverId)}finally{client._restarting=!1}}}async function stopServerProcess(client){const conn=await getConnector();client._stopping=!0,client.capabilities=null,client._completionCache=null,DocumentSync.clearServer(client);try{await _withTimeout(conn.execPeer("sendRequest",{serverId:client.serverId,method:"shutdown",params:null}),SHUTDOWN_TIMEOUT_MS),await conn.execPeer("sendNotification",{serverId:client.serverId,method:"exit",params:null})}catch(e){}await conn.execPeer("stopServer",{serverId:client.serverId}),client._stopping=!1,exports.trigger(EVENT_LANGUAGE_SERVER_STOPPED,{serverId:client.serverId,languages:client.languages})}function isLintingProviderActive(languageId){for(const client of clients.values())if(client.lintingProvider&&client.capabilities&&client.languages&&-1!==client.languages.indexOf(languageId))return!0;return!1}exports.registerLanguageServer=registerLanguageServer,exports.restartLanguageServer=restartLanguageServer,exports.changeWorkspaceRoot=changeWorkspaceRoot,exports.pathToServerUri=pathToServerUri,exports.serverUriToVfsUri=serverUriToVfsUri,exports.isLintingProviderActive=isLintingProviderActive,exports.EVENT_LANGUAGE_SERVER_STARTED=EVENT_LANGUAGE_SERVER_STARTED,exports.EVENT_LANGUAGE_SERVER_STOPPED=EVENT_LANGUAGE_SERVER_STOPPED});