forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLanguageClientWrapper.js
More file actions
1 lines (1 loc) · 13.7 KB
/
LanguageClientWrapper.js
File metadata and controls
1 lines (1 loc) · 13.7 KB
1
define(function(require,exports,module){var ToolingInfo=JSON.parse(require("text!languageTools/ToolingInfo.json")),MESSAGE_FORMAT={BRACKETS:"brackets",LSP:"lsp"};function _addTypeInformation(type,params){return{type:type,params:params}}function hasValidProp(obj,prop){return obj&&void 0!==obj[prop]&&null!==obj[prop]}function hasValidProps(obj,props){var retval=!!obj,len=props.length,i;for(i=0;retval&&i<len;i++)retval=retval&&void 0!==obj[props[i]]&&null!==obj[props[i]];return retval}function validateRequestParams(type,params){var validatedParams=null;if((params=params||{}).format===MESSAGE_FORMAT.LSP)return params;switch(type){case ToolingInfo.LANGUAGE_SERVICE.START:(hasValidProp(params,"rootPaths")||hasValidProp(params,"rootPath"))&&((validatedParams=params).capabilities=validatedParams.capabilities||!1);break;case ToolingInfo.FEATURES.CODE_HINTS:case ToolingInfo.FEATURES.PARAMETER_HINTS:case ToolingInfo.FEATURES.JUMP_TO_DECLARATION:case ToolingInfo.FEATURES.JUMP_TO_DEFINITION:case ToolingInfo.FEATURES.JUMP_TO_IMPL:hasValidProps(params,["filePath","cursorPos"])&&(validatedParams=params);break;case ToolingInfo.FEATURES.CODE_HINT_INFO:validatedParams=params;break;case ToolingInfo.FEATURES.FIND_REFERENCES:hasValidProps(params,["filePath","cursorPos"])&&((validatedParams=params).includeDeclaration=validatedParams.includeDeclaration||!1);break;case ToolingInfo.FEATURES.DOCUMENT_SYMBOLS:hasValidProp(params,"filePath")&&(validatedParams=params);break;case ToolingInfo.FEATURES.PROJECT_SYMBOLS:hasValidProp(params,"query")&&"string"==typeof params.query&&(validatedParams=params);break;case ToolingInfo.LANGUAGE_SERVICE.CUSTOM_REQUEST:validatedParams=params}return validatedParams}function validateNotificationParams(type,params){var validatedParams=null;if((params=params||{}).format===MESSAGE_FORMAT.LSP)return params;switch(type){case ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_OPENED:hasValidProps(params,["filePath","fileContent","languageId"])&&(validatedParams=params);break;case ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_CHANGED:hasValidProps(params,["filePath","fileContent"])&&(validatedParams=params);break;case ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_SAVED:case ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_CLOSED:hasValidProp(params,"filePath")&&(validatedParams=params);break;case ToolingInfo.SYNCHRONIZE_EVENTS.PROJECT_FOLDERS_CHANGED:hasValidProps(params,["foldersAdded","foldersRemoved"])&&(validatedParams=params);break;case ToolingInfo.LANGUAGE_SERVICE.CUSTOM_NOTIFICATION:validatedParams=params}return validatedParams}function validateHandler(handler){var retval=!1;return handler&&"function"==typeof handler?retval=!0:console.warn("Handler validation failed. Handler should be of type 'function'. Provided handler is of type :",typeof handler),retval}function LanguageClientWrapper(name,path,domainInterface,languages){this._name=name,this._path=path,this._domainInterface=domainInterface,this._languages=languages||[],this._startClient=null,this._stopClient=null,this._notifyClient=null,this._requestClient=null,this._onRequestHandler={},this._onNotificationHandlers={},this._dynamicCapabilities={},this._serverCapabilities={},this._onEventHandlers={activeEditorChange:[],projectOpen:[],beforeProjectClose:[],dirtyFlagChange:[],documentChange:[],fileNameChange:[],beforeAppClose:[]},this._init()}function logAnalyticsData(typeStrKey){var editor=require("editor/EditorManager").getActiveEditor(),document=editor?editor.document:null,language=document?document.language:null,languageName=language?language._name:"",Metrics=require("utils/Metrics"),typeStr=typeStrKey;Metrics.countEvent(Metrics.EVENT_TYPE.CODE_HINTS,"languageServerProtocol",typeStr+languageName.toLowerCase())}LanguageClientWrapper.prototype._init=function(){this._domainInterface.registerMethods([{methodName:ToolingInfo.LANGUAGE_SERVICE.REQUEST,methodHandle:this._onRequestDelegator.bind(this)},{methodName:ToolingInfo.LANGUAGE_SERVICE.NOTIFY,methodHandle:this._onNotificationDelegator.bind(this)}]),this._startClient=this._domainInterface.createInterface(ToolingInfo.LANGUAGE_SERVICE.START,!0),this._stopClient=this._domainInterface.createInterface(ToolingInfo.LANGUAGE_SERVICE.STOP,!0),this._notifyClient=this._domainInterface.createInterface(ToolingInfo.LANGUAGE_SERVICE.NOTIFY),this._requestClient=this._domainInterface.createInterface(ToolingInfo.LANGUAGE_SERVICE.REQUEST,!0)},LanguageClientWrapper.prototype._onRequestDelegator=function(params){if(!params||!params.type)return console.log("Invalid server request"),$.Deferred().reject();var requestHandler=this._onRequestHandler[params.type];return params.type===ToolingInfo.SERVICE_REQUESTS.REGISTRATION_REQUEST?this._registrationShim(params.params,requestHandler):params.type===ToolingInfo.SERVICE_REQUESTS.UNREGISTRATION_REQUEST?this._unregistrationShim(params.params,requestHandler):validateHandler(requestHandler)?requestHandler.call(null,params.params):(console.log("No handler provided for server request type : ",params.type),$.Deferred().reject())},LanguageClientWrapper.prototype._onNotificationDelegator=function(params){if(params&¶ms.type){var notificationHandlers=this._onNotificationHandlers[params.type];notificationHandlers&&Array.isArray(notificationHandlers)&¬ificationHandlers.length?notificationHandlers.forEach(function(handler){validateHandler(handler)&&handler.call(null,params.params)}):console.log("No handlers provided for server notification type : ",params.type)}else console.log("Invalid server notification")},LanguageClientWrapper.prototype._request=function(type,params){return(params=validateRequestParams(type,params))?(params=_addTypeInformation(type,params),this._requestClient(params)):(console.log("Invalid Parameters provided for request type : ",type),$.Deferred().reject())},LanguageClientWrapper.prototype._notify=function(type,params){(params=validateNotificationParams(type,params))?(params=_addTypeInformation(type,params),this._notifyClient(params)):console.log("Invalid Parameters provided for notification type : ",type)},LanguageClientWrapper.prototype._addOnRequestHandler=function(type,handler){validateHandler(handler)&&(this._onRequestHandler[type]=handler)},LanguageClientWrapper.prototype._addOnNotificationHandler=function(type,handler){validateHandler(handler)&&(this._onNotificationHandlers[type]||(this._onNotificationHandlers[type]=[]),this._onNotificationHandlers[type].push(handler))},LanguageClientWrapper.prototype.start=function(params){if(params=validateRequestParams(ToolingInfo.LANGUAGE_SERVICE.START,params)){var self=this;return this._startClient(params).then(function(result){return self.setServerCapabilities(result.capabilities),$.Deferred().resolve(result)},function(err){return $.Deferred().reject(err)})}return console.log("Invalid Parameters provided for request type : start"),$.Deferred().reject()},LanguageClientWrapper.prototype.stop=function(){return this._stopClient()},LanguageClientWrapper.prototype.restart=function(params){var self=this;return this.stop().then(function(){return self.start(params)})},LanguageClientWrapper.prototype.requestHints=function(params){return this._request(ToolingInfo.FEATURES.CODE_HINTS,params).then(function(response){return response&&response.items&&response.items.length&&logAnalyticsData("CODE_HINTS"),$.Deferred().resolve(response)},function(err){return $.Deferred().reject(err)})},LanguageClientWrapper.prototype.getAdditionalInfoForHint=function(params){return this._request(ToolingInfo.FEATURES.CODE_HINT_INFO,params)},LanguageClientWrapper.prototype.requestParameterHints=function(params){return this._request(ToolingInfo.FEATURES.PARAMETER_HINTS,params).then(function(response){return response&&response.signatures&&response.signatures.length&&logAnalyticsData("PARAM_HINTS"),$.Deferred().resolve(response)},function(err){return $.Deferred().reject(err)})},LanguageClientWrapper.prototype.gotoDefinition=function(params){return this._request(ToolingInfo.FEATURES.JUMP_TO_DEFINITION,params).then(function(response){return response&&response.range&&logAnalyticsData("JUMP_TO_DEF"),$.Deferred().resolve(response)},function(err){return $.Deferred().reject(err)})},LanguageClientWrapper.prototype.gotoDeclaration=function(params){return this._request(ToolingInfo.FEATURES.JUMP_TO_DECLARATION,params)},LanguageClientWrapper.prototype.gotoImplementation=function(params){return this._request(ToolingInfo.FEATURES.JUMP_TO_IMPL,params)},LanguageClientWrapper.prototype.findReferences=function(params){return this._request(ToolingInfo.FEATURES.FIND_REFERENCES,params)},LanguageClientWrapper.prototype.requestSymbolsForDocument=function(params){return this._request(ToolingInfo.FEATURES.DOCUMENT_SYMBOLS,params)},LanguageClientWrapper.prototype.requestSymbolsForWorkspace=function(params){return this._request(ToolingInfo.FEATURES.PROJECT_SYMBOLS,params)},LanguageClientWrapper.prototype.addOnShowMessage=function(handler){this._addOnNotificationHandler(ToolingInfo.SERVICE_NOTIFICATIONS.SHOW_MESSAGE,handler)},LanguageClientWrapper.prototype.addOnLogMessage=function(handler){this._addOnNotificationHandler(ToolingInfo.SERVICE_NOTIFICATIONS.LOG_MESSAGE,handler)},LanguageClientWrapper.prototype.addOnTelemetryEvent=function(handler){this._addOnNotificationHandler(ToolingInfo.SERVICE_NOTIFICATIONS.TELEMETRY,handler)},LanguageClientWrapper.prototype.addOnCodeInspection=function(handler){this._addOnNotificationHandler(ToolingInfo.SERVICE_NOTIFICATIONS.DIAGNOSTICS,handler)},LanguageClientWrapper.prototype.onShowMessageWithRequest=function(handler){this._addOnRequestHandler(ToolingInfo.SERVICE_REQUESTS.SHOW_SELECT_MESSAGE,handler)},LanguageClientWrapper.prototype.onProjectFoldersRequest=function(handler){this._addOnRequestHandler(ToolingInfo.SERVICE_REQUESTS.PROJECT_FOLDERS_REQUEST,handler)},LanguageClientWrapper.prototype._registrationShim=function(params,handler){var self=this,registrations;return params.registrations.forEach(function(registration){var id=registration.id;self._dynamicCapabilities[id]=registration}),validateHandler(handler)?handler(params):$.Deferred().resolve()},LanguageClientWrapper.prototype.onDynamicCapabilityRegistration=function(handler){this._addOnRequestHandler(ToolingInfo.SERVICE_REQUESTS.REGISTRATION_REQUEST,handler)},LanguageClientWrapper.prototype._unregistrationShim=function(params,handler){var self=this,unregistrations;return params.unregistrations.forEach(function(unregistration){var id=unregistration.id;delete self._dynamicCapabilities[id]}),validateHandler(handler)?handler(params):$.Deferred().resolve()},LanguageClientWrapper.prototype.onDynamicCapabilityUnregistration=function(handler){this._addOnRequestHandler(ToolingInfo.SERVICE_REQUESTS.UNREGISTRATION_REQUEST,handler)},LanguageClientWrapper.prototype.notifyProjectRootsChanged=function(params){this._notify(ToolingInfo.SYNCHRONIZE_EVENTS.PROJECT_FOLDERS_CHANGED,params)},LanguageClientWrapper.prototype.notifyTextDocumentOpened=function(params){this._notify(ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_OPENED,params)},LanguageClientWrapper.prototype.notifyTextDocumentClosed=function(params){this._notify(ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_CLOSED,params)},LanguageClientWrapper.prototype.notifyTextDocumentChanged=function(params){this._notify(ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_CHANGED,params)},LanguageClientWrapper.prototype.notifyTextDocumentSave=function(params){this._notify(ToolingInfo.SYNCHRONIZE_EVENTS.DOCUMENT_SAVED,params)},LanguageClientWrapper.prototype.sendCustomNotification=function(params){this._notify(ToolingInfo.LANGUAGE_SERVICE.CUSTOM_NOTIFICATION,params)},LanguageClientWrapper.prototype.onCustomNotification=function(type,handler){this._addOnNotificationHandler(type,handler)},LanguageClientWrapper.prototype.sendCustomRequest=function(params){return this._request(ToolingInfo.LANGUAGE_SERVICE.CUSTOM_REQUEST,params)},LanguageClientWrapper.prototype.onCustomRequest=function(type,handler){this._addOnRequestHandler(type,handler)},LanguageClientWrapper.prototype.addOnEditorChangeHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.activeEditorChange.push(handler)},LanguageClientWrapper.prototype.addOnProjectOpenHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.projectOpen.push(handler)},LanguageClientWrapper.prototype.addBeforeProjectCloseHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.beforeProjectClose.push(handler)},LanguageClientWrapper.prototype.addOnDocumentDirtyFlagChangeHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.dirtyFlagChange.push(handler)},LanguageClientWrapper.prototype.addOnDocumentChangeHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.documentChange.push(handler)},LanguageClientWrapper.prototype.addOnFileRenameHandler=function(handler){validateHandler(handler)&&this._onEventHandlers.fileNameChange.push(handler)},LanguageClientWrapper.prototype.addBeforeAppClose=function(handler){validateHandler(handler)&&this._onEventHandlers.beforeAppClose.push(handler)},LanguageClientWrapper.prototype.addOnCustomEventHandler=function(eventName,handler){validateHandler(handler)&&(this._onEventHandlers[eventName]||(this._onEventHandlers[eventName]=[]),this._onEventHandlers[eventName].push(handler))},LanguageClientWrapper.prototype.triggerEvent=function(event){var eventName=event.type,eventArgs=arguments,handlers;this._onEventHandlers[eventName]&&Array.isArray(this._onEventHandlers[eventName])&&this._onEventHandlers[eventName].forEach(function(handler){validateHandler(handler)&&handler.apply(null,eventArgs)})},LanguageClientWrapper.prototype.getDynamicCapabilities=function(){return this._dynamicCapabilities},LanguageClientWrapper.prototype.getServerCapabilities=function(){return this._serverCapabilities},LanguageClientWrapper.prototype.setServerCapabilities=function(serverCapabilities){this._serverCapabilities=serverCapabilities},exports.LanguageClientWrapper=LanguageClientWrapper,exports.validateRequestParams=validateRequestParams,exports.validateNotificationParams=validateNotificationParams});