"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.activate = void 0;
const coc_nvim_1 = __webpack_require__(1);
const server_1 = __importDefault(__webpack_require__(2));
-const commands_1 = __webpack_require__(140);
-const organizeImports_1 = __webpack_require__(114);
-const plugins_1 = __webpack_require__(141);
-function activate(context) {
- return __awaiter(this, void 0, void 0, function* () {
- let { subscriptions } = context;
- const config = coc_nvim_1.workspace.getConfiguration().get('tsserver', {});
- if (!config.enable)
- return;
- const pluginManager = new plugins_1.PluginManager();
- const service = new server_1.default(pluginManager);
+const commands_1 = __webpack_require__(141);
+const organizeImports_1 = __webpack_require__(112);
+const plugins_1 = __webpack_require__(142);
+async function activate(context) {
+ let { subscriptions, logger } = context;
+ const config = coc_nvim_1.workspace.getConfiguration().get('tsserver', {});
+ if (!config.enable)
+ return;
+ const pluginManager = new plugins_1.PluginManager();
+ const service = new server_1.default(pluginManager);
+ function registCommand(cmd) {
+ let { id, execute } = cmd;
+ subscriptions.push(coc_nvim_1.commands.registerCommand(id, execute, cmd));
+ }
+ registCommand(new commands_1.ConfigurePluginCommand(pluginManager));
+ registCommand(new commands_1.AutoFixCommand(service));
+ registCommand(new commands_1.ReloadProjectsCommand(service));
+ registCommand(new commands_1.OpenTsServerLogCommand(service));
+ registCommand(new commands_1.TypeScriptGoToProjectConfigCommand(service));
+ registCommand(new organizeImports_1.OrganizeImportsCommand(service));
+ service.start().then(() => {
subscriptions.push(coc_nvim_1.services.regist(service));
- yield service.start();
- function registCommand(cmd) {
- let { id, execute } = cmd;
- subscriptions.push(coc_nvim_1.commands.registerCommand(id, execute, cmd));
- }
- registCommand(new commands_1.AutoFixCommand(service.clientHost));
- registCommand(new commands_1.ReloadProjectsCommand(service.clientHost));
- registCommand(new commands_1.OpenTsServerLogCommand(service.clientHost));
- registCommand(new commands_1.TypeScriptGoToProjectConfigCommand(service.clientHost));
- registCommand(new organizeImports_1.OrganizeImportsCommand(service.clientHost.serviceClient));
- registCommand(new commands_1.ConfigurePluginCommand(pluginManager));
registCommand(coc_nvim_1.commands.register({
id: 'tsserver.restart',
execute: () => {
});
}
}));
- return {
- configurePlugin: (pluginId, configuration) => {
- pluginManager.setConfiguration(pluginId, configuration);
- }
- };
+ }, e => {
+ logger.error(`Error on service start:`, e);
});
+ return {
+ configurePlugin: (pluginId, configuration) => {
+ pluginManager.setConfiguration(pluginId, configuration);
+ }
+ };
}
exports.activate = activate;
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const coc_nvim_1 = __webpack_require__(1);
const vscode_languageserver_protocol_1 = __webpack_require__(3);
const typescriptServiceClientHost_1 = __importDefault(__webpack_require__(33));
-const languageDescription_1 = __webpack_require__(115);
+const languageDescription_1 = __webpack_require__(140);
class TsserverService {
constructor(pluginManager) {
this.pluginManager = pluginManager;
this.selector = this.descriptions.reduce((arr, c) => {
return arr.concat(c.modeIds);
}, []);
- coc_nvim_1.workspace.onDidOpenTextDocument(doc => {
- this.ensureConfigurationForDocument(doc);
- }, null, this.disposables);
}
get config() {
return coc_nvim_1.workspace.getConfiguration('tsserver');
}
- ensureConfigurationForDocument(document) {
- let uri = coc_nvim_1.Uri.parse(document.uri);
- let language = this.clientHost.findLanguage(uri);
- if (!language)
- return;
- language.fileConfigurationManager.ensureConfigurationForDocument(document).catch(_e => {
- // noop
+ /**
+ * Get running client host.
+ */
+ getClientHost() {
+ if (this.state == coc_nvim_1.ServiceStat.Running)
+ return Promise.resolve(this.clientHost);
+ this.start();
+ return new Promise((resolve, reject) => {
+ let timer = setTimeout(() => {
+ reject(new Error(`Server not started after 5s`));
+ }, 5000);
+ let disposable = this.onServiceReady(() => {
+ clearTimeout(timer);
+ disposable.dispose();
+ resolve(this.clientHost);
+ });
});
}
start() {
}
});
this._onDidServiceReady.fire(void 0);
- this.ensureConfiguration();
if (!started) {
started = true;
resolve();
});
});
}
- ensureConfiguration() {
- if (!this.clientHost)
- return;
- for (let doc of coc_nvim_1.workspace.documents) {
- this.ensureConfigurationForDocument(doc.textDocument);
- }
- }
dispose() {
coc_nvim_1.disposeAll(this.disposables);
}
- restart() {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.clientHost)
- return;
- let client = this.clientHost.serviceClient;
- yield client.restartTsServer();
- });
+ async restart() {
+ if (!this.clientHost)
+ return;
+ let client = this.clientHost.serviceClient;
+ await client.restartTsServer();
}
- stop() {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.clientHost)
- return;
- this.clientHost.reset();
- let client = this.clientHost.serviceClient;
- yield client.stop();
+ async stop() {
+ if (!this.clientHost)
return;
- });
+ this.clientHost.reset();
+ let client = this.clientHost.serviceClient;
+ await client.stop();
+ return;
}
}
exports.default = TsserverService;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
const vscode_languageserver_protocol_1 = __webpack_require__(3);
const languageProvider_1 = __importDefault(__webpack_require__(34));
const PConst = __importStar(__webpack_require__(39));
-const typescriptServiceClient_1 = __importDefault(__webpack_require__(117));
+const fileConfigurationManager_1 = __importDefault(__webpack_require__(113));
+const typescriptServiceClient_1 = __importDefault(__webpack_require__(114));
const typeConverters = __importStar(__webpack_require__(37));
-const typingsStatus_1 = __importStar(__webpack_require__(139));
+const typingsStatus_1 = __importStar(__webpack_require__(137));
+const arrays_1 = __webpack_require__(91);
+const watchBuild_1 = __importDefault(__webpack_require__(138));
+const workspaceSymbols_1 = __importDefault(__webpack_require__(139));
// Style check diagnostics that can be reported as warnings
const styleCheckDiagnostics = [
6133,
];
class TypeScriptServiceClientHost {
constructor(descriptions, pluginManager) {
- this.languages = [];
this.languagePerId = new Map();
this.disposables = [];
this.reportStyleCheckAsWarnings = true;
const packageFileWatcher = coc_nvim_1.workspace.createFileSystemWatcher('**/package.json');
packageFileWatcher.onDidCreate(this.reloadProjects, this, this.disposables);
packageFileWatcher.onDidChange(handleProjectChange, this, this.disposables);
- this.client = new typescriptServiceClient_1.default(pluginManager);
+ const allModeIds = this.getAllModeIds(descriptions, pluginManager);
+ this.client = new typescriptServiceClient_1.default(pluginManager, allModeIds);
this.disposables.push(this.client);
this.client.onDiagnosticsReceived(({ kind, resource, diagnostics }) => {
- this.diagnosticsReceived(kind, resource, diagnostics);
+ this.diagnosticsReceived(kind, resource, diagnostics).catch(e => {
+ console.error(e);
+ });
}, null, this.disposables);
+ // features
+ this.disposables.push(new watchBuild_1.default(this.client));
+ this.disposables.push(coc_nvim_1.languages.registerWorkspaceSymbolProvider(new workspaceSymbols_1.default(this.client, allModeIds)));
this.client.onConfigDiagnosticsReceived(diag => {
let { body } = diag;
if (body) {
}, null, this.disposables);
this.typingsStatus = new typingsStatus_1.default(this.client);
this.ataProgressReporter = new typingsStatus_1.AtaProgressReporter(this.client);
+ this.fileConfigurationManager = new fileConfigurationManager_1.default(this.client);
for (const description of descriptions) { // tslint:disable-line
- const manager = new languageProvider_1.default(this.client, description, this.typingsStatus);
- this.languages.push(manager);
- this.disposables.push(manager);
+ const manager = new languageProvider_1.default(this.client, this.fileConfigurationManager, description, this.typingsStatus);
this.languagePerId.set(description.id, manager);
}
+ const languageIds = new Set();
+ for (const plugin of pluginManager.plugins) {
+ if (plugin.configNamespace && plugin.languages.length) {
+ this.registerExtensionLanguageProvider({
+ id: plugin.configNamespace,
+ modeIds: Array.from(plugin.languages),
+ diagnosticSource: 'ts-plugin',
+ diagnosticLanguage: 1 /* TypeScript */,
+ diagnosticOwner: 'typescript',
+ isExternal: true
+ });
+ }
+ else {
+ for (const language of plugin.languages) {
+ languageIds.add(language);
+ }
+ }
+ }
+ if (languageIds.size) {
+ this.registerExtensionLanguageProvider({
+ id: 'typescript-plugins',
+ modeIds: Array.from(languageIds.values()),
+ diagnosticSource: 'ts-plugin',
+ diagnosticLanguage: 1 /* TypeScript */,
+ diagnosticOwner: 'typescript',
+ isExternal: true
+ });
+ }
this.client.ensureServiceStarted();
this.client.onTsServerStarted(() => {
this.triggerAllDiagnostics();
coc_nvim_1.workspace.onDidChangeConfiguration(this.configurationChanged, this, this.disposables);
this.configurationChanged();
}
+ registerExtensionLanguageProvider(description) {
+ const manager = new languageProvider_1.default(this.client, this.fileConfigurationManager, description, this.typingsStatus);
+ this.languagePerId.set(description.id, manager);
+ }
dispose() {
coc_nvim_1.disposeAll(this.disposables);
+ for (let language of this.languagePerId.values()) {
+ language.dispose();
+ }
+ this.languagePerId.clear();
+ this.fileConfigurationManager.dispose();
this.typingsStatus.dispose();
this.ataProgressReporter.dispose();
}
reset() {
- for (let lang of this.languages) {
- lang.fileConfigurationManager.reset();
- }
+ this.fileConfigurationManager.reset();
}
get serviceClient() {
return this.client;
}
reloadProjects() {
+ this.client.diagnosticsManager.reInitialize();
this.client.execute('reloadProjects', null, vscode_languageserver_protocol_1.CancellationToken.None);
this.triggerAllDiagnostics();
}
const config = coc_nvim_1.workspace.getConfiguration('tsserver');
this.reportStyleCheckAsWarnings = config.get('reportStyleChecksAsWarnings', true);
}
- findLanguage(resource) {
+ async findLanguage(uri) {
try {
- return this.languages.find(language => language.handles(resource));
+ let doc = await coc_nvim_1.workspace.loadFile(uri);
+ if (!doc)
+ return undefined;
+ let languages = Array.from(this.languagePerId.values());
+ return languages.find(language => language.handles(uri, doc.textDocument));
}
catch (_a) {
- return null;
+ return undefined;
}
}
- handles(uri) {
- return this.findLanguage(coc_nvim_1.Uri.parse(uri)) != null;
+ async handles(doc) {
+ let languages = Array.from(this.languagePerId.values());
+ let idx = languages.findIndex(language => language.handles(doc.uri, doc));
+ if (idx != -1)
+ return true;
+ return this.client.bufferSyncSupport.handles(doc.uri);
}
triggerAllDiagnostics() {
for (const language of this.languagePerId.values()) {
language.triggerAllDiagnostics();
}
}
- diagnosticsReceived(kind, resource, diagnostics) {
- const language = this.findLanguage(resource);
+ async diagnosticsReceived(kind, resource, diagnostics) {
+ const language = await this.findLanguage(resource.toString());
if (language) {
language.diagnosticsReceived(kind, resource, this.createMarkerDatas(diagnostics));
}
isStyleCheckDiagnostic(code) {
return code ? styleCheckDiagnostics.indexOf(code) !== -1 : false;
}
+ getAllModeIds(descriptions, pluginManager) {
+ const allModeIds = arrays_1.flatten([
+ ...descriptions.map(x => x.modeIds),
+ ...pluginManager.plugins.map(x => x.languages)
+ ]);
+ return allModeIds;
+ }
}
exports.default = TypeScriptServiceClientHost;
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
const coc_nvim_1 = __webpack_require__(1);
+const path_1 = __importDefault(__webpack_require__(13));
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
const baseCodeLensProvider_1 = __webpack_require__(35);
const completionItemProvider_1 = __importDefault(__webpack_require__(38));
const definitionProvider_1 = __importDefault(__webpack_require__(88));
const directiveCommentCompletions_1 = __importDefault(__webpack_require__(89));
const documentHighlight_1 = __importDefault(__webpack_require__(90));
const documentSymbol_1 = __importDefault(__webpack_require__(92));
-const fileConfigurationManager_1 = __importDefault(__webpack_require__(93));
-const folding_1 = __importDefault(__webpack_require__(94));
-const formatting_1 = __importDefault(__webpack_require__(95));
-const hover_1 = __importDefault(__webpack_require__(96));
-const implementationsCodeLens_1 = __importDefault(__webpack_require__(97));
+const folding_1 = __importDefault(__webpack_require__(93));
+const formatting_1 = __importDefault(__webpack_require__(94));
+const hover_1 = __importDefault(__webpack_require__(95));
+const implementationsCodeLens_1 = __importDefault(__webpack_require__(96));
+const importFix_1 = __importDefault(__webpack_require__(97));
+const moduleInstall_1 = __importDefault(__webpack_require__(99));
// import TagCompletionProvider from './features/tagCompletion'
-const quickfix_1 = __importDefault(__webpack_require__(98));
-const importFix_1 = __importDefault(__webpack_require__(99));
-const refactor_1 = __importDefault(__webpack_require__(101));
-const references_1 = __importDefault(__webpack_require__(102));
-const referencesCodeLens_1 = __importDefault(__webpack_require__(103));
-const rename_1 = __importDefault(__webpack_require__(104));
-const signatureHelp_1 = __importDefault(__webpack_require__(105));
-const updatePathOnRename_1 = __importDefault(__webpack_require__(106));
-const watchBuild_1 = __importDefault(__webpack_require__(108));
-const workspaceSymbols_1 = __importDefault(__webpack_require__(109));
-const smartSelect_1 = __importDefault(__webpack_require__(110));
-const moduleInstall_1 = __importDefault(__webpack_require__(111));
+const quickfix_1 = __importDefault(__webpack_require__(103));
+const refactor_1 = __importDefault(__webpack_require__(104));
+const references_1 = __importDefault(__webpack_require__(105));
+const referencesCodeLens_1 = __importDefault(__webpack_require__(106));
+const rename_1 = __importDefault(__webpack_require__(107));
+const signatureHelp_1 = __importDefault(__webpack_require__(108));
+const smartSelect_1 = __importDefault(__webpack_require__(109));
+const updatePathOnRename_1 = __importDefault(__webpack_require__(110));
+const organizeImports_1 = __webpack_require__(112);
const api_1 = __importDefault(__webpack_require__(40));
-const organizeImports_1 = __webpack_require__(114);
const suggestionSetting = 'suggestionActions.enabled';
class LanguageProvider {
- constructor(client, description, typingsStatus) {
+ constructor(client, fileConfigurationManager, description, typingsStatus) {
this.client = client;
+ this.fileConfigurationManager = fileConfigurationManager;
this.description = description;
+ this.typingsStatus = typingsStatus;
this.disposables = [];
- this.fileConfigurationManager = new fileConfigurationManager_1.default(client);
coc_nvim_1.workspace.onDidChangeConfiguration(this.configurationChanged, this, this.disposables);
this.configurationChanged();
let initialized = false;
- client.onTsServerStarted(() => __awaiter(this, void 0, void 0, function* () {
+ client.onTsServerStarted(async () => {
if (!initialized) {
initialized = true;
this.registerProviders(client, typingsStatus);
}
- else {
- this.client.diagnosticsManager.reInitialize();
- }
- }));
+ });
}
configurationChanged() {
const config = coc_nvim_1.workspace.getConfiguration(this.id, null);
dispose() {
coc_nvim_1.disposeAll(this.disposables);
}
+ _register(disposable) {
+ this.disposables.push(disposable);
+ }
registerProviders(client, typingsStatus) {
let languageIds = this.description.modeIds;
- this.disposables.push(coc_nvim_1.languages.registerCompletionItemProvider(`tsserver-${this.description.id}`, 'TSC', languageIds, new completionItemProvider_1.default(client, typingsStatus, this.fileConfigurationManager, this.description.id), completionItemProvider_1.default.triggerCharacters));
+ let clientId = `tsserver-${this.description.id}`;
+ this._register(coc_nvim_1.languages.registerCompletionItemProvider(clientId, 'TSC', languageIds, new completionItemProvider_1.default(client, typingsStatus, this.fileConfigurationManager, this.description.id), completionItemProvider_1.default.triggerCharacters));
if (this.client.apiVersion.gte(api_1.default.v230)) {
- this.disposables.push(coc_nvim_1.languages.registerCompletionItemProvider(`${this.description.id}-directive`, 'TSC', languageIds, new directiveCommentCompletions_1.default(client), ['@']));
+ this._register(coc_nvim_1.languages.registerCompletionItemProvider(`${this.description.id}-directive`, 'TSC', languageIds, new directiveCommentCompletions_1.default(client), ['@']));
}
let definitionProvider = new definitionProvider_1.default(client);
- this.disposables.push(coc_nvim_1.languages.registerDefinitionProvider(languageIds, definitionProvider));
- this.disposables.push(coc_nvim_1.languages.registerTypeDefinitionProvider(languageIds, definitionProvider));
- this.disposables.push(coc_nvim_1.languages.registerImplementationProvider(languageIds, definitionProvider));
- this.disposables.push(coc_nvim_1.languages.registerReferencesProvider(languageIds, new references_1.default(client)));
- this.disposables.push(coc_nvim_1.languages.registerHoverProvider(languageIds, new hover_1.default(client)));
- this.disposables.push(coc_nvim_1.languages.registerDocumentHighlightProvider(languageIds, new documentHighlight_1.default(this.client)));
- this.disposables.push(coc_nvim_1.languages.registerSignatureHelpProvider(languageIds, new signatureHelp_1.default(client), ['(', ',', '<', ')']));
- this.disposables.push(coc_nvim_1.languages.registerDocumentSymbolProvider(languageIds, new documentSymbol_1.default(client)));
- this.disposables.push(coc_nvim_1.languages.registerWorkspaceSymbolProvider(languageIds, new workspaceSymbols_1.default(client, languageIds)));
- this.disposables.push(coc_nvim_1.languages.registerRenameProvider(languageIds, new rename_1.default(client)));
+ this._register(coc_nvim_1.languages.registerDefinitionProvider(languageIds, definitionProvider));
+ this._register(coc_nvim_1.languages.registerTypeDefinitionProvider(languageIds, definitionProvider));
+ this._register(coc_nvim_1.languages.registerImplementationProvider(languageIds, definitionProvider));
+ this._register(coc_nvim_1.languages.registerReferencesProvider(languageIds, new references_1.default(client)));
+ this._register(coc_nvim_1.languages.registerHoverProvider(languageIds, new hover_1.default(client)));
+ this._register(coc_nvim_1.languages.registerDocumentHighlightProvider(languageIds, new documentHighlight_1.default(this.client)));
+ this._register(coc_nvim_1.languages.registerSignatureHelpProvider(languageIds, new signatureHelp_1.default(client), ['(', ',', '<', ')']));
+ this._register(coc_nvim_1.languages.registerDocumentSymbolProvider(languageIds, new documentSymbol_1.default(client)));
+ this._register(coc_nvim_1.languages.registerRenameProvider(languageIds, new rename_1.default(client, this.fileConfigurationManager)));
let formatProvider = new formatting_1.default(client, this.fileConfigurationManager);
- this.disposables.push(coc_nvim_1.languages.registerDocumentFormatProvider(languageIds, formatProvider));
- this.disposables.push(coc_nvim_1.languages.registerDocumentRangeFormatProvider(languageIds, formatProvider));
- this.disposables.push(coc_nvim_1.languages.registerOnTypeFormattingEditProvider(languageIds, formatProvider, [';', '}', '\n', String.fromCharCode(27)]));
- // this.disposables.push(
- // new ProjectError(client, commandManager)
- // )
- if (this.client.apiVersion.gte(api_1.default.v280)) {
- this.disposables.push(coc_nvim_1.languages.registerFoldingRangeProvider(languageIds, new folding_1.default(this.client)));
- this.disposables.push(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new organizeImports_1.OrganizeImportsCodeActionProvider(this.client, this.fileConfigurationManager), `tsserver-${this.description.id}`, [vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports]));
- }
+ this._register(coc_nvim_1.languages.registerDocumentFormatProvider(languageIds, formatProvider));
+ this._register(coc_nvim_1.languages.registerDocumentRangeFormatProvider(languageIds, formatProvider));
+ this._register(coc_nvim_1.languages.registerOnTypeFormattingEditProvider(languageIds, formatProvider, [';', '}', '\n', String.fromCharCode(27)]));
+ this._register(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new moduleInstall_1.default(client), 'tsserver'));
let { fileConfigurationManager } = this;
let conf = fileConfigurationManager.getLanguageConfiguration(this.id);
- if (this.client.apiVersion.gte(api_1.default.v290)
- && conf.get('updateImportsOnFileMove.enable')) {
- this.disposables.push(new updatePathOnRename_1.default(client, this.fileConfigurationManager, this.id));
+ if (['javascript', 'typescript'].includes(this.id)) {
+ if (this.client.apiVersion.gte(api_1.default.v290) && conf.get('updateImportsOnFileMove.enable')) {
+ this._register(new updatePathOnRename_1.default(client, this.fileConfigurationManager, this.id));
+ }
+ }
+ if (this.client.apiVersion.gte(api_1.default.v280)) {
+ this._register(coc_nvim_1.languages.registerFoldingRangeProvider(languageIds, new folding_1.default(this.client)));
+ this._register(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new organizeImports_1.OrganizeImportsCodeActionProvider(this.client, this.fileConfigurationManager), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports]));
}
if (this.client.apiVersion.gte(api_1.default.v240)) {
- this.disposables.push(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new refactor_1.default(client, this.fileConfigurationManager), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.Refactor]));
+ this._register(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new refactor_1.default(client, this.fileConfigurationManager), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.Refactor]));
}
- this.disposables.push(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new moduleInstall_1.default(client), 'tsserver'));
- this.disposables.push(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new quickfix_1.default(client), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.QuickFix]));
- this.disposables.push(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new importFix_1.default(this.client.bufferSyncSupport), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.QuickFix]));
+ this._register(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new quickfix_1.default(client, this.fileConfigurationManager), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.QuickFix]));
+ this._register(coc_nvim_1.languages.registerCodeActionProvider(languageIds, new importFix_1.default(this.client.bufferSyncSupport), 'tsserver', [vscode_languageserver_protocol_1.CodeActionKind.QuickFix]));
let cachedResponse = new baseCodeLensProvider_1.CachedNavTreeResponse();
- if (this.client.apiVersion.gte(api_1.default.v206)
- && conf.get('referencesCodeLens.enable')) {
- this.disposables.push(coc_nvim_1.languages.registerCodeLensProvider(languageIds, new referencesCodeLens_1.default(client, cachedResponse)));
+ if (this.client.apiVersion.gte(api_1.default.v206) && conf.get('referencesCodeLens.enable')) {
+ this._register(coc_nvim_1.languages.registerCodeLensProvider(languageIds, new referencesCodeLens_1.default(client, cachedResponse)));
}
- if (this.client.apiVersion.gte(api_1.default.v220)
- && conf.get('implementationsCodeLens.enable')) {
- this.disposables.push(coc_nvim_1.languages.registerCodeLensProvider(languageIds, new implementationsCodeLens_1.default(client, cachedResponse)));
+ if (this.client.apiVersion.gte(api_1.default.v220) && conf.get('implementationsCodeLens.enable')) {
+ this._register(coc_nvim_1.languages.registerCodeLensProvider(languageIds, new implementationsCodeLens_1.default(client, cachedResponse)));
}
if (this.client.apiVersion.gte(api_1.default.v350)) {
- this.disposables.push(coc_nvim_1.languages.registerSelectionRangeProvider(languageIds, new smartSelect_1.default(this.client)));
- }
- if (this.description.id == 'typescript') {
- // this.client.apiVersion
- this.disposables.push(new watchBuild_1.default(coc_nvim_1.commands, this.client));
+ this._register(coc_nvim_1.languages.registerSelectionRangeProvider(languageIds, new smartSelect_1.default(this.client)));
}
// if (this.client.apiVersion.gte(API.v300)) {
- // this.disposables.push(
+ // this._register(
// languages.registerCompletionItemProvider(
// `tsserver-${this.description.id}-tag`,
// 'TSC',
// )
// }
}
- handles(resource) {
- let { modeIds, configFile } = this.description;
- if (resource.toString().endsWith(configFile)) {
- return true;
- }
- let doc = coc_nvim_1.workspace.getDocument(resource.toString());
- if (doc && modeIds.indexOf(doc.filetype) !== -1) {
- return true;
- }
- let str = resource.toString();
- if (this.id === 'typescript' && /\.ts(x)?$/.test(str)) {
- return true;
- }
- if (this.id === 'javascript' && /\.js(x)?$/.test(str)) {
+ handles(resource, doc) {
+ if (doc && this.description.modeIds.indexOf(doc.languageId) >= 0) {
return true;
}
- return false;
+ const base = path_1.default.basename(coc_nvim_1.Uri.parse(resource).fsPath);
+ return !!base && (!!this.description.configFilePattern && this.description.configFilePattern.test(base));
}
get id() {
return this.description.id;
this.client.bufferSyncSupport.requestAllDiagnostics();
}
diagnosticsReceived(diagnosticsKind, file, diagnostics) {
- if (!this.client.bufferSyncSupport.shouldValidate(file.toString())) {
- return;
- }
const config = coc_nvim_1.workspace.getConfiguration(this.id, file.toString());
const reportUnnecessary = config.get('showUnused', true);
this.client.diagnosticsManager.diagnosticsReceived(diagnosticsKind, file.toString(), diagnostics.filter(diag => {
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TypeScriptBaseCodeLensProvider = exports.CachedNavTreeResponse = void 0;
/*---------------------------------------------------------------------------------------------
get onDidChangeCodeLenses() {
return this.onDidChangeCodeLensesEmitter.event;
}
- provideCodeLenses(document, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(document.uri);
- if (!filepath) {
+ async provideCodeLenses(document, token) {
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath) {
+ return [];
+ }
+ try {
+ const response = await this.cachedResponse.execute(document, () => this.client.execute('navtree', { file: filepath }, token));
+ if (!response) {
return [];
}
- try {
- const response = yield this.cachedResponse.execute(document, () => this.client.execute('navtree', { file: filepath }, token));
- if (!response) {
- return [];
- }
- const tree = response.body;
- const referenceableSpans = [];
- if (tree && tree.childItems) {
- tree.childItems.forEach(item => this.walkNavTree(document, item, null, referenceableSpans));
- }
- return referenceableSpans.map(range => {
- return {
- range,
- data: { uri: document.uri }
- };
- });
- }
- catch (_a) {
- return [];
+ const tree = response.body;
+ const referenceableSpans = [];
+ if (tree && tree.childItems) {
+ tree.childItems.forEach(item => this.walkNavTree(document, item, null, referenceableSpans));
}
- });
+ return referenceableSpans.map(range => {
+ return {
+ range,
+ data: { uri: document.uri }
+ };
+ });
+ }
+ catch (_a) {
+ return [];
+ }
}
walkNavTree(document, item, parent, results) {
if (!item) {
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
this.id = ApplyCompletionCodeActionCommand.ID;
}
// apply code action on complete
- execute(codeActions) {
- return __awaiter(this, void 0, void 0, function* () {
- if (codeActions.length === 0) {
- return;
- }
- if (codeActions.length === 1) {
- yield codeAction_1.applyCodeAction(this.client, codeActions[0]);
- return;
- }
- const idx = yield coc_nvim_1.workspace.showQuickpick(codeActions.map(o => o.description), 'Select code action to apply');
- if (idx < 0)
- return;
- const action = codeActions[idx];
- yield codeAction_1.applyCodeAction(this.client, action);
+ async execute(codeActions) {
+ if (codeActions.length === 0) {
return;
- });
+ }
+ if (codeActions.length === 1) {
+ await codeAction_1.applyCodeAction(this.client, codeActions[0]);
+ return;
+ }
+ const idx = await coc_nvim_1.workspace.showQuickpick(codeActions.map(o => o.description), 'Select code action to apply');
+ if (idx < 0)
+ return;
+ const action = codeActions[idx];
+ await codeAction_1.applyCodeAction(this.client, action);
+ return;
}
}
ApplyCompletionCodeActionCommand.ID = '_typescript.applyCompletionCodeAction';
* @param {string} triggerCharacter
* @returns {Promise<CompletionItem[]>}
*/
- provideCompletionItems(document, position, token, context) {
- return __awaiter(this, void 0, void 0, function* () {
- if (this.typingsStatus.isAcquiringTypings) {
- return Promise.resolve({
- isIncomplete: true,
- items: [{
- label: 'Acquiring typings...',
- detail: 'Acquiring typings definitions for IntelliSense.'
- }]
- });
- }
- let { uri } = document;
- const file = this.client.toPath(document.uri);
- if (!file)
- return null;
- let preText = document.getText({
- start: { line: position.line, character: 0 },
- end: position
+ async provideCompletionItems(document, position, token, context) {
+ if (this.typingsStatus.isAcquiringTypings) {
+ return Promise.resolve({
+ isIncomplete: true,
+ items: [{
+ label: 'Acquiring typings...',
+ detail: 'Acquiring typings definitions for IntelliSense.'
+ }]
});
- let { triggerCharacter, option } = context;
- if (!this.shouldTrigger(triggerCharacter, preText, option)) {
- return null;
- }
- const { completeOption } = this;
- const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { includeExternalModuleExports: completeOption.autoImports, includeInsertTextCompletions: true, triggerCharacter: this.getTsTriggerCharacter(context), includeAutomaticOptionalChainCompletions: completeOption.includeAutomaticOptionalChainCompletions });
- let entries;
- let dotAccessorContext;
- let isNewIdentifierLocation = true;
- let isMemberCompletion = false;
- let isIncomplete = false;
- const isInValidCommitCharacterContext = this.isInValidCommitCharacterContext(document, position);
- if (this.client.apiVersion.gte(api_1.default.v300)) {
- try {
- const response = yield this.client.interruptGetErr(() => this.client.execute('completionInfo', args, token));
- if (response.type !== 'response' || !response.body) {
- return null;
- }
- isNewIdentifierLocation = response.body.isNewIdentifierLocation;
- isMemberCompletion = response.body.isMemberCompletion;
- if (isMemberCompletion) {
- const dotMatch = preText.slice(0, position.character).match(/\??\.\s*$/) || undefined;
- if (dotMatch) {
- const range = vscode_languageserver_protocol_1.Range.create({
- line: position.line,
- character: position.character - dotMatch.length
- }, position);
- const text = document.getText(range);
- dotAccessorContext = { range, text };
- }
- }
- isIncomplete = response.metadata && response.metadata.isIncomplete;
- entries = response.body.entries;
+ }
+ let { uri } = document;
+ const file = this.client.toPath(document.uri);
+ if (!file)
+ return null;
+ let preText = document.getText({
+ start: { line: position.line, character: 0 },
+ end: position
+ });
+ let { triggerCharacter, option } = context;
+ if (!this.shouldTrigger(triggerCharacter, preText, option)) {
+ return null;
+ }
+ await this.client.interruptGetErr(() => this.fileConfigurationManager.ensureConfigurationForDocument(document, token));
+ const { completeOption } = this;
+ const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { includeExternalModuleExports: completeOption.autoImports, includeInsertTextCompletions: true, triggerCharacter: this.getTsTriggerCharacter(context), includeAutomaticOptionalChainCompletions: completeOption.includeAutomaticOptionalChainCompletions });
+ let entries;
+ let dotAccessorContext;
+ let isNewIdentifierLocation = true;
+ let isMemberCompletion = false;
+ let isIncomplete = false;
+ const isInValidCommitCharacterContext = this.isInValidCommitCharacterContext(document, position);
+ if (this.client.apiVersion.gte(api_1.default.v300)) {
+ try {
+ const response = await this.client.interruptGetErr(() => this.client.execute('completionInfo', args, token));
+ if (response.type !== 'response' || !response.body) {
+ return null;
}
- catch (e) {
- if (e.message == 'No content available.') {
- return null;
+ isNewIdentifierLocation = response.body.isNewIdentifierLocation;
+ isMemberCompletion = response.body.isMemberCompletion;
+ if (isMemberCompletion) {
+ const dotMatch = preText.slice(0, position.character).match(/\??\.\s*$/) || undefined;
+ if (dotMatch) {
+ const range = vscode_languageserver_protocol_1.Range.create({
+ line: position.line,
+ character: position.character - dotMatch.length
+ }, position);
+ const text = document.getText(range);
+ dotAccessorContext = { range, text };
}
- throw e;
}
+ isIncomplete = response.metadata && response.metadata.isIncomplete;
+ entries = response.body.entries;
}
- else {
- const response = yield this.client.interruptGetErr(() => this.client.execute('completions', args, token));
- if (response.type !== 'response' || !response.body) {
+ catch (e) {
+ if (e.message == 'No content available.') {
return null;
}
- entries = response.body;
+ throw e;
}
- const completionItems = [];
- for (const element of entries) {
- if (shouldExcludeCompletionEntry(element, completeOption)) {
- continue;
- }
- const item = completionItem_1.convertCompletionEntry(element, uri, position, {
- isNewIdentifierLocation,
- isMemberCompletion,
- enableCallCompletions: completeOption.completeFunctionCalls,
- isInValidCommitCharacterContext,
- dotAccessorContext,
- });
- completionItems.push(item);
+ }
+ else {
+ const response = await this.client.interruptGetErr(() => this.client.execute('completions', args, token));
+ if (response.type !== 'response' || !response.body) {
+ return null;
}
- return { isIncomplete, items: completionItems };
- });
+ entries = response.body;
+ }
+ const completionItems = [];
+ for (const element of entries) {
+ if (shouldExcludeCompletionEntry(element, completeOption)) {
+ continue;
+ }
+ const item = completionItem_1.convertCompletionEntry(element, uri, position, {
+ isNewIdentifierLocation,
+ isMemberCompletion,
+ enableCallCompletions: completeOption.completeFunctionCalls,
+ isInValidCommitCharacterContext,
+ dotAccessorContext,
+ });
+ completionItems.push(item);
+ }
+ return { isIncomplete, items: completionItems };
}
getTsTriggerCharacter(context) {
// return context.triggerCharacter as Proto.CompletionsTriggerCharacter
* @param {CancellationToken} token
* @returns {Promise<CompletionItem>}
*/
- resolveCompletionItem(item, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (item == null)
- return undefined;
- let { uri, position, source } = item.data;
- const filepath = this.client.toPath(uri);
- if (!filepath)
- return undefined;
- let document = coc_nvim_1.workspace.getDocument(uri);
- if (!document)
- return undefined;
- const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(filepath, position)), { entryNames: [
- source
- ? { name: item.label, source }
- : item.label
- ] });
- let response;
- try {
- response = yield this.client.interruptGetErr(() => this.client.execute('completionEntryDetails', args, token));
- }
- catch (_a) {
- return item;
- }
- if (response.type !== 'response' || !response.body) {
- return item;
- }
- const details = response.body;
- if (!details || !details.length || !details[0]) {
- return item;
- }
- const detail = details[0];
- if (!item.detail && detail.displayParts.length) {
- item.detail = Previewer.plain(detail.displayParts);
- }
- item.documentation = this.getDocumentation(detail);
- const { command, additionalTextEdits } = this.getCodeActions(detail, filepath);
- if (command)
- item.command = command;
- item.additionalTextEdits = additionalTextEdits;
- if (detail && item.insertTextFormat == vscode_languageserver_protocol_1.InsertTextFormat.Snippet) {
- const shouldCompleteFunction = yield this.isValidFunctionCompletionContext(filepath, position, token);
- if (shouldCompleteFunction) {
- this.createSnippetOfFunctionCall(item, detail);
- }
- }
+ async resolveCompletionItem(item, token) {
+ if (item == null)
+ return undefined;
+ let { uri, position, source, name } = item.data;
+ const filepath = this.client.toPath(uri);
+ if (!filepath)
+ return undefined;
+ let document = coc_nvim_1.workspace.getDocument(uri);
+ if (!document)
+ return undefined;
+ const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(filepath, position)), { entryNames: [source ? { name, source } : name] });
+ let response;
+ try {
+ response = await this.client.interruptGetErr(() => this.client.execute('completionEntryDetails', args, token));
+ }
+ catch (_a) {
return item;
- });
+ }
+ if (response.type !== 'response' || !response.body || !response.body.length) {
+ return item;
+ }
+ const details = response.body;
+ if (!details || !details.length || !details[0]) {
+ return item;
+ }
+ const detail = details[0];
+ if (!item.detail && detail.displayParts.length) {
+ item.detail = Previewer.plain(detail.displayParts);
+ }
+ item.documentation = this.getDocumentation(detail);
+ const { command, additionalTextEdits } = this.getCodeActions(detail, filepath);
+ if (command)
+ item.command = command;
+ item.additionalTextEdits = additionalTextEdits;
+ if (detail && item.insertTextFormat == vscode_languageserver_protocol_1.InsertTextFormat.Snippet) {
+ const shouldCompleteFunction = await this.isValidFunctionCompletionContext(filepath, position, token);
+ if (shouldCompleteFunction) {
+ this.createSnippetOfFunctionCall(item, detail);
+ }
+ }
+ return item;
}
getCodeActions(detail, filepath) {
if (!detail.codeActions || !detail.codeActions.length) {
snippet.appendTabstop(0);
item.insertText = snippet.value;
}
- isValidFunctionCompletionContext(filepath, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- // Workaround for https://github.com/Microsoft/TypeScript/issues/12677
- // Don't complete function calls inside of destructive assigments or imports
- try {
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
- const response = yield this.client.execute('quickinfo', args, token);
- if (response.type !== 'response') {
- return true;
- }
- const { body } = response;
- switch (body && body.kind) {
- case 'var':
- case 'let':
- case 'const':
- case 'alias':
- return false;
- default:
- return true;
- }
- }
- catch (e) {
+ async isValidFunctionCompletionContext(filepath, position, token) {
+ // Workaround for https://github.com/Microsoft/TypeScript/issues/12677
+ // Don't complete function calls inside of destructive assigments or imports
+ try {
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
+ const response = await this.client.execute('quickinfo', args, token);
+ if (response.type !== 'response') {
return true;
}
- });
+ const { body } = response;
+ switch (body && body.kind) {
+ case 'var':
+ case 'let':
+ case 'const':
+ case 'alias':
+ return false;
+ default:
+ return true;
+ }
+ }
+ catch (e) {
+ return true;
+ }
}
isInValidCommitCharacterContext(document, position) {
if (this.client.apiVersion.lt(api_1.default.v320)) {
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
API.v380 = API.fromSimpleString('3.8.0');
API.v381 = API.fromSimpleString('3.8.1');
API.v390 = API.fromSimpleString('3.9.0');
+API.v400 = API.fromSimpleString('4.0.0');
+API.v401 = API.fromSimpleString('4.0.1');
/***/ }),
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyCodeActionCommands = exports.applyCodeAction = exports.getEditForCodeAction = void 0;
/*---------------------------------------------------------------------------------------------
: undefined;
}
exports.getEditForCodeAction = getEditForCodeAction;
-function applyCodeAction(client, action) {
- return __awaiter(this, void 0, void 0, function* () {
- const workspaceEdit = getEditForCodeAction(client, action);
- if (workspaceEdit) {
- if (!(yield coc_nvim_1.workspace.applyEdit(workspaceEdit))) {
- return false;
- }
+async function applyCodeAction(client, action) {
+ const workspaceEdit = getEditForCodeAction(client, action);
+ if (workspaceEdit) {
+ if (!(await coc_nvim_1.workspace.applyEdit(workspaceEdit))) {
+ return false;
}
- return applyCodeActionCommands(client, action);
- });
+ }
+ return applyCodeActionCommands(client, action);
}
exports.applyCodeAction = applyCodeAction;
-function applyCodeActionCommands(client, action) {
- return __awaiter(this, void 0, void 0, function* () {
- // make sure there is command
- if (action.commands && action.commands.length) {
- for (const command of action.commands) {
- const response = yield client.execute('applyCodeActionCommand', { command }, vscode_languageserver_protocol_1.CancellationToken.None);
- if (!response || response.type != 'response' || !response.body) {
- return false;
- }
+async function applyCodeActionCommands(client, action) {
+ // make sure there is command
+ if (action.commands && action.commands.length) {
+ for (const command of action.commands) {
+ const response = await client.execute('applyCodeActionCommand', { command }, vscode_languageserver_protocol_1.CancellationToken.None);
+ if (!response || response.type != 'response' || !response.body) {
+ return false;
}
}
- return true;
- });
+ }
+ return true;
}
exports.applyCodeActionCommands = applyCodeActionCommands;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
data: {
uri,
position,
+ name: tsEntry.name,
source: tsEntry.source || ''
}
};
const next = displayParts[i + 1];
// Skip optional parameters
const nameIsFollowedByOptionalIndicator = next && next.text === '?';
- if (!nameIsFollowedByOptionalIndicator) {
+ // Skip this parameter
+ const nameIsThis = part.text === 'this';
+ if (!nameIsFollowedByOptionalIndicator && !nameIsThis) {
parts.push(part);
}
hasOptionalParameters = hasOptionalParameters || nameIsFollowedByOptionalIndicator;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const typeConverters = __importStar(__webpack_require__(37));
class TypeScriptDefinitionProvider {
constructor(client) {
this.client = client;
}
- getSymbolLocations(definitionType, document, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(document.uri);
- if (!filepath) {
- return undefined;
- }
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
- try {
- const response = yield this.client.execute(definitionType, args, token);
- const locations = (response.type == 'response' && response.body) || [];
- return locations.map(location => typeConverters.Location.fromTextSpan(this.client.toResource(location.file), location));
- }
- catch (_a) {
- return [];
- }
- });
+ async getSymbolLocations(definitionType, document, position, token) {
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath) {
+ return undefined;
+ }
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
+ try {
+ const response = await this.client.execute(definitionType, args, token);
+ const locations = (response.type == 'response' && response.body) || [];
+ return locations.map(location => typeConverters.Location.fromTextSpan(this.client.toResource(location.file), location));
+ }
+ catch (_a) {
+ return [];
+ }
}
provideDefinition(document, position, token) {
return this.getSymbolLocations('definition', document, position, token);
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
constructor(client) {
this.client = client;
}
- provideDocumentHighlights(resource, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const file = this.client.toPath(resource.uri);
- if (!file)
- return [];
- const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { filesToSearch: [file] });
- try {
- const response = yield this.client.execute('documentHighlights', args, token);
- if (response.type !== 'response' || !response.body) {
- return [];
- }
- return arrays_1.flatten(response.body
- .filter(highlight => highlight.file === file)
- .map(convertDocumentHighlight));
- }
- catch (_e) {
+ async provideDocumentHighlights(resource, position, token) {
+ const file = this.client.toPath(resource.uri);
+ if (!file)
+ return [];
+ const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { filesToSearch: [file] });
+ try {
+ const response = await this.client.execute('documentHighlights', args, token);
+ if (response.type !== 'response' || !response.body) {
return [];
}
- });
+ return arrays_1.flatten(response.body
+ .filter(highlight => highlight.file === file)
+ .map(convertDocumentHighlight));
+ }
+ catch (_e) {
+ return [];
+ }
}
}
exports.default = TypeScriptDocumentHighlightProvider;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
constructor(client) {
this.client = client;
}
- provideDocumentSymbols(resource, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(resource.uri);
- if (!filepath)
- return [];
- const args = {
- file: filepath
- };
- try {
- const response = yield this.client.execute('navtree', args, token);
- if (response.type == 'response' && response.body) {
- // The root represents the file. Ignore this when showing in the UI
- const tree = response.body;
- if (tree.childItems) {
- const result = new Array();
- tree.childItems.forEach(item => TypeScriptDocumentSymbolProvider.convertNavTree(result, item));
- return result;
- }
+ async provideDocumentSymbols(resource, token) {
+ const filepath = this.client.toPath(resource.uri);
+ if (!filepath)
+ return [];
+ const args = {
+ file: filepath
+ };
+ try {
+ const response = await this.client.execute('navtree', args, token);
+ if (response.type == 'response' && response.body) {
+ // The root represents the file. Ignore this when showing in the UI
+ const tree = response.body;
+ if (tree.childItems) {
+ const result = new Array();
+ tree.childItems.forEach(item => TypeScriptDocumentSymbolProvider.convertNavTree(result, item));
+ return result;
}
- return [];
}
- catch (e) {
- return [];
- }
- });
+ return [];
+ }
+ catch (e) {
+ return [];
+ }
}
static convertNavTree(bucket, item) {
let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item);
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-const coc_nvim_1 = __webpack_require__(1);
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const api_1 = __importDefault(__webpack_require__(40));
-function objAreEqual(a, b) {
- let keys = Object.keys(a);
- for (let i = 0; i < keys.length; i++) { // tslint:disable-line
- let key = keys[i];
- if (a[key] !== b[key]) {
- return false;
- }
- }
- return true;
-}
-class FileConfigurationManager {
- constructor(client) {
- this.client = client;
- this.cachedMap = new Map();
- }
- ensureConfigurationOptions(document, insertSpaces, tabSize) {
- return __awaiter(this, void 0, void 0, function* () {
- const file = this.client.toPath(document.uri);
- let options = {
- tabSize,
- insertSpaces
- };
- let cachedOption = this.cachedMap.get(document.uri);
- const currentOptions = this.getFileOptions(options, document);
- if (cachedOption
- && objAreEqual(cachedOption.formatOptions, currentOptions.formatOptions)
- && objAreEqual(cachedOption.preferences, currentOptions.preferences))
- return;
- this.cachedMap.set(document.uri, currentOptions);
- const args = Object.assign({ file }, currentOptions);
- yield this.client.execute('configure', args, vscode_languageserver_protocol_1.CancellationToken.None);
- });
- }
- ensureConfigurationForDocument(document) {
- return __awaiter(this, void 0, void 0, function* () {
- let opts = yield coc_nvim_1.workspace.getFormatOptions(document.uri);
- return this.ensureConfigurationOptions(document, opts.insertSpaces, opts.tabSize);
- });
- }
- reset() {
- this.cachedMap.clear();
- }
- getLanguageConfiguration(languageId) {
- return coc_nvim_1.workspace.getConfiguration(languageId);
- }
- isTypeScriptDocument(languageId) {
- return languageId.startsWith('typescript');
- }
- formatEnabled(document) {
- let { languageId, uri } = document;
- let language = languageId.startsWith('typescript') ? 'typescript' : 'javascript';
- const config = coc_nvim_1.workspace.getConfiguration(`${language}.format`, uri);
- return config.get('enabled');
- }
- enableJavascript() {
- const config = coc_nvim_1.workspace.getConfiguration('tsserver');
- return !!config.get('enableJavascript');
- }
- getFileOptions(options, document) {
- const lang = this.isTypeScriptDocument(document.languageId) ? 'typescript' : 'javascript';
- return {
- formatOptions: this.getFormatOptions(options, lang, document.uri),
- preferences: this.getPreferences(lang, document.uri)
- };
- }
- getFormatOptions(options, language, uri) {
- const config = coc_nvim_1.workspace.getConfiguration(`${language}.format`, uri);
- return {
- tabSize: options.tabSize,
- indentSize: options.tabSize,
- convertTabsToSpaces: options.insertSpaces,
- // We can use \n here since the editor normalizes later on to its line endings.
- newLineCharacter: '\n',
- insertSpaceAfterCommaDelimiter: config.get('insertSpaceAfterCommaDelimiter'),
- insertSpaceAfterConstructor: config.get('insertSpaceAfterConstructor'),
- insertSpaceAfterSemicolonInForStatements: config.get('insertSpaceAfterSemicolonInForStatements'),
- insertSpaceBeforeAndAfterBinaryOperators: config.get('insertSpaceBeforeAndAfterBinaryOperators'),
- insertSpaceAfterKeywordsInControlFlowStatements: config.get('insertSpaceAfterKeywordsInControlFlowStatements'),
- insertSpaceAfterFunctionKeywordForAnonymousFunctions: config.get('insertSpaceAfterFunctionKeywordForAnonymousFunctions'),
- insertSpaceBeforeFunctionParenthesis: config.get('insertSpaceBeforeFunctionParenthesis'),
- insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis'),
- insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets'),
- insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces'),
- insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces'),
- insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces'),
- insertSpaceAfterTypeAssertion: config.get('insertSpaceAfterTypeAssertion'),
- placeOpenBraceOnNewLineForFunctions: config.get('placeOpenBraceOnNewLineForFunctions'),
- placeOpenBraceOnNewLineForControlBlocks: config.get('placeOpenBraceOnNewLineForControlBlocks'),
- semicolons: config.get('semicolons', undefined)
- };
- }
- getCompleteOptions(languageId) {
- const lang = this.isTypeScriptDocument(languageId) ? 'typescript' : 'javascript';
- const config = coc_nvim_1.workspace.getConfiguration(`${lang}.suggest`);
- return {
- enabled: config.get('enabled', true),
- names: config.get('names', true),
- paths: config.get('paths', true),
- completeFunctionCalls: config.get('completeFunctionCalls', true),
- autoImports: config.get('autoImports', true),
- includeAutomaticOptionalChainCompletions: config.get('includeAutomaticOptionalChainCompletions', true)
- };
- }
- getPreferences(language, uri) {
- if (this.client.apiVersion.lt(api_1.default.v290)) {
- return {};
- }
- const config = coc_nvim_1.workspace.getConfiguration(`${language}.preferences`, uri);
- // getImportModuleSpecifierEndingPreference available on ts 2.9.0
- const preferences = {
- quotePreference: this.getQuoteStyle(config),
- importModuleSpecifierPreference: getImportModuleSpecifier(config),
- importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(config),
- allowTextChangesInNewFiles: uri.startsWith('file:'),
- allowRenameOfImportPath: true,
- providePrefixAndSuffixTextForRename: true,
- };
- return preferences;
- }
- getQuoteStyle(config) {
- let quoteStyle = config.get('quoteStyle', 'auto');
- if (this.client.apiVersion.gte(api_1.default.v333) || quoteStyle != 'auto')
- return quoteStyle;
- return 'single';
- }
-}
-exports.default = FileConfigurationManager;
-function getImportModuleSpecifier(config) {
- let val = config.get('importModuleSpecifier');
- switch (val) {
- case 'relative':
- return 'relative';
- case 'non-relative':
- return 'non-relative';
- default:
- return 'auto';
- }
-}
-function getImportModuleSpecifierEndingPreference(config) {
- switch (config.get('importModuleSpecifierEnding')) {
- case 'minimal': return 'minimal';
- case 'index': return 'index';
- case 'js': return 'js';
- default: return 'auto';
- }
-}
-
-
-/***/ }),
-/* 94 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const vscode_languageserver_types_1 = __webpack_require__(18);
const coc_nvim_1 = __webpack_require__(1);
constructor(client) {
this.client = client;
}
- provideFoldingRanges(document, _context, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const file = this.client.toPath(document.uri);
- if (!file) {
- return;
- }
- const args = { file };
- const res = yield this.client.execute('getOutliningSpans', args, token);
- if (res.type != 'response') {
- return;
- }
- const { body } = res;
- if (!body) {
- return;
- }
- return body
- .map(span => this.convertOutliningSpan(span, document))
- .filter(foldingRange => !!foldingRange);
- });
+ async provideFoldingRanges(document, _context, token) {
+ const file = this.client.toPath(document.uri);
+ if (!file) {
+ return;
+ }
+ const args = { file };
+ const res = await this.client.execute('getOutliningSpans', args, token);
+ if (res.type != 'response') {
+ return;
+ }
+ const { body } = res;
+ if (!body) {
+ return;
+ }
+ return body
+ .map(span => this.convertOutliningSpan(span, document))
+ .filter(foldingRange => !!foldingRange);
}
convertOutliningSpan(span, document) {
const range = typeConverters.Range.fromTextSpan(span.textSpan);
/***/ }),
-/* 95 */
+/* 94 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
enabled(document) {
return this.formattingOptionsManager.formatEnabled(document);
}
- doFormat(document, options, args, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.enabled(document))
- return [];
- yield this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize);
- try {
- const response = yield this.client.execute('format', args, token);
- if (response.type == 'response' && response.body) {
- let edits = response.body.map(typeConverters.TextEdit.fromCodeEdit);
- return edits;
- }
- }
- catch (_a) {
- // noop
- }
+ async doFormat(document, options, args, token) {
+ if (!this.enabled(document))
return [];
- });
+ await this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize, token);
+ try {
+ const response = await this.client.execute('format', args, token);
+ if (response.type == 'response' && response.body) {
+ let edits = response.body.map(typeConverters.TextEdit.fromCodeEdit);
+ return edits;
+ }
+ }
+ catch (_a) {
+ // noop
+ }
+ return [];
}
- provideDocumentRangeFormattingEdits(document, range, options, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.enabled(document))
- return [];
- const filepath = this.client.toPath(document.uri);
- if (!filepath)
- return [];
- const args = {
- file: filepath,
- line: range.start.line + 1,
- offset: range.start.character + 1,
- endLine: range.end.line + 1,
- endOffset: range.end.character + 1
- };
- return this.doFormat(document, options, args, token);
- });
+ async provideDocumentRangeFormattingEdits(document, range, options, token) {
+ if (!this.enabled(document))
+ return [];
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath)
+ return [];
+ const args = {
+ file: filepath,
+ line: range.start.line + 1,
+ offset: range.start.character + 1,
+ endLine: range.end.line + 1,
+ endOffset: range.end.character + 1
+ };
+ return this.doFormat(document, options, args, token);
}
- provideDocumentFormattingEdits(document, options, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.enabled(document))
- return [];
- const filepath = this.client.toPath(document.uri);
- if (!filepath)
- return [];
- const args = {
- file: filepath,
- line: 1,
- offset: 1,
- endLine: document.lineCount + 1,
- endOffset: 1
- };
- return this.doFormat(document, options, args, token);
- });
+ async provideDocumentFormattingEdits(document, options, token) {
+ if (!this.enabled(document))
+ return [];
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath)
+ return [];
+ const args = {
+ file: filepath,
+ line: 1,
+ offset: 1,
+ endLine: document.lineCount + 1,
+ endOffset: 1
+ };
+ return this.doFormat(document, options, args, token);
}
- provideOnTypeFormattingEdits(document, position, ch, options, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.enabled(document))
- return [];
- if (!this.client.configuration.formatOnType)
- return [];
- const file = this.client.toPath(document.uri);
- if (!file)
+ async provideOnTypeFormattingEdits(document, position, ch, options, token) {
+ if (!this.enabled(document))
+ return [];
+ if (!this.client.configuration.formatOnType)
+ return [];
+ const file = this.client.toPath(document.uri);
+ if (!file)
+ return [];
+ await this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize, token);
+ const doc = coc_nvim_1.workspace.getDocument(document.uri);
+ const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { key: ch });
+ try {
+ const res = await this.client.execute('formatonkey', args, token);
+ if (res.type != 'response') {
return [];
- yield this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize);
- const doc = coc_nvim_1.workspace.getDocument(document.uri);
- const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { key: ch });
- try {
- const res = yield this.client.execute('formatonkey', args, token);
- if (res.type != 'response') {
- return [];
- }
- const { body } = res;
- const edits = body;
- const result = [];
- if (!edits) {
- return result;
- }
- for (const edit of edits) {
- const textEdit = typeConverters.TextEdit.fromCodeEdit(edit);
- const range = textEdit.range;
- // Work around for https://github.com/Microsoft/TypeScript/issues/6700.
- // Check if we have an edit at the beginning of the line which only removes white spaces and leaves
- // an empty line. Drop those edits
- if (range.start.character === 0 &&
- range.start.line === range.end.line &&
- textEdit.newText === '') {
- const lText = doc.getline(range.start.line);
- // If the edit leaves something on the line keep the edit (note that the end character is exclusive).
- // Keep it also if it removes something else than whitespace
- if (lText.trim().length > 0 || lText.length > range.end.character) {
- result.push(textEdit);
- }
- }
- else {
+ }
+ const { body } = res;
+ const edits = body;
+ const result = [];
+ if (!edits) {
+ return result;
+ }
+ for (const edit of edits) {
+ const textEdit = typeConverters.TextEdit.fromCodeEdit(edit);
+ const range = textEdit.range;
+ // Work around for https://github.com/Microsoft/TypeScript/issues/6700.
+ // Check if we have an edit at the beginning of the line which only removes white spaces and leaves
+ // an empty line. Drop those edits
+ if (range.start.character === 0 &&
+ range.start.line === range.end.line &&
+ textEdit.newText === '') {
+ const lText = doc.getline(range.start.line);
+ // If the edit leaves something on the line keep the edit (note that the end character is exclusive).
+ // Keep it also if it removes something else than whitespace
+ if (lText.trim().length > 0 || lText.length > range.end.character) {
result.push(textEdit);
}
}
- return result;
- }
- catch (_a) {
- // noop
+ else {
+ result.push(textEdit);
+ }
}
- return [];
- });
+ return result;
+ }
+ catch (_a) {
+ // noop
+ }
+ return [];
}
}
exports.default = TypeScriptFormattingProvider;
/***/ }),
-/* 96 */
+/* 95 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const previewer_1 = __webpack_require__(86);
const typeConverters = __importStar(__webpack_require__(37));
constructor(client) {
this.client = client;
}
- provideHover(document, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(document.uri);
- if (!filepath) {
- return undefined;
- }
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
- try {
- const response = yield this.client.interruptGetErr(() => this.client.execute('quickinfo', args, token));
- if (response && response.type == 'response' && response.body) {
- const data = response.body;
- return {
- contents: TypeScriptHoverProvider.getContents(data),
- range: typeConverters.Range.fromTextSpan(data)
- };
- }
- }
- catch (e) {
- // noop
- }
+ async provideHover(document, position, token) {
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath) {
return undefined;
- });
+ }
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
+ try {
+ const response = await this.client.interruptGetErr(() => this.client.execute('quickinfo', args, token));
+ if (response && response.type == 'response' && response.body) {
+ const data = response.body;
+ return {
+ contents: TypeScriptHoverProvider.getContents(data),
+ range: typeConverters.Range.fromTextSpan(data)
+ };
+ }
+ }
+ catch (e) {
+ // noop
+ }
+ return undefined;
}
static getContents(data) {
const parts = [];
/***/ }),
-/* 97 */
+/* 96 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const PConst = __importStar(__webpack_require__(39));
const typeConverters = __importStar(__webpack_require__(37));
const baseCodeLensProvider_1 = __webpack_require__(35);
class TypeScriptImplementationsCodeLensProvider extends baseCodeLensProvider_1.TypeScriptBaseCodeLensProvider {
- resolveCodeLens(codeLens, token) {
- return __awaiter(this, void 0, void 0, function* () {
- let { uri } = codeLens.data;
- let filepath = this.client.toPath(uri);
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, codeLens.range.start);
- try {
- const response = yield this.client.execute('implementation', args, token, true);
- if (response && response.type == 'response' && response.body) {
- const locations = response.body
- .map(reference => {
- return {
- uri: this.client.toResource(reference.file),
- range: {
- start: typeConverters.Position.fromLocation(reference.start),
- end: {
- line: reference.start.line,
- character: 0
- }
+ async resolveCodeLens(codeLens, token) {
+ let { uri } = codeLens.data;
+ let filepath = this.client.toPath(uri);
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, codeLens.range.start);
+ try {
+ const response = await this.client.execute('implementation', args, token, { lowPriority: true });
+ if (response && response.type == 'response' && response.body) {
+ const locations = response.body
+ .map(reference => {
+ return {
+ uri: this.client.toResource(reference.file),
+ range: {
+ start: typeConverters.Position.fromLocation(reference.start),
+ end: {
+ line: reference.start.line,
+ character: 0
}
- };
- })
- // Exclude original from implementations
- .filter(location => !(location.uri.toString() === uri &&
- location.range.start.line === codeLens.range.start.line &&
- location.range.start.character ===
- codeLens.range.start.character));
- codeLens.command = this.getCommand(locations, codeLens);
- return codeLens;
- }
- }
- catch (_a) {
- // noop
+ }
+ };
+ })
+ // Exclude original from implementations
+ .filter(location => !(location.uri.toString() === uri &&
+ location.range.start.line === codeLens.range.start.line &&
+ location.range.start.character ===
+ codeLens.range.start.character));
+ codeLens.command = this.getCommand(locations, codeLens);
+ return codeLens;
}
- codeLens.command = {
- title: '0 implementations',
- command: ''
- };
- return codeLens;
- });
+ }
+ catch (_a) {
+ // noop
+ }
+ codeLens.command = {
+ title: '0 implementations',
+ command: ''
+ };
+ return codeLens;
}
getCommand(locations, codeLens) {
let { uri } = codeLens.data;
exports.default = TypeScriptImplementationsCodeLensProvider;
+/***/ }),
+/* 97 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+const coc_nvim_1 = __webpack_require__(1);
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const helper_1 = __webpack_require__(98);
+class ImportFixProvider {
+ constructor(bufferSyncSupport) {
+ this.bufferSyncSupport = bufferSyncSupport;
+ }
+ async provideCodeActions(document, _range, context, _token) {
+ if (this.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
+ return [];
+ }
+ let diagnostics = context.diagnostics.filter(d => d.code == 2304);
+ if (!diagnostics.length)
+ return [];
+ let edits = [];
+ let names = [];
+ let doc = coc_nvim_1.workspace.getDocument(document.uri);
+ let command;
+ for (const diagnostic of diagnostics) {
+ let { range } = diagnostic;
+ let line = doc.getline(range.start.line);
+ let name = line.slice(range.start.character, range.end.character);
+ if (names.indexOf(name) !== -1)
+ continue;
+ if (helper_1.nodeModules.indexOf(name) !== -1) {
+ names.push(name);
+ edits.push({
+ range: vscode_languageserver_protocol_1.Range.create(0, 0, 0, 0),
+ newText: `import ${name} from '${name}'\n`
+ });
+ command = 'tsserver.organizeImports';
+ }
+ }
+ let edit = {
+ changes: {
+ [document.uri]: edits
+ }
+ };
+ let cmd = null;
+ if (command)
+ cmd = {
+ title: `fix import`,
+ command: 'tsserver.organizeImports'
+ };
+ return [{
+ title: `Add import ${names.join(', ')}`,
+ edit,
+ command: cmd
+ }];
+ }
+}
+exports.default = ImportFixProvider;
+
+
/***/ }),
/* 98 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.nodeModules = void 0;
+exports.nodeModules = [
+ 'assert',
+ 'cluster',
+ 'crypto',
+ 'dns',
+ 'domain',
+ 'events',
+ 'fs',
+ 'http',
+ 'http2',
+ 'https',
+ 'inspector',
+ 'net',
+ 'os',
+ 'path',
+ 'punycode',
+ 'querystring',
+ 'readline',
+ 'repl',
+ 'stream',
+ 'string_decoder',
+ 'tls',
+ 'tty',
+ 'url',
+ 'util',
+ 'v8',
+ 'vm',
+ 'zlib',
+ 'perf_hooks'
+];
+
+
+/***/ }),
+/* 99 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+const coc_nvim_1 = __webpack_require__(1);
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const modules_1 = __webpack_require__(100);
+class InstallModuleCommand {
+ constructor() {
+ this.id = InstallModuleCommand.ID;
+ }
+ async execute(uri, name) {
+ await modules_1.installModules(uri, [name]);
+ }
+}
+InstallModuleCommand.ID = '_tsserver.installModule';
+class InstallModuleProvider {
+ constructor(client) {
+ this.client = client;
+ coc_nvim_1.commands.register(new InstallModuleCommand(), true);
+ }
+ async provideCodeActions(document, _range, context, _token) {
+ const uri = coc_nvim_1.Uri.parse(document.uri);
+ if (uri.scheme != 'file')
+ return null;
+ let { diagnostics } = context;
+ let diags = diagnostics.filter(s => s.code == 2307);
+ let names = diags.map(o => {
+ let ms = o.message.match(/module\s'(.+)'/);
+ return ms ? ms[1] : null;
+ });
+ names = names.filter(s => s != null);
+ if (!names.length)
+ return null;
+ let actions = [];
+ for (let name of names) {
+ let title = `install ${name}`;
+ let command = {
+ title: `install ${name}`,
+ command: InstallModuleCommand.ID,
+ arguments: [document.uri, name]
+ };
+ let codeAction = vscode_languageserver_protocol_1.CodeAction.create(title, command, vscode_languageserver_protocol_1.CodeActionKind.QuickFix);
+ actions.push(codeAction);
+ }
+ return actions;
+ }
+}
+exports.default = InstallModuleProvider;
+
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.installModules = exports.distinct = exports.moduleExists = exports.runCommand = void 0;
+const child_process_1 = __webpack_require__(101);
+const coc_nvim_1 = __webpack_require__(1);
+const fs_1 = __importDefault(__webpack_require__(102));
+const path_1 = __importDefault(__webpack_require__(13));
+function runCommand(cmd, cwd, timeout) {
+ return new Promise((resolve, reject) => {
+ let timer;
+ if (timeout) {
+ timer = setTimeout(() => {
+ reject(new Error(`timeout after ${timeout}s`));
+ }, timeout * 1000);
+ }
+ child_process_1.exec(cmd, { cwd }, (err, stdout) => {
+ if (timer)
+ clearTimeout(timer);
+ if (err) {
+ reject(new Error(`exited with ${err.code}`));
+ return;
+ }
+ resolve(stdout);
+ });
+ });
+}
+exports.runCommand = runCommand;
+async function getManager() {
+ let res = await coc_nvim_1.workspace.findUp(['yarn.lock', 'package-lock.json']);
+ if (!res)
+ return 'yarn';
+ return res.endsWith('yarn.lock') ? 'yarn' : 'npm';
+}
+async function getRoot() {
+ let res = await coc_nvim_1.workspace.findUp(['package.json']);
+ if (!res)
+ return null;
+ return path_1.default.dirname(res);
+}
+async function moduleExists(name) {
+ try {
+ let content = await runCommand(`npm info ${name} --json`, process.cwd());
+ if (!content)
+ return false;
+ let obj = JSON.parse(content);
+ if (obj.error != null)
+ return false;
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
+ return false;
+}
+exports.moduleExists = moduleExists;
+/**
+ * Removes duplicates from the given array. The optional keyFn allows to specify
+ * how elements are checked for equalness by returning a unique string for each.
+ */
+function distinct(array, keyFn) {
+ if (!keyFn) {
+ return array.filter((element, position) => {
+ return array.indexOf(element) === position;
+ });
+ }
+ const seen = Object.create(null);
+ return array.filter(elem => {
+ const key = keyFn(elem);
+ if (seen[key]) {
+ return false;
+ }
+ seen[key] = true;
+ return true;
+ });
+}
+exports.distinct = distinct;
+async function installModules(uri, names) {
+ names = distinct(names);
+ let workspaceFolder = coc_nvim_1.workspace.getWorkspaceFolder(uri);
+ let root = workspaceFolder ? coc_nvim_1.Uri.parse(workspaceFolder.uri).fsPath : undefined;
+ if (!root || !fs_1.default.existsSync(path_1.default.join(root, 'package.json'))) {
+ coc_nvim_1.workspace.showMessage(`package.json not found from workspaceFolder: ${root}`, 'error');
+ return;
+ }
+ let arr = names.concat(names.map(s => `@types/${s}`));
+ let statusItem = coc_nvim_1.workspace.createStatusBarItem(99, { progress: true });
+ statusItem.text = `Checking module ${arr.join(' ')}`;
+ statusItem.show();
+ let exists = await Promise.all(arr.map(name => {
+ return moduleExists(name).then(exists => {
+ return exists ? name : null;
+ });
+ }));
+ let manager = await getManager();
+ exists = exists.filter(s => s != null);
+ if (!exists.length)
+ return;
+ let devs = exists.filter(s => s.startsWith('@types'));
+ let deps = exists.filter(s => devs.indexOf(s) == -1);
+ statusItem.text = `Installing ${exists.join(' ')}`;
+ try {
+ let cmd = manager == 'npm' ? `npm i ${deps.join(' ')}` : `yarn add ${deps.join(' ')}`;
+ await runCommand(cmd, root);
+ cmd = manager == 'npm' ? `npm i ${deps.join(' ')} --save-dev` : `yarn add ${deps.join(' ')} --save-dev`;
+ await runCommand(cmd, root);
+ }
+ catch (e) {
+ statusItem.dispose();
+ coc_nvim_1.workspace.showMessage(`Install error ${e.message}`, 'error');
+ return;
+ }
+ statusItem.dispose();
+ coc_nvim_1.workspace.showMessage(`Installed: ${exists.join(' ')}`, 'more');
+}
+exports.installModules = installModules;
+
+
+/***/ }),
+/* 101 */
+/***/ (function(module, exports) {
+
+module.exports = require("child_process");
+
+/***/ }),
+/* 102 */
+/***/ (function(module, exports) {
+
+module.exports = require("fs");
+
+/***/ }),
+/* 103 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const codeAction_1 = __webpack_require__(84);
const typeConverters = __importStar(__webpack_require__(37));
class ApplyCodeActionCommand {
- constructor(client) {
+ constructor(client, formattingConfigurationManager) {
this.client = client;
+ this.formattingConfigurationManager = formattingConfigurationManager;
this.id = ApplyCodeActionCommand.ID;
}
- execute(action) {
- return __awaiter(this, void 0, void 0, function* () {
- return codeAction_1.applyCodeActionCommands(this.client, action);
- });
+ async execute(action) {
+ return codeAction_1.applyCodeActionCommands(this.client, action);
}
}
ApplyCodeActionCommand.ID = '_typescript.applyCodeActionCommand';
class ApplyFixAllCodeAction {
- constructor(client) {
+ constructor(client, formattingConfigurationManager) {
this.client = client;
+ this.formattingConfigurationManager = formattingConfigurationManager;
this.id = ApplyFixAllCodeAction.ID;
}
- execute(file, tsAction) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!tsAction.fixId) {
+ async execute(document, file, tsAction) {
+ if (!tsAction.fixId) {
+ return;
+ }
+ await this.formattingConfigurationManager.ensureConfigurationForDocument(document, vscode_languageserver_protocol_1.CancellationToken.None);
+ const args = {
+ scope: {
+ type: 'file',
+ args: { file }
+ },
+ fixId: tsAction.fixId
+ };
+ try {
+ const res = await this.client.execute('getCombinedCodeFix', args, vscode_languageserver_protocol_1.CancellationToken.None);
+ if (res.type != 'response') {
return;
}
- const args = {
- scope: {
- type: 'file',
- args: { file }
- },
- fixId: tsAction.fixId
- };
- try {
- const res = yield this.client.execute('getCombinedCodeFix', args, vscode_languageserver_protocol_1.CancellationToken.None);
- if (res.type != 'response') {
- return;
- }
- let { body } = res;
- const edit = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, body.changes);
- yield coc_nvim_1.workspace.applyEdit(edit);
- const token = vscode_languageserver_protocol_1.CancellationToken.None;
- const { commands } = body;
- if (commands && commands.length) {
- for (const command of commands) {
- yield this.client.execute('applyCodeActionCommand', { command }, token);
- }
+ let { body } = res;
+ const edit = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, body.changes);
+ await coc_nvim_1.workspace.applyEdit(edit);
+ const token = vscode_languageserver_protocol_1.CancellationToken.None;
+ const { commands } = body;
+ if (commands && commands.length) {
+ for (const command of commands) {
+ await this.client.execute('applyCodeActionCommand', { command }, token);
}
}
- catch (_a) {
- // noop
- }
- });
+ }
+ catch (_a) {
+ // noop
+ }
}
}
ApplyFixAllCodeAction.ID = '_typescript.applyFixAllCodeAction';
constructor(client) {
this.client = client;
}
- getFixableDiagnosticsForContext(context) {
- return __awaiter(this, void 0, void 0, function* () {
- const supportedActions = yield this.supportedCodeActions;
- const fixableDiagnostics = DiagnosticsSet.from(context.diagnostics.filter(diagnostic => supportedActions.has(+diagnostic.code)));
- return Array.from(fixableDiagnostics.values);
- });
+ async getFixableDiagnosticsForContext(context) {
+ const supportedActions = await this.supportedCodeActions;
+ const fixableDiagnostics = DiagnosticsSet.from(context.diagnostics.filter(diagnostic => supportedActions.has(+diagnostic.code)));
+ return Array.from(fixableDiagnostics.values);
}
get supportedCodeActions() {
if (!this._supportedCodeActions) {
}
}
class TypeScriptQuickFixProvider {
- constructor(client) {
+ constructor(client, formattingConfigurationManager) {
this.client = client;
- coc_nvim_1.commands.register(new ApplyCodeActionCommand(client));
- coc_nvim_1.commands.register(new ApplyFixAllCodeAction(client));
+ this.formattingConfigurationManager = formattingConfigurationManager;
+ coc_nvim_1.commands.register(new ApplyCodeActionCommand(client, formattingConfigurationManager));
+ coc_nvim_1.commands.register(new ApplyFixAllCodeAction(client, formattingConfigurationManager));
this.supportedCodeActionProvider = new SupportedCodeActionProvider(client);
}
- provideCodeActions(document, _range, context, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.client.apiVersion.gte(api_1.default.v213)) {
- return [];
- }
- const file = this.client.toPath(document.uri);
- if (!file) {
- return [];
- }
- const fixableDiagnostics = yield this.supportedCodeActionProvider.getFixableDiagnosticsForContext(context);
- if (!fixableDiagnostics.length) {
- return [];
- }
- if (this.client.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
- return [];
- }
+ async provideCodeActions(document, _range, context, token) {
+ const file = this.client.toPath(document.uri);
+ if (!file) {
+ return [];
+ }
+ await this.formattingConfigurationManager.ensureConfigurationForDocument(document, token);
+ const fixableDiagnostics = await this.supportedCodeActionProvider.getFixableDiagnosticsForContext(context);
+ if (!fixableDiagnostics.length) {
+ return [];
+ }
+ if (this.client.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
+ return [];
+ }
+ const results = [];
+ for (const diagnostic of fixableDiagnostics) {
+ results.push(...(await this.getFixesForDiagnostic(document, file, diagnostic, token)));
+ }
+ return results;
+ }
+ async getFixesForDiagnostic(document, file, diagnostic, token) {
+ const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, diagnostic.range)), { errorCodes: [+diagnostic.code] });
+ const codeFixesResponse = await this.client.execute('getCodeFixes', args, token);
+ if (codeFixesResponse.type != 'response') {
+ return [];
+ }
+ if (codeFixesResponse.body) {
const results = [];
- for (const diagnostic of fixableDiagnostics) {
- results.push(...(yield this.getFixesForDiagnostic(document, file, diagnostic, token)));
+ for (const tsCodeFix of codeFixesResponse.body) {
+ results.push(...(await this.getAllFixesForTsCodeAction(document, file, diagnostic, tsCodeFix)));
}
return results;
- });
- }
- getFixesForDiagnostic(document, file, diagnostic, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, diagnostic.range)), { errorCodes: [+diagnostic.code] });
- const codeFixesResponse = yield this.client.execute('getCodeFixes', args, token);
- if (codeFixesResponse.type != 'response') {
- return [];
- }
- if (codeFixesResponse.body) {
- const results = [];
- for (const tsCodeFix of codeFixesResponse.body) {
- results.push(...(yield this.getAllFixesForTsCodeAction(document, file, diagnostic, tsCodeFix)));
- }
- return results;
- }
- return [];
- });
+ }
+ return [];
}
- getAllFixesForTsCodeAction(document, file, diagnostic, tsAction) {
- return __awaiter(this, void 0, void 0, function* () {
- const singleFix = this.getSingleFixForTsCodeAction(diagnostic, tsAction);
- const fixAll = yield this.getFixAllForTsCodeAction(document, file, diagnostic, tsAction);
- return fixAll ? [singleFix, fixAll] : [singleFix];
- });
+ async getAllFixesForTsCodeAction(document, file, diagnostic, tsAction) {
+ const singleFix = this.getSingleFixForTsCodeAction(diagnostic, tsAction);
+ const fixAll = await this.getFixAllForTsCodeAction(document, file, diagnostic, tsAction);
+ return fixAll ? [singleFix, fixAll] : [singleFix];
}
getSingleFixForTsCodeAction(diagnostic, tsAction) {
const codeAction = {
};
codeAction.edit = codeAction_1.getEditForCodeAction(this.client, tsAction);
codeAction.diagnostics = [diagnostic];
- codeAction.isPrefered = true;
+ codeAction.isPreferred = true;
if (tsAction.commands) {
codeAction.command = {
command: ApplyCodeActionCommand.ID,
}
return codeAction;
}
- getFixAllForTsCodeAction(document, file, diagnostic, tsAction) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!tsAction.fixId || !this.client.apiVersion.gte(api_1.default.v270)) {
- return undefined;
- }
- // Make sure there are multiple diagnostics of the same type in the file
- if (!this.client.diagnosticsManager
- .getDiagnostics(document.uri)
- .some(x => x.code === diagnostic.code && x !== diagnostic)) {
- return;
- }
- const action = {
- title: tsAction.fixAllDescription || 'Fix all in file',
- kind: vscode_languageserver_protocol_1.CodeActionKind.QuickFix
- };
- action.diagnostics = [diagnostic];
- action.command = {
- command: ApplyFixAllCodeAction.ID,
- arguments: [file, tsAction],
- title: ''
- };
- return action;
- });
+ async getFixAllForTsCodeAction(document, file, diagnostic, tsAction) {
+ if (!tsAction.fixId || !this.client.apiVersion.gte(api_1.default.v270)) {
+ return undefined;
+ }
+ // Make sure there are multiple diagnostics of the same type in the file
+ if (!this.client.diagnosticsManager
+ .getDiagnostics(document.uri)
+ .some(x => x.code === diagnostic.code && x !== diagnostic)) {
+ return;
+ }
+ const action = {
+ title: tsAction.fixAllDescription || 'Fix all in file',
+ kind: vscode_languageserver_protocol_1.CodeActionKind.QuickFix
+ };
+ action.diagnostics = [diagnostic];
+ action.command = {
+ command: ApplyFixAllCodeAction.ID,
+ arguments: [document, file, tsAction],
+ title: ''
+ };
+ return action;
}
}
exports.default = TypeScriptQuickFixProvider;
/***/ }),
-/* 99 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const coc_nvim_1 = __webpack_require__(1);
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const helper_1 = __webpack_require__(100);
-class ImportFixProvider {
- constructor(bufferSyncSupport) {
- this.bufferSyncSupport = bufferSyncSupport;
- }
- provideCodeActions(document, _range, context, _token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (this.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
- return [];
- }
- let diagnostics = context.diagnostics.filter(d => d.code == 2304);
- if (!diagnostics.length)
- return [];
- let edits = [];
- let names = [];
- let doc = coc_nvim_1.workspace.getDocument(document.uri);
- let command;
- for (const diagnostic of diagnostics) {
- let { range } = diagnostic;
- let line = doc.getline(range.start.line);
- let name = line.slice(range.start.character, range.end.character);
- if (names.indexOf(name) !== -1)
- continue;
- if (helper_1.nodeModules.indexOf(name) !== -1) {
- names.push(name);
- edits.push({
- range: vscode_languageserver_protocol_1.Range.create(0, 0, 0, 0),
- newText: `import ${name} from '${name}'\n`
- });
- command = 'tsserver.organizeImports';
- }
- }
- let edit = {
- changes: {
- [document.uri]: edits
- }
- };
- let cmd = null;
- if (command)
- cmd = {
- title: `fix import`,
- command: 'tsserver.organizeImports'
- };
- return [{
- title: `Add import ${names.join(', ')}`,
- edit,
- command: cmd
- }];
- });
- }
-}
-exports.default = ImportFixProvider;
-
-
-/***/ }),
-/* 100 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.nodeModules = void 0;
-exports.nodeModules = [
- 'assert',
- 'cluster',
- 'crypto',
- 'dns',
- 'domain',
- 'events',
- 'fs',
- 'http',
- 'http2',
- 'https',
- 'inspector',
- 'net',
- 'os',
- 'path',
- 'punycode',
- 'querystring',
- 'readline',
- 'repl',
- 'stream',
- 'string_decoder',
- 'tls',
- 'tty',
- 'url',
- 'util',
- 'v8',
- 'vm',
- 'zlib',
- 'perf_hooks'
-];
-
-
-/***/ }),
-/* 101 */
+/* 104 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
this.client = client;
this.id = ApplyRefactoringCommand.ID;
}
- execute(document, file, refactor, action, range) {
- return __awaiter(this, void 0, void 0, function* () {
- const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, range)), { refactor,
- action });
- const response = yield this.client.execute('getEditsForRefactor', args, vscode_languageserver_protocol_1.CancellationToken.None);
- const body = response && response.body;
- if (!body || !body.edits.length) {
- return false;
- }
- const workspaceEdit = yield this.toWorkspaceEdit(body);
- if (!(yield coc_nvim_1.workspace.applyEdit(workspaceEdit))) {
- return false;
- }
- const renameLocation = body.renameLocation;
- if (renameLocation) {
- coc_nvim_1.commands.executeCommand('editor.action.rename', document.uri, typeConverters.Position.fromLocation(renameLocation));
- }
- return true;
- });
+ async execute(document, file, refactor, action, range) {
+ const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, range)), { refactor,
+ action });
+ const response = await this.client.execute('getEditsForRefactor', args, vscode_languageserver_protocol_1.CancellationToken.None);
+ const body = response && response.body;
+ if (!body || !body.edits.length) {
+ return false;
+ }
+ const workspaceEdit = await this.toWorkspaceEdit(body);
+ if (!(await coc_nvim_1.workspace.applyEdit(workspaceEdit))) {
+ return false;
+ }
+ const renameLocation = body.renameLocation;
+ if (renameLocation) {
+ coc_nvim_1.commands.executeCommand('editor.action.rename', document.uri, typeConverters.Position.fromLocation(renameLocation));
+ }
+ return true;
}
- toWorkspaceEdit(body) {
- return __awaiter(this, void 0, void 0, function* () {
- for (const edit of body.edits) {
- yield coc_nvim_1.workspace.createFile(edit.fileName, { ignoreIfExists: true });
- }
- let workspaceEdit = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, body.edits);
- return workspaceEdit;
- });
+ async toWorkspaceEdit(body) {
+ for (const edit of body.edits) {
+ await coc_nvim_1.workspace.createFile(edit.fileName, { ignoreIfExists: true });
+ }
+ let workspaceEdit = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, body.edits);
+ return workspaceEdit;
}
}
ApplyRefactoringCommand.ID = '_typescript.applyRefactoring';
this.doRefactoring = doRefactoring;
this.id = SelectRefactorCommand.ID;
}
- execute(document, file, info, range) {
- return __awaiter(this, void 0, void 0, function* () {
- let { actions } = info;
- const idx = actions.length == 1 ? 0 : yield coc_nvim_1.workspace.showQuickpick(actions.map(action => action.description || action.name));
- if (idx == -1)
- return false;
- let label = info.actions[idx].name;
- if (!label)
- return false;
- return this.doRefactoring.execute(document, file, info.name, label, range);
- });
+ async execute(document, file, info, range) {
+ let { actions } = info;
+ const idx = actions.length == 1 ? 0 : await coc_nvim_1.workspace.showQuickpick(actions.map(action => action.description || action.name));
+ if (idx == -1)
+ return false;
+ let label = info.actions[idx].name;
+ if (!label)
+ return false;
+ return this.doRefactoring.execute(document, file, info.name, label, range);
}
}
SelectRefactorCommand.ID = '_typescript.selectRefactoring';
const doRefactoringCommand = coc_nvim_1.commands.register(new ApplyRefactoringCommand(this.client));
coc_nvim_1.commands.register(new SelectRefactorCommand(doRefactoringCommand));
}
- provideCodeActions(document, range, context, token) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!this.shouldTrigger(context)) {
- return undefined;
- }
- const file = this.client.toPath(document.uri);
- if (!file)
- return undefined;
- yield this.formattingOptionsManager.ensureConfigurationForDocument(document);
- const args = typeConverters.Range.toFileRangeRequestArgs(file, range);
- let response;
- try {
- response = yield this.client.interruptGetErr(() => {
- return this.client.execute('getApplicableRefactors', args, token);
- });
- if (!response || !response.body) {
- return undefined;
- }
- }
- catch (_a) {
+ async provideCodeActions(document, range, context, token) {
+ if (!this.shouldTrigger(context)) {
+ return undefined;
+ }
+ const file = this.client.toPath(document.uri);
+ if (!file)
+ return undefined;
+ await this.formattingOptionsManager.ensureConfigurationForDocument(document, token);
+ const args = typeConverters.Range.toFileRangeRequestArgs(file, range);
+ let response;
+ try {
+ response = await this.client.interruptGetErr(() => {
+ return this.client.execute('getApplicableRefactors', args, token);
+ });
+ if (!response || !response.body) {
return undefined;
}
- return this.convertApplicableRefactors(response.body, document, file, range);
- });
+ }
+ catch (_a) {
+ return undefined;
+ }
+ return this.convertApplicableRefactors(response.body, document, file, range, context.only && context.only.some(v => v.includes(vscode_languageserver_protocol_1.CodeActionKind.Refactor)));
}
- convertApplicableRefactors(body, document, file, rangeOrSelection) {
+ convertApplicableRefactors(body, document, file, rangeOrSelection, setPrefrred) {
const actions = [];
for (const info of body) {
+ // ignore not refactor that not applicable
+ if (info.notApplicableReason)
+ continue;
if (!info.inlineable) {
const codeAction = {
title: info.description,
}
else {
for (const action of info.actions) {
- actions.push(this.refactorActionToCodeAction(action, document, file, info, rangeOrSelection));
+ let codeAction = this.refactorActionToCodeAction(action, document, file, info, rangeOrSelection);
+ if (setPrefrred) {
+ codeAction.isPreferred = TypeScriptRefactorProvider.isPreferred(action, info.actions);
+ }
+ actions.push(codeAction);
}
}
}
}
shouldTrigger(context) {
if (context.only &&
- context.only.indexOf(vscode_languageserver_protocol_1.CodeActionKind.Refactor) == -1) {
+ context.only.every(o => !o.includes(vscode_languageserver_protocol_1.CodeActionKind.Refactor))) {
return false;
}
return true;
}
return vscode_languageserver_protocol_1.CodeActionKind.Refactor;
}
+ static isPreferred(action, allActions) {
+ let kind = TypeScriptRefactorProvider.getKind(action);
+ if (TypeScriptRefactorProvider.extractConstantKind == kind) {
+ // Only mark the action with the lowest scope as preferred
+ const getScope = (name) => {
+ var _a;
+ const scope = (_a = name.match(/scope_(\d)/)) === null || _a === void 0 ? void 0 : _a[1];
+ return scope ? +scope : undefined;
+ };
+ const scope = getScope(action.name);
+ if (typeof scope !== 'number') {
+ return false;
+ }
+ return allActions
+ .filter(otherAtion => otherAtion !== action && otherAtion.name.startsWith('constant_'))
+ .every(otherAction => {
+ const otherScope = getScope(otherAction.name);
+ return typeof otherScope === 'number' ? scope < otherScope : true;
+ });
+ }
+ let { name } = action;
+ if (name.startsWith('Extract to type alias') || name.startsWith('Extract to interface')) {
+ return true;
+ }
+ return false;
+ }
}
exports.default = TypeScriptRefactorProvider;
TypeScriptRefactorProvider.extractFunctionKind = vscode_languageserver_protocol_1.CodeActionKind.RefactorExtract + '.function';
/***/ }),
-/* 102 */
+/* 105 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const typeConverters = __importStar(__webpack_require__(37));
class TypeScriptReferences {
constructor(client) {
this.client = client;
}
- provideReferences(document, position, context, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(document.uri);
- if (!filepath)
+ async provideReferences(document, position, context, token) {
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath)
+ return [];
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
+ try {
+ const msg = await this.client.execute('references', args, token);
+ if (!msg || msg.type != 'response' || !msg.body) {
return [];
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
- try {
- const msg = yield this.client.execute('references', args, token);
- if (!msg || msg.type != 'response' || !msg.body) {
- return [];
- }
- const result = [];
- for (const ref of msg.body.refs) {
- if (!context.includeDeclaration && ref.isDefinition) {
- continue;
- }
- const url = this.client.toResource(ref.file);
- const location = typeConverters.Location.fromTextSpan(url, ref);
- result.push(location);
- }
- return result;
}
- catch (_a) {
- return [];
+ const result = [];
+ for (const ref of msg.body.refs) {
+ if (!context.includeDeclaration && ref.isDefinition) {
+ continue;
+ }
+ const url = this.client.toResource(ref.file);
+ const location = typeConverters.Location.fromTextSpan(url, ref);
+ result.push(location);
}
- });
+ return result;
+ }
+ catch (_a) {
+ return [];
+ }
}
}
exports.default = TypeScriptReferences;
/***/ }),
-/* 103 */
+/* 106 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
let filepath = this.client.toPath(uri);
const args = typeConverters.Position.toFileLocationRequestArgs(filepath, codeLens.range.start);
return this.client
- .execute('references', args, token, true)
+ .execute('references', args, token, {
+ lowPriority: true
+ })
.then(response => {
if (!response || response.type != 'response' || !response.body) {
throw codeLens;
/***/ }),
-/* 104 */
+/* 107 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const api_1 = __importDefault(__webpack_require__(40));
const typeConverters = __importStar(__webpack_require__(37));
class TypeScriptRenameProvider {
- constructor(client) {
+ constructor(client, fileConfigurationManager) {
this.client = client;
+ this.fileConfigurationManager = fileConfigurationManager;
}
- prepareRename(document, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const response = yield this.execRename(document, position, token);
- if (!response || response.type !== 'response' || !response.body) {
- return null;
- }
- const renameInfo = response.body.info;
- if (!renameInfo.canRename) {
- return Promise.reject(new Error('Invalid location for rename.'));
- }
- if (this.client.apiVersion.gte(api_1.default.v310)) {
- const triggerSpan = renameInfo.triggerSpan;
- if (triggerSpan) {
- const range = typeConverters.Range.fromTextSpan(triggerSpan);
- return range;
- }
- }
+ async prepareRename(document, position, token) {
+ const response = await this.execRename(document, position, token);
+ if (!response || response.type !== 'response' || !response.body) {
return null;
- });
- }
- provideRenameEdits(document, position, newName, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const response = yield this.execRename(document, position, token);
- if (!response || response.type !== 'response' || !response.body) {
- return null;
- }
- const renameInfo = response.body.info;
- if (!renameInfo.canRename) {
- return Promise.reject(new Error('Invalid location for rename.'));
+ }
+ const renameInfo = response.body.info;
+ if (!renameInfo.canRename) {
+ return Promise.reject(new Error('Invalid location for rename.'));
+ }
+ if (this.client.apiVersion.gte(api_1.default.v310)) {
+ const triggerSpan = renameInfo.triggerSpan;
+ if (triggerSpan) {
+ const range = typeConverters.Range.fromTextSpan(triggerSpan);
+ return range;
}
- if (this.client.apiVersion.gte(api_1.default.v310)) {
- if (renameInfo.fileToRename) {
- const edits = yield this.renameFile(renameInfo.fileToRename, newName, token);
- if (edits) {
- return edits;
- }
- else {
- return Promise.reject(new Error('An error occurred while renaming file'));
- }
+ }
+ return null;
+ }
+ async provideRenameEdits(document, position, newName, token) {
+ const response = await this.execRename(document, position, token);
+ if (!response || response.type !== 'response' || !response.body) {
+ return null;
+ }
+ const renameInfo = response.body.info;
+ if (!renameInfo.canRename) {
+ return Promise.reject(new Error('Invalid location for rename.'));
+ }
+ if (this.client.apiVersion.gte(api_1.default.v310)) {
+ if (renameInfo.fileToRename) {
+ const edits = await this.renameFile(renameInfo.fileToRename, newName, token);
+ if (edits) {
+ return edits;
+ }
+ else {
+ return Promise.reject(new Error('An error occurred while renaming file'));
}
}
- return this.toWorkspaceEdit(response.body.locs, newName);
- });
+ }
+ return this.toWorkspaceEdit(response.body.locs, newName);
}
- execRename(document, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const file = this.client.toPath(document.uri);
- if (!file)
- return undefined;
- const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { findInStrings: false, findInComments: false });
- return this.client.interruptGetErr(() => {
- return this.client.execute('rename', args, token);
- });
+ async execRename(document, position, token) {
+ const file = this.client.toPath(document.uri);
+ if (!file)
+ return undefined;
+ const args = Object.assign(Object.assign({}, typeConverters.Position.toFileLocationRequestArgs(file, position)), { findInStrings: false, findInComments: false });
+ await this.fileConfigurationManager.ensureConfigurationForDocument(document, token);
+ return this.client.interruptGetErr(() => {
+ return this.client.execute('rename', args, token);
});
}
toWorkspaceEdit(locations, newName) {
}
return { changes };
}
- renameFile(fileToRename, newName, token) {
- return __awaiter(this, void 0, void 0, function* () {
- // Make sure we preserve file exension if none provided
- if (!path_1.default.extname(newName)) {
- newName += path_1.default.extname(fileToRename);
- }
- const dirname = path_1.default.dirname(fileToRename);
- const newFilePath = path_1.default.join(dirname, newName);
- const args = {
- file: fileToRename,
- oldFilePath: fileToRename,
- newFilePath
- };
- const response = yield this.client.execute('getEditsForFileRename', args, token);
- if (response.type !== 'response' || !response.body) {
- return undefined;
+ async renameFile(fileToRename, newName, token) {
+ // Make sure we preserve file exension if none provided
+ if (!path_1.default.extname(newName)) {
+ newName += path_1.default.extname(fileToRename);
+ }
+ const dirname = path_1.default.dirname(fileToRename);
+ const newFilePath = path_1.default.join(dirname, newName);
+ const args = {
+ file: fileToRename,
+ oldFilePath: fileToRename,
+ newFilePath
+ };
+ const response = await this.client.execute('getEditsForFileRename', args, token);
+ if (response.type !== 'response' || !response.body) {
+ return undefined;
+ }
+ const edits = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, response.body);
+ edits.documentChanges = edits.documentChanges || [];
+ edits.documentChanges.push({
+ kind: 'rename',
+ oldUri: coc_nvim_1.Uri.file(fileToRename).toString(),
+ newUri: coc_nvim_1.Uri.file(newFilePath).toString(),
+ options: {
+ overwrite: false,
+ ignoreIfExists: true
}
- const edits = typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, response.body);
- edits.documentChanges = edits.documentChanges || [];
- edits.documentChanges.push({
- kind: 'rename',
- oldUri: coc_nvim_1.Uri.file(fileToRename).toString(),
- newUri: coc_nvim_1.Uri.file(newFilePath).toString(),
- options: {
- overwrite: false,
- ignoreIfExists: true
- }
- });
- return edits;
});
+ return edits;
}
}
exports.default = TypeScriptRenameProvider;
/***/ }),
-/* 105 */
+/* 108 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
Object.defineProperty(exports, "__esModule", { value: true });
const Previewer = __importStar(__webpack_require__(86));
const typeConverters = __importStar(__webpack_require__(37));
constructor(client) {
this.client = client;
}
- provideSignatureHelp(document, position, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const filepath = this.client.toPath(document.uri);
- if (!filepath) {
- return undefined;
- }
- const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
- let response;
- try {
- response = yield this.client.interruptGetErr(() => this.client.execute('signatureHelp', args, token));
- }
- catch (e) {
- return undefined;
- }
- if (response.type !== 'response' || !response.body) {
- return undefined;
- }
- let info = response.body;
- const result = {
- activeSignature: info.selectedItemIndex,
- activeParameter: this.getActiveParmeter(info),
- signatures: info.items.map(signature => {
- return this.convertSignature(signature);
- })
- };
- return result;
- });
+ async provideSignatureHelp(document, position, token) {
+ const filepath = this.client.toPath(document.uri);
+ if (!filepath) {
+ return undefined;
+ }
+ const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
+ let response;
+ try {
+ response = await this.client.interruptGetErr(() => this.client.execute('signatureHelp', args, token));
+ }
+ catch (e) {
+ return undefined;
+ }
+ if (response.type !== 'response' || !response.body) {
+ return undefined;
+ }
+ let info = response.body;
+ const result = {
+ activeSignature: info.selectedItemIndex,
+ activeParameter: this.getActiveParmeter(info),
+ signatures: info.items.map(signature => {
+ return this.convertSignature(signature);
+ })
+ };
+ return result;
}
getActiveParmeter(info) {
const activeSignature = info.items[info.selectedItemIndex];
/***/ }),
-/* 106 */
+/* 109 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
+Object.defineProperty(exports, "__esModule", { value: true });
+const typeConverters = __importStar(__webpack_require__(37));
+class SmartSelection {
+ constructor(client) {
+ this.client = client;
+ }
+ async provideSelectionRanges(document, positions, token) {
+ const file = this.client.toPath(document.uri);
+ if (!file) {
+ return undefined;
+ }
+ const args = {
+ file,
+ locations: positions.map(typeConverters.Position.toLocation)
+ };
+ const response = await this.client.execute('selectionRange', args, token);
+ if (response.type !== 'response' || !response.body) {
+ return undefined;
+ }
+ return response.body.map(SmartSelection.convertSelectionRange);
+ }
+ static convertSelectionRange(selectionRange) {
+ return {
+ range: typeConverters.Range.fromTextSpan(selectionRange.textSpan),
+ parent: selectionRange.parent ? SmartSelection.convertSelectionRange(selectionRange.parent) : undefined,
+ };
+ }
+}
+exports.default = SmartSelection;
+
+
+/***/ }),
+/* 110 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
const vscode_languageserver_protocol_1 = __webpack_require__(3);
const coc_nvim_1 = __webpack_require__(1);
const typeConverters = __importStar(__webpack_require__(37));
-const mutex_1 = __webpack_require__(107);
+const mutex_1 = __webpack_require__(111);
function wait(ms) {
return new Promise(resolve => {
setTimeout(() => {
const watcher = coc_nvim_1.workspace.createFileSystemWatcher(glob);
this.disposables.push(watcher);
let mutex = new mutex_1.Mutex();
- watcher.onDidRename((e) => __awaiter(this, void 0, void 0, function* () {
- let release = yield mutex.acquire();
+ watcher.onDidRename(async (e) => {
+ let release = await mutex.acquire();
try {
- yield this.doRename(e.oldUri, e.newUri);
+ await this.doRename(e.oldUri, e.newUri);
release();
}
catch (e) {
this.client.logger.error('Error on rename:', e);
release();
}
- }), null, this.disposables);
+ }, null, this.disposables);
}
dispose() {
coc_nvim_1.disposeAll(this.disposables);
}
- doRename(oldResource, newResource) {
- return __awaiter(this, void 0, void 0, function* () {
- if (oldResource.scheme !== 'file' || newResource.scheme !== 'file') {
- return;
- }
- const targetFile = newResource.fsPath;
- const oldFile = oldResource.fsPath;
- const newUri = newResource.toString();
- let oldDocument = coc_nvim_1.workspace.getDocument(oldResource.toString());
- if (oldDocument) {
- yield coc_nvim_1.workspace.nvim.command(`silent ${oldDocument.bufnr}bwipeout!`);
- }
- let document = coc_nvim_1.workspace.getDocument(newUri);
- if (document) {
- yield coc_nvim_1.workspace.nvim.command(`silent ${document.bufnr}bwipeout!`);
- yield wait(30);
- }
- document = yield coc_nvim_1.workspace.loadFile(newUri);
- if (!document)
- return;
- yield wait(50);
- const edits = yield this.getEditsForFileRename(document.textDocument, oldFile, targetFile);
- if (!edits)
- return;
- if (yield this.promptUser(newResource)) {
- yield coc_nvim_1.workspace.applyEdit(edits);
- }
- });
+ async doRename(oldResource, newResource) {
+ if (oldResource.scheme !== 'file' || newResource.scheme !== 'file') {
+ return;
+ }
+ const targetFile = newResource.fsPath;
+ const oldFile = oldResource.fsPath;
+ const newUri = newResource.toString();
+ let oldDocument = coc_nvim_1.workspace.getDocument(oldResource.toString());
+ if (oldDocument) {
+ await coc_nvim_1.workspace.nvim.command(`silent ${oldDocument.bufnr}bwipeout!`);
+ }
+ let document = coc_nvim_1.workspace.getDocument(newUri);
+ if (document) {
+ await coc_nvim_1.workspace.nvim.command(`silent ${document.bufnr}bwipeout!`);
+ await wait(30);
+ }
+ document = await coc_nvim_1.workspace.loadFile(newUri);
+ if (!document)
+ return;
+ await wait(50);
+ const edits = await this.getEditsForFileRename(document.textDocument, oldFile, targetFile);
+ if (!edits)
+ return;
+ if (await this.promptUser(newResource)) {
+ await coc_nvim_1.workspace.applyEdit(edits);
+ }
}
- promptUser(newResource) {
- return __awaiter(this, void 0, void 0, function* () {
- return yield coc_nvim_1.workspace.showPrompt(`Update imports for moved file: ${newResource.fsPath}?`);
- });
+ async promptUser(newResource) {
+ return await coc_nvim_1.workspace.showPrompt(`Update imports for moved file: ${newResource.fsPath}?`);
}
- getEditsForFileRename(document, oldFile, newFile) {
- return __awaiter(this, void 0, void 0, function* () {
- yield this.fileConfigurationManager.ensureConfigurationForDocument(document);
- const response = yield this.client.interruptGetErr(() => {
- const args = {
- oldFilePath: oldFile,
- newFilePath: newFile,
- };
- return this.client.execute('getEditsForFileRename', args, vscode_languageserver_protocol_1.CancellationToken.None);
- });
- if (!response || response.type != 'response' || !response.body) {
- return;
+ async getEditsForFileRename(document, oldFile, newFile) {
+ await this.fileConfigurationManager.ensureConfigurationForDocument(document, vscode_languageserver_protocol_1.CancellationToken.None);
+ const response = await this.client.interruptGetErr(() => {
+ const args = {
+ oldFilePath: oldFile,
+ newFilePath: newFile,
+ };
+ return this.client.execute('getEditsForFileRename', args, vscode_languageserver_protocol_1.CancellationToken.None);
+ });
+ if (!response || response.type != 'response' || !response.body) {
+ return;
+ }
+ const edits = [];
+ for (const edit of response.body) {
+ // Workaround for https://github.com/Microsoft/vscode/issues/52675
+ if (edit.fileName.match(/[\/\\]node_modules[\/\\]/gi)) {
+ continue;
}
- const edits = [];
- for (const edit of response.body) {
- // Workaround for https://github.com/Microsoft/vscode/issues/52675
- if (edit.fileName.match(/[\/\\]node_modules[\/\\]/gi)) {
+ for (const change of edit.textChanges) {
+ if (change.newText.match(/\/node_modules\//gi)) {
continue;
}
- for (const change of edit.textChanges) {
- if (change.newText.match(/\/node_modules\//gi)) {
- continue;
- }
- }
- edits.push(edit);
}
- return typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, edits);
- });
+ edits.push(edit);
+ }
+ return typeConverters.WorkspaceEdit.fromFileCodeEdits(this.client, edits);
}
}
exports.default = UpdateImportsOnFileRenameHandler;
/***/ }),
-/* 107 */
+/* 111 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/***/ }),
-/* 108 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const coc_nvim_1 = __webpack_require__(1);
-const path_1 = __importDefault(__webpack_require__(13));
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const countRegex = /Found\s+(\d+)\s+error/;
-const errorRegex = /^(.+)\((\d+),(\d+)\):\s(\w+)\sTS(\d+):\s*(.+)$/;
-var TscStatus;
-(function (TscStatus) {
- TscStatus[TscStatus["INIT"] = 0] = "INIT";
- TscStatus[TscStatus["COMPILING"] = 1] = "COMPILING";
- TscStatus[TscStatus["RUNNING"] = 2] = "RUNNING";
- TscStatus[TscStatus["ERROR"] = 3] = "ERROR";
-})(TscStatus || (TscStatus = {}));
-class WatchProject {
- constructor(commandManager, client) {
- this.client = client;
- this.disposables = [];
- this.statusItem = coc_nvim_1.workspace.createStatusBarItem(1, { progress: true });
- let task = this.task = coc_nvim_1.workspace.createTask('TSC');
- this.disposables.push(commandManager.registerCommand(WatchProject.id, () => __awaiter(this, void 0, void 0, function* () {
- let opts = this.options = yield this.getOptions();
- yield this.start(opts);
- })));
- task.onExit(code => {
- if (code != 0) {
- coc_nvim_1.workspace.showMessage(`TSC exit with code ${code}`, 'warning');
- }
- this.onStop();
- });
- task.onStdout(lines => {
- for (let line of lines) {
- this.onLine(line);
- }
- });
- task.onStderr(lines => {
- coc_nvim_1.workspace.showMessage(`TSC error: ` + lines.join('\n'), 'error');
- });
- this.disposables.push(vscode_languageserver_protocol_1.Disposable.create(() => {
- task.dispose();
- }));
- this.check().catch(_e => {
- // noop
- });
- }
- check() {
- return __awaiter(this, void 0, void 0, function* () {
- let running = yield this.task.running;
- if (running) {
- this.options = yield this.getOptions();
- this.statusItem.isProgress = false;
- this.statusItem.text = '?';
- this.statusItem.show();
- }
- else {
- this.onStop();
- }
- });
- }
- start(options) {
- return __awaiter(this, void 0, void 0, function* () {
- yield this.task.start(options);
- });
- }
- onStop() {
- this.statusItem.hide();
- }
- onStart() {
- this.statusItem.text = 'compiling';
- this.statusItem.isProgress = true;
- this.statusItem.show();
- coc_nvim_1.workspace.nvim.call('setqflist', [[]], true);
- }
- onLine(line) {
- if (countRegex.test(line)) {
- let ms = line.match(countRegex);
- this.statusItem.text = ms[1] == '0' ? '✓' : '✗';
- this.statusItem.isProgress = false;
- }
- else if (WatchProject.startTexts.findIndex(s => line.indexOf(s) !== -1) != -1) {
- this.onStart();
- }
- else {
- let ms = line.match(errorRegex);
- if (!ms)
- return;
- let fullpath = path_1.default.join(this.options.cwd, ms[1]);
- let uri = coc_nvim_1.Uri.file(fullpath).toString();
- let doc = coc_nvim_1.workspace.getDocument(uri);
- let bufnr = doc ? doc.bufnr : null;
- let item = {
- filename: fullpath,
- lnum: Number(ms[2]),
- col: Number(ms[3]),
- text: `[tsc ${ms[5]}] ${ms[6]}`,
- type: /error/i.test(ms[4]) ? 'E' : 'W'
- };
- if (bufnr)
- item.bufnr = bufnr;
- coc_nvim_1.workspace.nvim.call('setqflist', [[item], 'a']);
- }
- }
- getOptions() {
- return __awaiter(this, void 0, void 0, function* () {
- let { tscPath } = this.client;
- if (!tscPath) {
- coc_nvim_1.workspace.showMessage(`Local & global tsc not found`, 'error');
- return;
- }
- let find = yield coc_nvim_1.workspace.findUp(['tsconfig.json']);
- if (!find) {
- coc_nvim_1.workspace.showMessage('tsconfig.json not found!', 'error');
- return;
- }
- let root = path_1.default.dirname(find);
- return {
- cmd: tscPath,
- args: ['-p', 'tsconfig.json', '--watch', 'true', '--pretty', 'false'],
- cwd: root
- };
- });
- }
- dispose() {
- coc_nvim_1.disposeAll(this.disposables);
- }
-}
-exports.default = WatchProject;
-WatchProject.id = 'tsserver.watchBuild';
-WatchProject.startTexts = ['Starting compilation in watch mode', 'Starting incremental compilation'];
-
-
-/***/ }),
-/* 109 */
+/* 112 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
+exports.OrganizeImportsCodeActionProvider = exports.OrganizeImportsCommand = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
const coc_nvim_1 = __webpack_require__(1);
-const typeConverters = __importStar(__webpack_require__(37));
-const api_1 = __importDefault(__webpack_require__(40));
-function getSymbolKind(item) {
- switch (item.kind) {
- case 'method':
- return vscode_languageserver_protocol_1.SymbolKind.Method;
- case 'enum':
- return vscode_languageserver_protocol_1.SymbolKind.Enum;
- case 'function':
- return vscode_languageserver_protocol_1.SymbolKind.Function;
- case 'class':
- return vscode_languageserver_protocol_1.SymbolKind.Class;
- case 'interface':
- return vscode_languageserver_protocol_1.SymbolKind.Interface;
- case 'var':
- return vscode_languageserver_protocol_1.SymbolKind.Variable;
- default:
- return vscode_languageserver_protocol_1.SymbolKind.Variable;
- }
-}
-class TypeScriptWorkspaceSymbolProvider {
- constructor(client, languageIds) {
- this.client = client;
- this.languageIds = languageIds;
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const typeconverts = __importStar(__webpack_require__(37));
+class OrganizeImportsCommand {
+ constructor(service) {
+ this.service = service;
+ this.id = 'tsserver.organizeImports';
}
- provideWorkspaceSymbols(search, token) {
- return __awaiter(this, void 0, void 0, function* () {
- let filepath;
- if (this.searchAllOpenProjects) {
- filepath = undefined;
- }
- else {
- let uri = this.getUri();
- filepath = uri ? this.client.toPath(uri) : undefined;
- if (!filepath && this.client.apiVersion.lt(api_1.default.v390)) {
- return [];
+ async _execute(client, document) {
+ let file = client.toPath(document.uri);
+ const args = {
+ scope: {
+ type: 'file',
+ args: {
+ file
}
}
- const args = {
- file: filepath,
- searchValue: search,
- maxResultCount: 256,
- };
- const response = yield this.client.execute('navto', args, token);
- if (response.type !== 'response' || response.body == null)
- return [];
- const result = [];
- for (const item of response.body) {
- if (!item.containerName && item.kind === 'alias') {
- continue;
- }
- const label = TypeScriptWorkspaceSymbolProvider.getLabel(item);
- const range = {
- start: typeConverters.Position.fromLocation(item.start),
- end: typeConverters.Position.fromLocation(item.end),
- };
- const symbolInfo = vscode_languageserver_protocol_1.SymbolInformation.create(label, getSymbolKind(item), range, this.client.toResource(item.file));
- result.push(symbolInfo);
+ };
+ const response = await client.interruptGetErr(() => client.execute('organizeImports', args, vscode_languageserver_protocol_1.CancellationToken.None));
+ if (!response || response.type != 'response' || !response.success) {
+ return;
+ }
+ const edit = typeconverts.WorkspaceEdit.fromFileCodeEdits(client, response.body);
+ let keys = Object.keys(edit.changes);
+ if (keys.length == 1) {
+ let doc = coc_nvim_1.workspace.getDocument(keys[0]);
+ if (doc) {
+ await doc.applyEdits(edit.changes[keys[0]]);
+ return;
}
- return result;
- });
- }
- static getLabel(item) {
- let label = item.name;
- if (item.kind === 'method' || item.kind === 'function') {
- label += '()';
}
- return label;
+ if (edit)
+ await coc_nvim_1.workspace.applyEdit(edit);
}
- getUri() {
- // typescript wants to have a resource even when asking
- // general questions so we check the active editor. If this
- // doesn't match we take the first TS document.
- const documents = coc_nvim_1.workspace.textDocuments;
- for (const document of documents) {
- if (this.languageIds.indexOf(document.languageId) >= 0) {
- return document.uri;
+ async execute(document) {
+ let client = await this.service.getClientHost();
+ if (!document) {
+ let doc = await coc_nvim_1.workspace.document;
+ if (!doc.attached) {
+ throw new Error(`Document not attached.`);
}
+ if (client.serviceClient.modeIds.indexOf(doc.filetype) == -1) {
+ throw new Error(`filetype "${doc.filetype}" not supported by tsserver.`);
+ }
+ document = doc.textDocument;
}
- return undefined;
+ await this._execute(client.serviceClient, document);
}
- get searchAllOpenProjects() {
- return this.client.apiVersion.gte(api_1.default.v390)
- && coc_nvim_1.workspace.getConfiguration('typescript').get('workspaceSymbols.scope', 'allOpenProjects') === 'allOpenProjects';
+}
+exports.OrganizeImportsCommand = OrganizeImportsCommand;
+class OrganizeImportsCodeActionProvider {
+ // public static readonly minVersion = API.v280
+ constructor(client, fileConfigManager) {
+ this.client = client;
+ this.fileConfigManager = fileConfigManager;
+ this.metadata = {
+ providedCodeActionKinds: [vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports]
+ };
+ }
+ async provideCodeActions(document, _range, context, token) {
+ if (this.client.modeIds.indexOf(document.languageId) == -1)
+ return;
+ if (!context.only || !context.only.includes(vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports)) {
+ return [];
+ }
+ await this.fileConfigManager.ensureConfigurationForDocument(document, token);
+ const action = vscode_languageserver_protocol_1.CodeAction.create('Organize Imports', {
+ title: '',
+ command: 'tsserver.organizeImports',
+ arguments: [document]
+ }, vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports);
+ return [action];
}
}
-exports.default = TypeScriptWorkspaceSymbolProvider;
+exports.OrganizeImportsCodeActionProvider = OrganizeImportsCodeActionProvider;
/***/ }),
-/* 110 */
+/* 113 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+const coc_nvim_1 = __webpack_require__(1);
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const api_1 = __importDefault(__webpack_require__(40));
+function objAreEqual(a, b) {
+ let keys = Object.keys(a);
+ for (let i = 0; i < keys.length; i++) { // tslint:disable-line
+ let key = keys[i];
+ if (a[key] !== b[key]) {
+ return false;
+ }
+ }
+ return true;
+}
+class FileConfigurationManager {
+ constructor(client) {
+ this.client = client;
+ this.cachedMap = new Map();
+ this.disposables = [];
+ coc_nvim_1.workspace.onDidCloseTextDocument(textDocument => {
+ // When a document gets closed delete the cached formatting options.
+ // This is necessary since the tsserver now closed a project when its
+ // last file in it closes which drops the stored formatting options
+ // as well.
+ this.cachedMap.delete(textDocument.uri);
+ }, undefined, this.disposables);
+ }
+ async ensureConfigurationOptions(document, insertSpaces, tabSize, token) {
+ const file = this.client.toPath(document.uri);
+ let options = {
+ tabSize,
+ insertSpaces
+ };
+ let cachedOption = this.cachedMap.get(document.uri);
+ const currentOptions = this.getFileOptions(options, document);
+ if (cachedOption
+ && objAreEqual(cachedOption.formatOptions, currentOptions.formatOptions)
+ && objAreEqual(cachedOption.preferences, currentOptions.preferences))
+ return;
+ this.cachedMap.set(document.uri, currentOptions);
+ const args = Object.assign({ file }, currentOptions);
+ await this.client.execute('configure', args, vscode_languageserver_protocol_1.CancellationToken.None);
+ try {
+ const response = await this.client.execute('configure', args, token);
+ if (response.type !== 'response') {
+ this.cachedMap.delete(document.uri);
+ }
+ }
+ catch (_e) {
+ this.cachedMap.delete(document.uri);
+ }
+ }
+ async ensureConfigurationForDocument(document, token) {
+ let opts = await coc_nvim_1.workspace.getFormatOptions(document.uri);
+ return this.ensureConfigurationOptions(document, opts.insertSpaces, opts.tabSize, token);
+ }
+ reset() {
+ this.cachedMap.clear();
+ }
+ getLanguageConfiguration(languageId) {
+ return coc_nvim_1.workspace.getConfiguration(languageId);
+ }
+ isTypeScriptDocument(languageId) {
+ return languageId.startsWith('typescript');
+ }
+ formatEnabled(document) {
+ let { languageId, uri } = document;
+ let language = languageId.startsWith('typescript') ? 'typescript' : 'javascript';
+ const config = coc_nvim_1.workspace.getConfiguration(`${language}.format`, uri);
+ return config.get('enabled');
+ }
+ enableJavascript() {
+ const config = coc_nvim_1.workspace.getConfiguration('tsserver');
+ return !!config.get('enableJavascript');
+ }
+ getFileOptions(options, document) {
+ const lang = this.isTypeScriptDocument(document.languageId) ? 'typescript' : 'javascript';
+ return {
+ formatOptions: this.getFormatOptions(options, lang, document.uri),
+ preferences: this.getPreferences(lang, document.uri)
+ };
+ }
+ getFormatOptions(options, language, uri) {
+ const config = coc_nvim_1.workspace.getConfiguration(`${language}.format`, uri);
+ return {
+ tabSize: options.tabSize,
+ indentSize: options.tabSize,
+ convertTabsToSpaces: options.insertSpaces,
+ // We can use \n here since the editor normalizes later on to its line endings.
+ newLineCharacter: '\n',
+ insertSpaceAfterCommaDelimiter: config.get('insertSpaceAfterCommaDelimiter'),
+ insertSpaceAfterConstructor: config.get('insertSpaceAfterConstructor'),
+ insertSpaceAfterSemicolonInForStatements: config.get('insertSpaceAfterSemicolonInForStatements'),
+ insertSpaceBeforeAndAfterBinaryOperators: config.get('insertSpaceBeforeAndAfterBinaryOperators'),
+ insertSpaceAfterKeywordsInControlFlowStatements: config.get('insertSpaceAfterKeywordsInControlFlowStatements'),
+ insertSpaceAfterFunctionKeywordForAnonymousFunctions: config.get('insertSpaceAfterFunctionKeywordForAnonymousFunctions'),
+ insertSpaceBeforeFunctionParenthesis: config.get('insertSpaceBeforeFunctionParenthesis'),
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis'),
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets'),
+ insertSpaceAfterOpeningAndBeforeClosingEmptyBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingEmptyBraces'),
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces'),
+ insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces'),
+ insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: config.get('insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces'),
+ insertSpaceAfterTypeAssertion: config.get('insertSpaceAfterTypeAssertion'),
+ placeOpenBraceOnNewLineForFunctions: config.get('placeOpenBraceOnNewLineForFunctions'),
+ placeOpenBraceOnNewLineForControlBlocks: config.get('placeOpenBraceOnNewLineForControlBlocks'),
+ semicolons: config.get('semicolons', undefined)
+ };
+ }
+ getCompleteOptions(languageId) {
+ const lang = this.isTypeScriptDocument(languageId) ? 'typescript' : 'javascript';
+ const config = coc_nvim_1.workspace.getConfiguration(`${lang}.suggest`);
+ return {
+ enabled: config.get('enabled', true),
+ names: config.get('names', true),
+ paths: config.get('paths', true),
+ completeFunctionCalls: config.get('completeFunctionCalls', true),
+ autoImports: config.get('autoImports', true),
+ includeAutomaticOptionalChainCompletions: config.get('includeAutomaticOptionalChainCompletions', true)
+ };
+ }
+ getPreferences(language, uri) {
+ if (this.client.apiVersion.lt(api_1.default.v290)) {
+ return {};
+ }
+ const config = coc_nvim_1.workspace.getConfiguration(`${language}.preferences`, uri);
+ // getImportModuleSpecifierEndingPreference available on ts 2.9.0
+ const preferences = {
+ quotePreference: this.getQuoteStyle(config),
+ importModuleSpecifierPreference: getImportModuleSpecifier(config),
+ importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(config),
+ allowTextChangesInNewFiles: uri.startsWith('file:'),
+ allowRenameOfImportPath: true,
+ providePrefixAndSuffixTextForRename: config.get('renameShorthandProperties', true) === false ? false : config.get('useAliasesForRenames', true),
+ };
+ return preferences;
+ }
+ getQuoteStyle(config) {
+ let quoteStyle = config.get('quoteStyle', 'auto');
+ if (this.client.apiVersion.gte(api_1.default.v333) || quoteStyle != 'auto')
+ return quoteStyle;
+ return 'single';
+ }
+ dispose() {
+ coc_nvim_1.disposeAll(this.disposables);
+ }
+}
+exports.default = FileConfigurationManager;
+function getImportModuleSpecifier(config) {
+ let val = config.get('importModuleSpecifier');
+ switch (val) {
+ case 'relative':
+ return 'relative';
+ case 'non-relative':
+ return 'non-relative';
+ default:
+ return 'auto';
+ }
+}
+function getImportModuleSpecifierEndingPreference(config) {
+ switch (config.get('importModuleSpecifierEnding')) {
+ case 'minimal': return 'minimal';
+ case 'index': return 'index';
+ case 'js': return 'js';
+ default: return 'auto';
+ }
+}
+
+
+/***/ }),
+/* 114 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const typeConverters = __importStar(__webpack_require__(37));
-class SmartSelection {
- constructor(client) {
- this.client = client;
- }
- provideSelectionRanges(document, positions, token) {
- return __awaiter(this, void 0, void 0, function* () {
- const file = this.client.toPath(document.uri);
- if (!file) {
- return undefined;
- }
- const args = {
- file,
- locations: positions.map(typeConverters.Position.toLocation)
- };
- const response = yield this.client.execute('selectionRange', args, token);
- if (response.type !== 'response' || !response.body) {
- return undefined;
- }
- return response.body.map(SmartSelection.convertSelectionRange);
- });
- }
- static convertSelectionRange(selectionRange) {
- return {
- range: typeConverters.Range.fromTextSpan(selectionRange.textSpan),
- parent: selectionRange.parent ? SmartSelection.convertSelectionRange(selectionRange.parent) : undefined,
- };
- }
-}
-exports.default = SmartSelection;
-
-
-/***/ }),
-/* 111 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const coc_nvim_1 = __webpack_require__(1);
+const fs_1 = __importDefault(__webpack_require__(102));
+const os_1 = __importDefault(__webpack_require__(14));
+const path_1 = __importDefault(__webpack_require__(13));
const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const modules_1 = __webpack_require__(112);
-class InstallModuleCommand {
- constructor() {
- this.id = InstallModuleCommand.ID;
+const fileSchemes = __importStar(__webpack_require__(115));
+const callbackMap_1 = __webpack_require__(116);
+const bufferSyncSupport_1 = __importDefault(__webpack_require__(118));
+const diagnostics_1 = __webpack_require__(122);
+const fileConfigurationManager_1 = __importDefault(__webpack_require__(113));
+const requestQueue_1 = __webpack_require__(123);
+const typescriptService_1 = __webpack_require__(117);
+const api_1 = __importDefault(__webpack_require__(40));
+const configuration_1 = __webpack_require__(124);
+const logger_1 = __importDefault(__webpack_require__(129));
+const process_1 = __webpack_require__(131);
+const tracer_1 = __importDefault(__webpack_require__(132));
+const tsconfig_1 = __webpack_require__(133);
+const versionProvider_1 = __webpack_require__(134);
+const versionStatus_1 = __importDefault(__webpack_require__(135));
+const wireProtocol_1 = __webpack_require__(136);
+class ForkedTsServerProcess {
+ constructor(childProcess) {
+ this.childProcess = childProcess;
+ this.toCancelOnResourceChange = new Set();
}
- execute(uri, name) {
- return __awaiter(this, void 0, void 0, function* () {
- yield modules_1.installModules(uri, [name]);
- });
+ onError(cb) {
+ this.childProcess.on('error', cb);
}
-}
-InstallModuleCommand.ID = '_tsserver.installModule';
-class InstallModuleProvider {
- constructor(client) {
- this.client = client;
- coc_nvim_1.commands.register(new InstallModuleCommand(), true);
+ onExit(cb) {
+ this.childProcess.on('exit', cb);
}
- provideCodeActions(document, _range, context, _token) {
- return __awaiter(this, void 0, void 0, function* () {
- const uri = coc_nvim_1.Uri.parse(document.uri);
- if (uri.scheme != 'file')
- return null;
- let { diagnostics } = context;
- let diags = diagnostics.filter(s => s.code == 2307);
- let names = diags.map(o => {
- let ms = o.message.match(/module\s'(.+)'\./);
- return ms ? ms[1] : null;
- });
- names = names.filter(s => s != null);
- if (!names.length)
- return null;
- let actions = [];
- for (let name of names) {
- let title = `install ${name}`;
- let command = {
- title: `install ${name}`,
- command: InstallModuleCommand.ID,
- arguments: [document.uri, name]
- };
- let codeAction = vscode_languageserver_protocol_1.CodeAction.create(title, command);
- actions.push(codeAction);
- }
- return actions;
- });
+ write(serverRequest) {
+ this.childProcess.stdin.write(JSON.stringify(serverRequest) + '\r\n', 'utf8');
+ }
+ createReader(callback, onError) {
+ // tslint:disable-next-line:no-unused-expression
+ new wireProtocol_1.Reader(this.childProcess.stdout, callback, onError);
+ }
+ kill() {
+ this.childProcess.kill();
}
}
-exports.default = InstallModuleProvider;
-
-
-/***/ }),
-/* 112 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.installModules = exports.distinct = exports.moduleExists = exports.runCommand = void 0;
-const child_process_1 = __webpack_require__(113);
-const path_1 = __importDefault(__webpack_require__(13));
-const coc_nvim_1 = __webpack_require__(1);
-function runCommand(cmd, cwd, timeout) {
- return new Promise((resolve, reject) => {
- let timer;
- if (timeout) {
- timer = setTimeout(() => {
- reject(new Error(`timeout after ${timeout}s`));
- }, timeout * 1000);
- }
- child_process_1.exec(cmd, { cwd }, (err, stdout) => {
- if (timer)
- clearTimeout(timer);
- if (err) {
- reject(new Error(`exited with ${err.code}`));
- return;
- }
- resolve(stdout);
+class TypeScriptServiceClient {
+ constructor(pluginManager, modeIds) {
+ this.pluginManager = pluginManager;
+ this.modeIds = modeIds;
+ this.state = coc_nvim_1.ServiceStat.Initial;
+ this.logger = new logger_1.default();
+ this.tsServerLogFile = null;
+ this.cancellationPipeName = null;
+ this._callbacks = new callbackMap_1.CallbackMap();
+ this._requestQueue = new requestQueue_1.RequestQueue();
+ this._pendingResponses = new Set();
+ this._onTsServerStarted = new vscode_languageserver_protocol_1.Emitter();
+ this._onProjectLanguageServiceStateChanged = new vscode_languageserver_protocol_1.Emitter();
+ this._onDidBeginInstallTypings = new vscode_languageserver_protocol_1.Emitter();
+ this._onDidEndInstallTypings = new vscode_languageserver_protocol_1.Emitter();
+ this._onTypesInstallerInitializationFailed = new vscode_languageserver_protocol_1.Emitter();
+ this.disposables = [];
+ this.isRestarting = false;
+ this._onDiagnosticsReceived = new vscode_languageserver_protocol_1.Emitter();
+ this._onConfigDiagnosticsReceived = new vscode_languageserver_protocol_1.Emitter();
+ this._onResendModelsRequested = new vscode_languageserver_protocol_1.Emitter();
+ this.pathSeparator = path_1.default.sep;
+ this.lastStart = Date.now();
+ this.servicePromise = null;
+ this.lastError = null;
+ this.numberRestarts = 0;
+ this.fileConfigurationManager = new fileConfigurationManager_1.default(this);
+ this._configuration = configuration_1.TypeScriptServiceConfiguration.loadFromWorkspace();
+ this.versionProvider = new versionProvider_1.TypeScriptVersionProvider(this._configuration);
+ this._apiVersion = api_1.default.defaultVersion;
+ this.tracer = new tracer_1.default(this.logger);
+ this.versionStatus = new versionStatus_1.default(this.normalizePath.bind(this), this.fileConfigurationManager.enableJavascript());
+ pluginManager.onDidUpdateConfig(update => {
+ this.configurePlugin(update.pluginId, update.config);
+ }, null, this.disposables);
+ pluginManager.onDidChangePlugins(() => {
+ this.restartTsServer();
+ }, null, this.disposables);
+ this.bufferSyncSupport = new bufferSyncSupport_1.default(this, modeIds);
+ this.onTsServerStarted(() => {
+ this.bufferSyncSupport.listen();
});
- });
-}
-exports.runCommand = runCommand;
-function getManager() {
- return __awaiter(this, void 0, void 0, function* () {
- let res = yield coc_nvim_1.workspace.findUp(['yarn.lock', 'package-lock.json']);
- if (!res)
- return 'yarn';
- return res.endsWith('yarn.lock') ? 'yarn' : 'npm';
- });
-}
-function getRoot() {
- return __awaiter(this, void 0, void 0, function* () {
- let res = yield coc_nvim_1.workspace.findUp(['package.json']);
- if (!res)
- return null;
- return path_1.default.dirname(res);
- });
-}
-function moduleExists(name) {
- return __awaiter(this, void 0, void 0, function* () {
- try {
- let content = yield runCommand(`npm info ${name} --json`, process.cwd());
- if (!content)
- return false;
- let obj = JSON.parse(content);
- if (obj.error != null)
- return false;
- return true;
+ this.diagnosticsManager = new diagnostics_1.DiagnosticsManager();
+ this.bufferSyncSupport.onDelete(resource => {
+ this.cancelInflightRequestsForResource(resource);
+ this.diagnosticsManager.delete(resource);
+ }, null, this.disposables);
+ this.bufferSyncSupport.onWillChange(resource => {
+ this.cancelInflightRequestsForResource(resource);
+ });
+ }
+ get onDiagnosticsReceived() {
+ return this._onDiagnosticsReceived.event;
+ }
+ get onConfigDiagnosticsReceived() {
+ return this._onConfigDiagnosticsReceived.event;
+ }
+ get onResendModelsRequested() {
+ return this._onResendModelsRequested.event;
+ }
+ get configuration() {
+ return this._configuration;
+ }
+ dispose() {
+ if (this.servicePromise) {
+ this.servicePromise
+ .then(childProcess => {
+ childProcess.kill();
+ })
+ .then(undefined, () => void 0);
}
- catch (e) {
- return false;
+ this.bufferSyncSupport.dispose();
+ this.logger.dispose();
+ this._onTsServerStarted.dispose();
+ this._onResendModelsRequested.dispose();
+ this.versionStatus.dispose();
+ }
+ info(message, data) {
+ this.logger.info(message, data);
+ }
+ error(message, data) {
+ this.logger.error(message, data);
+ }
+ restartTsServer() {
+ const start = () => {
+ this.servicePromise = this.startService(true);
+ return this.servicePromise;
+ };
+ if (this.servicePromise) {
+ return Promise.resolve(this.servicePromise.then(childProcess => {
+ this.state = coc_nvim_1.ServiceStat.Stopping;
+ this.info('Killing TS Server');
+ this.isRestarting = true;
+ childProcess.kill();
+ this.servicePromise = null;
+ }).then(start));
}
- return false;
- });
-}
-exports.moduleExists = moduleExists;
-/**
- * Removes duplicates from the given array. The optional keyFn allows to specify
- * how elements are checked for equalness by returning a unique string for each.
- */
-function distinct(array, keyFn) {
- if (!keyFn) {
- return array.filter((element, position) => {
- return array.indexOf(element) === position;
+ else {
+ return Promise.resolve(start());
+ }
+ }
+ stop() {
+ if (!this.servicePromise)
+ return;
+ return new Promise((resolve, reject) => {
+ this.servicePromise.then(childProcess => {
+ if (this.state == coc_nvim_1.ServiceStat.Running) {
+ this.info('Killing TS Server');
+ childProcess.onExit(() => {
+ resolve();
+ });
+ childProcess.kill();
+ this.servicePromise = null;
+ }
+ else {
+ resolve();
+ }
+ }, reject);
});
}
- const seen = Object.create(null);
- return array.filter(elem => {
- const key = keyFn(elem);
- if (seen[key]) {
- return false;
+ get onTsServerStarted() {
+ return this._onTsServerStarted.event;
+ }
+ get onProjectLanguageServiceStateChanged() {
+ return this._onProjectLanguageServiceStateChanged.event;
+ }
+ get onDidBeginInstallTypings() {
+ return this._onDidBeginInstallTypings.event;
+ }
+ get onDidEndInstallTypings() {
+ return this._onDidEndInstallTypings.event;
+ }
+ get onTypesInstallerInitializationFailed() {
+ return this._onTypesInstallerInitializationFailed.event;
+ }
+ get apiVersion() {
+ return this._apiVersion;
+ }
+ get tscPath() {
+ return this._tscPath;
+ }
+ service() {
+ if (this.servicePromise) {
+ return this.servicePromise;
}
- seen[key] = true;
- return true;
- });
-}
-exports.distinct = distinct;
-function installModules(uri, names) {
- return __awaiter(this, void 0, void 0, function* () {
- names = distinct(names);
- let root = yield getRoot();
- if (!root) {
- coc_nvim_1.workspace.showMessage(`package.json not found from cwd: ${coc_nvim_1.workspace.cwd}`, 'error');
- return;
+ if (this.lastError) {
+ return Promise.reject(this.lastError);
}
- let arr = names.concat(names.map(s => `@types/${s}`));
- let statusItem = coc_nvim_1.workspace.createStatusBarItem(99, { progress: true });
- statusItem.text = `Checking module ${arr.join(' ')}`;
- statusItem.show();
- let exists = yield Promise.all(arr.map(name => {
- return moduleExists(name).then(exists => {
- return exists ? name : null;
+ return this.startService().then(() => {
+ if (this.servicePromise) {
+ return this.servicePromise;
+ }
+ });
+ }
+ ensureServiceStarted() {
+ if (!this.servicePromise) {
+ this.startService().catch(err => {
+ coc_nvim_1.workspace.showMessage(`TSServer start failed: ${err.message}`, 'error');
+ this.error(`Service start failed: ${err.stack}`);
});
- }));
- let manager = yield getManager();
- exists = exists.filter(s => s != null);
- if (!exists.length)
- return;
- let devs = exists.filter(s => s.startsWith('@types'));
- let deps = exists.filter(s => devs.indexOf(s) == -1);
- statusItem.text = `Installing ${exists.join(' ')}`;
- try {
- yield Promise.all([deps, devs].map((names, i) => {
- let cmd = manager == 'npm' ? `npm i ${names.join(' ')}` : `yarn add ${names.join(' ')} --ignore-scripts --no-default-rc`;
- if (i == 1)
- cmd = cmd + ' --dev';
- return runCommand(cmd, root);
- }));
}
- catch (e) {
- statusItem.dispose();
- coc_nvim_1.workspace.showMessage(`Install error ${e.message}`, 'error');
+ }
+ async startService(resendModels = false) {
+ const { ignoreLocalTsserver } = this.configuration;
+ let currentVersion;
+ if (!ignoreLocalTsserver)
+ currentVersion = this.versionProvider.getLocalVersion();
+ if (!currentVersion || !fs_1.default.existsSync(currentVersion.tsServerPath)) {
+ currentVersion = this.versionProvider.getDefaultVersion();
+ }
+ if (!currentVersion || !currentVersion.isValid) {
+ if (this.configuration.globalTsdk) {
+ coc_nvim_1.workspace.showMessage(`Can not find typescript module, in 'tsserver.tsdk': ${this.configuration.globalTsdk}`, 'error');
+ }
+ else {
+ coc_nvim_1.workspace.showMessage(`Can not find typescript module, run ':CocInstall coc-tsserver' to fix it!`, 'error');
+ }
return;
}
- statusItem.dispose();
- coc_nvim_1.workspace.showMessage(`Installed: ${exists.join(' ')}`, 'more');
- });
-}
-exports.installModules = installModules;
-
-
-/***/ }),
-/* 113 */
-/***/ (function(module, exports) {
-
-module.exports = require("child_process");
-
-/***/ }),
-/* 114 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.OrganizeImportsCodeActionProvider = exports.OrganizeImportsCommand = void 0;
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-const coc_nvim_1 = __webpack_require__(1);
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const languageDescription_1 = __webpack_require__(115);
-const languageModeIds_1 = __webpack_require__(116);
-const typeconverts = __importStar(__webpack_require__(37));
-class OrganizeImportsCommand {
- constructor(client) {
- this.client = client;
- this.id = 'tsserver.organizeImports';
+ this._apiVersion = currentVersion.version;
+ this._tscPath = currentVersion.tscPath;
+ this.versionStatus.onDidChangeTypeScriptVersion(currentVersion);
+ this.lastError = null;
+ const tsServerForkArgs = await this.getTsServerArgs(currentVersion);
+ const debugPort = this._configuration.debugPort;
+ const maxTsServerMemory = this._configuration.maxTsServerMemory;
+ const options = {
+ execArgv: [
+ ...(debugPort ? [`--inspect=${debugPort}`] : []),
+ ...(maxTsServerMemory ? [`--max-old-space-size=${maxTsServerMemory}`] : []),
+ ],
+ cwd: coc_nvim_1.workspace.root
+ };
+ this.servicePromise = this.startProcess(currentVersion, tsServerForkArgs, options, resendModels);
+ return this.servicePromise;
}
- getTextEdits(document) {
- return __awaiter(this, void 0, void 0, function* () {
- let client = this.client;
- let file = client.toPath(document.uri);
- const args = {
- scope: {
- type: 'file',
- args: {
- file
+ startProcess(currentVersion, args, options, resendModels) {
+ this.state = coc_nvim_1.ServiceStat.Starting;
+ return new Promise((resolve, reject) => {
+ try {
+ process_1.fork(currentVersion.tsServerPath, args, options, this.logger, (err, childProcess) => {
+ if (err || !childProcess) {
+ this.state = coc_nvim_1.ServiceStat.StartFailed;
+ this.lastError = err;
+ this.error('Starting TSServer failed with error.', err.stack);
+ return;
}
- }
- };
- const response = yield this.client.interruptGetErr(() => this.client.execute('organizeImports', args, vscode_languageserver_protocol_1.CancellationToken.None));
- if (!response || response.type != 'response' || !response.success) {
- return;
+ this.state = coc_nvim_1.ServiceStat.Running;
+ this.info('Started TSServer', JSON.stringify(currentVersion, null, 2));
+ const handle = new ForkedTsServerProcess(childProcess);
+ this.tsServerProcess = handle;
+ this.lastStart = Date.now();
+ handle.onError((err) => {
+ this.lastError = err;
+ this.error('TSServer errored with error.', err);
+ this.error(`TSServer log file: ${this.tsServerLogFile || ''}`);
+ coc_nvim_1.workspace.showMessage(`TSServer errored with error. ${err.message}`, 'error');
+ this.serviceExited(false);
+ });
+ handle.onExit((code) => {
+ if (code == null) {
+ this.info('TSServer normal exit');
+ }
+ else {
+ this.error(`TSServer exited with code: ${code}`);
+ }
+ this.info(`TSServer log file: ${this.tsServerLogFile || ''}`);
+ this.serviceExited(!this.isRestarting);
+ this.isRestarting = false;
+ });
+ handle.createReader(msg => {
+ this.dispatchMessage(msg);
+ }, error => {
+ this.error('ReaderError', error);
+ });
+ resolve(handle);
+ this.serviceStarted(resendModels);
+ this._onTsServerStarted.fire(currentVersion.version);
+ });
}
- const edit = typeconverts.WorkspaceEdit.fromFileCodeEdits(client, response.body);
- let desc = languageDescription_1.standardLanguageDescriptions.find(o => o.modeIds.indexOf(document.languageId) !== -1);
- if (!desc)
- return null;
- return edit;
- });
- }
- execute(document) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!document) {
- let doc = yield coc_nvim_1.workspace.document;
- if (languageModeIds_1.languageIds.indexOf(doc.filetype) == -1)
- return;
- document = doc.textDocument;
+ catch (e) {
+ reject(e);
}
- let edit = yield this.getTextEdits(document);
- if (edit)
- yield coc_nvim_1.workspace.applyEdit(edit);
- return;
});
}
-}
-exports.OrganizeImportsCommand = OrganizeImportsCommand;
-class OrganizeImportsCodeActionProvider {
- // public static readonly minVersion = API.v280
- constructor(client, fileConfigManager) {
- this.client = client;
- this.fileConfigManager = fileConfigManager;
- this.metadata = {
- providedCodeActionKinds: [vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports]
+ async openTsServerLogFile() {
+ const isRoot = process.getuid && process.getuid() == 0;
+ let echoErr = (msg) => {
+ coc_nvim_1.workspace.showMessage(msg, 'error');
};
- }
- provideCodeActions(document, _range, context, _token) {
- if (languageModeIds_1.languageIds.indexOf(document.languageId) == -1)
- return;
- if (!context.only || !context.only.includes(vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports)) {
- return [];
+ if (isRoot) {
+ echoErr('Log disabled for root user.');
+ return false;
+ }
+ if (!this.apiVersion.gte(api_1.default.v222)) {
+ echoErr('TS Server logging requires TS 2.2.2+');
+ return false;
+ }
+ if (this._configuration.tsServerLogLevel === configuration_1.TsServerLogLevel.Off) {
+ echoErr(`TS Server logging is off. Change 'tsserver.log' in 'coc-settings.json' to enable`);
+ return false;
+ }
+ if (!this.tsServerLogFile) {
+ echoErr('TS Server has not started logging.');
+ return false;
+ }
+ try {
+ await coc_nvim_1.workspace.nvim.command(`edit ${this.tsServerLogFile}`);
+ return true;
+ }
+ catch (_a) {
+ echoErr('Could not open TS Server log file');
+ return false;
}
- const action = vscode_languageserver_protocol_1.CodeAction.create('Organize Imports', {
- title: '',
- command: 'tsserver.organizeImports',
- arguments: [document]
- }, vscode_languageserver_protocol_1.CodeActionKind.SourceOrganizeImports);
- return [action];
- }
-}
-exports.OrganizeImportsCodeActionProvider = OrganizeImportsCodeActionProvider;
-
-
-/***/ }),
-/* 115 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.standardLanguageDescriptions = void 0;
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-const languageModeIds = __importStar(__webpack_require__(116));
-exports.standardLanguageDescriptions = [
- {
- id: 'typescript',
- diagnosticSource: 'ts',
- diagnosticOwner: 'typescript',
- modeIds: [languageModeIds.typescript, languageModeIds.typescriptreact,
- languageModeIds.typescripttsx, languageModeIds.typescriptjsx],
- diagnosticLanguage: 1 /* TypeScript */,
- configFile: 'tsconfig.json'
- },
- {
- id: 'javascript',
- diagnosticSource: 'ts',
- diagnosticOwner: 'typescript',
- modeIds: [languageModeIds.javascript, languageModeIds.javascriptreact],
- diagnosticLanguage: 0 /* JavaScript */,
- configFile: 'jsconfig.json'
- }
-];
-
-
-/***/ }),
-/* 116 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.languageIds = exports.jsxTags = exports.javascriptjsx = exports.javascriptreact = exports.javascript = exports.typescriptjsx = exports.typescripttsx = exports.typescriptreact = exports.typescript = void 0;
-exports.typescript = 'typescript';
-exports.typescriptreact = 'typescriptreact';
-exports.typescripttsx = 'typescript.tsx';
-exports.typescriptjsx = 'typescript.jsx';
-exports.javascript = 'javascript';
-exports.javascriptreact = 'javascriptreact';
-exports.javascriptjsx = 'javascript.jsx';
-exports.jsxTags = 'jsx-tags';
-exports.languageIds = [exports.typescript, exports.typescriptreact, exports.javascript, exports.javascriptreact, exports.javascriptjsx, exports.typescripttsx, exports.jsxTags];
-
-
-/***/ }),
-/* 117 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const fs_1 = __importDefault(__webpack_require__(118));
-const os_1 = __importDefault(__webpack_require__(14));
-const path_1 = __importDefault(__webpack_require__(13));
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
-const which_1 = __importDefault(__webpack_require__(119));
-const coc_nvim_1 = __webpack_require__(1);
-const fileConfigurationManager_1 = __importDefault(__webpack_require__(93));
-const typescriptService_1 = __webpack_require__(123);
-const api_1 = __importDefault(__webpack_require__(40));
-const configuration_1 = __webpack_require__(124);
-const logger_1 = __importDefault(__webpack_require__(125));
-const process_1 = __webpack_require__(127);
-const tracer_1 = __importDefault(__webpack_require__(128));
-const tsconfig_1 = __webpack_require__(129);
-const versionProvider_1 = __webpack_require__(130);
-const versionStatus_1 = __importDefault(__webpack_require__(131));
-const wireProtocol_1 = __webpack_require__(132);
-const callbackMap_1 = __webpack_require__(133);
-const requestQueue_1 = __webpack_require__(134);
-const bufferSyncSupport_1 = __importDefault(__webpack_require__(135));
-const diagnostics_1 = __webpack_require__(137);
-class ForkedTsServerProcess {
- constructor(childProcess) {
- this.childProcess = childProcess;
- }
- onError(cb) {
- this.childProcess.on('error', cb);
- }
- onExit(cb) {
- this.childProcess.on('exit', cb);
}
- write(serverRequest) {
- this.childProcess.stdin.write(JSON.stringify(serverRequest) + '\r\n', 'utf8');
+ serviceStarted(resendModels) {
+ this.bufferSyncSupport.reset();
+ const watchOptions = this.apiVersion.gte(api_1.default.v380)
+ ? this.configuration.watchOptions
+ : undefined;
+ const configureOptions = {
+ hostInfo: 'coc-nvim',
+ preferences: {
+ providePrefixAndSuffixTextForRename: true,
+ allowRenameOfImportPath: true,
+ },
+ watchOptions
+ };
+ this.executeWithoutWaitingForResponse('configure', configureOptions); // tslint:disable-line
+ this.setCompilerOptionsForInferredProjects(this._configuration);
+ if (resendModels) {
+ this._onResendModelsRequested.fire(void 0);
+ this.fileConfigurationManager.reset();
+ this.diagnosticsManager.reInitialize();
+ this.bufferSyncSupport.reinitialize();
+ }
+ // Reconfigure any plugins
+ for (const [config, pluginName] of this.pluginManager.configurations()) {
+ this.configurePlugin(config, pluginName);
+ }
}
- createReader(callback, onError) {
- // tslint:disable-next-line:no-unused-expression
- new wireProtocol_1.Reader(this.childProcess.stdout, callback, onError);
+ setCompilerOptionsForInferredProjects(configuration) {
+ if (!this.apiVersion.gte(api_1.default.v206))
+ return;
+ const args = {
+ options: this.getCompilerOptionsForInferredProjects(configuration)
+ };
+ this.executeWithoutWaitingForResponse('compilerOptionsForInferredProjects', args); // tslint:disable-line
}
- kill() {
- this.childProcess.kill();
+ getCompilerOptionsForInferredProjects(configuration) {
+ return Object.assign(Object.assign({}, tsconfig_1.inferredProjectConfig(configuration)), { allowJs: true, allowSyntheticDefaultImports: true, allowNonTsExtensions: true });
}
-}
-class TypeScriptServiceClient {
- constructor(pluginManager) {
- this.pluginManager = pluginManager;
- this.state = coc_nvim_1.ServiceStat.Initial;
- this.logger = new logger_1.default();
+ serviceExited(restart) {
+ this.state = coc_nvim_1.ServiceStat.Stopped;
+ this.servicePromise = null;
this.tsServerLogFile = null;
- this.cancellationPipeName = null;
+ this._callbacks.destroy('Service died.');
this._callbacks = new callbackMap_1.CallbackMap();
this._requestQueue = new requestQueue_1.RequestQueue();
this._pendingResponses = new Set();
- this._onTsServerStarted = new vscode_languageserver_protocol_1.Emitter();
- this._onProjectLanguageServiceStateChanged = new vscode_languageserver_protocol_1.Emitter();
- this._onDidBeginInstallTypings = new vscode_languageserver_protocol_1.Emitter();
- this._onDidEndInstallTypings = new vscode_languageserver_protocol_1.Emitter();
- this._onTypesInstallerInitializationFailed = new vscode_languageserver_protocol_1.Emitter();
- this.disposables = [];
- this.isRestarting = false;
- this._onDiagnosticsReceived = new vscode_languageserver_protocol_1.Emitter();
- this._onConfigDiagnosticsReceived = new vscode_languageserver_protocol_1.Emitter();
- this._onResendModelsRequested = new vscode_languageserver_protocol_1.Emitter();
- this.pathSeparator = path_1.default.sep;
- this.lastStart = Date.now();
- this.servicePromise = null;
- this.lastError = null;
- this.numberRestarts = 0;
- this.fileConfigurationManager = new fileConfigurationManager_1.default(this);
- this._configuration = configuration_1.TypeScriptServiceConfiguration.loadFromWorkspace();
- this.versionProvider = new versionProvider_1.TypeScriptVersionProvider(this._configuration);
- this._apiVersion = api_1.default.defaultVersion;
- this.tracer = new tracer_1.default(this.logger);
- this.versionStatus = new versionStatus_1.default(this.normalizePath.bind(this), this.fileConfigurationManager.enableJavascript());
- pluginManager.onDidUpdateConfig(update => {
- this.configurePlugin(update.pluginId, update.config);
- }, null, this.disposables);
- pluginManager.onDidChangePlugins(() => {
- this.restartTsServer();
- }, null, this.disposables);
- this.bufferSyncSupport = new bufferSyncSupport_1.default(this);
- this.onTsServerStarted(() => {
- this.bufferSyncSupport.listen();
- });
- this.diagnosticsManager = new diagnostics_1.DiagnosticsManager();
- this.bufferSyncSupport.onDelete(resource => {
- this.diagnosticsManager.delete(resource);
- }, null, this.disposables);
- }
- get onDiagnosticsReceived() {
- return this._onDiagnosticsReceived.event;
+ if (restart) {
+ const diff = Date.now() - this.lastStart;
+ this.numberRestarts++;
+ let startService = true;
+ if (this.numberRestarts > 5) {
+ this.numberRestarts = 0;
+ if (diff < 10 * 1000 /* 10 seconds */) {
+ this.lastStart = Date.now();
+ startService = false;
+ coc_nvim_1.workspace.showMessage('The TypeScript language service died 5 times right after it got started.', 'error'); // tslint:disable-line
+ }
+ else if (diff < 60 * 1000 /* 1 Minutes */) {
+ this.lastStart = Date.now();
+ coc_nvim_1.workspace.showMessage('The TypeScript language service died unexpectedly 5 times in the last 5 Minutes.', 'error'); // tslint:disable-line
+ }
+ }
+ if (startService) {
+ this.startService(true); // tslint:disable-line
+ }
+ }
}
- get onConfigDiagnosticsReceived() {
- return this._onConfigDiagnosticsReceived.event;
+ toPath(uri) {
+ return this.normalizePath(coc_nvim_1.Uri.parse(uri));
}
- get onResendModelsRequested() {
- return this._onResendModelsRequested.event;
+ toOpenedFilePath(uri, options = {}) {
+ if (!this.bufferSyncSupport.ensureHasBuffer(uri)) {
+ if (!options.suppressAlertOnFailure) {
+ console.error(`Unexpected resource ${uri}`);
+ }
+ return undefined;
+ }
+ return this.toPath(uri);
}
- get configuration() {
- return this._configuration;
+ toResource(filepath) {
+ if (this._apiVersion.gte(api_1.default.v213)) {
+ if (filepath.startsWith('untitled:')) {
+ let resource = coc_nvim_1.Uri.parse(filepath);
+ if (this.inMemoryResourcePrefix) {
+ const dirName = path_1.default.dirname(resource.path);
+ const fileName = path_1.default.basename(resource.path);
+ if (fileName.startsWith(this.inMemoryResourcePrefix)) {
+ resource = resource.with({ path: path_1.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length)) });
+ }
+ }
+ return resource.toString();
+ }
+ }
+ return coc_nvim_1.Uri.file(filepath).toString();
}
- dispose() {
- if (this.servicePromise) {
- this.servicePromise
- .then(childProcess => {
- childProcess.kill();
- })
- .then(undefined, () => void 0);
+ normalizePath(resource) {
+ if (fileSchemes.disabledSchemes.has(resource.scheme)) {
+ return undefined;
+ }
+ switch (resource.scheme) {
+ case fileSchemes.file: {
+ let result = resource.fsPath;
+ if (!result)
+ return undefined;
+ result = path_1.default.normalize(result);
+ // Both \ and / must be escaped in regular expressions
+ return result.replace(new RegExp('\\' + this.pathSeparator, 'g'), '/');
+ }
+ default: {
+ return this.inMemoryResourcePrefix + resource.toString(true);
+ }
}
- this.bufferSyncSupport.dispose();
- coc_nvim_1.disposeAll(this.disposables);
- this.logger.dispose();
- this._onTsServerStarted.dispose();
- this._onResendModelsRequested.dispose();
- this.versionStatus.dispose();
}
- info(message, data) {
- this.logger.info(message, data);
+ get inMemoryResourcePrefix() {
+ return this._apiVersion.gte(api_1.default.v270) ? '^' : '';
}
- error(message, data) {
- this.logger.error(message, data);
+ asUrl(filepath) {
+ if (this._apiVersion.gte(api_1.default.v213)) {
+ if (filepath.startsWith('untitled:')) {
+ let resource = coc_nvim_1.Uri.parse(filepath);
+ if (this.inMemoryResourcePrefix) {
+ const dirName = path_1.default.dirname(resource.path);
+ const fileName = path_1.default.basename(resource.path);
+ if (fileName.startsWith(this.inMemoryResourcePrefix)) {
+ resource = resource.with({
+ path: path_1.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length))
+ });
+ }
+ }
+ return resource;
+ }
+ }
+ return coc_nvim_1.Uri.file(filepath);
}
- restartTsServer() {
- const start = () => {
- this.servicePromise = this.startService(true);
- return this.servicePromise;
- };
- if (this.servicePromise) {
- return Promise.resolve(this.servicePromise.then(childProcess => {
- this.state = coc_nvim_1.ServiceStat.Stopping;
- this.info('Killing TS Server');
- this.isRestarting = true;
- childProcess.kill();
- this.servicePromise = null;
- }).then(start));
+ execute(command, args, token, config) {
+ var _a;
+ let execution;
+ if (config === null || config === void 0 ? void 0 : config.cancelOnResourceChange) {
+ const source = new vscode_languageserver_protocol_1.CancellationTokenSource();
+ token.onCancellationRequested(() => source.cancel());
+ const inFlight = {
+ resource: config.cancelOnResourceChange,
+ cancel: () => source.cancel(),
+ };
+ (_a = this.tsServerProcess) === null || _a === void 0 ? void 0 : _a.toCancelOnResourceChange.add(inFlight);
+ execution = this.executeImpl(command, args, Object.assign({ isAsync: false, token: source.token, expectsResult: true }, config)).finally(() => {
+ var _a;
+ (_a = this.tsServerProcess) === null || _a === void 0 ? void 0 : _a.toCancelOnResourceChange.delete(inFlight);
+ source.dispose();
+ });
}
else {
- return Promise.resolve(start());
+ execution = this.executeImpl(command, args, Object.assign({ isAsync: false, token, expectsResult: true }, config));
}
+ if (config === null || config === void 0 ? void 0 : config.nonRecoverable) {
+ execution.catch(err => this.fatalError(command, err));
+ }
+ return execution;
}
- stop() {
- if (!this.servicePromise)
- return;
- return new Promise((resolve, reject) => {
- this.servicePromise.then(childProcess => {
- if (this.state == coc_nvim_1.ServiceStat.Running) {
- this.info('Killing TS Server');
- childProcess.onExit(() => {
- resolve();
- });
- childProcess.kill();
- this.servicePromise = null;
- }
- else {
- resolve();
- }
- }, reject);
- });
- }
- get onTsServerStarted() {
- return this._onTsServerStarted.event;
- }
- get onProjectLanguageServiceStateChanged() {
- return this._onProjectLanguageServiceStateChanged.event;
- }
- get onDidBeginInstallTypings() {
- return this._onDidBeginInstallTypings.event;
- }
- get onDidEndInstallTypings() {
- return this._onDidEndInstallTypings.event;
- }
- get onTypesInstallerInitializationFailed() {
- return this._onTypesInstallerInitializationFailed.event;
+ fatalError(command, error) {
+ console.error(`A non-recoverable error occured while executing tsserver command: ${command}`);
+ if (this.state === coc_nvim_1.ServiceStat.Running) {
+ this.info('Killing TS Server by fatal error:', error);
+ this.service().then(service => {
+ service.kill();
+ });
+ }
}
- get apiVersion() {
- return this._apiVersion;
+ executeAsync(command, args, token) {
+ return this.executeImpl(command, args, {
+ isAsync: true,
+ token,
+ expectsResult: true
+ });
}
- get tscPath() {
- return this._tscPath;
+ executeWithoutWaitingForResponse(command, args) {
+ this.executeImpl(command, args, {
+ isAsync: false,
+ token: undefined,
+ expectsResult: false
+ });
}
- service() {
- if (this.servicePromise) {
- return this.servicePromise;
+ executeImpl(command, args, executeInfo) {
+ if (this.servicePromise == null) {
+ return Promise.resolve(undefined);
}
- if (this.lastError) {
- return Promise.reject(this.lastError);
+ this.bufferSyncSupport.beforeCommand(command);
+ const request = this._requestQueue.createRequest(command, args);
+ const requestInfo = {
+ request,
+ expectsResponse: executeInfo.expectsResult,
+ isAsync: executeInfo.isAsync,
+ queueingType: getQueueingType(command, executeInfo.lowPriority)
+ };
+ let result;
+ if (executeInfo.expectsResult) {
+ result = new Promise((resolve, reject) => {
+ this._callbacks.add(request.seq, { onSuccess: resolve, onError: reject, startTime: Date.now(), isAsync: executeInfo.isAsync }, executeInfo.isAsync);
+ if (executeInfo.token) {
+ executeInfo.token.onCancellationRequested(() => {
+ this.tryCancelRequest(request.seq, command);
+ });
+ }
+ }).catch((err) => {
+ throw err;
+ });
}
- return this.startService().then(() => {
- if (this.servicePromise) {
- return this.servicePromise;
+ this._requestQueue.enqueue(requestInfo);
+ this.sendNextRequests();
+ return result;
+ }
+ sendNextRequests() {
+ while (this._pendingResponses.size === 0 && this._requestQueue.length > 0) {
+ const item = this._requestQueue.dequeue();
+ if (item) {
+ this.sendRequest(item);
}
- });
+ }
}
- ensureServiceStarted() {
- if (!this.servicePromise) {
- this.startService().catch(err => {
- coc_nvim_1.workspace.showMessage(`TSServer start failed: ${err.message}`, 'error');
- this.error(`Service start failed: ${err.stack}`);
- });
+ sendRequest(requestItem) {
+ const serverRequest = requestItem.request;
+ this.tracer.traceRequest(serverRequest, requestItem.expectsResponse, this._requestQueue.length);
+ if (requestItem.expectsResponse && !requestItem.isAsync) {
+ this._pendingResponses.add(requestItem.request.seq);
}
+ this.service().then(childProcess => {
+ try {
+ childProcess.write(serverRequest);
+ }
+ catch (err) {
+ const callback = this.fetchCallback(serverRequest.seq);
+ if (callback) {
+ callback.onError(err);
+ }
+ }
+ });
}
- startService(resendModels = false) {
- return __awaiter(this, void 0, void 0, function* () {
- const { ignoreLocalTsserver } = this.configuration;
- let currentVersion;
- if (!ignoreLocalTsserver)
- currentVersion = this.versionProvider.getLocalVersion();
- if (!currentVersion || !fs_1.default.existsSync(currentVersion.tsServerPath)) {
- currentVersion = this.versionProvider.getDefaultVersion();
+ tryCancelRequest(seq, command) {
+ try {
+ if (this._requestQueue.tryDeletePendingRequest(seq)) {
+ this.tracer.logTrace(`TypeScript Server: canceled request with sequence number ${seq}`);
+ return true;
}
- if (!currentVersion || !currentVersion.isValid) {
- if (this.configuration.globalTsdk) {
- coc_nvim_1.workspace.showMessage(`Can not find typescript module, in 'tsserver.tsdk': ${this.configuration.globalTsdk}`, 'error');
+ if (this.cancellationPipeName) {
+ this.tracer.logTrace(`TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`);
+ try {
+ fs_1.default.writeFileSync(this.cancellationPipeName + seq, '');
}
- else {
- coc_nvim_1.workspace.showMessage(`Can not find typescript module, run ':CocInstall coc-tsserver' to fix it!`, 'error');
+ catch (_a) {
+ // noop
}
- return;
+ return true;
}
- this._apiVersion = currentVersion.version;
- this._tscPath = currentVersion.tscPath;
- this.versionStatus.onDidChangeTypeScriptVersion(currentVersion);
- this.lastError = null;
- const tsServerForkArgs = yield this.getTsServerArgs();
- const debugPort = this._configuration.debugPort;
- const maxTsServerMemory = this._configuration.maxTsServerMemory;
- const options = {
- execArgv: [
- ...(debugPort ? [`--inspect=${debugPort}`] : []),
- ...(maxTsServerMemory ? [`--max-old-space-size=${maxTsServerMemory}`] : []),
- ],
- cwd: coc_nvim_1.workspace.root
- };
- this.servicePromise = this.startProcess(currentVersion, tsServerForkArgs, options, resendModels);
- return this.servicePromise;
- });
+ this.tracer.logTrace(`TypeScript Server: tried to cancel request with sequence number ${seq}. But request got already delivered.`);
+ return false;
+ }
+ finally {
+ const callback = this.fetchCallback(seq);
+ if (callback) {
+ callback.onSuccess(new typescriptService_1.ServerResponse.Cancelled(`Cancelled request ${seq} - ${command}`));
+ }
+ }
}
- startProcess(currentVersion, args, options, resendModels) {
- this.state = coc_nvim_1.ServiceStat.Starting;
- return new Promise((resolve, reject) => {
- try {
- process_1.fork(currentVersion.tsServerPath, args, options, this.logger, (err, childProcess) => {
- if (err || !childProcess) {
- this.state = coc_nvim_1.ServiceStat.StartFailed;
- this.lastError = err;
- this.error('Starting TSServer failed with error.', err.stack);
- return;
- }
- this.state = coc_nvim_1.ServiceStat.Running;
- this.info('Started TSServer', JSON.stringify(currentVersion, null, 2));
- const handle = new ForkedTsServerProcess(childProcess);
- this.lastStart = Date.now();
- handle.onError((err) => {
- this.lastError = err;
- this.error('TSServer errored with error.', err);
- this.error(`TSServer log file: ${this.tsServerLogFile || ''}`);
- coc_nvim_1.workspace.showMessage(`TSServer errored with error. ${err.message}`, 'error');
- this.serviceExited(false);
- });
- handle.onExit((code) => {
- if (code == null) {
- this.info('TSServer normal exit');
- }
- else {
- this.error(`TSServer exited with code: ${code}`);
+ fetchCallback(seq) {
+ const callback = this._callbacks.fetch(seq);
+ if (!callback) {
+ return undefined;
+ }
+ this._pendingResponses.delete(seq);
+ return callback;
+ }
+ dispatchMessage(message) {
+ try {
+ switch (message.type) {
+ case 'response':
+ this.dispatchResponse(message);
+ break;
+ case 'event':
+ const event = message;
+ if (event.event === 'requestCompleted') {
+ const seq = event.body.request_seq;
+ const p = this._callbacks.fetch(seq);
+ if (p) {
+ this.tracer.traceRequestCompleted('requestCompleted', seq, p.startTime);
+ p.onSuccess(undefined);
}
- this.info(`TSServer log file: ${this.tsServerLogFile || ''}`);
- this.serviceExited(!this.isRestarting);
- this.isRestarting = false;
- });
- handle.createReader(msg => {
- this.dispatchMessage(msg);
- }, error => {
- this.error('ReaderError', error);
- });
- resolve(handle);
- this.serviceStarted(resendModels);
- this._onTsServerStarted.fire(currentVersion.version);
- });
- }
- catch (e) {
- reject(e);
+ }
+ else {
+ this.tracer.traceEvent(event);
+ this.dispatchEvent(event);
+ }
+ break;
+ default:
+ throw new Error(`Unknown message type ${message.type} received`);
}
- });
+ }
+ finally {
+ this.sendNextRequests();
+ }
}
- openTsServerLogFile() {
- return __awaiter(this, void 0, void 0, function* () {
- const isRoot = process.getuid && process.getuid() == 0;
- let echoErr = (msg) => {
- coc_nvim_1.workspace.showMessage(msg, 'error');
- };
- if (isRoot) {
- echoErr('Log disabled for root user.');
- return false;
+ dispatchResponse(response) {
+ const callback = this.fetchCallback(response.request_seq);
+ if (!callback) {
+ return;
+ }
+ this.tracer.traceResponse(response, callback.startTime);
+ if (response.success) {
+ callback.onSuccess(response);
+ }
+ else if (response.message === 'No content available.') {
+ // Special case where response itself is successful but there is not any data to return.
+ callback.onSuccess(typescriptService_1.ServerResponse.NoContent);
+ }
+ else {
+ callback.onError(new Error(response.message));
+ }
+ }
+ dispatchEvent(event) {
+ switch (event.event) {
+ case 'syntaxDiag':
+ case 'semanticDiag':
+ case 'suggestionDiag':
+ const diagnosticEvent = event;
+ if (diagnosticEvent.body && diagnosticEvent.body.diagnostics) {
+ this._onDiagnosticsReceived.fire({
+ kind: getDiagnosticsKind(event),
+ resource: this.asUrl(diagnosticEvent.body.file),
+ diagnostics: diagnosticEvent.body.diagnostics
+ });
+ }
+ break;
+ case 'configFileDiag':
+ this._onConfigDiagnosticsReceived.fire(event);
+ break;
+ case 'projectLanguageServiceState':
+ if (event.body) {
+ this._onProjectLanguageServiceStateChanged.fire(event.body);
+ }
+ break;
+ case 'beginInstallTypes':
+ if (event.body) {
+ this._onDidBeginInstallTypings.fire(event.body);
+ }
+ break;
+ case 'endInstallTypes':
+ if (event.body) {
+ this._onDidEndInstallTypings.fire(event.body);
+ }
+ break;
+ case 'projectsUpdatedInBackground':
+ const body = event.body;
+ const resources = body.openFiles.map(coc_nvim_1.Uri.file);
+ this.bufferSyncSupport.getErr(resources);
+ break;
+ case 'typesInstallerInitializationFailed':
+ if (event.body) {
+ this._onTypesInstallerInitializationFailed.fire(event.body);
+ }
+ break;
+ case 'projectLoadingStart':
+ this.versionStatus.loading = true;
+ break;
+ case 'projectLoadingFinish':
+ this.versionStatus.loading = false;
+ break;
+ }
+ }
+ async getTsServerArgs(currentVersion) {
+ const args = [];
+ args.push('--allowLocalPluginLoads');
+ if (this.apiVersion.gte(api_1.default.v250)) {
+ args.push('--useInferredProjectPerProjectRoot');
+ }
+ else {
+ args.push('--useSingleInferredProject');
+ }
+ if (this.apiVersion.gte(api_1.default.v206) && this._configuration.disableAutomaticTypeAcquisition) {
+ args.push('--disableAutomaticTypingAcquisition');
+ }
+ if (this.apiVersion.gte(api_1.default.v222)) {
+ this.cancellationPipeName = process_1.getTempFile(`tscancellation-${process_1.makeRandomHexString(20)}`);
+ args.push('--cancellationPipeName', this.cancellationPipeName + '*');
+ }
+ if (this.apiVersion.gte(api_1.default.v222)) {
+ const isRoot = process.getuid && process.getuid() == 0;
+ if (this._configuration.tsServerLogLevel !== configuration_1.TsServerLogLevel.Off && !isRoot) {
+ const logDir = process_1.getTempDirectory();
+ if (logDir) {
+ this.tsServerLogFile = path_1.default.join(logDir, `tsserver.log`);
+ this.info('TSServer log file :', this.tsServerLogFile);
+ }
+ else {
+ this.tsServerLogFile = null;
+ this.error('Could not create TSServer log directory');
+ }
+ if (this.tsServerLogFile) {
+ args.push('--logVerbosity', configuration_1.TsServerLogLevel.toString(this._configuration.tsServerLogLevel));
+ args.push('--logFile', this.tsServerLogFile);
+ }
}
- if (!this.apiVersion.gte(api_1.default.v222)) {
- echoErr('TS Server logging requires TS 2.2.2+');
- return false;
+ }
+ if (this.apiVersion.gte(api_1.default.v230)) {
+ const pluginNames = this.pluginManager.plugins.map(x => x.name);
+ let pluginPaths = this._configuration.tsServerPluginPaths;
+ pluginPaths = pluginPaths.reduce((p, c) => {
+ if (path_1.default.isAbsolute(c)) {
+ p.push(c);
+ }
+ else {
+ let roots = coc_nvim_1.workspace.workspaceFolders.map(o => coc_nvim_1.Uri.parse(o.uri).fsPath);
+ p.push(...roots.map(r => path_1.default.join(r, c)));
+ }
+ return p;
+ }, []);
+ if (pluginNames.length) {
+ const isUsingBundledTypeScriptVersion = currentVersion.path == this.versionProvider.bundledVersion.path;
+ args.push('--globalPlugins', pluginNames.join(','));
+ for (const plugin of this.pluginManager.plugins) {
+ if (isUsingBundledTypeScriptVersion || plugin.enableForWorkspaceTypeScriptVersions) {
+ pluginPaths.push(plugin.path);
+ }
+ }
}
- if (this._configuration.tsServerLogLevel === configuration_1.TsServerLogLevel.Off) {
- echoErr(`TS Server logging is off. Change 'tsserver.log' in 'coc-settings.json' to enable`);
- return false;
+ if (pluginPaths.length) {
+ args.push('--pluginProbeLocations', pluginPaths.join(','));
}
- if (!this.tsServerLogFile) {
- echoErr('TS Server has not started logging.');
- return false;
+ }
+ if (this._configuration.locale) {
+ args.push('--locale', this._configuration.locale);
+ }
+ if (this._configuration.typingsCacheLocation) {
+ args.push('--globalTypingsCacheLocation', `"${this._configuration.typingsCacheLocation}"`);
+ }
+ if (this.apiVersion.gte(api_1.default.v234)) {
+ let { npmLocation } = this._configuration;
+ if (npmLocation) {
+ this.logger.info(`using npm from ${npmLocation}`);
+ args.push('--npmLocation', `"${npmLocation}"`);
}
- try {
- yield coc_nvim_1.workspace.nvim.command(`edit ${this.tsServerLogFile}`);
- return true;
+ }
+ if (this.apiVersion.gte(api_1.default.v291)) {
+ args.push('--noGetErrOnBackgroundUpdate');
+ }
+ if (this.apiVersion.gte(api_1.default.v345)) {
+ args.push('--validateDefaultNpmLocation');
+ }
+ return args;
+ }
+ getProjectRootPath(uri) {
+ let root = coc_nvim_1.workspace.cwd;
+ let u = coc_nvim_1.Uri.parse(uri);
+ if (u.scheme !== 'file')
+ return undefined;
+ let folder = coc_nvim_1.workspace.getWorkspaceFolder(uri);
+ if (folder) {
+ root = coc_nvim_1.Uri.parse(folder.uri).fsPath;
+ }
+ else {
+ let filepath = coc_nvim_1.Uri.parse(uri).fsPath;
+ if (!filepath.startsWith(root)) {
+ root = path_1.default.dirname(filepath);
}
- catch (_a) {
- echoErr('Could not open TS Server log file');
- return false;
+ }
+ if (root == os_1.default.homedir())
+ return undefined;
+ return root;
+ }
+ configurePlugin(pluginName, configuration) {
+ if (this.apiVersion.gte(api_1.default.v314)) {
+ if (!this.servicePromise)
+ return;
+ this.servicePromise.then(() => {
+ // tslint:disable-next-line: no-floating-promises
+ this.executeWithoutWaitingForResponse('configurePlugin', { pluginName, configuration });
+ });
+ }
+ }
+ interruptGetErr(f) {
+ return this.bufferSyncSupport.interuptGetErr(f);
+ }
+ cancelInflightRequestsForResource(resource) {
+ if (this.state !== coc_nvim_1.ServiceStat.Running || !this.tsServerProcess) {
+ return;
+ }
+ for (const request of this.tsServerProcess.toCancelOnResourceChange) {
+ if (request.resource.toString() === resource.toString()) {
+ request.cancel();
}
- });
+ }
}
- serviceStarted(resendModels) {
- const watchOptions = this.apiVersion.gte(api_1.default.v380)
- ? this.configuration.watchOptions
- : undefined;
- const configureOptions = {
- hostInfo: 'coc-nvim',
- preferences: {
- providePrefixAndSuffixTextForRename: true,
- allowRenameOfImportPath: true,
- },
- watchOptions
- };
- this.executeWithoutWaitingForResponse('configure', configureOptions); // tslint:disable-line
- this.setCompilerOptionsForInferredProjects(this._configuration);
- if (resendModels) {
- this._onResendModelsRequested.fire(void 0);
- this.diagnosticsManager.reInitialize();
- this.bufferSyncSupport.reinitialize();
+}
+exports.default = TypeScriptServiceClient;
+function getDiagnosticsKind(event) {
+ switch (event.event) {
+ case 'syntaxDiag':
+ return diagnostics_1.DiagnosticKind.Syntax;
+ case 'semanticDiag':
+ return diagnostics_1.DiagnosticKind.Semantic;
+ case 'suggestionDiag':
+ return diagnostics_1.DiagnosticKind.Suggestion;
+ }
+ throw new Error('Unknown dignostics kind');
+}
+const fenceCommands = new Set(['change', 'close', 'open']);
+function getQueueingType(command, lowPriority) {
+ if (fenceCommands.has(command)) {
+ return requestQueue_1.RequestQueueingType.Fence;
+ }
+ return lowPriority ? requestQueue_1.RequestQueueingType.LowPriority : requestQueue_1.RequestQueueingType.Normal;
+}
+
+
+/***/ }),
+/* 115 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.disabledSchemes = exports.semanticSupportedSchemes = exports.walkThroughSnippet = exports.vsls = exports.git = exports.untitled = exports.file = void 0;
+exports.file = 'file';
+exports.untitled = 'untitled';
+exports.git = 'git';
+/** Live share scheme */
+exports.vsls = 'vsls';
+exports.walkThroughSnippet = 'walkThroughSnippet';
+exports.semanticSupportedSchemes = [
+ exports.file,
+ exports.untitled,
+ exports.walkThroughSnippet,
+];
+/**
+ * File scheme for which JS/TS language feature should be disabled
+ */
+exports.disabledSchemes = new Set([
+ exports.git,
+ exports.vsls
+]);
+
+
+/***/ }),
+/* 116 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CallbackMap = void 0;
+const typescriptService_1 = __webpack_require__(117);
+class CallbackMap {
+ constructor() {
+ this._callbacks = new Map();
+ this._asyncCallbacks = new Map();
+ }
+ destroy(cause) {
+ const cancellation = new typescriptService_1.ServerResponse.Cancelled(cause);
+ for (const callback of this._callbacks.values()) {
+ callback.onSuccess(cancellation);
}
- // Reconfigure any plugins
- for (const [config, pluginName] of this.pluginManager.configurations()) {
- this.configurePlugin(config, pluginName);
+ this._callbacks.clear();
+ for (const callback of this._asyncCallbacks.values()) {
+ callback.onSuccess(cancellation);
}
+ this._asyncCallbacks.clear();
}
- setCompilerOptionsForInferredProjects(configuration) {
- if (!this.apiVersion.gte(api_1.default.v206))
- return;
- const args = {
- options: this.getCompilerOptionsForInferredProjects(configuration)
- };
- this.executeWithoutWaitingForResponse('compilerOptionsForInferredProjects', args); // tslint:disable-line
+ add(seq, callback, isAsync) {
+ if (isAsync) {
+ this._asyncCallbacks.set(seq, callback);
+ }
+ else {
+ this._callbacks.set(seq, callback);
+ }
}
- getCompilerOptionsForInferredProjects(configuration) {
- return Object.assign(Object.assign({}, tsconfig_1.inferredProjectConfig(configuration)), { allowJs: true, allowSyntheticDefaultImports: true, allowNonTsExtensions: true });
+ fetch(seq) {
+ const callback = this._callbacks.get(seq) || this._asyncCallbacks.get(seq);
+ this.delete(seq);
+ return callback;
}
- serviceExited(restart) {
- this.state = coc_nvim_1.ServiceStat.Stopped;
- this.servicePromise = null;
- this.tsServerLogFile = null;
- this._callbacks.destroy('Service died.');
- this._callbacks = new callbackMap_1.CallbackMap();
- this._requestQueue = new requestQueue_1.RequestQueue();
- this._pendingResponses = new Set();
- if (restart) {
- const diff = Date.now() - this.lastStart;
- this.numberRestarts++;
- let startService = true;
- if (this.numberRestarts > 5) {
- this.numberRestarts = 0;
- if (diff < 10 * 1000 /* 10 seconds */) {
- this.lastStart = Date.now();
- startService = false;
- coc_nvim_1.workspace.showMessage('The TypeScript language service died 5 times right after it got started.', 'error'); // tslint:disable-line
- }
- else if (diff < 60 * 1000 /* 1 Minutes */) {
- this.lastStart = Date.now();
- coc_nvim_1.workspace.showMessage('The TypeScript language service died unexpectedly 5 times in the last 5 Minutes.', 'error'); // tslint:disable-line
- }
- }
- if (startService) {
- this.startService(true); // tslint:disable-line
- }
+ delete(seq) {
+ if (!this._callbacks.delete(seq)) {
+ this._asyncCallbacks.delete(seq);
}
}
- toPath(uri) {
- return this.normalizePath(coc_nvim_1.Uri.parse(uri));
+}
+exports.CallbackMap = CallbackMap;
+
+
+/***/ }),
+/* 117 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ExectuionTarget = exports.ServerResponse = void 0;
+var ServerResponse;
+(function (ServerResponse) {
+ class Cancelled {
+ constructor(reason) {
+ this.reason = reason;
+ this.type = 'cancelled';
+ }
+ }
+ ServerResponse.Cancelled = Cancelled;
+ // tslint:disable-next-line: new-parens
+ ServerResponse.NoContent = new class {
+ constructor() {
+ this.type = 'noContent';
+ }
+ };
+})(ServerResponse = exports.ServerResponse || (exports.ServerResponse = {}));
+var ExectuionTarget;
+(function (ExectuionTarget) {
+ ExectuionTarget[ExectuionTarget["Semantic"] = 0] = "Semantic";
+ ExectuionTarget[ExectuionTarget["Syntax"] = 1] = "Syntax";
+})(ExectuionTarget = exports.ExectuionTarget || (exports.ExectuionTarget = {}));
+
+
+/***/ }),
+/* 118 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+const coc_nvim_1 = __webpack_require__(1);
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const api_1 = __importDefault(__webpack_require__(40));
+const async_1 = __webpack_require__(119);
+const typeConverters = __importStar(__webpack_require__(37));
+const languageModeIds_1 = __webpack_require__(120);
+const resourceMap_1 = __webpack_require__(121);
+class CloseOperation {
+ constructor(args) {
+ this.args = args;
+ this.type = 0 /* Close */;
}
- toResource(filepath) {
- if (this._apiVersion.gte(api_1.default.v213)) {
- if (filepath.startsWith('untitled:')) {
- let resource = coc_nvim_1.Uri.parse(filepath);
- if (this.inMemoryResourcePrefix) {
- const dirName = path_1.default.dirname(resource.path);
- const fileName = path_1.default.basename(resource.path);
- if (fileName.startsWith(this.inMemoryResourcePrefix)) {
- resource = resource.with({ path: path_1.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length)) });
- }
- }
- return resource.toString();
- }
- }
- return coc_nvim_1.Uri.file(filepath).toString();
+}
+class OpenOperation {
+ constructor(args) {
+ this.args = args;
+ this.type = 1 /* Open */;
}
- normalizePath(resource) {
- if (this._apiVersion.gte(api_1.default.v213)) {
- if (resource.scheme == 'untitled') {
- const dirName = path_1.default.dirname(resource.path);
- const fileName = this.inMemoryResourcePrefix + path_1.default.basename(resource.path);
- return resource
- .with({ path: path_1.default.posix.join(dirName, fileName) })
- .toString(true);
- }
- }
- const result = resource.fsPath;
- if (!result)
- return null;
- // Both \ and / must be escaped in regular expressions
- return result.replace(new RegExp('\\' + this.pathSeparator, 'g'), '/');
+}
+class ChangeOperation {
+ constructor(args) {
+ this.args = args;
+ this.type = 2 /* Change */;
}
- get inMemoryResourcePrefix() {
- return this._apiVersion.gte(api_1.default.v270) ? '^' : '';
+}
+class SyncedBuffer {
+ constructor(document, filepath, client, synchronizer) {
+ this.document = document;
+ this.filepath = filepath;
+ this.client = client;
+ this.synchronizer = synchronizer;
+ this.state = 1 /* Initial */;
}
- asUrl(filepath) {
- if (this._apiVersion.gte(api_1.default.v213)) {
- if (filepath.startsWith('untitled:')) {
- let resource = coc_nvim_1.Uri.parse(filepath);
- if (this.inMemoryResourcePrefix) {
- const dirName = path_1.default.dirname(resource.path);
- const fileName = path_1.default.basename(resource.path);
- if (fileName.startsWith(this.inMemoryResourcePrefix)) {
- resource = resource.with({
- path: path_1.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length))
- });
- }
- }
- return resource;
+ open() {
+ const args = {
+ file: this.filepath,
+ fileContent: this.document.getText(),
+ projectRootPath: this.client.getProjectRootPath(this.document.uri),
+ };
+ const scriptKind = languageModeIds_1.mode2ScriptKind(this.document.languageId);
+ if (scriptKind) {
+ args.scriptKindName = scriptKind;
+ }
+ if (this.client.apiVersion.gte(api_1.default.v240)) {
+ // plugin managed.
+ const tsPluginsForDocument = this.client.pluginManager.plugins
+ .filter(x => x.languages.indexOf(this.document.languageId) >= 0);
+ if (tsPluginsForDocument.length) {
+ args.plugins = tsPluginsForDocument.map(plugin => plugin.name);
}
}
- return coc_nvim_1.Uri.file(filepath);
- }
- execute(command, args, token, lowPriority) {
- return this.executeImpl(command, args, {
- isAsync: false,
- token,
- expectsResult: true,
- lowPriority
- });
+ this.synchronizer.open(this.resource, args);
+ this.state = 2 /* Open */;
}
- executeAsync(command, args, token) {
- return this.executeImpl(command, args, {
- isAsync: true,
- token,
- expectsResult: true
- });
+ get resource() {
+ return this.document.uri;
}
- executeWithoutWaitingForResponse(command, args) {
- this.executeImpl(command, args, {
- isAsync: false,
- token: undefined,
- expectsResult: false
- });
+ get lineCount() {
+ return this.document.lineCount;
}
- executeImpl(command, args, executeInfo) {
- if (this.servicePromise == null) {
- return Promise.resolve(undefined);
- }
- this.bufferSyncSupport.beforeCommand(command);
- const request = this._requestQueue.createRequest(command, args);
- const requestInfo = {
- request,
- expectsResponse: executeInfo.expectsResult,
- isAsync: executeInfo.isAsync,
- queueingType: getQueueingType(command, executeInfo.lowPriority)
- };
- let result;
- if (executeInfo.expectsResult) {
- result = new Promise((resolve, reject) => {
- this._callbacks.add(request.seq, { onSuccess: resolve, onError: reject, startTime: Date.now(), isAsync: executeInfo.isAsync }, executeInfo.isAsync);
- if (executeInfo.token) {
- executeInfo.token.onCancellationRequested(() => {
- this.tryCancelRequest(request.seq, command);
- });
- }
- }).catch((err) => {
- throw err;
- });
+ get kind() {
+ if (this.document.languageId.startsWith('javascript')) {
+ return 2 /* JavaScript */;
}
- this._requestQueue.enqueue(requestInfo);
- this.sendNextRequests();
- return result;
+ return 1 /* TypeScript */;
}
- sendNextRequests() {
- while (this._pendingResponses.size === 0 && this._requestQueue.length > 0) {
- const item = this._requestQueue.dequeue();
- if (item) {
- this.sendRequest(item);
- }
+ /**
+ * @return Was the buffer open?
+ */
+ close() {
+ if (this.state !== 2 /* Open */) {
+ this.state = 2 /* Closed */;
+ return false;
}
+ this.state = 2 /* Closed */;
+ return this.synchronizer.close(this.resource, this.filepath);
}
- sendRequest(requestItem) {
- const serverRequest = requestItem.request;
- this.tracer.traceRequest(serverRequest, requestItem.expectsResponse, this._requestQueue.length);
- if (requestItem.expectsResponse && !requestItem.isAsync) {
- this._pendingResponses.add(requestItem.request.seq);
+ onContentChanged(events) {
+ if (this.state !== 2 /* Open */) {
+ console.error(`Unexpected buffer state: ${this.state}`);
}
- this.service().then(childProcess => {
- try {
- childProcess.write(serverRequest);
- }
- catch (err) {
- const callback = this.fetchCallback(serverRequest.seq);
- if (callback) {
- callback.onError(err);
- }
- }
- });
+ this.synchronizer.change(this.resource, this.filepath, events);
}
- tryCancelRequest(seq, command) {
- try {
- if (this._requestQueue.tryDeletePendingRequest(seq)) {
- this.tracer.logTrace(`TypeScript Server: canceled request with sequence number ${seq}`);
- return true;
- }
- if (this.cancellationPipeName) {
- this.tracer.logTrace(`TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`);
- try {
- fs_1.default.writeFileSync(this.cancellationPipeName + seq, '');
- }
- catch (_a) {
- // noop
- }
- return true;
- }
- this.tracer.logTrace(`TypeScript Server: tried to cancel request with sequence number ${seq}. But request got already delivered.`);
- return false;
- }
- finally {
- const callback = this.fetchCallback(seq);
- if (callback) {
- callback.onSuccess(new typescriptService_1.ServerResponse.Cancelled(`Cancelled request ${seq} - ${command}`));
- }
+}
+class SyncedBufferMap extends resourceMap_1.ResourceMap {
+ getForPath(filePath) {
+ return this.get(coc_nvim_1.Uri.file(filePath).toString());
+ }
+ get allBuffers() {
+ return this.values;
+ }
+}
+class PendingDiagnostics extends resourceMap_1.ResourceMap {
+ getOrderedFileSet() {
+ const orderedResources = Array.from(this.entries)
+ .sort((a, b) => a.value - b.value)
+ .map(entry => entry.uri);
+ const map = new resourceMap_1.ResourceMap(this._normalizePath);
+ for (const resource of orderedResources) {
+ map.set(resource, undefined);
}
+ return map;
}
- fetchCallback(seq) {
- const callback = this._callbacks.fetch(seq);
- if (!callback) {
- return undefined;
+}
+/**
+ * Manages synchronization of buffers with the TS server.
+ *
+ * If supported, batches together file changes. This allows the TS server to more efficiently process changes.
+ */
+class BufferSynchronizer {
+ constructor(client, pathNormalizer) {
+ this.client = client;
+ this._pending = new resourceMap_1.ResourceMap(pathNormalizer);
+ }
+ open(resource, args) {
+ if (this.supportsBatching) {
+ this.updatePending(resource, new OpenOperation(args));
+ }
+ else {
+ this.client.executeWithoutWaitingForResponse('open', args);
}
- this._pendingResponses.delete(seq);
- return callback;
}
- dispatchMessage(message) {
- try {
- switch (message.type) {
- case 'response':
- this.dispatchResponse(message);
- break;
- case 'event':
- const event = message;
- if (event.event === 'requestCompleted') {
- const seq = event.body.request_seq;
- const p = this._callbacks.fetch(seq);
- if (p) {
- this.tracer.traceRequestCompleted('requestCompleted', seq, p.startTime);
- p.onSuccess(undefined);
- }
- }
- else {
- this.tracer.traceEvent(event);
- this.dispatchEvent(event);
- }
- break;
- default:
- throw new Error(`Unknown message type ${message.type} received`);
- }
+ /**
+ * @return Was the buffer open?
+ */
+ close(resource, filepath) {
+ if (this.supportsBatching) {
+ return this.updatePending(resource, new CloseOperation(filepath));
}
- finally {
- this.sendNextRequests();
+ else {
+ const args = { file: filepath };
+ this.client.executeWithoutWaitingForResponse('close', args);
+ return true;
}
}
- dispatchResponse(response) {
- const callback = this.fetchCallback(response.request_seq);
- if (!callback) {
+ change(resource, filepath, events) {
+ if (!events.length) {
return;
}
- this.tracer.traceResponse(response, callback.startTime);
- if (response.success) {
- callback.onSuccess(response);
- }
- else if (response.message === 'No content available.') {
- // Special case where response itself is successful but there is not any data to return.
- callback.onSuccess(typescriptService_1.ServerResponse.NoContent);
+ if (this.supportsBatching) {
+ this.updatePending(resource, new ChangeOperation({
+ fileName: filepath,
+ textChanges: events.map((change) => ({
+ newText: change.text,
+ start: typeConverters.Position.toLocation(change.range.start),
+ end: typeConverters.Position.toLocation(change.range.end),
+ })).reverse(),
+ }));
}
else {
- callback.onError(new Error(response.message));
+ for (const { range, text } of events) {
+ const args = Object.assign({ insertString: text }, typeConverters.Range.toFormattingRequestArgs(filepath, range));
+ this.client.executeWithoutWaitingForResponse('change', args);
+ }
}
}
- dispatchEvent(event) {
- switch (event.event) {
- case 'syntaxDiag':
- case 'semanticDiag':
- case 'suggestionDiag':
- const diagnosticEvent = event;
- if (diagnosticEvent.body && diagnosticEvent.body.diagnostics) {
- this._onDiagnosticsReceived.fire({
- kind: getDiagnosticsKind(event),
- resource: this.asUrl(diagnosticEvent.body.file),
- diagnostics: diagnosticEvent.body.diagnostics
- });
- }
- break;
- case 'configFileDiag':
- this._onConfigDiagnosticsReceived.fire(event);
- break;
- case 'projectLanguageServiceState':
- if (event.body) {
- this._onProjectLanguageServiceStateChanged.fire(event.body);
- }
- break;
- case 'beginInstallTypes':
- if (event.body) {
- this._onDidBeginInstallTypings.fire(event.body);
- }
- break;
- case 'endInstallTypes':
- if (event.body) {
- this._onDidEndInstallTypings.fire(event.body);
- }
- break;
- case 'projectsUpdatedInBackground':
- const body = event.body;
- const resources = body.openFiles.map(coc_nvim_1.Uri.file);
- this.bufferSyncSupport.getErr(resources);
- break;
- case 'typesInstallerInitializationFailed':
- if (event.body) {
- this._onTypesInstallerInitializationFailed.fire(event.body);
- }
- break;
- case 'projectLoadingStart':
- this.versionStatus.loading = true;
- break;
- case 'projectLoadingFinish':
- this.versionStatus.loading = false;
- break;
+ reset() {
+ this._pending.clear();
+ }
+ beforeCommand(command) {
+ if (command === 'updateOpen') {
+ return;
}
+ this.flush();
}
- getTsServerArgs() {
- return __awaiter(this, void 0, void 0, function* () {
- const args = [];
- args.push('--allowLocalPluginLoads');
- if (this.apiVersion.gte(api_1.default.v250)) {
- args.push('--useInferredProjectPerProjectRoot');
- }
- else {
- args.push('--useSingleInferredProject');
- }
- if (this.apiVersion.gte(api_1.default.v206) && this._configuration.disableAutomaticTypeAcquisition) {
- args.push('--disableAutomaticTypingAcquisition');
- }
- if (this.apiVersion.gte(api_1.default.v222)) {
- this.cancellationPipeName = process_1.getTempFile(`tscancellation-${process_1.makeRandomHexString(20)}`);
- args.push('--cancellationPipeName', this.cancellationPipeName + '*');
- }
- if (this.apiVersion.gte(api_1.default.v222)) {
- const isRoot = process.getuid && process.getuid() == 0;
- if (this._configuration.tsServerLogLevel !== configuration_1.TsServerLogLevel.Off && !isRoot) {
- const logDir = process_1.getTempDirectory();
- if (logDir) {
- this.tsServerLogFile = path_1.default.join(logDir, `tsserver.log`);
- this.info('TSServer log file :', this.tsServerLogFile);
- }
- else {
- this.tsServerLogFile = null;
- this.error('Could not create TSServer log directory');
- }
- if (this.tsServerLogFile) {
- args.push('--logVerbosity', configuration_1.TsServerLogLevel.toString(this._configuration.tsServerLogLevel));
- args.push('--logFile', this.tsServerLogFile);
- }
- }
- }
- if (this.apiVersion.gte(api_1.default.v230)) {
- const pluginNames = this.pluginManager.plugins.map(x => x.name);
- const pluginRoot = this._configuration.tsServerPluginRoot;
- const pluginPaths = pluginRoot ? [pluginRoot] : [];
- if (pluginNames.length) {
- args.push('--globalPlugins', pluginNames.join(','));
- for (const plugin of this.pluginManager.plugins) {
- pluginPaths.push(plugin.path);
- }
- }
- if (pluginPaths.length) {
- args.push('--pluginProbeLocations', pluginPaths.join(','));
- }
- }
- if (this._configuration.typingsCacheLocation) {
- args.push('--globalTypingsCacheLocation', `"${this._configuration.typingsCacheLocation}"`);
- }
- if (this.apiVersion.gte(api_1.default.v234)) {
- if (this._configuration.npmLocation) {
- args.push('--npmLocation', `"${this._configuration.npmLocation}"`);
- }
- else {
- try {
- args.push('--npmLocation', `"${which_1.default.sync('npm')}"`);
- }
- catch (e) { } // tslint:disable-line
+ flush() {
+ if (!this.supportsBatching) {
+ // We've already eagerly synchronized
+ this._pending.clear();
+ return;
+ }
+ if (this._pending.size > 0) {
+ const closedFiles = [];
+ const openFiles = [];
+ const changedFiles = [];
+ for (const change of this._pending.values) {
+ switch (change.type) {
+ case 2 /* Change */:
+ changedFiles.push(change.args);
+ break;
+ case 1 /* Open */:
+ openFiles.push(change.args);
+ break;
+ case 0 /* Close */:
+ closedFiles.push(change.args);
+ break;
}
}
- if (this.apiVersion.gte(api_1.default.v291)) {
- args.push('--noGetErrOnBackgroundUpdate');
- }
- if (this.apiVersion.gte(api_1.default.v345)) {
- args.push('--validateDefaultNpmLocation');
- }
- return args;
- });
+ this.client.execute('updateOpen', { changedFiles, closedFiles, openFiles }, vscode_languageserver_protocol_1.CancellationToken.None, { nonRecoverable: true });
+ this._pending.clear();
+ }
}
- getProjectRootPath(uri) {
- let root = coc_nvim_1.workspace.cwd;
- let u = coc_nvim_1.Uri.parse(uri);
- if (u.scheme == 'file') {
- let folder = coc_nvim_1.workspace.getWorkspaceFolder(uri);
- if (folder) {
- root = coc_nvim_1.Uri.parse(folder.uri).fsPath;
- }
- else {
- let filepath = coc_nvim_1.Uri.parse(uri).fsPath;
- if (!filepath.startsWith(root)) {
- root = path_1.default.dirname(filepath);
+ get supportsBatching() {
+ return this.client.apiVersion.gte(api_1.default.v340);
+ }
+ updatePending(resource, op) {
+ switch (op.type) {
+ case 0 /* Close */:
+ const existing = this._pending.get(resource);
+ switch (existing === null || existing === void 0 ? void 0 : existing.type) {
+ case 1 /* Open */:
+ this._pending.delete(resource);
+ return false; // Open then close. No need to do anything
}
- }
+ break;
}
- if (root == os_1.default.homedir())
- return null;
- return root;
+ if (this._pending.has(resource)) {
+ // we saw this file before, make sure we flush before working with it again
+ this.flush();
+ }
+ this._pending.set(resource, op);
+ return true;
}
- configurePlugin(pluginName, configuration) {
- if (this.apiVersion.gte(api_1.default.v314)) {
- if (!this.servicePromise)
+}
+class GetErrRequest {
+ constructor(client, uris, _token, onDone) {
+ this.uris = uris;
+ this._token = _token;
+ this._done = false;
+ let files = uris.map(uri => client.normalizePath(uri));
+ const args = {
+ delay: 0,
+ files
+ };
+ const done = () => {
+ if (this._done) {
return;
- this.servicePromise.then(() => {
- // tslint:disable-next-line: no-floating-promises
- this.executeWithoutWaitingForResponse('configurePlugin', { pluginName, configuration });
- });
- }
+ }
+ this._done = true;
+ onDone();
+ };
+ client.executeAsync('geterr', args, _token.token).then(done, done);
}
- interruptGetErr(f) {
- return this.bufferSyncSupport.interuptGetErr(f);
+ static executeGetErrRequest(client, uris, onDone) {
+ const token = new vscode_languageserver_protocol_1.CancellationTokenSource();
+ return new GetErrRequest(client, uris, token, onDone);
}
-}
-exports.default = TypeScriptServiceClient;
-function getDiagnosticsKind(event) {
- switch (event.event) {
- case 'syntaxDiag':
- return diagnostics_1.DiagnosticKind.Syntax;
- case 'semanticDiag':
- return diagnostics_1.DiagnosticKind.Semantic;
- case 'suggestionDiag':
- return diagnostics_1.DiagnosticKind.Suggestion;
+ cancel() {
+ if (!this._done) {
+ this._token.cancel();
+ }
+ this._token.dispose();
}
- throw new Error('Unknown dignostics kind');
}
-const fenceCommands = new Set(['change', 'close', 'open']);
-function getQueueingType(command, lowPriority) {
- if (fenceCommands.has(command)) {
- return requestQueue_1.RequestQueueingType.Fence;
+class BufferSyncSupport {
+ constructor(client, modeIds) {
+ this.disposables = [];
+ this._validateJavaScript = true;
+ this._validateTypeScript = true;
+ this.listening = false;
+ this._onDelete = new vscode_languageserver_protocol_1.Emitter();
+ this.onDelete = this._onDelete.event;
+ this._onWillChange = new vscode_languageserver_protocol_1.Emitter();
+ this.onWillChange = this._onWillChange.event;
+ this.client = client;
+ this.modeIds = new Set(modeIds);
+ this.diagnosticDelayer = new async_1.Delayer(300);
+ const pathNormalizer = (path) => this.client.toPath(path);
+ this.syncedBuffers = new SyncedBufferMap(pathNormalizer);
+ this.pendingDiagnostics = new PendingDiagnostics(pathNormalizer);
+ this.synchronizer = new BufferSynchronizer(client, pathNormalizer);
+ this.updateConfiguration();
+ coc_nvim_1.workspace.onDidChangeConfiguration(this.updateConfiguration, this, this.disposables);
}
- return lowPriority ? requestQueue_1.RequestQueueingType.LowPriority : requestQueue_1.RequestQueueingType.Normal;
-}
-
-
-/***/ }),
-/* 118 */
-/***/ (function(module, exports) {
-
-module.exports = require("fs");
-
-/***/ }),
-/* 119 */
-/***/ (function(module, exports, __webpack_require__) {
-
-const isWindows = process.platform === 'win32' ||
- process.env.OSTYPE === 'cygwin' ||
- process.env.OSTYPE === 'msys'
-
-const path = __webpack_require__(13)
-const COLON = isWindows ? ';' : ':'
-const isexe = __webpack_require__(120)
-
-const getNotFoundError = (cmd) =>
- Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })
-
-const getPathInfo = (cmd, opt) => {
- const colon = opt.colon || COLON
-
- // If it has a slash, then we don't bother searching the pathenv.
- // just check the file itself, and that's it.
- const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? ['']
- : (
- [
- // windows always checks the cwd first
- ...(isWindows ? [process.cwd()] : []),
- ...(opt.path || process.env.PATH ||
- /* istanbul ignore next: very unusual */ '').split(colon),
- ]
- )
- const pathExtExe = isWindows
- ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'
- : ''
- const pathExt = isWindows ? pathExtExe.split(colon) : ['']
-
- if (isWindows) {
- if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
- pathExt.unshift('')
- }
-
- return {
- pathEnv,
- pathExt,
- pathExtExe,
- }
-}
-
-const which = (cmd, opt, cb) => {
- if (typeof opt === 'function') {
- cb = opt
- opt = {}
- }
- if (!opt)
- opt = {}
-
- const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
- const found = []
-
- const step = i => new Promise((resolve, reject) => {
- if (i === pathEnv.length)
- return opt.all && found.length ? resolve(found)
- : reject(getNotFoundError(cmd))
-
- const ppRaw = pathEnv[i]
- const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
-
- const pCmd = path.join(pathPart, cmd)
- const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
- : pCmd
-
- resolve(subStep(p, i, 0))
- })
-
- const subStep = (p, i, ii) => new Promise((resolve, reject) => {
- if (ii === pathExt.length)
- return resolve(step(i + 1))
- const ext = pathExt[ii]
- isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
- if (!er && is) {
- if (opt.all)
- found.push(p + ext)
- else
- return resolve(p + ext)
- }
- return resolve(subStep(p, i, ii + 1))
- })
- })
-
- return cb ? step(0).then(res => cb(null, res), cb) : step(0)
-}
-
-const whichSync = (cmd, opt) => {
- opt = opt || {}
-
- const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
- const found = []
-
- for (let i = 0; i < pathEnv.length; i ++) {
- const ppRaw = pathEnv[i]
- const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
-
- const pCmd = path.join(pathPart, cmd)
- const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
- : pCmd
-
- for (let j = 0; j < pathExt.length; j ++) {
- const cur = p + pathExt[j]
- try {
- const is = isexe.sync(cur, { pathExt: pathExtExe })
- if (is) {
- if (opt.all)
- found.push(cur)
- else
- return cur
+ listen() {
+ if (this.listening) {
+ return;
+ }
+ this.listening = true;
+ coc_nvim_1.workspace.onDidOpenTextDocument(this.openTextDocument, this, this.disposables);
+ coc_nvim_1.workspace.onDidCloseTextDocument(this.onDidCloseTextDocument, this, this.disposables);
+ coc_nvim_1.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, this.disposables);
+ coc_nvim_1.workspace.textDocuments.forEach(this.openTextDocument, this);
+ }
+ handles(resource) {
+ return this.syncedBuffers.has(resource);
+ }
+ dispose() {
+ this.pendingDiagnostics.clear();
+ coc_nvim_1.disposeAll(this.disposables);
+ this._onWillChange.dispose();
+ this._onDelete.dispose();
+ }
+ ensureHasBuffer(resource) {
+ if (this.syncedBuffers.has(resource)) {
+ return true;
+ }
+ const existingDocument = coc_nvim_1.workspace.textDocuments.find(doc => doc.uri.toString() === resource);
+ if (existingDocument) {
+ return this.openTextDocument(existingDocument);
+ }
+ return false;
+ }
+ toResource(filePath) {
+ const buffer = this.syncedBuffers.getForPath(filePath);
+ if (buffer)
+ return buffer.resource;
+ return coc_nvim_1.Uri.file(filePath).toString();
+ }
+ reset() {
+ var _a;
+ (_a = this.pendingGetErr) === null || _a === void 0 ? void 0 : _a.cancel();
+ this.pendingDiagnostics.clear();
+ this.synchronizer.reset();
+ }
+ reinitialize() {
+ this.reset();
+ for (const buffer of this.syncedBuffers.allBuffers) {
+ buffer.open();
+ }
+ }
+ openTextDocument(document) {
+ if (!this.modeIds.has(document.languageId)) {
+ // can't handle
+ return false;
+ }
+ const resource = document.uri;
+ const filepath = this.client.normalizePath(coc_nvim_1.Uri.parse(resource));
+ if (!filepath) {
+ return false;
+ }
+ if (this.syncedBuffers.has(resource)) {
+ return true;
+ }
+ const syncedBuffer = new SyncedBuffer(document, filepath, this.client, this.synchronizer);
+ this.syncedBuffers.set(resource, syncedBuffer);
+ syncedBuffer.open();
+ this.requestDiagnostic(syncedBuffer);
+ return true;
+ }
+ closeResource(resource) {
+ const syncedBuffer = this.syncedBuffers.get(resource);
+ if (!syncedBuffer) {
+ return;
+ }
+ this.pendingDiagnostics.delete(resource);
+ this.syncedBuffers.delete(resource);
+ const wasBufferOpen = syncedBuffer.close();
+ this._onDelete.fire(resource);
+ if (wasBufferOpen) {
+ this.requestAllDiagnostics();
+ }
+ }
+ onDidCloseTextDocument(document) {
+ this.closeResource(document.uri);
+ }
+ onDidChangeTextDocument(e) {
+ const syncedBuffer = this.syncedBuffers.get(e.textDocument.uri);
+ if (!syncedBuffer) {
+ return;
+ }
+ this._onWillChange.fire(syncedBuffer.resource);
+ syncedBuffer.onContentChanged(e.contentChanges);
+ const didTrigger = this.requestDiagnostic(syncedBuffer);
+ if (!didTrigger && this.pendingGetErr) {
+ // In this case we always want to re-trigger all diagnostics
+ this.pendingGetErr.cancel();
+ this.pendingGetErr = undefined;
+ this.triggerDiagnostics();
+ }
+ }
+ beforeCommand(command) {
+ this.synchronizer.beforeCommand(command);
+ }
+ interuptGetErr(f) {
+ if (!this.pendingGetErr) {
+ return f();
+ }
+ this.pendingGetErr.cancel();
+ this.pendingGetErr = undefined;
+ const result = f();
+ this.triggerDiagnostics();
+ return result;
+ }
+ getErr(resources) {
+ const handledResources = resources.filter(resource => {
+ let syncedBuffer = this.syncedBuffers.get(resource.toString());
+ return syncedBuffer && this.shouldValidate(syncedBuffer);
+ });
+ if (!handledResources.length) {
+ return;
+ }
+ for (const resource of handledResources) {
+ this.pendingDiagnostics.set(resource.toString(), Date.now());
+ }
+ this.triggerDiagnostics();
+ }
+ triggerDiagnostics(delay = 200) {
+ this.diagnosticDelayer.trigger(() => {
+ this.sendPendingDiagnostics();
+ }, delay);
+ }
+ requestAllDiagnostics() {
+ for (const buffer of this.syncedBuffers.allBuffers) {
+ if (this.shouldValidate(buffer)) {
+ this.pendingDiagnostics.set(buffer.resource, Date.now());
+ }
+ }
+ this.triggerDiagnostics();
+ }
+ requestDiagnostic(buffer) {
+ if (!this.shouldValidate(buffer)) {
+ return false;
+ }
+ this.pendingDiagnostics.set(buffer.resource, Date.now());
+ const delay = Math.min(Math.max(Math.ceil(buffer.lineCount / 20), 300), 800);
+ this.triggerDiagnostics(delay);
+ return true;
+ }
+ hasPendingDiagnostics(uri) {
+ return this.pendingDiagnostics.has(uri);
+ }
+ sendPendingDiagnostics() {
+ const orderedFileSet = this.pendingDiagnostics.getOrderedFileSet();
+ if (this.pendingGetErr) {
+ this.pendingGetErr.cancel();
+ for (const uri of this.pendingGetErr.uris) {
+ let resource = uri.toString();
+ let syncedBuffer = this.syncedBuffers.get(resource);
+ if (syncedBuffer && this.shouldValidate(syncedBuffer)) {
+ orderedFileSet.set(resource, undefined);
+ }
+ else {
+ orderedFileSet.delete(resource);
+ }
+ }
+ this.pendingGetErr = undefined;
+ }
+ // Add all open TS buffers to the geterr request. They might be visible
+ for (const buffer of this.syncedBuffers.values) {
+ if (this.shouldValidate(buffer)) {
+ orderedFileSet.set(buffer.resource, undefined);
+ }
+ }
+ if (orderedFileSet.size) {
+ let uris = Array.from(orderedFileSet.uris).map(uri => coc_nvim_1.Uri.parse(uri));
+ const getErr = this.pendingGetErr = GetErrRequest.executeGetErrRequest(this.client, uris, () => {
+ if (this.pendingGetErr === getErr) {
+ this.pendingGetErr = undefined;
+ }
+ });
+ }
+ this.pendingDiagnostics.clear();
+ }
+ updateConfiguration() {
+ const jsConfig = coc_nvim_1.workspace.getConfiguration('javascript', null);
+ const tsConfig = coc_nvim_1.workspace.getConfiguration('typescript', null);
+ this._validateJavaScript = jsConfig.get('validate.enable', true);
+ this._validateTypeScript = tsConfig.get('validate.enable', true);
+ }
+ shouldValidate(buffer) {
+ switch (buffer.kind) {
+ case 2 /* JavaScript */:
+ return this._validateJavaScript;
+ case 1 /* TypeScript */:
+ default:
+ return this._validateTypeScript;
}
- } catch (ex) {}
}
- }
-
- if (opt.all && found.length)
- return found
-
- if (opt.nothrow)
- return null
-
- throw getNotFoundError(cmd)
}
-
-module.exports = which
-which.sync = whichSync
+exports.default = BufferSyncSupport;
/***/ }),
-/* 120 */
+/* 119 */
/***/ (function(module, exports, __webpack_require__) {
-var fs = __webpack_require__(118)
-var core
-if (process.platform === 'win32' || global.TESTING_WINDOWS) {
- core = __webpack_require__(121)
-} else {
- core = __webpack_require__(122)
-}
-
-module.exports = isexe
-isexe.sync = sync
-
-function isexe (path, options, cb) {
- if (typeof options === 'function') {
- cb = options
- options = {}
- }
+"use strict";
- if (!cb) {
- if (typeof Promise !== 'function') {
- throw new TypeError('callback not provided')
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Delayer = void 0;
+class Delayer {
+ constructor(defaultDelay) {
+ this.defaultDelay = defaultDelay;
+ this.timeout = null;
+ this.completionPromise = null;
+ this.onSuccess = null;
+ this.task = null;
}
-
- return new Promise(function (resolve, reject) {
- isexe(path, options || {}, function (er, is) {
- if (er) {
- reject(er)
- } else {
- resolve(is)
+ trigger(task, delay = this.defaultDelay) {
+ this.task = task;
+ if (delay >= 0) {
+ this.cancelTimeout();
}
- })
- })
- }
-
- core(path, options || {}, function (er, is) {
- // ignore EACCES because that just means we aren't allowed to run it
- if (er) {
- if (er.code === 'EACCES' || options && options.ignoreErrors) {
- er = null
- is = false
- }
+ if (!this.completionPromise) {
+ this.completionPromise = new Promise(resolve => {
+ this.onSuccess = resolve;
+ }).then(() => {
+ this.completionPromise = null;
+ this.onSuccess = null;
+ let result = this.task && this.task();
+ this.task = null;
+ return result;
+ });
+ }
+ if (delay >= 0 || this.timeout === null) {
+ this.timeout = setTimeout(() => {
+ this.timeout = null;
+ if (this.onSuccess) {
+ this.onSuccess(undefined);
+ }
+ }, delay >= 0 ? delay : this.defaultDelay);
+ }
+ return this.completionPromise;
}
- cb(er, is)
- })
-}
-
-function sync (path, options) {
- // my kingdom for a filtered catch
- try {
- return core.sync(path, options || {})
- } catch (er) {
- if (options && options.ignoreErrors || er.code === 'EACCES') {
- return false
- } else {
- throw er
+ cancelTimeout() {
+ if (this.timeout !== null) {
+ clearTimeout(this.timeout);
+ this.timeout = null;
+ }
}
- }
}
+exports.Delayer = Delayer;
/***/ }),
-/* 121 */
+/* 120 */
/***/ (function(module, exports, __webpack_require__) {
-module.exports = isexe
-isexe.sync = sync
-
-var fs = __webpack_require__(118)
-
-function checkPathExt (path, options) {
- var pathext = options.pathExt !== undefined ?
- options.pathExt : process.env.PATHEXT
-
- if (!pathext) {
- return true
- }
-
- pathext = pathext.split(';')
- if (pathext.indexOf('') !== -1) {
- return true
- }
- for (var i = 0; i < pathext.length; i++) {
- var p = pathext[i].toLowerCase()
- if (p && path.substr(-p.length).toLowerCase() === p) {
- return true
- }
- }
- return false
-}
-
-function checkStat (stat, path, options) {
- if (!stat.isSymbolicLink() && !stat.isFile()) {
- return false
- }
- return checkPathExt(path, options)
-}
-
-function isexe (path, options, cb) {
- fs.stat(path, function (er, stat) {
- cb(er, er ? false : checkStat(stat, path, options))
- })
-}
+"use strict";
-function sync (path, options) {
- return checkStat(fs.statSync(path), path, options)
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.mode2ScriptKind = exports.languageIds = exports.jsxTags = exports.javascriptjsx = exports.javascriptreact = exports.javascript = exports.typescriptjsx = exports.typescripttsx = exports.typescriptreact = exports.typescript = void 0;
+exports.typescript = 'typescript';
+exports.typescriptreact = 'typescriptreact';
+exports.typescripttsx = 'typescript.tsx';
+exports.typescriptjsx = 'typescript.jsx';
+exports.javascript = 'javascript';
+exports.javascriptreact = 'javascriptreact';
+exports.javascriptjsx = 'javascript.jsx';
+exports.jsxTags = 'jsx-tags';
+exports.languageIds = [exports.typescript, exports.typescriptreact, exports.javascript, exports.javascriptreact, exports.javascriptjsx, exports.typescripttsx, exports.jsxTags];
+function mode2ScriptKind(mode) {
+ switch (mode) {
+ case exports.typescript:
+ return 'TS';
+ case exports.typescripttsx:
+ return 'TSX';
+ case exports.typescriptjsx:
+ return 'TSX';
+ case exports.typescriptreact:
+ return 'TSX';
+ case exports.javascript:
+ return 'JS';
+ case exports.javascriptreact:
+ return 'JSX';
+ }
+ return undefined;
}
+exports.mode2ScriptKind = mode2ScriptKind;
/***/ }),
-/* 122 */
+/* 121 */
/***/ (function(module, exports, __webpack_require__) {
-module.exports = isexe
-isexe.sync = sync
-
-var fs = __webpack_require__(118)
+"use strict";
-function isexe (path, options, cb) {
- fs.stat(path, function (er, stat) {
- cb(er, er ? false : checkStat(stat, options))
- })
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.isWindowsPath = exports.ResourceMap = void 0;
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+const coc_nvim_1 = __webpack_require__(1);
+function defaultPathNormalizer(resource) {
+ let u = coc_nvim_1.Uri.parse(resource);
+ if (u.scheme === 'file') {
+ return u.fsPath;
+ }
+ return resource.toString();
}
-
-function sync (path, options) {
- return checkStat(fs.statSync(path), options)
+/**
+ * Maps of file uris
+ *
+ * Attempts to handle correct mapping on both case sensitive and case in-sensitive
+ * file systems.
+ */
+class ResourceMap {
+ constructor(_normalizePath = defaultPathNormalizer) {
+ this._normalizePath = _normalizePath;
+ this._map = new Map();
+ }
+ get size() {
+ return this._map.size;
+ }
+ get entries() {
+ return this._map.values();
+ }
+ has(uri) {
+ const file = this.toKey(uri);
+ return !!file && this._map.has(file);
+ }
+ get(uri) {
+ const file = this.toKey(uri);
+ if (!file)
+ return undefined;
+ let entry = this._map.get(file);
+ return entry ? entry.value : undefined;
+ }
+ set(uri, value) {
+ const file = this.toKey(uri);
+ if (file) {
+ this._map.set(file, { uri, value });
+ }
+ }
+ delete(uri) {
+ const file = this.toKey(uri);
+ if (file) {
+ this._map.delete(file);
+ }
+ }
+ get values() {
+ return Array.from(this._map.values()).map(x => x.value);
+ }
+ get uris() {
+ return Array.from(this._map.values()).map(x => x.uri);
+ }
+ clear() {
+ this._map.clear();
+ }
+ toKey(uri) {
+ const key = this._normalizePath
+ ? this._normalizePath(uri)
+ : uri;
+ if (!key) {
+ return key;
+ }
+ return this.isCaseInsensitivePath(key) ? key.toLowerCase() : key;
+ }
+ isCaseInsensitivePath(path) {
+ if (isWindowsPath(path)) {
+ return true;
+ }
+ return path[0] === '/' && this.onIsCaseInsenitiveFileSystem;
+ }
+ get onIsCaseInsenitiveFileSystem() {
+ if (process.platform === 'win32') {
+ return true;
+ }
+ if (process.platform === 'darwin') {
+ return true;
+ }
+ return false;
+ }
}
-
-function checkStat (stat, options) {
- return stat.isFile() && checkMode(stat, options)
+exports.ResourceMap = ResourceMap;
+function isWindowsPath(path) {
+ return /^[a-zA-Z]:\\/.test(path);
}
+exports.isWindowsPath = isWindowsPath;
-function checkMode (stat, options) {
- var mod = stat.mode
- var uid = stat.uid
- var gid = stat.gid
-
- var myUid = options.uid !== undefined ?
- options.uid : process.getuid && process.getuid()
- var myGid = options.gid !== undefined ?
- options.gid : process.getgid && process.getgid()
- var u = parseInt('100', 8)
- var g = parseInt('010', 8)
- var o = parseInt('001', 8)
- var ug = u | g
+/***/ }),
+/* 122 */
+/***/ (function(module, exports, __webpack_require__) {
- var ret = (mod & o) ||
- (mod & g) && gid === myGid ||
- (mod & u) && uid === myUid ||
- (mod & ug) && myUid === 0
+"use strict";
- return ret
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DiagnosticsManager = exports.DiagnosticKind = exports.DiagnosticSet = void 0;
+const coc_nvim_1 = __webpack_require__(1);
+const resourceMap_1 = __webpack_require__(121);
+class DiagnosticSet {
+ constructor() {
+ this._map = new resourceMap_1.ResourceMap();
+ }
+ set(uri, diagnostics) {
+ this._map.set(uri, diagnostics);
+ }
+ get(uri) {
+ return this._map.get(uri) || [];
+ }
+ clear() {
+ this._map = new resourceMap_1.ResourceMap();
+ }
+}
+exports.DiagnosticSet = DiagnosticSet;
+var DiagnosticKind;
+(function (DiagnosticKind) {
+ DiagnosticKind[DiagnosticKind["Syntax"] = 0] = "Syntax";
+ DiagnosticKind[DiagnosticKind["Semantic"] = 1] = "Semantic";
+ DiagnosticKind[DiagnosticKind["Suggestion"] = 2] = "Suggestion";
+})(DiagnosticKind = exports.DiagnosticKind || (exports.DiagnosticKind = {}));
+const allDiagnosticKinds = [
+ DiagnosticKind.Syntax,
+ DiagnosticKind.Semantic,
+ DiagnosticKind.Suggestion
+];
+class DiagnosticsManager {
+ constructor() {
+ this._diagnostics = new Map();
+ this._pendingUpdates = new resourceMap_1.ResourceMap();
+ this._enableJavascriptSuggestions = true;
+ this._enableTypescriptSuggestions = true;
+ this.updateDelay = 200;
+ for (const kind of allDiagnosticKinds) {
+ this._diagnostics.set(kind, new DiagnosticSet());
+ }
+ this._currentDiagnostics = coc_nvim_1.languages.createDiagnosticCollection('tsserver');
+ }
+ dispose() {
+ this._currentDiagnostics.dispose();
+ for (const value of this._pendingUpdates.values) {
+ clearTimeout(value);
+ }
+ this._pendingUpdates = new resourceMap_1.ResourceMap();
+ }
+ reInitialize() {
+ this._currentDiagnostics.clear();
+ for (const diagnosticSet of this._diagnostics.values()) {
+ diagnosticSet.clear();
+ }
+ }
+ setEnableSuggestions(languageId, value) {
+ let curr = languageId == 'javascript' ? this._enableJavascriptSuggestions : this._enableTypescriptSuggestions;
+ if (curr == value) {
+ return;
+ }
+ if (languageId == 'javascript') {
+ this._enableJavascriptSuggestions = value;
+ }
+ else {
+ this._enableTypescriptSuggestions = value;
+ }
+ }
+ diagnosticsReceived(kind, uri, diagnostics) {
+ const collection = this._diagnostics.get(kind);
+ if (!collection)
+ return;
+ let doc = coc_nvim_1.workspace.getDocument(uri);
+ if (doc)
+ uri = doc.uri;
+ if (diagnostics.length === 0) {
+ const existing = collection.get(uri);
+ if (existing.length === 0) {
+ // No need to update
+ return;
+ }
+ }
+ collection.set(uri, diagnostics);
+ this.scheduleDiagnosticsUpdate(uri);
+ }
+ configFileDiagnosticsReceived(uri, diagnostics) {
+ this._currentDiagnostics.set(uri, diagnostics);
+ }
+ delete(uri) {
+ this._currentDiagnostics.delete(uri);
+ }
+ getDiagnostics(uri) {
+ return this._currentDiagnostics.get(uri) || [];
+ return [];
+ }
+ scheduleDiagnosticsUpdate(uri) {
+ if (!this._pendingUpdates.has(uri)) {
+ this._pendingUpdates.set(uri, setTimeout(() => this.updateCurrentDiagnostics(uri), this.updateDelay));
+ }
+ }
+ updateCurrentDiagnostics(uri) {
+ if (this._pendingUpdates.has(uri)) {
+ clearTimeout(this._pendingUpdates.get(uri));
+ this._pendingUpdates.delete(uri);
+ }
+ const allDiagnostics = [
+ ...this._diagnostics.get(DiagnosticKind.Syntax).get(uri),
+ ...this._diagnostics.get(DiagnosticKind.Semantic).get(uri),
+ ...this.getSuggestionDiagnostics(uri)
+ ];
+ this._currentDiagnostics.set(uri, allDiagnostics);
+ }
+ getSuggestionDiagnostics(uri) {
+ const enabled = this.suggestionsEnabled(uri);
+ return this._diagnostics
+ .get(DiagnosticKind.Suggestion)
+ .get(uri)
+ .filter(x => {
+ if (!enabled) {
+ // Still show unused
+ return x.code == 6133;
+ }
+ return enabled;
+ });
+ }
+ suggestionsEnabled(uri) {
+ let doc = coc_nvim_1.workspace.getDocument(uri);
+ if (!doc)
+ return false;
+ if (doc.filetype.startsWith('javascript')) {
+ return this._enableJavascriptSuggestions;
+ }
+ if (doc.filetype.startsWith('typescript')) {
+ return this._enableTypescriptSuggestions;
+ }
+ return true;
+ }
}
+exports.DiagnosticsManager = DiagnosticsManager;
/***/ }),
"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
-exports.ServerResponse = void 0;
-var ServerResponse;
-(function (ServerResponse) {
- class Cancelled {
- constructor(reason) {
- this.reason = reason;
- this.type = 'cancelled';
+exports.RequestQueue = exports.RequestQueueingType = void 0;
+var RequestQueueingType;
+(function (RequestQueueingType) {
+ /**
+ * Normal request that is executed in order.
+ */
+ RequestQueueingType[RequestQueueingType["Normal"] = 1] = "Normal";
+ /**
+ * Request that normal requests jump in front of in the queue.
+ */
+ RequestQueueingType[RequestQueueingType["LowPriority"] = 2] = "LowPriority";
+ /**
+ * A fence that blocks request reordering.
+ *
+ * Fences are not reordered. Unlike a normal request, a fence will never jump in front of a low priority request
+ * in the request queue.
+ */
+ RequestQueueingType[RequestQueueingType["Fence"] = 3] = "Fence";
+})(RequestQueueingType = exports.RequestQueueingType || (exports.RequestQueueingType = {}));
+class RequestQueue {
+ constructor() {
+ this.queue = [];
+ this.sequenceNumber = 0;
+ }
+ get length() {
+ return this.queue.length;
+ }
+ enqueue(item) {
+ if (item.queueingType === RequestQueueingType.Normal) {
+ let index = this.queue.length - 1;
+ while (index >= 0) {
+ if (this.queue[index].queueingType !== RequestQueueingType.LowPriority) {
+ break;
+ }
+ --index;
+ }
+ this.queue.splice(index + 1, 0, item);
+ }
+ else {
+ // Only normal priority requests can be reordered. All other requests just go to the end.
+ this.queue.push(item);
}
}
- ServerResponse.Cancelled = Cancelled;
- // tslint:disable-next-line: new-parens
- ServerResponse.NoContent = new class {
- constructor() {
- this.type = 'noContent';
+ dequeue() {
+ return this.queue.shift();
+ }
+ tryDeletePendingRequest(seq) {
+ for (let i = 0; i < this.queue.length; i++) {
+ if (this.queue[i].request.seq === seq) {
+ this.queue.splice(i, 1);
+ return true;
+ }
}
- };
-})(ServerResponse = exports.ServerResponse || (exports.ServerResponse = {}));
+ return false;
+ }
+ createRequest(command, args) {
+ return {
+ seq: this.sequenceNumber++,
+ type: 'request',
+ command,
+ arguments: args
+ };
+ }
+}
+exports.RequestQueue = RequestQueue;
/***/ }),
Object.defineProperty(exports, "__esModule", { value: true });
exports.TypeScriptServiceConfiguration = exports.TsServerLogLevel = void 0;
const coc_nvim_1 = __webpack_require__(1);
-const which_1 = __importDefault(__webpack_require__(119));
+const which_1 = __importDefault(__webpack_require__(125));
var TsServerLogLevel;
(function (TsServerLogLevel) {
TsServerLogLevel[TsServerLogLevel["Off"] = 0] = "Off";
get typingsCacheLocation() {
return this._configuration.get('typingsCacheLocation', '');
}
- get tsServerPluginRoot() {
- return this._configuration.get('tsServerPluginRoot', null);
+ get tsServerPluginPaths() {
+ return this._configuration.get('pluginPaths', []);
}
get checkJs() {
return this._configuration.get('implicitProjectConfig.checkJs', false);
get npmLocation() {
let path = this._configuration.get('npm', '');
if (path)
- return path;
+ return coc_nvim_1.workspace.expand(path);
try {
path = which_1.default.sync('npm');
}
/* 125 */
/***/ (function(module, exports, __webpack_require__) {
-"use strict";
+const isWindows = process.platform === 'win32' ||
+ process.env.OSTYPE === 'cygwin' ||
+ process.env.OSTYPE === 'msys'
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const coc_nvim_1 = __webpack_require__(1);
-const is = __importStar(__webpack_require__(126));
-class Logger {
- get output() {
- if (this._channel) {
- return this._channel;
- }
- this._channel = coc_nvim_1.workspace.createOutputChannel('tsserver');
- return this._channel;
- }
- dispose() {
- if (this._channel) {
- this._channel.dispose();
- }
- }
- data2String(data) {
- if (data instanceof Error) {
- if (is.string(data.stack)) {
- return data.stack;
- }
- return data.message;
- }
- if (is.boolean(data.success) && !data.success && is.string(data.message)) {
- return data.message;
- }
- if (is.string(data)) {
- return data;
- }
- return data.toString();
- }
- info(message, data) {
- this.logLevel('Info', message, data);
- }
- warn(message, data) {
- this.logLevel('Warn', message, data);
- }
- error(message, data) {
- // See https://github.com/Microsoft/TypeScript/issues/10496
- if (data && data.message === 'No content available.') {
- return;
- }
- this.logLevel('Error', message, data);
- }
- logLevel(level, message, data) {
- this.output.appendLine(`[${level} - ${new Date().toLocaleTimeString()}] ${message}`);
- if (data) {
- this.output.appendLine(this.data2String(data));
- }
- }
-}
-exports.default = Logger;
+const path = __webpack_require__(13)
+const COLON = isWindows ? ';' : ':'
+const isexe = __webpack_require__(126)
+const getNotFoundError = (cmd) =>
+ Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })
-/***/ }),
-/* 126 */
-/***/ (function(module, exports, __webpack_require__) {
+const getPathInfo = (cmd, opt) => {
+ const colon = opt.colon || COLON
-"use strict";
+ // If it has a slash, then we don't bother searching the pathenv.
+ // just check the file itself, and that's it.
+ const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? ['']
+ : (
+ [
+ // windows always checks the cwd first
+ ...(isWindows ? [process.cwd()] : []),
+ ...(opt.path || process.env.PATH ||
+ /* istanbul ignore next: very unusual */ '').split(colon),
+ ]
+ )
+ const pathExtExe = isWindows
+ ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'
+ : ''
+ const pathExt = isWindows ? pathExtExe.split(colon) : ['']
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.string = exports.boolean = exports.defined = void 0;
-const toString = Object.prototype.toString;
-function defined(value) {
- return typeof value !== 'undefined';
-}
-exports.defined = defined;
-function boolean(value) {
- return value === true || value === false;
+ if (isWindows) {
+ if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
+ pathExt.unshift('')
+ }
+
+ return {
+ pathEnv,
+ pathExt,
+ pathExtExe,
+ }
}
-exports.boolean = boolean;
-function string(value) {
- return toString.call(value) === '[object String]';
+
+const which = (cmd, opt, cb) => {
+ if (typeof opt === 'function') {
+ cb = opt
+ opt = {}
+ }
+ if (!opt)
+ opt = {}
+
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
+ const found = []
+
+ const step = i => new Promise((resolve, reject) => {
+ if (i === pathEnv.length)
+ return opt.all && found.length ? resolve(found)
+ : reject(getNotFoundError(cmd))
+
+ const ppRaw = pathEnv[i]
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
+
+ const pCmd = path.join(pathPart, cmd)
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
+ : pCmd
+
+ resolve(subStep(p, i, 0))
+ })
+
+ const subStep = (p, i, ii) => new Promise((resolve, reject) => {
+ if (ii === pathExt.length)
+ return resolve(step(i + 1))
+ const ext = pathExt[ii]
+ isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {
+ if (!er && is) {
+ if (opt.all)
+ found.push(p + ext)
+ else
+ return resolve(p + ext)
+ }
+ return resolve(subStep(p, i, ii + 1))
+ })
+ })
+
+ return cb ? step(0).then(res => cb(null, res), cb) : step(0)
}
-exports.string = string;
+const whichSync = (cmd, opt) => {
+ opt = opt || {}
+
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)
+ const found = []
+
+ for (let i = 0; i < pathEnv.length; i ++) {
+ const ppRaw = pathEnv[i]
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw
+
+ const pCmd = path.join(pathPart, cmd)
+ const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd
+ : pCmd
+
+ for (let j = 0; j < pathExt.length; j ++) {
+ const cur = p + pathExt[j]
+ try {
+ const is = isexe.sync(cur, { pathExt: pathExtExe })
+ if (is) {
+ if (opt.all)
+ found.push(cur)
+ else
+ return cur
+ }
+ } catch (ex) {}
+ }
+ }
-/***/ }),
-/* 127 */
-/***/ (function(module, exports, __webpack_require__) {
+ if (opt.all && found.length)
+ return found
-"use strict";
+ if (opt.nothrow)
+ return null
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.fork = exports.getTempFile = exports.getTempDirectory = exports.makeRandomHexString = void 0;
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-const child_process_1 = __importDefault(__webpack_require__(113));
-const net_1 = __importDefault(__webpack_require__(16));
-const os_1 = __importDefault(__webpack_require__(14));
-const path_1 = __importDefault(__webpack_require__(13));
-const fs_1 = __importDefault(__webpack_require__(118));
-function makeRandomHexString(length) {
- let chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
- let result = '';
- for (let i = 0; i < length; i++) {
- const idx = Math.floor(chars.length * Math.random());
- result += chars[idx];
- }
- return result;
-}
-exports.makeRandomHexString = makeRandomHexString;
-function getTempDirectory() {
- let dir = path_1.default.join(os_1.default.tmpdir(), `coc.nvim-${process.pid}`);
- if (!fs_1.default.existsSync(dir)) {
- fs_1.default.mkdirSync(dir);
- }
- return dir;
-}
-exports.getTempDirectory = getTempDirectory;
-function generatePipeName() {
- return getPipeName(makeRandomHexString(40));
-}
-function getPipeName(name) {
- const fullName = 'coc-tsc-' + name;
- if (process.platform === 'win32') {
- return '\\\\.\\pipe\\' + fullName + '-sock';
- }
- const tmpdir = getTempDirectory();
- // Mac/Unix: use socket file
- return path_1.default.join(tmpdir, fullName + '.sock');
-}
-function getTempFile(name) {
- const fullName = 'coc-nvim-' + name;
- return path_1.default.join(getTempDirectory(), fullName + '.sock');
-}
-exports.getTempFile = getTempFile;
-function generatePatchedEnv(env, stdInPipeName, stdOutPipeName, stdErrPipeName) {
- const newEnv = Object.assign({}, env);
- // Set the two unique pipe names and the electron flag as process env
- newEnv['STDIN_PIPE_NAME'] = stdInPipeName; // tslint:disable-line
- newEnv['STDOUT_PIPE_NAME'] = stdOutPipeName; // tslint:disable-line
- newEnv['STDERR_PIPE_NAME'] = stdErrPipeName; // tslint:disable-line
- newEnv['TSS_LOG'] = `-level verbose -file ${path_1.default.join(os_1.default.tmpdir(), 'coc-nvim-tsc.log')}`; // tslint:disable-line
- // Ensure we always have a PATH set
- newEnv['PATH'] = newEnv['PATH'] || process.env.PATH; // tslint:disable-line
- return newEnv;
-}
-function fork(modulePath, args, options, logger, callback) {
- let callbackCalled = false;
- const resolve = (result) => {
- if (callbackCalled) {
- return;
- }
- callbackCalled = true;
- callback(null, result);
- };
- const reject = (err) => {
- if (callbackCalled) {
- return;
- }
- callbackCalled = true;
- callback(err, null);
- };
- // Generate three unique pipe names
- const stdInPipeName = generatePipeName();
- const stdOutPipeName = generatePipeName();
- const stdErrPipeName = generatePipeName();
- const newEnv = generatePatchedEnv(process.env, stdInPipeName, stdOutPipeName, stdErrPipeName);
- newEnv['NODE_PATH'] = path_1.default.join(modulePath, '..', '..', '..'); // tslint:disable-line
- let childProcess;
- // Begin listening to stderr pipe
- let stdErrServer = net_1.default.createServer(stdErrStream => {
- // From now on the childProcess.stderr is available for reading
- childProcess.stderr = stdErrStream;
- });
- stdErrServer.listen(stdErrPipeName);
- // Begin listening to stdout pipe
- let stdOutServer = net_1.default.createServer(stdOutStream => {
- // The child process will write exactly one chunk with content `ready` when it has installed a listener to the stdin pipe
- stdOutStream.once('data', (_chunk) => {
- // The child process is sending me the `ready` chunk, time to connect to the stdin pipe
- childProcess.stdin = net_1.default.connect(stdInPipeName);
- // From now on the childProcess.stdout is available for reading
- childProcess.stdout = stdOutStream;
- resolve(childProcess);
- });
- });
- stdOutServer.listen(stdOutPipeName);
- let serverClosed = false;
- const closeServer = () => {
- if (serverClosed) {
- return;
- }
- serverClosed = true;
- stdOutServer.close();
- stdErrServer.close();
- };
- // Create the process
- logger.info('Forking TSServer', `PATH: ${newEnv['PATH']} `);
- const bootstrapperPath = path_1.default.resolve(__dirname, '../bin/tsserverForkStart');
- childProcess = child_process_1.default.fork(bootstrapperPath, [modulePath].concat(args), {
- silent: true,
- env: newEnv,
- execArgv: options.execArgv
- });
- childProcess.once('error', (err) => {
- closeServer();
- reject(err);
- });
- childProcess.once('exit', (err) => {
- closeServer();
- reject(err);
- });
+ throw getNotFoundError(cmd)
}
-exports.fork = fork;
+
+module.exports = which
+which.sync = whichSync
/***/ }),
-/* 128 */
+/* 126 */
/***/ (function(module, exports, __webpack_require__) {
-"use strict";
+var fs = __webpack_require__(102)
+var core
+if (process.platform === 'win32' || global.TESTING_WINDOWS) {
+ core = __webpack_require__(127)
+} else {
+ core = __webpack_require__(128)
+}
-Object.defineProperty(exports, "__esModule", { value: true });
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-const coc_nvim_1 = __webpack_require__(1);
-var Trace;
-(function (Trace) {
- Trace[Trace["Off"] = 0] = "Off";
- Trace[Trace["Messages"] = 1] = "Messages";
- Trace[Trace["Verbose"] = 2] = "Verbose";
-})(Trace || (Trace = {}));
-(function (Trace) {
- function fromString(value) {
- value = value || '';
- value = value.toLowerCase();
- switch (value) {
- case 'off':
- return Trace.Off;
- case 'messages':
- return Trace.Messages;
- case 'verbose':
- return Trace.Verbose;
- default:
- return Trace.Off;
- }
- }
- Trace.fromString = fromString;
-})(Trace || (Trace = {}));
-class Tracer {
- constructor(logger) {
- this.logger = logger;
- this.trace = Tracer.readTrace();
- }
- static readTrace() {
- let result = Trace.fromString(coc_nvim_1.workspace.getConfiguration('tsserver').get('trace.server', 'off'));
- if (result === Trace.Off && !!process.env.TSS_TRACE) {
- result = Trace.Messages;
- }
- return result;
- }
- traceRequest(request, responseExpected, queueLength) {
- if (this.trace === Trace.Off)
- return;
- let data;
- if (this.trace === Trace.Verbose && request.arguments) {
- data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`;
- }
- this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${queueLength}`, data);
- }
- traceResponse(response, startTime) {
- if (this.trace === Trace.Off) {
- return;
- }
- let data;
- if (this.trace === Trace.Verbose && response.body) {
- data = `Result: ${JSON.stringify(response.body, null, 4)}`;
- }
- this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data);
- }
- traceEvent(event) {
- if (this.trace === Trace.Off) {
- return;
- }
- let data;
- if (this.trace === Trace.Verbose && event.body) {
- data = `Data: ${JSON.stringify(event.body, null, 4)}`;
- }
- this.logTrace(`Event received: ${event.event} (${event.seq}).`, data);
- }
- logTrace(message, data) {
- if (this.trace !== Trace.Off) {
- this.logger.logLevel('Trace', message, data);
- }
+module.exports = isexe
+isexe.sync = sync
+
+function isexe (path, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ if (!cb) {
+ if (typeof Promise !== 'function') {
+ throw new TypeError('callback not provided')
}
- traceRequestCompleted(command, request_seq, startTime) {
- if (this.trace === Trace.Off) {
- return;
+
+ return new Promise(function (resolve, reject) {
+ isexe(path, options || {}, function (er, is) {
+ if (er) {
+ reject(er)
+ } else {
+ resolve(is)
}
- this.logTrace(`Async response received: ${command} (${request_seq}). Request took ${Date.now() - startTime} ms.`);
+ })
+ })
+ }
+
+ core(path, options || {}, function (er, is) {
+ // ignore EACCES because that just means we aren't allowed to run it
+ if (er) {
+ if (er.code === 'EACCES' || options && options.ignoreErrors) {
+ er = null
+ is = false
+ }
}
+ cb(er, is)
+ })
+}
+
+function sync (path, options) {
+ // my kingdom for a filtered catch
+ try {
+ return core.sync(path, options || {})
+ } catch (er) {
+ if (options && options.ignoreErrors || er.code === 'EACCES') {
+ return false
+ } else {
+ throw er
+ }
+ }
}
-exports.default = Tracer;
/***/ }),
-/* 129 */
+/* 127 */
/***/ (function(module, exports, __webpack_require__) {
-"use strict";
+module.exports = isexe
+isexe.sync = sync
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.inferredProjectConfig = void 0;
-function inferredProjectConfig(config) {
- const base = {
- module: 'commonjs',
- target: 'es2016',
- jsx: 'preserve'
- };
- if (config.checkJs) {
- base.checkJs = true;
- }
- if (config.experimentalDecorators) {
- base.experimentalDecorators = true;
+var fs = __webpack_require__(102)
+
+function checkPathExt (path, options) {
+ var pathext = options.pathExt !== undefined ?
+ options.pathExt : process.env.PATHEXT
+
+ if (!pathext) {
+ return true
+ }
+
+ pathext = pathext.split(';')
+ if (pathext.indexOf('') !== -1) {
+ return true
+ }
+ for (var i = 0; i < pathext.length; i++) {
+ var p = pathext[i].toLowerCase()
+ if (p && path.substr(-p.length).toLowerCase() === p) {
+ return true
}
- return base;
+ }
+ return false
+}
+
+function checkStat (stat, path, options) {
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
+ return false
+ }
+ return checkPathExt(path, options)
+}
+
+function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, path, options))
+ })
+}
+
+function sync (path, options) {
+ return checkStat(fs.statSync(path), path, options)
}
-exports.inferredProjectConfig = inferredProjectConfig;
/***/ }),
-/* 130 */
+/* 128 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = isexe
+isexe.sync = sync
+
+var fs = __webpack_require__(102)
+
+function isexe (path, options, cb) {
+ fs.stat(path, function (er, stat) {
+ cb(er, er ? false : checkStat(stat, options))
+ })
+}
+
+function sync (path, options) {
+ return checkStat(fs.statSync(path), options)
+}
+
+function checkStat (stat, options) {
+ return stat.isFile() && checkMode(stat, options)
+}
+
+function checkMode (stat, options) {
+ var mod = stat.mode
+ var uid = stat.uid
+ var gid = stat.gid
+
+ var myUid = options.uid !== undefined ?
+ options.uid : process.getuid && process.getuid()
+ var myGid = options.gid !== undefined ?
+ options.gid : process.getgid && process.getgid()
+
+ var u = parseInt('100', 8)
+ var g = parseInt('010', 8)
+ var o = parseInt('001', 8)
+ var ug = u | g
+
+ var ret = (mod & o) ||
+ (mod & g) && gid === myGid ||
+ (mod & u) && uid === myUid ||
+ (mod & ug) && myUid === 0
+
+ return ret
+}
+
+
+/***/ }),
+/* 129 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TypeScriptVersionProvider = exports.TypeScriptVersion = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-const fs_1 = __importDefault(__webpack_require__(118));
-const path_1 = __importDefault(__webpack_require__(13));
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
const coc_nvim_1 = __webpack_require__(1);
-const api_1 = __importDefault(__webpack_require__(40));
-const requireFunc = true ? require : undefined;
-class TypeScriptVersion {
- constructor(path, _pathLabel) {
- this.path = path;
- this._pathLabel = _pathLabel;
- this._api = null;
- }
- get tscPath() {
- return path_1.default.resolve(this.path, '../bin/tsc');
- }
- get tsServerPath() {
- return path_1.default.resolve(this.path, 'tsserver.js');
- }
- get pathLabel() {
- return typeof this._pathLabel === 'undefined' ? this.path : this._pathLabel;
- }
- get isValid() {
- return this.version != null;
- }
- get version() {
- if (this._api)
- return this._api;
- let api = this._api = this.getTypeScriptVersion(this.tsServerPath);
- return api;
- }
- get versionString() {
- const version = this.version;
- return version ? version.versionString : null;
- }
- getTypeScriptVersion(serverPath) {
- if (!fs_1.default.existsSync(serverPath)) {
- return undefined;
+const is = __importStar(__webpack_require__(130));
+class Logger {
+ get output() {
+ if (this._channel) {
+ return this._channel;
}
- const p = serverPath.split(path_1.default.sep);
- if (p.length <= 2) {
- return undefined;
+ this._channel = coc_nvim_1.workspace.createOutputChannel('tsserver');
+ return this._channel;
+ }
+ dispose() {
+ if (this._channel) {
+ this._channel.dispose();
}
- const p2 = p.slice(0, -2);
- const modulePath = p2.join(path_1.default.sep);
- let fileName = path_1.default.join(modulePath, 'package.json');
- if (!fs_1.default.existsSync(fileName)) {
- // Special case for ts dev versions
- if (path_1.default.basename(modulePath) === 'built') {
- fileName = path_1.default.join(modulePath, '..', 'package.json');
+ }
+ data2String(data) {
+ if (data instanceof Error) {
+ if (is.string(data.stack)) {
+ return data.stack;
}
+ return data.message;
}
- if (!fs_1.default.existsSync(fileName)) {
- return undefined;
- }
- const contents = fs_1.default.readFileSync(fileName).toString();
- let desc = null;
- try {
- desc = JSON.parse(contents);
- }
- catch (err) {
- return undefined;
- }
- if (!desc || !desc.version) {
- return undefined;
+ if (is.boolean(data.success) && !data.success && is.string(data.message)) {
+ return data.message;
}
- return desc.version ? api_1.default.fromVersionString(desc.version) : undefined;
- }
-}
-exports.TypeScriptVersion = TypeScriptVersion;
-const MODULE_FOLDERS = ['node_modules/typescript/lib', '.vscode/pnpify/typescript/lib'];
-class TypeScriptVersionProvider {
- constructor(configuration) {
- this.configuration = configuration;
- }
- updateConfiguration(configuration) {
- this.configuration = configuration;
- }
- getDefaultVersion() {
- // tsdk from configuration
- let { globalTsdk } = this.configuration;
- if (globalTsdk)
- return new TypeScriptVersion(globalTsdk);
- return this.bundledVersion;
- }
- get globalVersion() {
- let { globalTsdk } = this.configuration;
- if (globalTsdk)
- return new TypeScriptVersion(globalTsdk);
- return undefined;
- }
- getLocalVersion() {
- let folders = coc_nvim_1.workspace.workspaceFolders.map(f => coc_nvim_1.Uri.parse(f.uri).fsPath);
- for (let p of folders) {
- for (let folder of MODULE_FOLDERS) {
- let libFolder = path_1.default.join(p, folder);
- if (fs_1.default.existsSync(libFolder)) {
- let version = new TypeScriptVersion(libFolder);
- if (version.isValid)
- return version;
- }
- }
+ if (is.string(data)) {
+ return data;
}
- return null;
+ return data.toString();
}
- get bundledVersion() {
- try {
- const file = requireFunc.resolve('typescript');
- const bundledVersion = new TypeScriptVersion(path_1.default.dirname(file), '');
- return bundledVersion;
+ info(message, data) {
+ this.logLevel('Info', message, data);
+ }
+ warn(message, data) {
+ this.logLevel('Warn', message, data);
+ }
+ error(message, data) {
+ // See https://github.com/Microsoft/TypeScript/issues/10496
+ if (data && data.message === 'No content available.') {
+ return;
}
- catch (e) {
- coc_nvim_1.workspace.showMessage('Bundled typescript module not found', 'error');
- return null;
+ this.logLevel('Error', message, data);
+ }
+ logLevel(level, message, data) {
+ this.output.appendLine(`[${level} - ${new Date().toLocaleTimeString()}] ${message}`);
+ if (data) {
+ this.output.appendLine(this.data2String(data));
}
}
}
-exports.TypeScriptVersionProvider = TypeScriptVersionProvider;
+exports.default = Logger;
/***/ }),
-/* 131 */
+/* 130 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
-};
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
-const coc_nvim_1 = __webpack_require__(1);
-class VersionStatus {
- constructor(_normalizePath, enableJavascript) {
- this._normalizePath = _normalizePath;
- this.enableJavascript = enableJavascript;
- this._versionBarEntry = coc_nvim_1.workspace.createStatusBarItem(99);
- this._onChangeEditorSub = coc_nvim_1.events.on('BufEnter', this.onBufEnter, this);
- this._versionBarEntry.show();
- }
- dispose() {
- this._versionBarEntry.dispose();
- this._onChangeEditorSub.dispose();
- }
- onDidChangeTypeScriptVersion(_version) {
- this._versionBarEntry.text = `TSC`;
- }
- set loading(isLoading) {
- this._versionBarEntry.isProgress = isLoading;
- }
- checkFiletype(filetype) {
- if (filetype.startsWith('javascript') && this.enableJavascript) {
- return true;
- }
- return filetype.startsWith('typescript');
- }
- onBufEnter(bufnr) {
- return __awaiter(this, void 0, void 0, function* () {
- let filetype = yield coc_nvim_1.workspace.nvim.call('getbufvar', [bufnr, '&filetype', '']);
- if (this.checkFiletype(filetype)) {
- this._versionBarEntry.show();
- }
- else {
- this._versionBarEntry.hide();
- }
- });
- }
+exports.string = exports.boolean = exports.defined = void 0;
+const toString = Object.prototype.toString;
+function defined(value) {
+ return typeof value !== 'undefined';
}
-exports.default = VersionStatus;
+exports.defined = defined;
+function boolean(value) {
+ return value === true || value === false;
+}
+exports.boolean = boolean;
+function string(value) {
+ return toString.call(value) === '[object String]';
+}
+exports.string = string;
/***/ }),
-/* 132 */
+/* 131 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.Reader = void 0;
-const DefaultSize = 8192;
-const ContentLength = 'Content-Length: ';
-const ContentLengthSize = Buffer.byteLength(ContentLength, 'utf8');
-const Blank = Buffer.from(' ', 'utf8')[0];
-const BackslashR = Buffer.from('\r', 'utf8')[0];
-const BackslashN = Buffer.from('\n', 'utf8')[0];
-class ProtocolBuffer {
- constructor() {
- this.index = 0;
- this.buffer = Buffer.allocUnsafe(DefaultSize);
+exports.fork = exports.getTempFile = exports.getTempDirectory = exports.makeRandomHexString = void 0;
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+const child_process_1 = __importDefault(__webpack_require__(101));
+const net_1 = __importDefault(__webpack_require__(16));
+const os_1 = __importDefault(__webpack_require__(14));
+const path_1 = __importDefault(__webpack_require__(13));
+const fs_1 = __importDefault(__webpack_require__(102));
+function makeRandomHexString(length) {
+ let chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
+ let result = '';
+ for (let i = 0; i < length; i++) {
+ const idx = Math.floor(chars.length * Math.random());
+ result += chars[idx];
}
- append(data) {
- let toAppend = null;
- if (Buffer.isBuffer(data)) {
- toAppend = data;
- }
- else {
- toAppend = Buffer.from(data, 'utf8');
- }
- if (this.buffer.length - this.index >= toAppend.length) {
- toAppend.copy(this.buffer, this.index, 0, toAppend.length);
- }
- else {
- let newSize = (Math.ceil((this.index + toAppend.length) / DefaultSize) + 1) *
- DefaultSize;
- if (this.index === 0) {
- this.buffer = Buffer.allocUnsafe(newSize);
- toAppend.copy(this.buffer, 0, 0, toAppend.length);
- }
- else {
- this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
- }
- }
- this.index += toAppend.length;
+ return result;
+}
+exports.makeRandomHexString = makeRandomHexString;
+function getTempDirectory() {
+ let dir = path_1.default.join(os_1.default.tmpdir(), `coc.nvim-${process.pid}`);
+ if (!fs_1.default.existsSync(dir)) {
+ fs_1.default.mkdirSync(dir);
}
- tryReadContentLength() {
- let result = -1;
- let current = 0;
- // we are utf8 encoding...
- while (current < this.index &&
- (this.buffer[current] === Blank ||
- this.buffer[current] === BackslashR ||
- this.buffer[current] === BackslashN)) {
- current++;
- }
- if (this.index < current + ContentLengthSize) {
- return result;
- }
- current += ContentLengthSize;
- let start = current;
- while (current < this.index && this.buffer[current] !== BackslashR) {
- current++;
- }
- if (current + 3 >= this.index ||
- this.buffer[current + 1] !== BackslashN ||
- this.buffer[current + 2] !== BackslashR ||
- this.buffer[current + 3] !== BackslashN) {
- return result;
- }
- let data = this.buffer.toString('utf8', start, current);
- result = parseInt(data, 10);
- this.buffer = this.buffer.slice(current + 4);
- this.index = this.index - (current + 4);
- return result;
+ return dir;
+}
+exports.getTempDirectory = getTempDirectory;
+function generatePipeName() {
+ return getPipeName(makeRandomHexString(40));
+}
+function getPipeName(name) {
+ const fullName = 'coc-tsc-' + name;
+ if (process.platform === 'win32') {
+ return '\\\\.\\pipe\\' + fullName + '-sock';
}
- tryReadContent(length) {
- if (this.index < length) {
- return null;
+ const tmpdir = getTempDirectory();
+ // Mac/Unix: use socket file
+ return path_1.default.join(tmpdir, fullName + '.sock');
+}
+function getTempFile(name) {
+ const fullName = 'coc-nvim-' + name;
+ return path_1.default.join(getTempDirectory(), fullName + '.sock');
+}
+exports.getTempFile = getTempFile;
+function generatePatchedEnv(env, stdInPipeName, stdOutPipeName, stdErrPipeName) {
+ const newEnv = Object.assign({}, env);
+ // Set the two unique pipe names and the electron flag as process env
+ newEnv['STDIN_PIPE_NAME'] = stdInPipeName; // tslint:disable-line
+ newEnv['STDOUT_PIPE_NAME'] = stdOutPipeName; // tslint:disable-line
+ newEnv['STDERR_PIPE_NAME'] = stdErrPipeName; // tslint:disable-line
+ newEnv['TSS_LOG'] = `-level verbose -file ${path_1.default.join(os_1.default.tmpdir(), 'coc-nvim-tsc.log')}`; // tslint:disable-line
+ // Ensure we always have a PATH set
+ newEnv['PATH'] = newEnv['PATH'] || process.env.PATH; // tslint:disable-line
+ return newEnv;
+}
+function fork(modulePath, args, options, logger, callback) {
+ let callbackCalled = false;
+ const resolve = (result) => {
+ if (callbackCalled) {
+ return;
}
- let result = this.buffer.toString('utf8', 0, length);
- let sourceStart = length;
- while (sourceStart < this.index &&
- (this.buffer[sourceStart] === BackslashR ||
- this.buffer[sourceStart] === BackslashN)) {
- sourceStart++;
+ callbackCalled = true;
+ callback(null, result);
+ };
+ const reject = (err) => {
+ if (callbackCalled) {
+ return;
}
- this.buffer.copy(this.buffer, 0, sourceStart);
- this.index = this.index - sourceStart;
- return result;
- }
-}
-class Reader {
- constructor(readable, callback, onError) {
- this.readable = readable;
- this.callback = callback;
- this.onError = onError;
- this.buffer = new ProtocolBuffer();
- this.nextMessageLength = -1;
- this.readable.on('data', (data) => {
- this.onLengthData(data);
+ callbackCalled = true;
+ callback(err, null);
+ };
+ // Generate three unique pipe names
+ const stdInPipeName = generatePipeName();
+ const stdOutPipeName = generatePipeName();
+ const stdErrPipeName = generatePipeName();
+ const newEnv = generatePatchedEnv(process.env, stdInPipeName, stdOutPipeName, stdErrPipeName);
+ newEnv['NODE_PATH'] = path_1.default.join(modulePath, '..', '..', '..'); // tslint:disable-line
+ let childProcess;
+ // Begin listening to stderr pipe
+ let stdErrServer = net_1.default.createServer(stdErrStream => {
+ // From now on the childProcess.stderr is available for reading
+ childProcess.stderr = stdErrStream;
+ });
+ stdErrServer.listen(stdErrPipeName);
+ // Begin listening to stdout pipe
+ let stdOutServer = net_1.default.createServer(stdOutStream => {
+ // The child process will write exactly one chunk with content `ready` when it has installed a listener to the stdin pipe
+ stdOutStream.once('data', (_chunk) => {
+ // The child process is sending me the `ready` chunk, time to connect to the stdin pipe
+ childProcess.stdin = net_1.default.connect(stdInPipeName);
+ // From now on the childProcess.stdout is available for reading
+ childProcess.stdout = stdOutStream;
+ resolve(childProcess);
});
- }
- onLengthData(data) {
- try {
- this.buffer.append(data);
- while (true) {
- if (this.nextMessageLength === -1) {
- this.nextMessageLength = this.buffer.tryReadContentLength();
- if (this.nextMessageLength === -1) {
- return;
- }
- }
- const msg = this.buffer.tryReadContent(this.nextMessageLength);
- if (msg === null) {
- return;
- }
- this.nextMessageLength = -1;
- const json = JSON.parse(msg);
- this.callback(json);
- }
- }
- catch (e) {
- this.onError(e);
+ });
+ stdOutServer.listen(stdOutPipeName);
+ let serverClosed = false;
+ const closeServer = () => {
+ if (serverClosed) {
+ return;
}
- }
+ serverClosed = true;
+ stdOutServer.close();
+ stdErrServer.close();
+ };
+ // Create the process
+ logger.info('Forking TSServer', `PATH: ${newEnv['PATH']} `);
+ const bootstrapperPath = path_1.default.resolve(__dirname, '../bin/tsserverForkStart');
+ childProcess = child_process_1.default.fork(bootstrapperPath, [modulePath].concat(args), {
+ silent: true,
+ env: newEnv,
+ execArgv: options.execArgv
+ });
+ childProcess.once('error', (err) => {
+ closeServer();
+ reject(err);
+ });
+ childProcess.once('exit', (err) => {
+ closeServer();
+ reject(err);
+ });
}
-exports.Reader = Reader;
+exports.fork = fork;
/***/ }),
-/* 133 */
+/* 132 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.CallbackMap = void 0;
-const typescriptService_1 = __webpack_require__(123);
-class CallbackMap {
- constructor() {
- this._callbacks = new Map();
- this._asyncCallbacks = new Map();
+const coc_nvim_1 = __webpack_require__(1);
+var Trace;
+(function (Trace) {
+ Trace[Trace["Off"] = 0] = "Off";
+ Trace[Trace["Messages"] = 1] = "Messages";
+ Trace[Trace["Verbose"] = 2] = "Verbose";
+})(Trace || (Trace = {}));
+(function (Trace) {
+ function fromString(value) {
+ value = value || '';
+ value = value.toLowerCase();
+ switch (value) {
+ case 'off':
+ return Trace.Off;
+ case 'messages':
+ return Trace.Messages;
+ case 'verbose':
+ return Trace.Verbose;
+ default:
+ return Trace.Off;
+ }
}
- destroy(cause) {
- const cancellation = new typescriptService_1.ServerResponse.Cancelled(cause);
- for (const callback of this._callbacks.values()) {
- callback.onSuccess(cancellation);
+ Trace.fromString = fromString;
+})(Trace || (Trace = {}));
+class Tracer {
+ constructor(logger) {
+ this.logger = logger;
+ this.trace = Tracer.readTrace();
+ }
+ static readTrace() {
+ let result = Trace.fromString(coc_nvim_1.workspace.getConfiguration('tsserver').get('trace.server', 'off'));
+ if (result === Trace.Off && !!process.env.TSS_TRACE) {
+ result = Trace.Messages;
}
- this._callbacks.clear();
- for (const callback of this._asyncCallbacks.values()) {
- callback.onSuccess(cancellation);
+ return result;
+ }
+ traceRequest(request, responseExpected, queueLength) {
+ if (this.trace === Trace.Off)
+ return;
+ let data;
+ if (this.trace === Trace.Verbose && request.arguments) {
+ data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`;
}
- this._asyncCallbacks.clear();
+ this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${queueLength}`, data);
}
- add(seq, callback, isAsync) {
- if (isAsync) {
- this._asyncCallbacks.set(seq, callback);
+ traceResponse(response, startTime) {
+ if (this.trace === Trace.Off) {
+ return;
}
- else {
- this._callbacks.set(seq, callback);
+ let data;
+ if (this.trace === Trace.Verbose && response.body) {
+ data = `Result: ${JSON.stringify(response.body, null, 4)}`;
}
+ this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data);
}
- fetch(seq) {
- const callback = this._callbacks.get(seq) || this._asyncCallbacks.get(seq);
- this.delete(seq);
- return callback;
+ traceEvent(event) {
+ if (this.trace === Trace.Off) {
+ return;
+ }
+ let data;
+ if (this.trace === Trace.Verbose && event.body) {
+ data = `Data: ${JSON.stringify(event.body, null, 4)}`;
+ }
+ this.logTrace(`Event received: ${event.event} (${event.seq}).`, data);
}
- delete(seq) {
- if (!this._callbacks.delete(seq)) {
- this._asyncCallbacks.delete(seq);
+ logTrace(message, data) {
+ if (this.trace !== Trace.Off) {
+ this.logger.logLevel('Trace', message, data);
+ }
+ }
+ traceRequestCompleted(command, request_seq, startTime) {
+ if (this.trace === Trace.Off) {
+ return;
}
+ this.logTrace(`Async response received: ${command} (${request_seq}). Request took ${Date.now() - startTime} ms.`);
}
}
-exports.CallbackMap = CallbackMap;
+exports.default = Tracer;
/***/ }),
-/* 134 */
+/* 133 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
-exports.RequestQueue = exports.RequestQueueingType = void 0;
-var RequestQueueingType;
-(function (RequestQueueingType) {
- /**
- * Normal request that is executed in order.
- */
- RequestQueueingType[RequestQueueingType["Normal"] = 1] = "Normal";
- /**
- * Request that normal requests jump in front of in the queue.
- */
- RequestQueueingType[RequestQueueingType["LowPriority"] = 2] = "LowPriority";
- /**
- * A fence that blocks request reordering.
- *
- * Fences are not reordered. Unlike a normal request, a fence will never jump in front of a low priority request
- * in the request queue.
- */
- RequestQueueingType[RequestQueueingType["Fence"] = 3] = "Fence";
-})(RequestQueueingType = exports.RequestQueueingType || (exports.RequestQueueingType = {}));
-class RequestQueue {
- constructor() {
- this.queue = [];
- this.sequenceNumber = 0;
- }
- get length() {
- return this.queue.length;
- }
- enqueue(item) {
- if (item.queueingType === RequestQueueingType.Normal) {
- let index = this.queue.length - 1;
- while (index >= 0) {
- if (this.queue[index].queueingType !== RequestQueueingType.LowPriority) {
- break;
- }
- --index;
- }
- this.queue.splice(index + 1, 0, item);
- }
- else {
- // Only normal priority requests can be reordered. All other requests just go to the end.
- this.queue.push(item);
- }
- }
- dequeue() {
- return this.queue.shift();
- }
- tryDeletePendingRequest(seq) {
- for (let i = 0; i < this.queue.length; i++) {
- if (this.queue[i].request.seq === seq) {
- this.queue.splice(i, 1);
- return true;
- }
- }
- return false;
+exports.inferredProjectConfig = void 0;
+function inferredProjectConfig(config) {
+ const base = {
+ module: 'commonjs',
+ target: 'es2016',
+ jsx: 'preserve'
+ };
+ if (config.checkJs) {
+ base.checkJs = true;
}
- createRequest(command, args) {
- return {
- seq: this.sequenceNumber++,
- type: 'request',
- command,
- arguments: args
- };
+ if (config.experimentalDecorators) {
+ base.experimentalDecorators = true;
}
+ return base;
}
-exports.RequestQueue = RequestQueue;
-
-
-/***/ }),
-/* 135 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
- __setModuleDefault(result, mod);
- return result;
-};
+exports.inferredProjectConfig = inferredProjectConfig;
+
+
+/***/ }),
+/* 134 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
+exports.TypeScriptVersionProvider = exports.TypeScriptVersion = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+const fs_1 = __importDefault(__webpack_require__(102));
+const path_1 = __importDefault(__webpack_require__(13));
const coc_nvim_1 = __webpack_require__(1);
-const vscode_languageserver_protocol_1 = __webpack_require__(3);
const api_1 = __importDefault(__webpack_require__(40));
-const async_1 = __webpack_require__(136);
-const typeConverters = __importStar(__webpack_require__(37));
-const languageModeIds = __importStar(__webpack_require__(116));
-function mode2ScriptKind(mode) {
- switch (mode) {
- case languageModeIds.typescript:
- return 'TS';
- case languageModeIds.typescripttsx:
- return 'TSX';
- case languageModeIds.typescriptjsx:
- return 'TSX';
- case languageModeIds.typescriptreact:
- return 'TSX';
- case languageModeIds.javascript:
- return 'JS';
- case languageModeIds.javascriptreact:
- return 'JSX';
- }
- return undefined;
-}
-/**
- * Manages synchronization of buffers with the TS server.
- *
- * If supported, batches together file changes. This allows the TS server to more efficiently process changes.
- */
-class BufferSynchronizer {
- constructor(client) {
- this.client = client;
- this._pending = {};
- this._pendingFiles = new Set();
+const requireFunc = true ? require : undefined;
+class TypeScriptVersion {
+ constructor(path, _pathLabel) {
+ this.path = path;
+ this._pathLabel = _pathLabel;
+ this._api = null;
}
- open(args) {
- this.client.executeWithoutWaitingForResponse('open', args);
+ get tscPath() {
+ return path_1.default.resolve(this.path, '../bin/tsc');
}
- close(filepath) {
- const args = { file: filepath };
- this.client.executeWithoutWaitingForResponse('close', args);
+ get tsServerPath() {
+ return path_1.default.resolve(this.path, 'tsserver.js');
}
- change(filepath, events) {
- if (!events.length) {
- return;
- }
- if (this.supportsBatching) {
- this.updatePending(filepath, pending => {
- if (!pending.changedFiles) {
- pending.changedFiles = [];
- }
- pending.changedFiles.push({
- fileName: filepath,
- textChanges: events.map((change) => ({
- newText: change.text,
- start: typeConverters.Position.toLocation(change.range.start),
- end: typeConverters.Position.toLocation(change.range.end),
- })).reverse(),
- });
- });
- }
- else {
- for (const event of events) {
- const args = Object.assign({ insertString: event.text }, typeConverters.Range.toFormattingRequestArgs(filepath, event.range));
- this.client.executeWithoutWaitingForResponse('change', args);
- }
- }
+ get pathLabel() {
+ return typeof this._pathLabel === 'undefined' ? this.path : this._pathLabel;
}
- beforeCommand(command) {
- if (command === 'updateOpen') {
- return;
- }
- this.flush();
+ get isValid() {
+ return this.version != null;
}
- flush() {
- if (!this.supportsBatching) {
- // We've already eagerly synchronized
- return;
- }
- if (this._pending.changedFiles) {
- this.client.executeWithoutWaitingForResponse('updateOpen', this._pending);
- this._pending = {};
- this._pendingFiles.clear();
- }
+ get version() {
+ if (this._api)
+ return this._api;
+ let api = this._api = this.getTypeScriptVersion(this.tsServerPath);
+ return api;
}
- get supportsBatching() {
- return this.client.apiVersion.gte(api_1.default.v340) && coc_nvim_1.workspace.getConfiguration('tsserver').get('useBatchedBufferSync', true);
+ get versionString() {
+ const version = this.version;
+ return version ? version.versionString : null;
}
- updatePending(filepath, f) {
- if (this.supportsBatching && this._pendingFiles.has(filepath)) {
- this.flush();
- this._pendingFiles.clear();
- f(this._pending);
- this._pendingFiles.add(filepath);
- }
- else {
- f(this._pending);
+ getTypeScriptVersion(serverPath) {
+ if (!fs_1.default.existsSync(serverPath)) {
+ return undefined;
}
- }
- reset() {
- this._pending = {};
- this._pendingFiles.clear();
- }
-}
-class BufferSyncSupport {
- constructor(client) {
- this.uris = new Set();
- this.disposables = [];
- this.pendingDiagnostics = new Map();
- this._validateJavaScript = true;
- this._validateTypeScript = true;
- this.listening = false;
- this._onDelete = new vscode_languageserver_protocol_1.Emitter();
- this.onDelete = this._onDelete.event;
- this.client = client;
- this.synchronizer = new BufferSynchronizer(client);
- this.modeIds = new Set(languageModeIds.languageIds);
- this.diagnosticDelayer = new async_1.Delayer(300);
- }
- listen() {
- if (this.listening) {
- return;
+ const p = serverPath.split(path_1.default.sep);
+ if (p.length <= 2) {
+ return undefined;
}
- this.listening = true;
- coc_nvim_1.workspace.onDidOpenTextDocument(this.onDidOpenTextDocument, this, this.disposables);
- coc_nvim_1.workspace.onDidCloseTextDocument(this.onDidCloseTextDocument, this, this.disposables);
- coc_nvim_1.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, this.disposables);
- coc_nvim_1.workspace.textDocuments.forEach(this.onDidOpenTextDocument, this);
- this.updateConfiguration();
- coc_nvim_1.workspace.onDidChangeConfiguration(this.updateConfiguration, this, this.disposables);
- }
- dispose() {
- this.pendingDiagnostics.clear();
- coc_nvim_1.disposeAll(this.disposables);
- }
- onDidOpenTextDocument(document) {
- if (!this.modeIds.has(document.languageId))
- return;
- let { uri } = document;
- let filepath = this.client.toPath(uri);
- this.uris.add(uri);
- const args = {
- file: filepath,
- fileContent: document.getText()
- };
- if (this.client.apiVersion.gte(api_1.default.v203)) {
- const scriptKind = mode2ScriptKind(document.languageId);
- if (scriptKind) {
- args.scriptKindName = scriptKind;
+ const p2 = p.slice(0, -2);
+ const modulePath = p2.join(path_1.default.sep);
+ let fileName = path_1.default.join(modulePath, 'package.json');
+ if (!fs_1.default.existsSync(fileName)) {
+ // Special case for ts dev versions
+ if (path_1.default.basename(modulePath) === 'built') {
+ fileName = path_1.default.join(modulePath, '..', 'package.json');
}
}
- if (this.client.apiVersion.gte(api_1.default.v230)) {
- let root = this.client.getProjectRootPath(document.uri);
- if (root)
- args.projectRootPath = root;
- }
- this.synchronizer.open(args);
- // this.client.executeWithoutWaitingForResponse('open', args)
- this.requestDiagnostic(uri);
- }
- onDidCloseTextDocument(document) {
- let { uri } = document;
- if (!this.uris.has(uri))
- return;
- let filepath = this.client.toPath(uri);
- this.uris.delete(uri);
- this.pendingDiagnostics.delete(uri);
- this.synchronizer.close(filepath);
- this._onDelete.fire(uri);
- this.requestAllDiagnostics();
- // this.client.executeWithoutWaitingForResponse('close', args)
- }
- onDidChangeTextDocument(e) {
- let { textDocument, contentChanges } = e;
- let { uri } = textDocument;
- if (!this.uris.has(uri))
- return;
- let filepath = this.client.toPath(uri);
- this.synchronizer.change(filepath, contentChanges);
- const didTrigger = this.requestDiagnostic(uri);
- if (!didTrigger && this.pendingGetErr) {
- // In this case we always want to re-trigger all diagnostics
- this.pendingGetErr.cancel();
- this.pendingGetErr = undefined;
- this.triggerDiagnostics();
+ if (!fs_1.default.existsSync(fileName)) {
+ return undefined;
}
- }
- beforeCommand(command) {
- this.synchronizer.beforeCommand(command);
- }
- interuptGetErr(f) {
- if (!this.pendingGetErr) {
- return f();
+ const contents = fs_1.default.readFileSync(fileName).toString();
+ let desc = null;
+ try {
+ desc = JSON.parse(contents);
}
- this.pendingGetErr.cancel();
- this.pendingGetErr = undefined;
- const result = f();
- this.triggerDiagnostics();
- return result;
- }
- getErr(resources) {
- const handledResources = resources.filter(resource => this.uris.has(resource.toString()));
- if (!handledResources.length) {
- return;
+ catch (err) {
+ return undefined;
}
- for (const resource of handledResources) {
- let uri = resource.toString();
- if (this.shouldValidate(uri)) {
- this.pendingDiagnostics.set(uri, Date.now());
- }
+ if (!desc || !desc.version) {
+ return undefined;
}
- this.triggerDiagnostics();
- }
- has(uri) {
- return this.uris.has(uri);
+ return desc.version ? api_1.default.fromVersionString(desc.version) : undefined;
}
- triggerDiagnostics(delay = 200) {
- this.diagnosticDelayer.trigger(() => {
- this.sendPendingDiagnostics();
- }, delay);
+}
+exports.TypeScriptVersion = TypeScriptVersion;
+const MODULE_FOLDERS = ['node_modules/typescript/lib', '.vscode/pnpify/typescript/lib', '.yarn/sdks/typescript/lib'];
+class TypeScriptVersionProvider {
+ constructor(configuration) {
+ this.configuration = configuration;
}
- requestAllDiagnostics() {
- for (const uri of this.uris) {
- if (this.shouldValidate(uri)) {
- this.pendingDiagnostics.set(uri, Date.now());
- }
- }
- this.diagnosticDelayer.trigger(() => {
- this.sendPendingDiagnostics();
- }, 200);
+ updateConfiguration(configuration) {
+ this.configuration = configuration;
}
- requestDiagnostic(uri) {
- let document = coc_nvim_1.workspace.getDocument(uri);
- if (!document || !this.shouldValidate(uri))
- return false;
- this.pendingDiagnostics.set(uri, Date.now());
- const lineCount = document.lineCount;
- const delay = Math.min(Math.max(Math.ceil(lineCount / 20), 300), 800);
- this.triggerDiagnostics(delay);
- return true;
+ getDefaultVersion() {
+ // tsdk from configuration
+ let { globalTsdk } = this.configuration;
+ if (globalTsdk)
+ return new TypeScriptVersion(globalTsdk);
+ return this.bundledVersion;
}
- hasPendingDiagnostics(uri) {
- return this.pendingDiagnostics.has(uri);
+ get globalVersion() {
+ let { globalTsdk } = this.configuration;
+ if (globalTsdk)
+ return new TypeScriptVersion(coc_nvim_1.workspace.expand(globalTsdk));
+ return undefined;
}
- sendPendingDiagnostics() {
- const uris = Array.from(this.pendingDiagnostics.entries())
- .sort((a, b) => a[1] - b[1])
- .map(entry => entry[0]);
- // Add all open TS buffers to the geterr request. They might be visible
- for (const uri of this.uris) {
- if (uris.indexOf(uri) == -1) {
- uris.push(uri);
+ getLocalVersion() {
+ let folders = coc_nvim_1.workspace.workspaceFolders.map(f => coc_nvim_1.Uri.parse(f.uri).fsPath);
+ for (let p of folders) {
+ for (let folder of MODULE_FOLDERS) {
+ let libFolder = path_1.default.join(p, folder);
+ if (fs_1.default.existsSync(libFolder)) {
+ let version = new TypeScriptVersion(libFolder);
+ if (version.isValid)
+ return version;
+ }
}
}
- let files = uris.map(uri => this.client.toPath(uri));
- if (files.length) {
- if (this.pendingGetErr)
- this.pendingGetErr.cancel();
- const getErr = this.pendingGetErr = GetErrRequest.executeGetErrRequest(this.client, files, () => {
- if (this.pendingGetErr === getErr) {
- this.pendingGetErr = undefined;
- }
- });
+ return null;
+ }
+ get bundledVersion() {
+ try {
+ const file = requireFunc.resolve('typescript');
+ const bundledVersion = new TypeScriptVersion(path_1.default.dirname(file), '');
+ return bundledVersion;
+ }
+ catch (e) {
+ coc_nvim_1.workspace.showMessage('Bundled typescript module not found', 'error');
+ return null;
}
- this.pendingDiagnostics.clear();
}
- updateConfiguration() {
- const jsConfig = coc_nvim_1.workspace.getConfiguration('javascript', null);
- const tsConfig = coc_nvim_1.workspace.getConfiguration('typescript', null);
- this._validateJavaScript = jsConfig.get('validate.enable', true);
- this._validateTypeScript = tsConfig.get('validate.enable', true);
+}
+exports.TypeScriptVersionProvider = TypeScriptVersionProvider;
+
+
+/***/ }),
+/* 135 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+const coc_nvim_1 = __webpack_require__(1);
+class VersionStatus {
+ constructor(_normalizePath, enableJavascript) {
+ this._normalizePath = _normalizePath;
+ this.enableJavascript = enableJavascript;
+ this._versionBarEntry = coc_nvim_1.workspace.createStatusBarItem(99);
+ this._onChangeEditorSub = coc_nvim_1.events.on('BufEnter', this.onBufEnter, this);
+ this._versionBarEntry.show();
}
- shouldValidate(uri) {
- let doc = coc_nvim_1.workspace.getDocument(uri);
- if (!doc)
- return false;
- if (languageModeIds.languageIds.indexOf(doc.filetype) == -1) {
- return false;
- }
- if (doc.filetype.startsWith('javascript')) {
- return this._validateJavaScript;
- }
- return this._validateTypeScript;
+ dispose() {
+ this._versionBarEntry.dispose();
+ this._onChangeEditorSub.dispose();
}
- reinitialize() {
- var _a;
- this.pendingDiagnostics.clear();
- (_a = this.pendingGetErr) === null || _a === void 0 ? void 0 : _a.cancel();
- this.synchronizer.reset();
- for (let doc of coc_nvim_1.workspace.documents) {
- this.onDidOpenTextDocument(doc.textDocument);
- }
+ onDidChangeTypeScriptVersion(_version) {
+ this._versionBarEntry.text = `TSC`;
}
-}
-exports.default = BufferSyncSupport;
-class GetErrRequest {
- constructor(client, files, _token, onDone) {
- this.files = files;
- this._token = _token;
- this._done = false;
- const args = {
- delay: 0,
- files: this.files
- };
- const done = () => {
- if (this._done) {
- return;
- }
- this._done = true;
- onDone();
- };
- client.executeAsync('geterr', args, _token.token).then(done, done);
+ set loading(isLoading) {
+ this._versionBarEntry.isProgress = isLoading;
}
- static executeGetErrRequest(client, files, onDone) {
- const token = new vscode_languageserver_protocol_1.CancellationTokenSource();
- return new GetErrRequest(client, files, token, onDone);
+ checkFiletype(filetype) {
+ if (filetype.startsWith('javascript') && this.enableJavascript) {
+ return true;
+ }
+ return filetype.startsWith('typescript');
}
- cancel() {
- if (!this._done) {
- this._token.cancel();
+ async onBufEnter(bufnr) {
+ let filetype = await coc_nvim_1.workspace.nvim.call('getbufvar', [bufnr, '&filetype', '']);
+ if (this.checkFiletype(filetype)) {
+ this._versionBarEntry.show();
+ }
+ else {
+ this._versionBarEntry.hide();
}
- this._token.dispose();
}
}
+exports.default = VersionStatus;
/***/ }),
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-exports.Delayer = void 0;
-class Delayer {
- constructor(defaultDelay) {
- this.defaultDelay = defaultDelay;
- this.timeout = null;
- this.completionPromise = null;
- this.onSuccess = null;
- this.task = null;
+exports.Reader = void 0;
+const DefaultSize = 8192;
+const ContentLength = 'Content-Length: ';
+const ContentLengthSize = Buffer.byteLength(ContentLength, 'utf8');
+const Blank = Buffer.from(' ', 'utf8')[0];
+const BackslashR = Buffer.from('\r', 'utf8')[0];
+const BackslashN = Buffer.from('\n', 'utf8')[0];
+class ProtocolBuffer {
+ constructor() {
+ this.index = 0;
+ this.buffer = Buffer.allocUnsafe(DefaultSize);
}
- trigger(task, delay = this.defaultDelay) {
- this.task = task;
- if (delay >= 0) {
- this.cancelTimeout();
+ append(data) {
+ let toAppend = null;
+ if (Buffer.isBuffer(data)) {
+ toAppend = data;
}
- if (!this.completionPromise) {
- this.completionPromise = new Promise(resolve => {
- this.onSuccess = resolve;
- }).then(() => {
- this.completionPromise = null;
- this.onSuccess = null;
- let result = this.task && this.task();
- this.task = null;
- return result;
- });
+ else {
+ toAppend = Buffer.from(data, 'utf8');
}
- if (delay >= 0 || this.timeout === null) {
- this.timeout = setTimeout(() => {
- this.timeout = null;
- if (this.onSuccess) {
- this.onSuccess(undefined);
- }
- }, delay >= 0 ? delay : this.defaultDelay);
+ if (this.buffer.length - this.index >= toAppend.length) {
+ toAppend.copy(this.buffer, this.index, 0, toAppend.length);
}
- return this.completionPromise;
+ else {
+ let newSize = (Math.ceil((this.index + toAppend.length) / DefaultSize) + 1) *
+ DefaultSize;
+ if (this.index === 0) {
+ this.buffer = Buffer.allocUnsafe(newSize);
+ toAppend.copy(this.buffer, 0, 0, toAppend.length);
+ }
+ else {
+ this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
+ }
+ }
+ this.index += toAppend.length;
}
- cancelTimeout() {
- if (this.timeout !== null) {
- clearTimeout(this.timeout);
- this.timeout = null;
+ tryReadContentLength() {
+ let result = -1;
+ let current = 0;
+ // we are utf8 encoding...
+ while (current < this.index &&
+ (this.buffer[current] === Blank ||
+ this.buffer[current] === BackslashR ||
+ this.buffer[current] === BackslashN)) {
+ current++;
+ }
+ if (this.index < current + ContentLengthSize) {
+ return result;
+ }
+ current += ContentLengthSize;
+ let start = current;
+ while (current < this.index && this.buffer[current] !== BackslashR) {
+ current++;
+ }
+ if (current + 3 >= this.index ||
+ this.buffer[current + 1] !== BackslashN ||
+ this.buffer[current + 2] !== BackslashR ||
+ this.buffer[current + 3] !== BackslashN) {
+ return result;
+ }
+ let data = this.buffer.toString('utf8', start, current);
+ result = parseInt(data, 10);
+ this.buffer = this.buffer.slice(current + 4);
+ this.index = this.index - (current + 4);
+ return result;
+ }
+ tryReadContent(length) {
+ if (this.index < length) {
+ return null;
+ }
+ let result = this.buffer.toString('utf8', 0, length);
+ let sourceStart = length;
+ while (sourceStart < this.index &&
+ (this.buffer[sourceStart] === BackslashR ||
+ this.buffer[sourceStart] === BackslashN)) {
+ sourceStart++;
}
+ this.buffer.copy(this.buffer, 0, sourceStart);
+ this.index = this.index - sourceStart;
+ return result;
}
}
-exports.Delayer = Delayer;
+class Reader {
+ constructor(readable, callback, onError) {
+ this.readable = readable;
+ this.callback = callback;
+ this.onError = onError;
+ this.buffer = new ProtocolBuffer();
+ this.nextMessageLength = -1;
+ this.readable.on('data', (data) => {
+ this.onLengthData(data);
+ });
+ }
+ onLengthData(data) {
+ try {
+ this.buffer.append(data);
+ while (true) {
+ if (this.nextMessageLength === -1) {
+ this.nextMessageLength = this.buffer.tryReadContentLength();
+ if (this.nextMessageLength === -1) {
+ return;
+ }
+ }
+ const msg = this.buffer.tryReadContent(this.nextMessageLength);
+ if (msg === null) {
+ return;
+ }
+ this.nextMessageLength = -1;
+ const json = JSON.parse(msg);
+ this.callback(json);
+ }
+ }
+ catch (e) {
+ this.onError(e);
+ }
+ }
+}
+exports.Reader = Reader;
/***/ }),
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-exports.DiagnosticsManager = exports.DiagnosticKind = exports.DiagnosticSet = void 0;
+exports.AtaProgressReporter = void 0;
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
const coc_nvim_1 = __webpack_require__(1);
-const resourceMap_1 = __webpack_require__(138);
-class DiagnosticSet {
- constructor() {
- this._map = new resourceMap_1.ResourceMap();
- }
- set(uri, diagnostics) {
- this._map.set(uri, diagnostics);
- }
- get(uri) {
- return this._map.get(uri) || [];
- }
- clear() {
- this._map = new resourceMap_1.ResourceMap();
- }
-}
-exports.DiagnosticSet = DiagnosticSet;
-var DiagnosticKind;
-(function (DiagnosticKind) {
- DiagnosticKind[DiagnosticKind["Syntax"] = 0] = "Syntax";
- DiagnosticKind[DiagnosticKind["Semantic"] = 1] = "Semantic";
- DiagnosticKind[DiagnosticKind["Suggestion"] = 2] = "Suggestion";
-})(DiagnosticKind = exports.DiagnosticKind || (exports.DiagnosticKind = {}));
-const allDiagnosticKinds = [
- DiagnosticKind.Syntax,
- DiagnosticKind.Semantic,
- DiagnosticKind.Suggestion
-];
-class DiagnosticsManager {
- constructor() {
- this._diagnostics = new Map();
- this._pendingUpdates = new resourceMap_1.ResourceMap();
- this._enableJavascriptSuggestions = true;
- this._enableTypescriptSuggestions = true;
- this.updateDelay = 200;
- for (const kind of allDiagnosticKinds) {
- this._diagnostics.set(kind, new DiagnosticSet());
- }
- this._currentDiagnostics = coc_nvim_1.languages.createDiagnosticCollection('tsserver');
- }
- dispose() {
- this._currentDiagnostics.dispose();
- for (const value of this._pendingUpdates.values) {
- clearTimeout(value);
- }
- this._pendingUpdates = new resourceMap_1.ResourceMap();
+const typingsInstallTimeout = 30 * 1000;
+class TypingsStatus {
+ constructor(client) {
+ this._acquiringTypings = Object.create({});
+ this._subscriptions = [];
+ this._client = client;
+ this._subscriptions.push(this._client.onDidBeginInstallTypings(event => this.onBeginInstallTypings(event.eventId)));
+ this._subscriptions.push(this._client.onDidEndInstallTypings(event => this.onEndInstallTypings(event.eventId)));
}
- reInitialize() {
- this._currentDiagnostics.clear();
- for (const diagnosticSet of this._diagnostics.values()) {
- diagnosticSet.clear();
+ dispose() {
+ this._subscriptions.forEach(x => x.dispose());
+ for (const eventId of Object.keys(this._acquiringTypings)) {
+ clearTimeout(this._acquiringTypings[eventId]);
}
}
- setEnableSuggestions(languageId, value) {
- let curr = languageId == 'javascript' ? this._enableJavascriptSuggestions : this._enableTypescriptSuggestions;
- if (curr == value) {
- return;
- }
- if (languageId == 'javascript') {
- this._enableJavascriptSuggestions = value;
- }
- else {
- this._enableTypescriptSuggestions = value;
- }
+ get isAcquiringTypings() {
+ return Object.keys(this._acquiringTypings).length > 0;
}
- diagnosticsReceived(kind, uri, diagnostics) {
- const collection = this._diagnostics.get(kind);
- if (!collection)
+ onBeginInstallTypings(eventId) {
+ if (this._acquiringTypings[eventId]) {
return;
- if (diagnostics.length === 0) {
- const existing = collection.get(uri);
- if (existing.length === 0) {
- // No need to update
- return;
- }
}
- collection.set(uri, diagnostics);
- this.scheduleDiagnosticsUpdate(uri);
- }
- configFileDiagnosticsReceived(uri, diagnostics) {
- this._currentDiagnostics.set(uri, diagnostics);
- }
- delete(uri) {
- this._currentDiagnostics.delete(uri);
- }
- getDiagnostics(uri) {
- return this._currentDiagnostics.get(uri) || [];
- return [];
+ this._acquiringTypings[eventId] = setTimeout(() => {
+ this.onEndInstallTypings(eventId);
+ }, typingsInstallTimeout);
}
- scheduleDiagnosticsUpdate(uri) {
- if (!this._pendingUpdates.has(uri)) {
- this._pendingUpdates.set(uri, setTimeout(() => this.updateCurrentDiagnostics(uri), this.updateDelay));
+ onEndInstallTypings(eventId) {
+ const timer = this._acquiringTypings[eventId];
+ if (timer) {
+ clearTimeout(timer);
}
+ delete this._acquiringTypings[eventId];
}
- updateCurrentDiagnostics(uri) {
- if (this._pendingUpdates.has(uri)) {
- clearTimeout(this._pendingUpdates.get(uri));
- this._pendingUpdates.delete(uri);
- }
- const allDiagnostics = [
- ...this._diagnostics.get(DiagnosticKind.Syntax).get(uri),
- ...this._diagnostics.get(DiagnosticKind.Semantic).get(uri),
- ...this.getSuggestionDiagnostics(uri)
- ];
- this._currentDiagnostics.set(uri, allDiagnostics);
+}
+exports.default = TypingsStatus;
+class AtaProgressReporter {
+ constructor(client) {
+ this._promises = new Map();
+ this._invalid = false;
+ this.statusItem = coc_nvim_1.workspace.createStatusBarItem(10, { progress: true });
+ const disposables = [];
+ disposables.push(client.onDidBeginInstallTypings(e => this._onBegin(e.eventId)));
+ disposables.push(client.onDidEndInstallTypings(e => this._onEndOrTimeout(e.eventId)));
+ disposables.push(client.onTypesInstallerInitializationFailed(_ => this.onTypesInstallerInitializationFailed()));
+ this._disposable = vscode_languageserver_protocol_1.Disposable.create(() => {
+ disposables.forEach(disposable => {
+ disposable.dispose();
+ });
+ });
}
- getSuggestionDiagnostics(uri) {
- const enabled = this.suggestionsEnabled(uri);
- return this._diagnostics
- .get(DiagnosticKind.Suggestion)
- .get(uri)
- .filter(x => {
- if (!enabled) {
- // Still show unused
- return x.code == 6133;
- }
- return enabled;
+ dispose() {
+ this._disposable.dispose();
+ this._promises.forEach(value => value());
+ }
+ _onBegin(eventId) {
+ const handle = setTimeout(() => this._onEndOrTimeout(eventId), typingsInstallTimeout);
+ new Promise(resolve => {
+ this._promises.set(eventId, () => {
+ clearTimeout(handle);
+ resolve();
+ });
});
+ this.statusItem.text = 'Fetching data for better TypeScript IntelliSense';
+ this.statusItem.show();
}
- suggestionsEnabled(uri) {
- let doc = coc_nvim_1.workspace.getDocument(uri);
- if (!doc)
- return false;
- if (doc.filetype.startsWith('javascript')) {
- return this._enableJavascriptSuggestions;
+ _onEndOrTimeout(eventId) {
+ this.statusItem.hide();
+ const resolve = this._promises.get(eventId);
+ if (resolve) {
+ this._promises.delete(eventId);
+ resolve();
}
- if (doc.filetype.startsWith('typescript')) {
- return this._enableTypescriptSuggestions;
+ }
+ onTypesInstallerInitializationFailed() {
+ this.statusItem.hide();
+ if (!this._invalid) {
+ coc_nvim_1.workspace.showMessage('Could not install typings files for JavaScript language features. Please ensure that NPM is installed', 'error');
}
- return true;
+ this._invalid = true;
}
}
-exports.DiagnosticsManager = DiagnosticsManager;
+exports.AtaProgressReporter = AtaProgressReporter;
/***/ }),
"use strict";
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.isWindowsPath = exports.ResourceMap = void 0;
-/**
- * Maps of file resources
- *
- * Attempts to handle correct mapping on both case sensitive and case in-sensitive
- * file systems.
- */
-class ResourceMap {
- constructor(_normalizePath) {
- this._normalizePath = _normalizePath;
- this._map = new Map();
- }
- has(resource) {
- const file = this.toKey(resource);
- return !!file && this._map.has(file);
- }
- get(resource) {
- const file = this.toKey(resource);
- return file ? this._map.get(file) : undefined;
+const coc_nvim_1 = __webpack_require__(1);
+const path_1 = __importDefault(__webpack_require__(13));
+const vscode_languageserver_protocol_1 = __webpack_require__(3);
+const countRegex = /Found\s+(\d+)\s+error/;
+const errorRegex = /^(.+)\((\d+),(\d+)\):\s(\w+)\sTS(\d+):\s*(.+)$/;
+var TscStatus;
+(function (TscStatus) {
+ TscStatus[TscStatus["INIT"] = 0] = "INIT";
+ TscStatus[TscStatus["COMPILING"] = 1] = "COMPILING";
+ TscStatus[TscStatus["RUNNING"] = 2] = "RUNNING";
+ TscStatus[TscStatus["ERROR"] = 3] = "ERROR";
+})(TscStatus || (TscStatus = {}));
+class WatchProject {
+ constructor(client) {
+ this.client = client;
+ this.disposables = [];
+ this.statusItem = coc_nvim_1.workspace.createStatusBarItem(1, { progress: true });
+ let task = this.task = coc_nvim_1.workspace.createTask('TSC');
+ this.disposables.push(coc_nvim_1.commands.registerCommand(WatchProject.id, async () => {
+ let opts = this.options = await this.getOptions();
+ await this.start(opts);
+ }));
+ task.onExit(code => {
+ if (code != 0) {
+ coc_nvim_1.workspace.showMessage(`TSC exit with code ${code}`, 'warning');
+ }
+ this.onStop();
+ });
+ task.onStdout(lines => {
+ for (let line of lines) {
+ this.onLine(line);
+ }
+ });
+ task.onStderr(lines => {
+ coc_nvim_1.workspace.showMessage(`TSC error: ` + lines.join('\n'), 'error');
+ });
+ this.disposables.push(vscode_languageserver_protocol_1.Disposable.create(() => {
+ task.dispose();
+ }));
+ this.check().catch(_e => {
+ // noop
+ });
}
- set(resource, value) {
- const file = this.toKey(resource);
- if (file) {
- this._map.set(file, value);
+ async check() {
+ let running = await this.task.running;
+ if (running) {
+ this.options = await this.getOptions();
+ this.statusItem.isProgress = false;
+ this.statusItem.text = '?';
+ this.statusItem.show();
}
- }
- delete(resource) {
- const file = this.toKey(resource);
- if (file) {
- this._map.delete(file);
+ else {
+ this.onStop();
}
}
- get values() {
- return this._map.values();
+ async start(options) {
+ await this.task.start(options);
}
- get keys() {
- return this._map.keys();
+ onStop() {
+ this.statusItem.hide();
}
- toKey(resource) {
- const key = this._normalizePath
- ? this._normalizePath(resource)
- : resource;
- if (!key) {
- return key;
- }
- return this.isCaseInsensitivePath(key) ? key.toLowerCase() : key;
+ onStart() {
+ this.statusItem.text = 'compiling';
+ this.statusItem.isProgress = true;
+ this.statusItem.show();
+ coc_nvim_1.workspace.nvim.call('setqflist', [[]], true);
}
- isCaseInsensitivePath(path) {
- if (isWindowsPath(path)) {
- return true;
+ onLine(line) {
+ if (countRegex.test(line)) {
+ let ms = line.match(countRegex);
+ this.statusItem.text = ms[1] == '0' ? '✓' : '✗';
+ this.statusItem.isProgress = false;
+ }
+ else if (WatchProject.startTexts.findIndex(s => line.indexOf(s) !== -1) != -1) {
+ this.onStart();
+ }
+ else {
+ let ms = line.match(errorRegex);
+ if (!ms)
+ return;
+ let fullpath = path_1.default.join(this.options.cwd, ms[1]);
+ let uri = coc_nvim_1.Uri.file(fullpath).toString();
+ let doc = coc_nvim_1.workspace.getDocument(uri);
+ let bufnr = doc ? doc.bufnr : null;
+ let item = {
+ filename: fullpath,
+ lnum: Number(ms[2]),
+ col: Number(ms[3]),
+ text: `[tsc ${ms[5]}] ${ms[6]}`,
+ type: /error/i.test(ms[4]) ? 'E' : 'W'
+ };
+ if (bufnr)
+ item.bufnr = bufnr;
+ coc_nvim_1.workspace.nvim.call('setqflist', [[item], 'a']);
}
- return path[0] === '/' && this.onIsCaseInsenitiveFileSystem;
}
- get onIsCaseInsenitiveFileSystem() {
- if (process.platform === 'win32') {
- return true;
+ async getOptions() {
+ let { tscPath } = this.client;
+ if (!tscPath) {
+ coc_nvim_1.workspace.showMessage(`Local & global tsc not found`, 'error');
+ return;
}
- if (process.platform === 'darwin') {
- return true;
+ let find = await coc_nvim_1.workspace.findUp(['tsconfig.json']);
+ if (!find) {
+ coc_nvim_1.workspace.showMessage('tsconfig.json not found!', 'error');
+ return;
}
- return false;
+ let root = path_1.default.dirname(find);
+ return {
+ cmd: tscPath,
+ args: ['-p', 'tsconfig.json', '--watch', 'true', '--pretty', 'false'],
+ cwd: root
+ };
+ }
+ dispose() {
+ coc_nvim_1.disposeAll(this.disposables);
}
}
-exports.ResourceMap = ResourceMap;
-function isWindowsPath(path) {
- return /^[a-zA-Z]:\\/.test(path);
-}
-exports.isWindowsPath = isWindowsPath;
+exports.default = WatchProject;
+WatchProject.id = 'tsserver.watchBuild';
+WatchProject.startTexts = ['Starting compilation in watch mode', 'Starting incremental compilation'];
/***/ }),
"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
Object.defineProperty(exports, "__esModule", { value: true });
-exports.AtaProgressReporter = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
const vscode_languageserver_protocol_1 = __webpack_require__(3);
const coc_nvim_1 = __webpack_require__(1);
-const typingsInstallTimeout = 30 * 1000;
-class TypingsStatus {
- constructor(client) {
- this._acquiringTypings = Object.create({});
- this._subscriptions = [];
- this._client = client;
- this._subscriptions.push(this._client.onDidBeginInstallTypings(event => this.onBeginInstallTypings(event.eventId)));
- this._subscriptions.push(this._client.onDidEndInstallTypings(event => this.onEndInstallTypings(event.eventId)));
- }
- dispose() {
- this._subscriptions.forEach(x => x.dispose());
- for (const eventId of Object.keys(this._acquiringTypings)) {
- clearTimeout(this._acquiringTypings[eventId]);
- }
+const typeConverters = __importStar(__webpack_require__(37));
+const api_1 = __importDefault(__webpack_require__(40));
+function getSymbolKind(item) {
+ switch (item.kind) {
+ case 'method':
+ return vscode_languageserver_protocol_1.SymbolKind.Method;
+ case 'enum':
+ return vscode_languageserver_protocol_1.SymbolKind.Enum;
+ case 'function':
+ return vscode_languageserver_protocol_1.SymbolKind.Function;
+ case 'class':
+ return vscode_languageserver_protocol_1.SymbolKind.Class;
+ case 'interface':
+ return vscode_languageserver_protocol_1.SymbolKind.Interface;
+ case 'var':
+ return vscode_languageserver_protocol_1.SymbolKind.Variable;
+ default:
+ return vscode_languageserver_protocol_1.SymbolKind.Variable;
}
- get isAcquiringTypings() {
- return Object.keys(this._acquiringTypings).length > 0;
+}
+class TypeScriptWorkspaceSymbolProvider {
+ constructor(client, languageIds) {
+ this.client = client;
+ this.languageIds = languageIds;
}
- onBeginInstallTypings(eventId) {
- if (this._acquiringTypings[eventId]) {
- return;
+ async provideWorkspaceSymbols(search, token) {
+ let filepath;
+ if (this.searchAllOpenProjects) {
+ filepath = undefined;
}
- this._acquiringTypings[eventId] = setTimeout(() => {
- this.onEndInstallTypings(eventId);
- }, typingsInstallTimeout);
- }
- onEndInstallTypings(eventId) {
- const timer = this._acquiringTypings[eventId];
- if (timer) {
- clearTimeout(timer);
+ else {
+ let uri = this.getUri();
+ filepath = uri ? this.client.toPath(uri) : undefined;
+ if (!filepath && this.client.apiVersion.lt(api_1.default.v390)) {
+ return [];
+ }
}
- delete this._acquiringTypings[eventId];
- }
-}
-exports.default = TypingsStatus;
-class AtaProgressReporter {
- constructor(client) {
- this._promises = new Map();
- this._invalid = false;
- this.statusItem = coc_nvim_1.workspace.createStatusBarItem(10, { progress: true });
- const disposables = [];
- disposables.push(client.onDidBeginInstallTypings(e => this._onBegin(e.eventId)));
- disposables.push(client.onDidEndInstallTypings(e => this._onEndOrTimeout(e.eventId)));
- disposables.push(client.onTypesInstallerInitializationFailed(_ => this.onTypesInstallerInitializationFailed()));
- this._disposable = vscode_languageserver_protocol_1.Disposable.create(() => {
- disposables.forEach(disposable => {
- disposable.dispose();
- });
- });
- }
- dispose() {
- this._disposable.dispose();
- this._promises.forEach(value => value());
- }
- _onBegin(eventId) {
- const handle = setTimeout(() => this._onEndOrTimeout(eventId), typingsInstallTimeout);
- new Promise(resolve => {
- this._promises.set(eventId, () => {
- clearTimeout(handle);
- resolve();
- });
- });
- this.statusItem.text = 'Fetching data for better TypeScript IntelliSense';
- this.statusItem.show();
+ const args = {
+ file: filepath,
+ searchValue: search,
+ maxResultCount: 256,
+ };
+ const response = await this.client.execute('navto', args, token);
+ if (response.type !== 'response' || response.body == null)
+ return [];
+ const result = [];
+ for (const item of response.body) {
+ if (!item.containerName && item.kind === 'alias') {
+ continue;
+ }
+ const label = TypeScriptWorkspaceSymbolProvider.getLabel(item);
+ const range = {
+ start: typeConverters.Position.fromLocation(item.start),
+ end: typeConverters.Position.fromLocation(item.end),
+ };
+ const symbolInfo = vscode_languageserver_protocol_1.SymbolInformation.create(label, getSymbolKind(item), range, this.client.toResource(item.file));
+ result.push(symbolInfo);
+ }
+ return result;
}
- _onEndOrTimeout(eventId) {
- this.statusItem.hide();
- const resolve = this._promises.get(eventId);
- if (resolve) {
- this._promises.delete(eventId);
- resolve();
+ static getLabel(item) {
+ let label = item.name;
+ if (item.kind === 'method' || item.kind === 'function') {
+ label += '()';
}
+ return label;
}
- onTypesInstallerInitializationFailed() {
- this.statusItem.hide();
- if (!this._invalid) {
- coc_nvim_1.workspace.showMessage('Could not install typings files for JavaScript language features. Please ensure that NPM is installed', 'error');
+ getUri() {
+ // typescript wants to have a resource even when asking
+ // general questions so we check the active editor. If this
+ // doesn't match we take the first TS document.
+ const documents = coc_nvim_1.workspace.textDocuments;
+ for (const document of documents) {
+ if (this.languageIds.indexOf(document.languageId) >= 0) {
+ return document.uri;
+ }
}
- this._invalid = true;
+ return undefined;
+ }
+ get searchAllOpenProjects() {
+ return this.client.apiVersion.gte(api_1.default.v390)
+ && coc_nvim_1.workspace.getConfiguration('typescript').get('workspaceSymbols.scope', 'allOpenProjects') === 'allOpenProjects';
}
}
-exports.AtaProgressReporter = AtaProgressReporter;
+exports.default = TypeScriptWorkspaceSymbolProvider;
/***/ }),
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.standardLanguageDescriptions = void 0;
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+const languageModeIds = __importStar(__webpack_require__(120));
+exports.standardLanguageDescriptions = [
+ {
+ id: 'typescript',
+ diagnosticSource: 'ts',
+ diagnosticOwner: 'typescript',
+ modeIds: [languageModeIds.typescript, languageModeIds.typescriptreact,
+ languageModeIds.typescripttsx, languageModeIds.typescriptjsx],
+ diagnosticLanguage: 1 /* TypeScript */,
+ configFile: 'tsconfig.json',
+ configFilePattern: /^tsconfig(\..*)?\.json$/gi
+ },
+ {
+ id: 'javascript',
+ diagnosticSource: 'ts',
+ diagnosticOwner: 'typescript',
+ modeIds: [languageModeIds.javascript, languageModeIds.javascriptreact, languageModeIds.javascriptjsx],
+ diagnosticLanguage: 0 /* JavaScript */,
+ configFile: 'jsconfig.json',
+ configFilePattern: /^jsconfig(\..*)?\.json$/gi
+ }
+];
+
+
+/***/ }),
+/* 141 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigurePluginCommand = exports.AutoFixCommand = exports.TypeScriptGoToProjectConfigCommand = exports.OpenTsServerLogCommand = exports.ReloadProjectsCommand = void 0;
const vscode_languageserver_protocol_1 = __webpack_require__(3);
const typeConverters = __importStar(__webpack_require__(37));
const vscode_languageserver_types_1 = __webpack_require__(18);
-const modules_1 = __webpack_require__(112);
-const helper_1 = __webpack_require__(100);
-const languageModeIds_1 = __webpack_require__(116);
+const modules_1 = __webpack_require__(100);
+const helper_1 = __webpack_require__(98);
class ReloadProjectsCommand {
- constructor(client) {
- this.client = client;
+ constructor(service) {
+ this.service = service;
this.id = 'tsserver.reloadProjects';
}
- execute() {
- this.client.reloadProjects();
+ async execute() {
+ let client = await this.service.getClientHost();
+ client.reloadProjects();
coc_nvim_1.workspace.showMessage('projects reloaded');
}
}
exports.ReloadProjectsCommand = ReloadProjectsCommand;
class OpenTsServerLogCommand {
- constructor(client) {
- this.client = client;
+ constructor(service) {
+ this.service = service;
this.id = 'tsserver.openTsServerLog';
}
- execute() {
- this.client.serviceClient.openTsServerLogFile(); // tslint:disable-line
+ async execute() {
+ let client = await this.service.getClientHost();
+ client.serviceClient.openTsServerLogFile(); // tslint:disable-line
}
}
exports.OpenTsServerLogCommand = OpenTsServerLogCommand;
class TypeScriptGoToProjectConfigCommand {
- constructor(client) {
- this.client = client;
+ constructor(service) {
+ this.service = service;
this.id = 'tsserver.goToProjectConfig';
}
- execute() {
- return __awaiter(this, void 0, void 0, function* () {
- let doc = yield coc_nvim_1.workspace.document;
- let { filetype } = doc;
- if (languageModeIds_1.languageIds.indexOf(filetype) == -1) {
- coc_nvim_1.workspace.showMessage(`Could not determine TypeScript or JavaScript project. Unsupported file type: ${filetype}`, 'warning');
- return;
- }
- // doc.filetype
- yield goToProjectConfig(this.client, doc.uri);
- });
+ async execute() {
+ let client = await this.service.getClientHost();
+ let doc = await coc_nvim_1.workspace.document;
+ let { languageId } = doc.textDocument;
+ if (client.serviceClient.modeIds.indexOf(languageId) == -1) {
+ throw new Error(`Could not determine TypeScript or JavaScript project. Unsupported file type: ${languageId}`);
+ return;
+ }
+ await goToProjectConfig(client, doc.uri);
}
}
exports.TypeScriptGoToProjectConfigCommand = TypeScriptGoToProjectConfigCommand;
-function goToProjectConfig(clientHost, uri) {
- return __awaiter(this, void 0, void 0, function* () {
- const client = clientHost.serviceClient;
- const file = client.toPath(uri);
- let res;
- try {
- res = yield client.execute('projectInfo', { file, needFileNameList: false }, vscode_languageserver_protocol_1.CancellationToken.None);
- }
- catch (_a) {
- // noop
- }
- if (!res || !res.body) {
- coc_nvim_1.workspace.showMessage('Could not determine TypeScript or JavaScript project.', 'warning');
- return;
- }
- const { configFileName } = res.body;
- if (configFileName && !isImplicitProjectConfigFile(configFileName)) {
- yield coc_nvim_1.workspace.openResource(coc_nvim_1.Uri.file(configFileName).toString());
- return;
- }
- coc_nvim_1.workspace.showMessage('Config file not found', 'warning');
- });
+async function goToProjectConfig(clientHost, uri) {
+ const client = clientHost.serviceClient;
+ const file = client.toPath(uri);
+ let res;
+ try {
+ res = await client.execute('projectInfo', { file, needFileNameList: false }, vscode_languageserver_protocol_1.CancellationToken.None);
+ }
+ catch (_a) {
+ // noop
+ }
+ if (!res || !res.body) {
+ coc_nvim_1.workspace.showMessage('Could not determine TypeScript or JavaScript project.', 'warning');
+ return;
+ }
+ const { configFileName } = res.body;
+ if (configFileName && !isImplicitProjectConfigFile(configFileName)) {
+ await coc_nvim_1.workspace.openResource(coc_nvim_1.Uri.file(configFileName).toString());
+ return;
+ }
+ coc_nvim_1.workspace.showMessage('Config file not found', 'warning');
}
function isImplicitProjectConfigFile(configFileName) {
return configFileName.indexOf('/dev/null/') === 0;
2304,
]);
class AutoFixCommand {
- constructor(client) {
- this.client = client;
+ constructor(service) {
+ this.service = service;
this.id = 'tsserver.executeAutofix';
}
- execute() {
- return __awaiter(this, void 0, void 0, function* () {
- let document = yield coc_nvim_1.workspace.document;
- let { uri } = document;
- if (!this.client.handles(uri)) {
- coc_nvim_1.workspace.showMessage(`Document ${uri} is not handled by tsserver.`, 'warning');
- return;
- }
- let file = this.client.serviceClient.toPath(document.uri);
- let diagnostics = coc_nvim_1.diagnosticManager.getDiagnostics(document.uri);
- let missingDiagnostics = diagnostics.filter(o => o.code == 2307);
- if (missingDiagnostics.length) {
- let names = missingDiagnostics.map(o => {
- let ms = o.message.match(/module\s'(.+)'\./);
- return ms ? ms[1] : null;
+ async execute() {
+ if (this.service.state != coc_nvim_1.ServiceStat.Running) {
+ throw new Error('service not running');
+ return;
+ }
+ let client = await this.service.getClientHost();
+ let document = await coc_nvim_1.workspace.document;
+ let handles = await client.handles(document.textDocument);
+ if (!handles) {
+ throw new Error(`Document ${document.uri} is not handled by tsserver.`);
+ return;
+ }
+ let file = client.serviceClient.toPath(document.uri);
+ let diagnostics = coc_nvim_1.diagnosticManager.getDiagnostics(document.uri);
+ let missingDiagnostics = diagnostics.filter(o => o.code == 2307);
+ if (missingDiagnostics.length) {
+ let names = missingDiagnostics.map(o => {
+ let ms = o.message.match(/module\s'(.+)'\./);
+ return ms ? ms[1] : null;
+ });
+ names = names.filter(s => s != null);
+ if (names.length) {
+ modules_1.installModules(document.uri, names).catch(e => {
+ console.error(e.message); // tslint:disable-line
});
- names = names.filter(s => s != null);
- if (names.length) {
- modules_1.installModules(document.uri, names).catch(e => {
- console.error(e.message); // tslint:disable-line
- });
- }
}
- diagnostics = diagnostics.filter(x => autoFixableDiagnosticCodes.has(x.code));
- if (diagnostics.length == 0)
- return;
- diagnostics = diagnostics.reduce((arr, curr) => {
- if (curr.code == 2304 && arr.findIndex(o => o.message == curr.message) != -1)
- return arr;
- arr.push(curr);
+ }
+ diagnostics = diagnostics.filter(x => autoFixableDiagnosticCodes.has(x.code));
+ if (diagnostics.length == 0)
+ return;
+ diagnostics = diagnostics.reduce((arr, curr) => {
+ if (curr.code == 2304 && arr.findIndex(o => o.message == curr.message) != -1)
return arr;
- }, []);
- let client = this.client.serviceClient;
- let edits = [];
- let command;
- let names = [];
- for (let diagnostic of diagnostics) {
- const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, diagnostic.range)), { errorCodes: [+(diagnostic.code)] });
- const response = yield client.execute('getCodeFixes', args, vscode_languageserver_protocol_1.CancellationToken.None);
- if (response.type !== 'response' || !response.body || response.body.length < 1) {
- if (diagnostic.code == 2304) {
- let { range } = diagnostic;
- let line = document.getline(range.start.line);
- let name = line.slice(range.start.character, range.end.character);
- if (helper_1.nodeModules.indexOf(name) !== -1 && names.indexOf(name) == -1) {
- names.push(name);
- edits.push({
- range: vscode_languageserver_types_1.Range.create(0, 0, 0, 0),
- newText: `import ${name} from '${name}'\n`
- });
- command = 'tsserver.organizeImports';
- }
- }
- continue;
- }
- const fix = response.body[0];
- for (let change of fix.changes) {
- if (change.fileName != file)
- continue;
- // change.fileName
- for (let ch of change.textChanges) {
+ arr.push(curr);
+ return arr;
+ }, []);
+ let edits = [];
+ let command;
+ let names = [];
+ for (let diagnostic of diagnostics) {
+ const args = Object.assign(Object.assign({}, typeConverters.Range.toFileRangeRequestArgs(file, diagnostic.range)), { errorCodes: [+(diagnostic.code)] });
+ const response = await client.serviceClient.execute('getCodeFixes', args, vscode_languageserver_protocol_1.CancellationToken.None);
+ if (response.type !== 'response' || !response.body || response.body.length < 1) {
+ if (diagnostic.code == 2304) {
+ let { range } = diagnostic;
+ let line = document.getline(range.start.line);
+ let name = line.slice(range.start.character, range.end.character);
+ if (helper_1.nodeModules.indexOf(name) !== -1 && names.indexOf(name) == -1) {
+ names.push(name);
edits.push({
- range: typeConverters.Range.fromTextSpan(ch),
- newText: ch.newText
+ range: vscode_languageserver_types_1.Range.create(0, 0, 0, 0),
+ newText: `import ${name} from '${name}'\n`
});
+ command = 'tsserver.organizeImports';
}
}
+ continue;
}
- if (edits.length)
- yield document.applyEdits(coc_nvim_1.workspace.nvim, edits);
- if (command)
- coc_nvim_1.commands.executeCommand(command);
- });
+ const fix = response.body[0];
+ for (let change of fix.changes) {
+ if (change.fileName != file)
+ continue;
+ // change.fileName
+ for (let ch of change.textChanges) {
+ edits.push({
+ range: typeConverters.Range.fromTextSpan(ch),
+ newText: ch.newText
+ });
+ }
+ }
+ }
+ if (edits.length)
+ await document.applyEdits(edits);
+ if (command)
+ coc_nvim_1.commands.executeCommand(command);
}
}
exports.AutoFixCommand = AutoFixCommand;
/***/ }),
-/* 141 */
+/* 142 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};