1 (function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap
2 /******/ // The module cache
3 /******/ var installedModules = {};
5 /******/ // The require function
6 /******/ function __webpack_require__(moduleId) {
8 /******/ // Check if module is in cache
9 /******/ if(installedModules[moduleId]) {
10 /******/ return installedModules[moduleId].exports;
12 /******/ // Create a new module (and put it into the cache)
13 /******/ var module = installedModules[moduleId] = {
19 /******/ // Execute the module function
20 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
22 /******/ // Flag the module as loaded
23 /******/ module.l = true;
25 /******/ // Return the exports of the module
26 /******/ return module.exports;
30 /******/ // expose the modules object (__webpack_modules__)
31 /******/ __webpack_require__.m = modules;
33 /******/ // expose the module cache
34 /******/ __webpack_require__.c = installedModules;
36 /******/ // define getter function for harmony exports
37 /******/ __webpack_require__.d = function(exports, name, getter) {
38 /******/ if(!__webpack_require__.o(exports, name)) {
39 /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
43 /******/ // define __esModule on exports
44 /******/ __webpack_require__.r = function(exports) {
45 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
48 /******/ Object.defineProperty(exports, '__esModule', { value: true });
51 /******/ // create a fake namespace object
52 /******/ // mode & 1: value is a module id, require it
53 /******/ // mode & 2: merge all properties of value into the ns
54 /******/ // mode & 4: return value when already ns object
55 /******/ // mode & 8|1: behave like require
56 /******/ __webpack_require__.t = function(value, mode) {
57 /******/ if(mode & 1) value = __webpack_require__(value);
58 /******/ if(mode & 8) return value;
59 /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60 /******/ var ns = Object.create(null);
61 /******/ __webpack_require__.r(ns);
62 /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63 /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
67 /******/ // getDefaultExport function for compatibility with non-harmony modules
68 /******/ __webpack_require__.n = function(module) {
69 /******/ var getter = module && module.__esModule ?
70 /******/ function getDefault() { return module['default']; } :
71 /******/ function getModuleExports() { return module; };
72 /******/ __webpack_require__.d(getter, 'a', getter);
73 /******/ return getter;
76 /******/ // Object.prototype.hasOwnProperty.call
77 /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
79 /******/ // __webpack_public_path__
80 /******/ __webpack_require__.p = "";
83 /******/ // Load entry module and return exports
84 /******/ return __webpack_require__(__webpack_require__.s = 0);
86 /************************************************************************/
89 /***/ (function(module, exports, __webpack_require__) {
93 var __importDefault = (this && this.__importDefault) || function (mod) {
94 return (mod && mod.__esModule) ? mod : { "default": mod };
96 Object.defineProperty(exports, "__esModule", { value: true });
97 /******************************************************************
98 MIT License http://www.opensource.org/licenses/mit-license.php
99 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
100 *******************************************************************/
101 const coc_nvim_1 = __webpack_require__(1);
102 const os_1 = __importDefault(__webpack_require__(2));
103 const fs_1 = __importDefault(__webpack_require__(3));
104 const path_1 = __importDefault(__webpack_require__(4));
105 const util_1 = __importDefault(__webpack_require__(5));
106 const vscode_languageserver_types_1 = __webpack_require__(6);
107 const snippet_1 = __importDefault(__webpack_require__(7));
108 const provider_1 = __webpack_require__(35);
109 const snipmateProvider_1 = __webpack_require__(39);
110 const textmateProvider_1 = __webpack_require__(43);
111 const ultisnipsProvider_1 = __webpack_require__(49);
112 const debounce_1 = __importDefault(__webpack_require__(52));
113 const languages_1 = __importDefault(__webpack_require__(53));
114 const documentation = `# A valid snippet should starts with:
116 # snippet trigger_word [ "description" [ options ] ]
124 # b - Beginning of line.
125 # i - In-word expansion.
127 # r - Regular expression
128 # e - Custom context snippet
129 # A - Snippet will be triggered automatically, when condition matches.
133 # snippet emitter "emitter properties" b
134 # private readonly $\{1} = new Emitter<$2>()
135 # public readonly $\{1/^_(.*)/$1/}: Event<$2> = this.$1.event
138 # Online reference: https://github.com/SirVer/ultisnips/blob/master/doc/UltiSnips.txt
140 async function activate(context) {
141 let { subscriptions } = context;
142 const { nvim } = coc_nvim_1.workspace;
143 const configuration = coc_nvim_1.workspace.getConfiguration('snippets');
144 const filetypeExtends = configuration.get('extends', {});
145 const manager = new provider_1.ProviderManager();
146 const trace = configuration.get('trace', 'error');
147 let mru = coc_nvim_1.workspace.createMru('snippets-mru');
148 const channel = coc_nvim_1.workspace.createOutputChannel('snippets');
149 let snippetsDir = configuration.get('userSnippetsDirectory');
151 snippetsDir = snippetsDir.replace(/^~/, os_1.default.homedir());
152 if (snippetsDir.indexOf('$') !== -1) {
153 snippetsDir = snippetsDir.replace(/\$(\w+)/g, (match, p1) => {
155 return (_a = process.env[p1]) !== null && _a !== void 0 ? _a : match;
158 if (!path_1.default.isAbsolute(snippetsDir)) {
159 coc_nvim_1.workspace.showMessage(`snippets.userSnippetsDirectory => ${snippetsDir} should be absolute path`, 'warning');
164 snippetsDir = path_1.default.join(path_1.default.dirname(coc_nvim_1.workspace.env.extensionRoot), 'ultisnips');
165 if (!fs_1.default.existsSync(snippetsDir)) {
166 await util_1.default.promisify(fs_1.default.mkdir)(snippetsDir);
168 coc_nvim_1.events.on('CompleteDone', async (item) => {
169 if (item.user_data && item.user_data.indexOf('snippets') !== -1) {
170 await mru.add(item.word);
172 }, null, subscriptions);
173 coc_nvim_1.workspace.onDidOpenTextDocument(async (document) => {
174 if (document.uri.endsWith('.snippets')) {
175 let doc = coc_nvim_1.workspace.getDocument(document.uri);
178 let { buffer } = doc;
179 await buffer.setOption('filetype', 'snippets');
181 }, null, subscriptions);
182 if (configuration.get('ultisnips.enable', true)) {
183 let config = configuration.get('ultisnips', {});
184 let c = Object.assign({}, config, {
185 extends: Object.assign({}, filetypeExtends)
187 c.directories = c.directories ? c.directories.slice() : [];
188 if (c.directories.indexOf(snippetsDir) == -1) {
189 c.directories.push(snippetsDir);
191 let provider = new ultisnipsProvider_1.UltiSnippetsProvider(channel, trace, c, context);
192 manager.regist(provider, 'ultisnips');
193 subscriptions.push(provider);
194 // add rtp if ultisnips not found
195 nvim.getOption('runtimepath').then(async (rtp) => {
196 let paths = rtp.split(',');
197 let idx = paths.findIndex(s => /^ultisnips$/i.test(path_1.default.basename(s)));
200 let directory = path_1.default.resolve(__dirname, '..');
201 nvim.command('autocmd BufNewFile,BufRead *.snippets setf snippets', true);
202 nvim.command(`execute 'noa set rtp+='.fnameescape('${directory.replace(/'/g, "''")}')`, true);
203 coc_nvim_1.workspace.documents.forEach(doc => {
204 if (doc.uri.endsWith('.snippets')) {
205 doc.buffer.setOption('filetype', 'snippets', true);
213 loadFromExtensions: configuration.get('loadFromExtensions', true),
214 snippetsRoots: configuration.get('textmateSnippetsRoots', []),
215 extends: Object.assign({}, filetypeExtends)
217 let provider = new textmateProvider_1.TextmateProvider(channel, trace, config);
218 manager.regist(provider, 'snippets');
219 if (configuration.get('snipmate.enable', true)) {
221 author: configuration.get('snipmate.author', ''),
222 extends: Object.assign({}, filetypeExtends)
224 let provider = new snipmateProvider_1.SnipmateProvider(channel, trace, config);
225 manager.regist(provider, 'snipmate');
227 if (configuration.get('autoTrigger', true)) {
229 coc_nvim_1.events.on('InsertCharPre', () => {
230 insertTs = Date.now();
231 }, null, subscriptions);
232 coc_nvim_1.events.on(['TextChanged', 'TextChangedP', 'TextChangedI'], debounce_1.default(async () => {
233 if (!coc_nvim_1.workspace.insertMode)
235 if (!insertTs || Date.now() - insertTs > 200)
238 let edits = await manager.getTriggerSnippets(true);
239 if (insertTs != curr || edits.length == 0)
241 if (edits.length > 1) {
242 channel.appendLine(`Multiple snippet found for auto trigger: ${edits.map(s => s.prefix).join(', ')}`);
243 coc_nvim_1.workspace.showMessage('Multiple snippet found for auto trigger, check output by :CocCommand workspace.showOutput', 'warning');
245 await coc_nvim_1.commands.executeCommand('editor.action.insertSnippet', edits[0]);
246 await mru.add(edits[0].prefix);
247 }, 100), null, subscriptions);
250 if (configuration.get('enableStatusItem', true)) {
251 statusItem = coc_nvim_1.workspace.createStatusBarItem(90, { progress: true });
252 statusItem.text = 'loading snippets';
255 manager.init().then(() => {
256 statusItem === null || statusItem === void 0 ? void 0 : statusItem.hide();
258 statusItem === null || statusItem === void 0 ? void 0 : statusItem.hide();
259 coc_nvim_1.workspace.showMessage(`Error on load snippets: ${e.message}`, 'error');
261 if (manager.hasProvider) {
262 let disposable = coc_nvim_1.languages.registerCompletionItemProvider('snippets', 'S', null, manager, configuration.get('triggerCharacters', []), configuration.get('priority', 90));
263 subscriptions.push(disposable);
265 async function fallback() {
266 await nvim.call('coc#start', [{ source: 'snippets' }]);
268 async function doExpand() {
269 let edits = await manager.getTriggerSnippets();
270 if (edits.length == 0)
272 if (edits.length == 1) {
273 await coc_nvim_1.commands.executeCommand('editor.action.insertSnippet', edits[0]);
274 await mru.add(edits[0].prefix);
277 let idx = await coc_nvim_1.workspace.showQuickpick(edits.map(e => e.description || e.prefix), 'choose snippet:');
280 await coc_nvim_1.commands.executeCommand('editor.action.insertSnippet', edits[idx]);
281 await mru.add(edits[idx].prefix);
285 if (configuration.get("convertToSnippetsAction")) {
286 subscriptions.push(coc_nvim_1.languages.registerCodeActionProvider([{ scheme: 'file' }, { scheme: 'untitled' }], {
287 provideCodeActions: async (document, range, context) => {
288 if (context.only && !context.only.includes(vscode_languageserver_types_1.CodeActionKind.Source))
290 let text = document.getText(range);
291 if (text.endsWith('\n'))
292 text = text.replace(/\n$/, '');
293 let action = vscode_languageserver_types_1.CodeAction.create('Convert to snippet', {
294 command: 'snippets.editSnippets',
295 title: 'Convert to snippet',
300 }, 'snippets', [vscode_languageserver_types_1.CodeActionKind.Source]));
302 subscriptions.push(coc_nvim_1.commands.registerCommand('snippets.editSnippets', async (text) => {
303 let buf = await nvim.buffer;
304 let doc = coc_nvim_1.workspace.getDocument(buf.id);
306 coc_nvim_1.workspace.showMessage('Document not found', 'error');
309 let file = path_1.default.join(snippetsDir, `${doc.filetype}.snippets`);
310 if (!fs_1.default.existsSync(file)) {
311 await util_1.default.promisify(fs_1.default.writeFile)(file, documentation, 'utf8');
313 let uri = coc_nvim_1.Uri.file(file).toString();
314 await coc_nvim_1.workspace.jumpTo(uri, null, configuration.get('editSnippetsCommand'));
316 await nvim.command('normal! G');
317 await nvim.command('normal! 2o');
318 let position = await coc_nvim_1.workspace.getCursorPosition();
319 let indent = text.match(/^\s*/)[0];
320 text = text.split(/\r?\n/).map(s => s.startsWith(indent) ? s.slice(indent.length) : s).join('\n');
321 let escaped = text.replace(/([$}\]])/g, '\\$1');
322 // tslint:disable-next-line: no-invalid-template-strings
323 let snippet = 'snippet ${1:Tab_trigger} "${2:Description}" ${3:b}\n' + escaped + '\nendsnippet';
324 let edit = vscode_languageserver_types_1.TextEdit.insert(position, snippet);
325 await coc_nvim_1.commands.executeCommand('editor.action.insertSnippet', edit);
328 subscriptions.push(coc_nvim_1.commands.registerCommand('snippets.openSnippetFiles', async () => {
329 let buf = await nvim.buffer;
330 let doc = coc_nvim_1.workspace.getDocument(buf.id);
332 coc_nvim_1.workspace.showMessage('Document not found', 'error');
335 let files = await manager.getSnippetFiles(doc.filetype);
337 coc_nvim_1.workspace.showMessage('No related snippet file found', 'warning');
340 let idx = await coc_nvim_1.workspace.showQuickpick(files, 'choose snippet file:');
343 let uri = coc_nvim_1.Uri.file(files[idx]).toString();
344 await coc_nvim_1.workspace.jumpTo(uri, null, configuration.get('editSnippetsCommand'));
346 subscriptions.push(coc_nvim_1.workspace.registerKeymap(['i'], 'snippets-expand', async () => {
347 let expanded = await doExpand();
350 }, { silent: true, sync: true, cancel: true }));
351 subscriptions.push(coc_nvim_1.workspace.registerKeymap(['i'], 'snippets-expand-jump', async () => {
352 let expanded = await doExpand();
354 let bufnr = await nvim.call('bufnr', '%');
355 let session = coc_nvim_1.snippetManager.getSession(bufnr);
356 if (session && session.isActive) {
357 await nvim.call('coc#_cancel', []);
358 await coc_nvim_1.snippetManager.nextPlaceholder();
363 }, { silent: true, sync: true, cancel: true }));
364 subscriptions.push(coc_nvim_1.workspace.registerKeymap(['v'], 'snippets-select', async () => {
365 let doc = await coc_nvim_1.workspace.document;
368 let mode = await nvim.call('visualmode');
369 if (['v', 'V'].indexOf(mode) == -1) {
370 coc_nvim_1.workspace.showMessage(`visual mode ${mode} not supported`, 'warning');
373 await nvim.command('normal! `<');
374 let start = await coc_nvim_1.workspace.getCursorPosition();
375 await nvim.command('normal! `>');
376 let end = await coc_nvim_1.workspace.getCursorPosition();
377 end = vscode_languageserver_types_1.Position.create(end.line, end.character + 1);
378 let range = vscode_languageserver_types_1.Range.create(start, end);
379 let text = doc.textDocument.getText(range);
380 await nvim.call('feedkeys', ['i', 'in']);
382 await doc.applyEdits(coc_nvim_1.workspace.nvim, [{ range, newText: '' }]);
386 let currline = doc.getline(start.line);
387 let indent = currline.match(/^\s*/)[0];
388 let lines = text.split(/\r?\n/);
389 lines = lines.map(s => s.startsWith(indent) ? s.slice(indent.length) : s);
390 text = lines.join('\n');
391 range = vscode_languageserver_types_1.Range.create(vscode_languageserver_types_1.Position.create(start.line, indent.length), end);
392 await doc.applyEdits(coc_nvim_1.workspace.nvim, [{ range, newText: '' }]);
394 await nvim.setVar('coc_selected_text', text);
395 await coc_nvim_1.workspace.moveTo(range.start);
396 }, { silent: true, sync: false, cancel: true }));
397 let languageProvider = new languages_1.default(channel, trace);
398 subscriptions.push(coc_nvim_1.languages.registerCompletionItemProvider('snippets-source', 'S', ['snippets'], languageProvider, ['$'], configuration.get('priority', 90)));
399 subscriptions.push(statusItem);
400 subscriptions.push(channel);
401 subscriptions.push(coc_nvim_1.listManager.registerList(new snippet_1.default(coc_nvim_1.workspace.nvim, manager, mru)));
403 expandable: async () => {
406 edits = await manager.getTriggerSnippets();
409 channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}] Error on getTriggerSnippets: ${e}`);
411 return edits && edits.length > 0;
415 exports.activate = activate;
420 /***/ (function(module, exports) {
422 module.exports = require("coc.nvim");
426 /***/ (function(module, exports) {
428 module.exports = require("os");
432 /***/ (function(module, exports) {
434 module.exports = require("fs");
438 /***/ (function(module, exports) {
440 module.exports = require("path");
444 /***/ (function(module, exports) {
446 module.exports = require("util");
450 /***/ (function(module, __webpack_exports__, __webpack_require__) {
453 __webpack_require__.r(__webpack_exports__);
454 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Position", function() { return Position; });
455 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Range", function() { return Range; });
456 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Location", function() { return Location; });
457 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LocationLink", function() { return LocationLink; });
458 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Color", function() { return Color; });
459 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ColorInformation", function() { return ColorInformation; });
460 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ColorPresentation", function() { return ColorPresentation; });
461 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FoldingRangeKind", function() { return FoldingRangeKind; });
462 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FoldingRange", function() { return FoldingRange; });
463 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiagnosticRelatedInformation", function() { return DiagnosticRelatedInformation; });
464 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiagnosticSeverity", function() { return DiagnosticSeverity; });
465 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiagnosticTag", function() { return DiagnosticTag; });
466 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Diagnostic", function() { return Diagnostic; });
467 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Command", function() { return Command; });
468 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextEdit", function() { return TextEdit; });
469 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextDocumentEdit", function() { return TextDocumentEdit; });
470 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CreateFile", function() { return CreateFile; });
471 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RenameFile", function() { return RenameFile; });
472 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DeleteFile", function() { return DeleteFile; });
473 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WorkspaceEdit", function() { return WorkspaceEdit; });
474 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WorkspaceChange", function() { return WorkspaceChange; });
475 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextDocumentIdentifier", function() { return TextDocumentIdentifier; });
476 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VersionedTextDocumentIdentifier", function() { return VersionedTextDocumentIdentifier; });
477 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextDocumentItem", function() { return TextDocumentItem; });
478 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MarkupKind", function() { return MarkupKind; });
479 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MarkupContent", function() { return MarkupContent; });
480 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CompletionItemKind", function() { return CompletionItemKind; });
481 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InsertTextFormat", function() { return InsertTextFormat; });
482 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CompletionItemTag", function() { return CompletionItemTag; });
483 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CompletionItem", function() { return CompletionItem; });
484 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CompletionList", function() { return CompletionList; });
485 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MarkedString", function() { return MarkedString; });
486 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hover", function() { return Hover; });
487 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ParameterInformation", function() { return ParameterInformation; });
488 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SignatureInformation", function() { return SignatureInformation; });
489 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DocumentHighlightKind", function() { return DocumentHighlightKind; });
490 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DocumentHighlight", function() { return DocumentHighlight; });
491 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymbolKind", function() { return SymbolKind; });
492 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymbolTag", function() { return SymbolTag; });
493 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SymbolInformation", function() { return SymbolInformation; });
494 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DocumentSymbol", function() { return DocumentSymbol; });
495 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CodeActionKind", function() { return CodeActionKind; });
496 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CodeActionContext", function() { return CodeActionContext; });
497 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CodeAction", function() { return CodeAction; });
498 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CodeLens", function() { return CodeLens; });
499 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FormattingOptions", function() { return FormattingOptions; });
500 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DocumentLink", function() { return DocumentLink; });
501 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionRange", function() { return SelectionRange; });
502 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EOL", function() { return EOL; });
503 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TextDocument", function() { return TextDocument; });
504 /* --------------------------------------------------------------------------------------------
\r
505 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
506 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
507 * ------------------------------------------------------------------------------------------ */
\r
510 * The Position namespace provides helper functions to work with
\r
511 * [Position](#Position) literals.
\r
514 (function (Position) {
\r
516 * Creates a new Position literal from the given line and character.
\r
517 * @param line The position's line.
\r
518 * @param character The position's character.
\r
520 function create(line, character) {
\r
521 return { line: line, character: character };
\r
523 Position.create = create;
\r
525 * Checks whether the given liternal conforms to the [Position](#Position) interface.
\r
527 function is(value) {
\r
528 var candidate = value;
\r
529 return Is.objectLiteral(candidate) && Is.number(candidate.line) && Is.number(candidate.character);
\r
532 })(Position || (Position = {}));
\r
534 * The Range namespace provides helper functions to work with
\r
535 * [Range](#Range) literals.
\r
538 (function (Range) {
\r
539 function create(one, two, three, four) {
\r
540 if (Is.number(one) && Is.number(two) && Is.number(three) && Is.number(four)) {
\r
541 return { start: Position.create(one, two), end: Position.create(three, four) };
\r
543 else if (Position.is(one) && Position.is(two)) {
\r
544 return { start: one, end: two };
\r
547 throw new Error("Range#create called with invalid arguments[" + one + ", " + two + ", " + three + ", " + four + "]");
\r
550 Range.create = create;
\r
552 * Checks whether the given literal conforms to the [Range](#Range) interface.
\r
554 function is(value) {
\r
555 var candidate = value;
\r
556 return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);
\r
559 })(Range || (Range = {}));
\r
561 * The Location namespace provides helper functions to work with
\r
562 * [Location](#Location) literals.
\r
565 (function (Location) {
\r
567 * Creates a Location literal.
\r
568 * @param uri The location's uri.
\r
569 * @param range The location's range.
\r
571 function create(uri, range) {
\r
572 return { uri: uri, range: range };
\r
574 Location.create = create;
\r
576 * Checks whether the given literal conforms to the [Location](#Location) interface.
\r
578 function is(value) {
\r
579 var candidate = value;
\r
580 return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));
\r
583 })(Location || (Location = {}));
\r
585 * The LocationLink namespace provides helper functions to work with
\r
586 * [LocationLink](#LocationLink) literals.
\r
589 (function (LocationLink) {
\r
591 * Creates a LocationLink literal.
\r
592 * @param targetUri The definition's uri.
\r
593 * @param targetRange The full range of the definition.
\r
594 * @param targetSelectionRange The span of the symbol definition at the target.
\r
595 * @param originSelectionRange The span of the symbol being defined in the originating source file.
\r
597 function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {
\r
598 return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };
\r
600 LocationLink.create = create;
\r
602 * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.
\r
604 function is(value) {
\r
605 var candidate = value;
\r
606 return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)
\r
607 && (Range.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange))
\r
608 && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));
\r
610 LocationLink.is = is;
\r
611 })(LocationLink || (LocationLink = {}));
\r
613 * The Color namespace provides helper functions to work with
\r
614 * [Color](#Color) literals.
\r
617 (function (Color) {
\r
619 * Creates a new Color literal.
\r
621 function create(red, green, blue, alpha) {
\r
629 Color.create = create;
\r
631 * Checks whether the given literal conforms to the [Color](#Color) interface.
\r
633 function is(value) {
\r
634 var candidate = value;
\r
635 return Is.number(candidate.red)
\r
636 && Is.number(candidate.green)
\r
637 && Is.number(candidate.blue)
\r
638 && Is.number(candidate.alpha);
\r
641 })(Color || (Color = {}));
\r
643 * The ColorInformation namespace provides helper functions to work with
\r
644 * [ColorInformation](#ColorInformation) literals.
\r
646 var ColorInformation;
\r
647 (function (ColorInformation) {
\r
649 * Creates a new ColorInformation literal.
\r
651 function create(range, color) {
\r
657 ColorInformation.create = create;
\r
659 * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
\r
661 function is(value) {
\r
662 var candidate = value;
\r
663 return Range.is(candidate.range) && Color.is(candidate.color);
\r
665 ColorInformation.is = is;
\r
666 })(ColorInformation || (ColorInformation = {}));
\r
668 * The Color namespace provides helper functions to work with
\r
669 * [ColorPresentation](#ColorPresentation) literals.
\r
671 var ColorPresentation;
\r
672 (function (ColorPresentation) {
\r
674 * Creates a new ColorInformation literal.
\r
676 function create(label, textEdit, additionalTextEdits) {
\r
679 textEdit: textEdit,
\r
680 additionalTextEdits: additionalTextEdits,
\r
683 ColorPresentation.create = create;
\r
685 * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
\r
687 function is(value) {
\r
688 var candidate = value;
\r
689 return Is.string(candidate.label)
\r
690 && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))
\r
691 && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));
\r
693 ColorPresentation.is = is;
\r
694 })(ColorPresentation || (ColorPresentation = {}));
\r
696 * Enum of known range kinds
\r
698 var FoldingRangeKind;
\r
699 (function (FoldingRangeKind) {
\r
701 * Folding range for a comment
\r
703 FoldingRangeKind["Comment"] = "comment";
\r
705 * Folding range for a imports or includes
\r
707 FoldingRangeKind["Imports"] = "imports";
\r
709 * Folding range for a region (e.g. `#region`)
\r
711 FoldingRangeKind["Region"] = "region";
\r
712 })(FoldingRangeKind || (FoldingRangeKind = {}));
\r
714 * The folding range namespace provides helper functions to work with
\r
715 * [FoldingRange](#FoldingRange) literals.
\r
718 (function (FoldingRange) {
\r
720 * Creates a new FoldingRange literal.
\r
722 function create(startLine, endLine, startCharacter, endCharacter, kind) {
\r
724 startLine: startLine,
\r
727 if (Is.defined(startCharacter)) {
\r
728 result.startCharacter = startCharacter;
\r
730 if (Is.defined(endCharacter)) {
\r
731 result.endCharacter = endCharacter;
\r
733 if (Is.defined(kind)) {
\r
734 result.kind = kind;
\r
738 FoldingRange.create = create;
\r
740 * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.
\r
742 function is(value) {
\r
743 var candidate = value;
\r
744 return Is.number(candidate.startLine) && Is.number(candidate.startLine)
\r
745 && (Is.undefined(candidate.startCharacter) || Is.number(candidate.startCharacter))
\r
746 && (Is.undefined(candidate.endCharacter) || Is.number(candidate.endCharacter))
\r
747 && (Is.undefined(candidate.kind) || Is.string(candidate.kind));
\r
749 FoldingRange.is = is;
\r
750 })(FoldingRange || (FoldingRange = {}));
\r
752 * The DiagnosticRelatedInformation namespace provides helper functions to work with
\r
753 * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.
\r
755 var DiagnosticRelatedInformation;
\r
756 (function (DiagnosticRelatedInformation) {
\r
758 * Creates a new DiagnosticRelatedInformation literal.
\r
760 function create(location, message) {
\r
762 location: location,
\r
766 DiagnosticRelatedInformation.create = create;
\r
768 * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.
\r
770 function is(value) {
\r
771 var candidate = value;
\r
772 return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);
\r
774 DiagnosticRelatedInformation.is = is;
\r
775 })(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));
\r
777 * The diagnostic's severity.
\r
779 var DiagnosticSeverity;
\r
780 (function (DiagnosticSeverity) {
\r
782 * Reports an error.
\r
784 DiagnosticSeverity.Error = 1;
\r
786 * Reports a warning.
\r
788 DiagnosticSeverity.Warning = 2;
\r
790 * Reports an information.
\r
792 DiagnosticSeverity.Information = 3;
\r
796 DiagnosticSeverity.Hint = 4;
\r
797 })(DiagnosticSeverity || (DiagnosticSeverity = {}));
\r
799 * The diagnostic tags.
\r
804 (function (DiagnosticTag) {
\r
806 * Unused or unnecessary code.
\r
808 * Clients are allowed to render diagnostics with this tag faded out instead of having
\r
809 * an error squiggle.
\r
811 DiagnosticTag.Unnecessary = 1;
\r
813 * Deprecated or obsolete code.
\r
815 * Clients are allowed to rendered diagnostics with this tag strike through.
\r
817 DiagnosticTag.Deprecated = 2;
\r
818 })(DiagnosticTag || (DiagnosticTag = {}));
\r
820 * The Diagnostic namespace provides helper functions to work with
\r
821 * [Diagnostic](#Diagnostic) literals.
\r
824 (function (Diagnostic) {
\r
826 * Creates a new Diagnostic literal.
\r
828 function create(range, message, severity, code, source, relatedInformation) {
\r
829 var result = { range: range, message: message };
\r
830 if (Is.defined(severity)) {
\r
831 result.severity = severity;
\r
833 if (Is.defined(code)) {
\r
834 result.code = code;
\r
836 if (Is.defined(source)) {
\r
837 result.source = source;
\r
839 if (Is.defined(relatedInformation)) {
\r
840 result.relatedInformation = relatedInformation;
\r
844 Diagnostic.create = create;
\r
846 * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.
\r
848 function is(value) {
\r
849 var candidate = value;
\r
850 return Is.defined(candidate)
\r
851 && Range.is(candidate.range)
\r
852 && Is.string(candidate.message)
\r
853 && (Is.number(candidate.severity) || Is.undefined(candidate.severity))
\r
854 && (Is.number(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))
\r
855 && (Is.string(candidate.source) || Is.undefined(candidate.source))
\r
856 && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));
\r
858 Diagnostic.is = is;
\r
859 })(Diagnostic || (Diagnostic = {}));
\r
861 * The Command namespace provides helper functions to work with
\r
862 * [Command](#Command) literals.
\r
865 (function (Command) {
\r
867 * Creates a new Command literal.
\r
869 function create(title, command) {
\r
871 for (var _i = 2; _i < arguments.length; _i++) {
\r
872 args[_i - 2] = arguments[_i];
\r
874 var result = { title: title, command: command };
\r
875 if (Is.defined(args) && args.length > 0) {
\r
876 result.arguments = args;
\r
880 Command.create = create;
\r
882 * Checks whether the given literal conforms to the [Command](#Command) interface.
\r
884 function is(value) {
\r
885 var candidate = value;
\r
886 return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);
\r
889 })(Command || (Command = {}));
\r
891 * The TextEdit namespace provides helper function to create replace,
\r
892 * insert and delete edits more easily.
\r
895 (function (TextEdit) {
\r
897 * Creates a replace text edit.
\r
898 * @param range The range of text to be replaced.
\r
899 * @param newText The new text.
\r
901 function replace(range, newText) {
\r
902 return { range: range, newText: newText };
\r
904 TextEdit.replace = replace;
\r
906 * Creates a insert text edit.
\r
907 * @param position The position to insert the text at.
\r
908 * @param newText The text to be inserted.
\r
910 function insert(position, newText) {
\r
911 return { range: { start: position, end: position }, newText: newText };
\r
913 TextEdit.insert = insert;
\r
915 * Creates a delete text edit.
\r
916 * @param range The range of text to be deleted.
\r
918 function del(range) {
\r
919 return { range: range, newText: '' };
\r
921 TextEdit.del = del;
\r
922 function is(value) {
\r
923 var candidate = value;
\r
924 return Is.objectLiteral(candidate)
\r
925 && Is.string(candidate.newText)
\r
926 && Range.is(candidate.range);
\r
929 })(TextEdit || (TextEdit = {}));
\r
931 * The TextDocumentEdit namespace provides helper function to create
\r
932 * an edit that manipulates a text document.
\r
934 var TextDocumentEdit;
\r
935 (function (TextDocumentEdit) {
\r
937 * Creates a new `TextDocumentEdit`
\r
939 function create(textDocument, edits) {
\r
940 return { textDocument: textDocument, edits: edits };
\r
942 TextDocumentEdit.create = create;
\r
943 function is(value) {
\r
944 var candidate = value;
\r
945 return Is.defined(candidate)
\r
946 && VersionedTextDocumentIdentifier.is(candidate.textDocument)
\r
947 && Array.isArray(candidate.edits);
\r
949 TextDocumentEdit.is = is;
\r
950 })(TextDocumentEdit || (TextDocumentEdit = {}));
\r
952 (function (CreateFile) {
\r
953 function create(uri, options) {
\r
958 if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
\r
959 result.options = options;
\r
963 CreateFile.create = create;
\r
964 function is(value) {
\r
965 var candidate = value;
\r
966 return candidate && candidate.kind === 'create' && Is.string(candidate.uri) &&
\r
967 (candidate.options === void 0 ||
\r
968 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
\r
970 CreateFile.is = is;
\r
971 })(CreateFile || (CreateFile = {}));
\r
973 (function (RenameFile) {
\r
974 function create(oldUri, newUri, options) {
\r
980 if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
\r
981 result.options = options;
\r
985 RenameFile.create = create;
\r
986 function is(value) {
\r
987 var candidate = value;
\r
988 return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) &&
\r
989 (candidate.options === void 0 ||
\r
990 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
\r
992 RenameFile.is = is;
\r
993 })(RenameFile || (RenameFile = {}));
\r
995 (function (DeleteFile) {
\r
996 function create(uri, options) {
\r
1001 if (options !== void 0 && (options.recursive !== void 0 || options.ignoreIfNotExists !== void 0)) {
\r
1002 result.options = options;
\r
1006 DeleteFile.create = create;
\r
1007 function is(value) {
\r
1008 var candidate = value;
\r
1009 return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) &&
\r
1010 (candidate.options === void 0 ||
\r
1011 ((candidate.options.recursive === void 0 || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === void 0 || Is.boolean(candidate.options.ignoreIfNotExists))));
\r
1013 DeleteFile.is = is;
\r
1014 })(DeleteFile || (DeleteFile = {}));
\r
1015 var WorkspaceEdit;
\r
1016 (function (WorkspaceEdit) {
\r
1017 function is(value) {
\r
1018 var candidate = value;
\r
1019 return candidate &&
\r
1020 (candidate.changes !== void 0 || candidate.documentChanges !== void 0) &&
\r
1021 (candidate.documentChanges === void 0 || candidate.documentChanges.every(function (change) {
\r
1022 if (Is.string(change.kind)) {
\r
1023 return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);
\r
1026 return TextDocumentEdit.is(change);
\r
1030 WorkspaceEdit.is = is;
\r
1031 })(WorkspaceEdit || (WorkspaceEdit = {}));
\r
1032 var TextEditChangeImpl = /** @class */ (function () {
\r
1033 function TextEditChangeImpl(edits) {
\r
1034 this.edits = edits;
\r
1036 TextEditChangeImpl.prototype.insert = function (position, newText) {
\r
1037 this.edits.push(TextEdit.insert(position, newText));
\r
1039 TextEditChangeImpl.prototype.replace = function (range, newText) {
\r
1040 this.edits.push(TextEdit.replace(range, newText));
\r
1042 TextEditChangeImpl.prototype.delete = function (range) {
\r
1043 this.edits.push(TextEdit.del(range));
\r
1045 TextEditChangeImpl.prototype.add = function (edit) {
\r
1046 this.edits.push(edit);
\r
1048 TextEditChangeImpl.prototype.all = function () {
\r
1049 return this.edits;
\r
1051 TextEditChangeImpl.prototype.clear = function () {
\r
1052 this.edits.splice(0, this.edits.length);
\r
1054 return TextEditChangeImpl;
\r
1057 * A workspace change helps constructing changes to a workspace.
\r
1059 var WorkspaceChange = /** @class */ (function () {
\r
1060 function WorkspaceChange(workspaceEdit) {
\r
1062 this._textEditChanges = Object.create(null);
\r
1063 if (workspaceEdit) {
\r
1064 this._workspaceEdit = workspaceEdit;
\r
1065 if (workspaceEdit.documentChanges) {
\r
1066 workspaceEdit.documentChanges.forEach(function (change) {
\r
1067 if (TextDocumentEdit.is(change)) {
\r
1068 var textEditChange = new TextEditChangeImpl(change.edits);
\r
1069 _this._textEditChanges[change.textDocument.uri] = textEditChange;
\r
1073 else if (workspaceEdit.changes) {
\r
1074 Object.keys(workspaceEdit.changes).forEach(function (key) {
\r
1075 var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);
\r
1076 _this._textEditChanges[key] = textEditChange;
\r
1081 Object.defineProperty(WorkspaceChange.prototype, "edit", {
\r
1083 * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal
\r
1084 * use to be returned from a workspace edit operation like rename.
\r
1086 get: function () {
\r
1087 return this._workspaceEdit;
\r
1090 configurable: true
\r
1092 WorkspaceChange.prototype.getTextEditChange = function (key) {
\r
1093 if (VersionedTextDocumentIdentifier.is(key)) {
\r
1094 if (!this._workspaceEdit) {
\r
1095 this._workspaceEdit = {
\r
1096 documentChanges: []
\r
1099 if (!this._workspaceEdit.documentChanges) {
\r
1100 throw new Error('Workspace edit is not configured for document changes.');
\r
1102 var textDocument = key;
\r
1103 var result = this._textEditChanges[textDocument.uri];
\r
1106 var textDocumentEdit = {
\r
1107 textDocument: textDocument,
\r
1110 this._workspaceEdit.documentChanges.push(textDocumentEdit);
\r
1111 result = new TextEditChangeImpl(edits);
\r
1112 this._textEditChanges[textDocument.uri] = result;
\r
1117 if (!this._workspaceEdit) {
\r
1118 this._workspaceEdit = {
\r
1119 changes: Object.create(null)
\r
1122 if (!this._workspaceEdit.changes) {
\r
1123 throw new Error('Workspace edit is not configured for normal text edit changes.');
\r
1125 var result = this._textEditChanges[key];
\r
1128 this._workspaceEdit.changes[key] = edits;
\r
1129 result = new TextEditChangeImpl(edits);
\r
1130 this._textEditChanges[key] = result;
\r
1135 WorkspaceChange.prototype.createFile = function (uri, options) {
\r
1136 this.checkDocumentChanges();
\r
1137 this._workspaceEdit.documentChanges.push(CreateFile.create(uri, options));
\r
1139 WorkspaceChange.prototype.renameFile = function (oldUri, newUri, options) {
\r
1140 this.checkDocumentChanges();
\r
1141 this._workspaceEdit.documentChanges.push(RenameFile.create(oldUri, newUri, options));
\r
1143 WorkspaceChange.prototype.deleteFile = function (uri, options) {
\r
1144 this.checkDocumentChanges();
\r
1145 this._workspaceEdit.documentChanges.push(DeleteFile.create(uri, options));
\r
1147 WorkspaceChange.prototype.checkDocumentChanges = function () {
\r
1148 if (!this._workspaceEdit || !this._workspaceEdit.documentChanges) {
\r
1149 throw new Error('Workspace edit is not configured for document changes.');
\r
1152 return WorkspaceChange;
\r
1156 * The TextDocumentIdentifier namespace provides helper functions to work with
\r
1157 * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.
\r
1159 var TextDocumentIdentifier;
\r
1160 (function (TextDocumentIdentifier) {
\r
1162 * Creates a new TextDocumentIdentifier literal.
\r
1163 * @param uri The document's uri.
\r
1165 function create(uri) {
\r
1166 return { uri: uri };
\r
1168 TextDocumentIdentifier.create = create;
\r
1170 * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.
\r
1172 function is(value) {
\r
1173 var candidate = value;
\r
1174 return Is.defined(candidate) && Is.string(candidate.uri);
\r
1176 TextDocumentIdentifier.is = is;
\r
1177 })(TextDocumentIdentifier || (TextDocumentIdentifier = {}));
\r
1179 * The VersionedTextDocumentIdentifier namespace provides helper functions to work with
\r
1180 * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.
\r
1182 var VersionedTextDocumentIdentifier;
\r
1183 (function (VersionedTextDocumentIdentifier) {
\r
1185 * Creates a new VersionedTextDocumentIdentifier literal.
\r
1186 * @param uri The document's uri.
\r
1187 * @param uri The document's text.
\r
1189 function create(uri, version) {
\r
1190 return { uri: uri, version: version };
\r
1192 VersionedTextDocumentIdentifier.create = create;
\r
1194 * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.
\r
1196 function is(value) {
\r
1197 var candidate = value;
\r
1198 return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.number(candidate.version));
\r
1200 VersionedTextDocumentIdentifier.is = is;
\r
1201 })(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));
\r
1203 * The TextDocumentItem namespace provides helper functions to work with
\r
1204 * [TextDocumentItem](#TextDocumentItem) literals.
\r
1206 var TextDocumentItem;
\r
1207 (function (TextDocumentItem) {
\r
1209 * Creates a new TextDocumentItem literal.
\r
1210 * @param uri The document's uri.
\r
1211 * @param languageId The document's language identifier.
\r
1212 * @param version The document's version number.
\r
1213 * @param text The document's text.
\r
1215 function create(uri, languageId, version, text) {
\r
1216 return { uri: uri, languageId: languageId, version: version, text: text };
\r
1218 TextDocumentItem.create = create;
\r
1220 * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.
\r
1222 function is(value) {
\r
1223 var candidate = value;
\r
1224 return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.number(candidate.version) && Is.string(candidate.text);
\r
1226 TextDocumentItem.is = is;
\r
1227 })(TextDocumentItem || (TextDocumentItem = {}));
\r
1229 * Describes the content type that a client supports in various
\r
1230 * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
\r
1232 * Please note that `MarkupKinds` must not start with a `$`. This kinds
\r
1233 * are reserved for internal usage.
\r
1236 (function (MarkupKind) {
\r
1238 * Plain text is supported as a content format
\r
1240 MarkupKind.PlainText = 'plaintext';
\r
1242 * Markdown is supported as a content format
\r
1244 MarkupKind.Markdown = 'markdown';
\r
1245 })(MarkupKind || (MarkupKind = {}));
\r
1246 (function (MarkupKind) {
\r
1248 * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.
\r
1250 function is(value) {
\r
1251 var candidate = value;
\r
1252 return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;
\r
1254 MarkupKind.is = is;
\r
1255 })(MarkupKind || (MarkupKind = {}));
\r
1256 var MarkupContent;
\r
1257 (function (MarkupContent) {
\r
1259 * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.
\r
1261 function is(value) {
\r
1262 var candidate = value;
\r
1263 return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);
\r
1265 MarkupContent.is = is;
\r
1266 })(MarkupContent || (MarkupContent = {}));
\r
1268 * The kind of a completion entry.
\r
1270 var CompletionItemKind;
\r
1271 (function (CompletionItemKind) {
\r
1272 CompletionItemKind.Text = 1;
\r
1273 CompletionItemKind.Method = 2;
\r
1274 CompletionItemKind.Function = 3;
\r
1275 CompletionItemKind.Constructor = 4;
\r
1276 CompletionItemKind.Field = 5;
\r
1277 CompletionItemKind.Variable = 6;
\r
1278 CompletionItemKind.Class = 7;
\r
1279 CompletionItemKind.Interface = 8;
\r
1280 CompletionItemKind.Module = 9;
\r
1281 CompletionItemKind.Property = 10;
\r
1282 CompletionItemKind.Unit = 11;
\r
1283 CompletionItemKind.Value = 12;
\r
1284 CompletionItemKind.Enum = 13;
\r
1285 CompletionItemKind.Keyword = 14;
\r
1286 CompletionItemKind.Snippet = 15;
\r
1287 CompletionItemKind.Color = 16;
\r
1288 CompletionItemKind.File = 17;
\r
1289 CompletionItemKind.Reference = 18;
\r
1290 CompletionItemKind.Folder = 19;
\r
1291 CompletionItemKind.EnumMember = 20;
\r
1292 CompletionItemKind.Constant = 21;
\r
1293 CompletionItemKind.Struct = 22;
\r
1294 CompletionItemKind.Event = 23;
\r
1295 CompletionItemKind.Operator = 24;
\r
1296 CompletionItemKind.TypeParameter = 25;
\r
1297 })(CompletionItemKind || (CompletionItemKind = {}));
\r
1299 * Defines whether the insert text in a completion item should be interpreted as
\r
1300 * plain text or a snippet.
\r
1302 var InsertTextFormat;
\r
1303 (function (InsertTextFormat) {
\r
1305 * The primary text to be inserted is treated as a plain string.
\r
1307 InsertTextFormat.PlainText = 1;
\r
1309 * The primary text to be inserted is treated as a snippet.
\r
1311 * A snippet can define tab stops and placeholders with `$1`, `$2`
\r
1312 * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
\r
1313 * the end of the snippet. Placeholders with equal identifiers are linked,
\r
1314 * that is typing in one will update others too.
\r
1316 * See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
\r
1318 InsertTextFormat.Snippet = 2;
\r
1319 })(InsertTextFormat || (InsertTextFormat = {}));
\r
1321 * Completion item tags are extra annotations that tweak the rendering of a completion
\r
1326 var CompletionItemTag;
\r
1327 (function (CompletionItemTag) {
\r
1329 * Render a completion as obsolete, usually using a strike-out.
\r
1331 CompletionItemTag.Deprecated = 1;
\r
1332 })(CompletionItemTag || (CompletionItemTag = {}));
\r
1334 * The CompletionItem namespace provides functions to deal with
\r
1335 * completion items.
\r
1337 var CompletionItem;
\r
1338 (function (CompletionItem) {
\r
1340 * Create a completion item and seed it with a label.
\r
1341 * @param label The completion item's label
\r
1343 function create(label) {
\r
1344 return { label: label };
\r
1346 CompletionItem.create = create;
\r
1347 })(CompletionItem || (CompletionItem = {}));
\r
1349 * The CompletionList namespace provides functions to deal with
\r
1350 * completion lists.
\r
1352 var CompletionList;
\r
1353 (function (CompletionList) {
\r
1355 * Creates a new completion list.
\r
1357 * @param items The completion items.
\r
1358 * @param isIncomplete The list is not complete.
\r
1360 function create(items, isIncomplete) {
\r
1361 return { items: items ? items : [], isIncomplete: !!isIncomplete };
\r
1363 CompletionList.create = create;
\r
1364 })(CompletionList || (CompletionList = {}));
\r
1366 (function (MarkedString) {
\r
1368 * Creates a marked string from plain text.
\r
1370 * @param plainText The plain text.
\r
1372 function fromPlainText(plainText) {
\r
1373 return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
\r
1375 MarkedString.fromPlainText = fromPlainText;
\r
1377 * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.
\r
1379 function is(value) {
\r
1380 var candidate = value;
\r
1381 return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));
\r
1383 MarkedString.is = is;
\r
1384 })(MarkedString || (MarkedString = {}));
\r
1386 (function (Hover) {
\r
1388 * Checks whether the given value conforms to the [Hover](#Hover) interface.
\r
1390 function is(value) {
\r
1391 var candidate = value;
\r
1392 return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||
\r
1393 MarkedString.is(candidate.contents) ||
\r
1394 Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === void 0 || Range.is(value.range));
\r
1397 })(Hover || (Hover = {}));
\r
1399 * The ParameterInformation namespace provides helper functions to work with
\r
1400 * [ParameterInformation](#ParameterInformation) literals.
\r
1402 var ParameterInformation;
\r
1403 (function (ParameterInformation) {
\r
1405 * Creates a new parameter information literal.
\r
1407 * @param label A label string.
\r
1408 * @param documentation A doc string.
\r
1410 function create(label, documentation) {
\r
1411 return documentation ? { label: label, documentation: documentation } : { label: label };
\r
1413 ParameterInformation.create = create;
\r
1414 })(ParameterInformation || (ParameterInformation = {}));
\r
1416 * The SignatureInformation namespace provides helper functions to work with
\r
1417 * [SignatureInformation](#SignatureInformation) literals.
\r
1419 var SignatureInformation;
\r
1420 (function (SignatureInformation) {
\r
1421 function create(label, documentation) {
\r
1422 var parameters = [];
\r
1423 for (var _i = 2; _i < arguments.length; _i++) {
\r
1424 parameters[_i - 2] = arguments[_i];
\r
1426 var result = { label: label };
\r
1427 if (Is.defined(documentation)) {
\r
1428 result.documentation = documentation;
\r
1430 if (Is.defined(parameters)) {
\r
1431 result.parameters = parameters;
\r
1434 result.parameters = [];
\r
1438 SignatureInformation.create = create;
\r
1439 })(SignatureInformation || (SignatureInformation = {}));
\r
1441 * A document highlight kind.
\r
1443 var DocumentHighlightKind;
\r
1444 (function (DocumentHighlightKind) {
\r
1446 * A textual occurrence.
\r
1448 DocumentHighlightKind.Text = 1;
\r
1450 * Read-access of a symbol, like reading a variable.
\r
1452 DocumentHighlightKind.Read = 2;
\r
1454 * Write-access of a symbol, like writing to a variable.
\r
1456 DocumentHighlightKind.Write = 3;
\r
1457 })(DocumentHighlightKind || (DocumentHighlightKind = {}));
\r
1459 * DocumentHighlight namespace to provide helper functions to work with
\r
1460 * [DocumentHighlight](#DocumentHighlight) literals.
\r
1462 var DocumentHighlight;
\r
1463 (function (DocumentHighlight) {
\r
1465 * Create a DocumentHighlight object.
\r
1466 * @param range The range the highlight applies to.
\r
1468 function create(range, kind) {
\r
1469 var result = { range: range };
\r
1470 if (Is.number(kind)) {
\r
1471 result.kind = kind;
\r
1475 DocumentHighlight.create = create;
\r
1476 })(DocumentHighlight || (DocumentHighlight = {}));
\r
1481 (function (SymbolKind) {
\r
1482 SymbolKind.File = 1;
\r
1483 SymbolKind.Module = 2;
\r
1484 SymbolKind.Namespace = 3;
\r
1485 SymbolKind.Package = 4;
\r
1486 SymbolKind.Class = 5;
\r
1487 SymbolKind.Method = 6;
\r
1488 SymbolKind.Property = 7;
\r
1489 SymbolKind.Field = 8;
\r
1490 SymbolKind.Constructor = 9;
\r
1491 SymbolKind.Enum = 10;
\r
1492 SymbolKind.Interface = 11;
\r
1493 SymbolKind.Function = 12;
\r
1494 SymbolKind.Variable = 13;
\r
1495 SymbolKind.Constant = 14;
\r
1496 SymbolKind.String = 15;
\r
1497 SymbolKind.Number = 16;
\r
1498 SymbolKind.Boolean = 17;
\r
1499 SymbolKind.Array = 18;
\r
1500 SymbolKind.Object = 19;
\r
1501 SymbolKind.Key = 20;
\r
1502 SymbolKind.Null = 21;
\r
1503 SymbolKind.EnumMember = 22;
\r
1504 SymbolKind.Struct = 23;
\r
1505 SymbolKind.Event = 24;
\r
1506 SymbolKind.Operator = 25;
\r
1507 SymbolKind.TypeParameter = 26;
\r
1508 })(SymbolKind || (SymbolKind = {}));
\r
1510 * Symbol tags are extra annotations that tweak the rendering of a symbol.
\r
1514 (function (SymbolTag) {
\r
1516 * Render a symbol as obsolete, usually using a strike-out.
\r
1518 SymbolTag.Deprecated = 1;
\r
1519 })(SymbolTag || (SymbolTag = {}));
\r
1520 var SymbolInformation;
\r
1521 (function (SymbolInformation) {
\r
1523 * Creates a new symbol information literal.
\r
1525 * @param name The name of the symbol.
\r
1526 * @param kind The kind of the symbol.
\r
1527 * @param range The range of the location of the symbol.
\r
1528 * @param uri The resource of the location of symbol, defaults to the current document.
\r
1529 * @param containerName The name of the symbol containing the symbol.
\r
1531 function create(name, kind, range, uri, containerName) {
\r
1535 location: { uri: uri, range: range }
\r
1537 if (containerName) {
\r
1538 result.containerName = containerName;
\r
1542 SymbolInformation.create = create;
\r
1543 })(SymbolInformation || (SymbolInformation = {}));
\r
1544 var DocumentSymbol;
\r
1545 (function (DocumentSymbol) {
\r
1547 * Creates a new symbol information literal.
\r
1549 * @param name The name of the symbol.
\r
1550 * @param detail The detail of the symbol.
\r
1551 * @param kind The kind of the symbol.
\r
1552 * @param range The range of the symbol.
\r
1553 * @param selectionRange The selectionRange of the symbol.
\r
1554 * @param children Children of the symbol.
\r
1556 function create(name, detail, kind, range, selectionRange, children) {
\r
1562 selectionRange: selectionRange
\r
1564 if (children !== void 0) {
\r
1565 result.children = children;
\r
1569 DocumentSymbol.create = create;
\r
1571 * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.
\r
1573 function is(value) {
\r
1574 var candidate = value;
\r
1575 return candidate &&
\r
1576 Is.string(candidate.name) && Is.number(candidate.kind) &&
\r
1577 Range.is(candidate.range) && Range.is(candidate.selectionRange) &&
\r
1578 (candidate.detail === void 0 || Is.string(candidate.detail)) &&
\r
1579 (candidate.deprecated === void 0 || Is.boolean(candidate.deprecated)) &&
\r
1580 (candidate.children === void 0 || Array.isArray(candidate.children));
\r
1582 DocumentSymbol.is = is;
\r
1583 })(DocumentSymbol || (DocumentSymbol = {}));
\r
1585 * A set of predefined code action kinds
\r
1587 var CodeActionKind;
\r
1588 (function (CodeActionKind) {
\r
1592 CodeActionKind.Empty = '';
\r
1594 * Base kind for quickfix actions: 'quickfix'
\r
1596 CodeActionKind.QuickFix = 'quickfix';
\r
1598 * Base kind for refactoring actions: 'refactor'
\r
1600 CodeActionKind.Refactor = 'refactor';
\r
1602 * Base kind for refactoring extraction actions: 'refactor.extract'
\r
1604 * Example extract actions:
\r
1606 * - Extract method
\r
1607 * - Extract function
\r
1608 * - Extract variable
\r
1609 * - Extract interface from class
\r
1612 CodeActionKind.RefactorExtract = 'refactor.extract';
\r
1614 * Base kind for refactoring inline actions: 'refactor.inline'
\r
1616 * Example inline actions:
\r
1618 * - Inline function
\r
1619 * - Inline variable
\r
1620 * - Inline constant
\r
1623 CodeActionKind.RefactorInline = 'refactor.inline';
\r
1625 * Base kind for refactoring rewrite actions: 'refactor.rewrite'
\r
1627 * Example rewrite actions:
\r
1629 * - Convert JavaScript function to class
\r
1630 * - Add or remove parameter
\r
1631 * - Encapsulate field
\r
1632 * - Make method static
\r
1633 * - Move method to base class
\r
1636 CodeActionKind.RefactorRewrite = 'refactor.rewrite';
\r
1638 * Base kind for source actions: `source`
\r
1640 * Source code actions apply to the entire file.
\r
1642 CodeActionKind.Source = 'source';
\r
1644 * Base kind for an organize imports source action: `source.organizeImports`
\r
1646 CodeActionKind.SourceOrganizeImports = 'source.organizeImports';
\r
1648 * Base kind for auto-fix source actions: `source.fixAll`.
\r
1650 * Fix all actions automatically fix errors that have a clear fix that do not require user input.
\r
1651 * They should not suppress errors or perform unsafe fixes such as generating new types or classes.
\r
1655 CodeActionKind.SourceFixAll = 'source.fixAll';
\r
1656 })(CodeActionKind || (CodeActionKind = {}));
\r
1658 * The CodeActionContext namespace provides helper functions to work with
\r
1659 * [CodeActionContext](#CodeActionContext) literals.
\r
1661 var CodeActionContext;
\r
1662 (function (CodeActionContext) {
\r
1664 * Creates a new CodeActionContext literal.
\r
1666 function create(diagnostics, only) {
\r
1667 var result = { diagnostics: diagnostics };
\r
1668 if (only !== void 0 && only !== null) {
\r
1669 result.only = only;
\r
1673 CodeActionContext.create = create;
\r
1675 * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.
\r
1677 function is(value) {
\r
1678 var candidate = value;
\r
1679 return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === void 0 || Is.typedArray(candidate.only, Is.string));
\r
1681 CodeActionContext.is = is;
\r
1682 })(CodeActionContext || (CodeActionContext = {}));
\r
1684 (function (CodeAction) {
\r
1685 function create(title, commandOrEdit, kind) {
\r
1686 var result = { title: title };
\r
1687 if (Command.is(commandOrEdit)) {
\r
1688 result.command = commandOrEdit;
\r
1691 result.edit = commandOrEdit;
\r
1693 if (kind !== void 0) {
\r
1694 result.kind = kind;
\r
1698 CodeAction.create = create;
\r
1699 function is(value) {
\r
1700 var candidate = value;
\r
1701 return candidate && Is.string(candidate.title) &&
\r
1702 (candidate.diagnostics === void 0 || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&
\r
1703 (candidate.kind === void 0 || Is.string(candidate.kind)) &&
\r
1704 (candidate.edit !== void 0 || candidate.command !== void 0) &&
\r
1705 (candidate.command === void 0 || Command.is(candidate.command)) &&
\r
1706 (candidate.isPreferred === void 0 || Is.boolean(candidate.isPreferred)) &&
\r
1707 (candidate.edit === void 0 || WorkspaceEdit.is(candidate.edit));
\r
1709 CodeAction.is = is;
\r
1710 })(CodeAction || (CodeAction = {}));
\r
1712 * The CodeLens namespace provides helper functions to work with
\r
1713 * [CodeLens](#CodeLens) literals.
\r
1716 (function (CodeLens) {
\r
1718 * Creates a new CodeLens literal.
\r
1720 function create(range, data) {
\r
1721 var result = { range: range };
\r
1722 if (Is.defined(data)) {
\r
1723 result.data = data;
\r
1727 CodeLens.create = create;
\r
1729 * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.
\r
1731 function is(value) {
\r
1732 var candidate = value;
\r
1733 return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));
\r
1736 })(CodeLens || (CodeLens = {}));
\r
1738 * The FormattingOptions namespace provides helper functions to work with
\r
1739 * [FormattingOptions](#FormattingOptions) literals.
\r
1741 var FormattingOptions;
\r
1742 (function (FormattingOptions) {
\r
1744 * Creates a new FormattingOptions literal.
\r
1746 function create(tabSize, insertSpaces) {
\r
1747 return { tabSize: tabSize, insertSpaces: insertSpaces };
\r
1749 FormattingOptions.create = create;
\r
1751 * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.
\r
1753 function is(value) {
\r
1754 var candidate = value;
\r
1755 return Is.defined(candidate) && Is.number(candidate.tabSize) && Is.boolean(candidate.insertSpaces);
\r
1757 FormattingOptions.is = is;
\r
1758 })(FormattingOptions || (FormattingOptions = {}));
\r
1760 * The DocumentLink namespace provides helper functions to work with
\r
1761 * [DocumentLink](#DocumentLink) literals.
\r
1764 (function (DocumentLink) {
\r
1766 * Creates a new DocumentLink literal.
\r
1768 function create(range, target, data) {
\r
1769 return { range: range, target: target, data: data };
\r
1771 DocumentLink.create = create;
\r
1773 * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.
\r
1775 function is(value) {
\r
1776 var candidate = value;
\r
1777 return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));
\r
1779 DocumentLink.is = is;
\r
1780 })(DocumentLink || (DocumentLink = {}));
\r
1782 * The SelectionRange namespace provides helper function to work with
\r
1783 * SelectionRange literals.
\r
1785 var SelectionRange;
\r
1786 (function (SelectionRange) {
\r
1788 * Creates a new SelectionRange
\r
1789 * @param range the range.
\r
1790 * @param parent an optional parent.
\r
1792 function create(range, parent) {
\r
1793 return { range: range, parent: parent };
\r
1795 SelectionRange.create = create;
\r
1796 function is(value) {
\r
1797 var candidate = value;
\r
1798 return candidate !== undefined && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));
\r
1800 SelectionRange.is = is;
\r
1801 })(SelectionRange || (SelectionRange = {}));
\r
1802 var EOL = ['\n', '\r\n', '\r'];
\r
1804 * @deprecated Use the text document from the new vscode-languageserver-textdocument package.
\r
1807 (function (TextDocument) {
\r
1809 * Creates a new ITextDocument literal from the given uri and content.
\r
1810 * @param uri The document's uri.
\r
1811 * @param languageId The document's language Id.
\r
1812 * @param content The document's content.
\r
1814 function create(uri, languageId, version, content) {
\r
1815 return new FullTextDocument(uri, languageId, version, content);
\r
1817 TextDocument.create = create;
\r
1819 * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.
\r
1821 function is(value) {
\r
1822 var candidate = value;
\r
1823 return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.number(candidate.lineCount)
\r
1824 && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;
\r
1826 TextDocument.is = is;
\r
1827 function applyEdits(document, edits) {
\r
1828 var text = document.getText();
\r
1829 var sortedEdits = mergeSort(edits, function (a, b) {
\r
1830 var diff = a.range.start.line - b.range.start.line;
\r
1832 return a.range.start.character - b.range.start.character;
\r
1836 var lastModifiedOffset = text.length;
\r
1837 for (var i = sortedEdits.length - 1; i >= 0; i--) {
\r
1838 var e = sortedEdits[i];
\r
1839 var startOffset = document.offsetAt(e.range.start);
\r
1840 var endOffset = document.offsetAt(e.range.end);
\r
1841 if (endOffset <= lastModifiedOffset) {
\r
1842 text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);
\r
1845 throw new Error('Overlapping edit');
\r
1847 lastModifiedOffset = startOffset;
\r
1851 TextDocument.applyEdits = applyEdits;
\r
1852 function mergeSort(data, compare) {
\r
1853 if (data.length <= 1) {
\r
1857 var p = (data.length / 2) | 0;
\r
1858 var left = data.slice(0, p);
\r
1859 var right = data.slice(p);
\r
1860 mergeSort(left, compare);
\r
1861 mergeSort(right, compare);
\r
1865 while (leftIdx < left.length && rightIdx < right.length) {
\r
1866 var ret = compare(left[leftIdx], right[rightIdx]);
\r
1868 // smaller_equal -> take left to preserve order
\r
1869 data[i++] = left[leftIdx++];
\r
1872 // greater -> take right
\r
1873 data[i++] = right[rightIdx++];
\r
1876 while (leftIdx < left.length) {
\r
1877 data[i++] = left[leftIdx++];
\r
1879 while (rightIdx < right.length) {
\r
1880 data[i++] = right[rightIdx++];
\r
1884 })(TextDocument || (TextDocument = {}));
\r
1885 var FullTextDocument = /** @class */ (function () {
\r
1886 function FullTextDocument(uri, languageId, version, content) {
\r
1888 this._languageId = languageId;
\r
1889 this._version = version;
\r
1890 this._content = content;
\r
1891 this._lineOffsets = undefined;
\r
1893 Object.defineProperty(FullTextDocument.prototype, "uri", {
\r
1894 get: function () {
\r
1898 configurable: true
\r
1900 Object.defineProperty(FullTextDocument.prototype, "languageId", {
\r
1901 get: function () {
\r
1902 return this._languageId;
\r
1905 configurable: true
\r
1907 Object.defineProperty(FullTextDocument.prototype, "version", {
\r
1908 get: function () {
\r
1909 return this._version;
\r
1912 configurable: true
\r
1914 FullTextDocument.prototype.getText = function (range) {
\r
1916 var start = this.offsetAt(range.start);
\r
1917 var end = this.offsetAt(range.end);
\r
1918 return this._content.substring(start, end);
\r
1920 return this._content;
\r
1922 FullTextDocument.prototype.update = function (event, version) {
\r
1923 this._content = event.text;
\r
1924 this._version = version;
\r
1925 this._lineOffsets = undefined;
\r
1927 FullTextDocument.prototype.getLineOffsets = function () {
\r
1928 if (this._lineOffsets === undefined) {
\r
1929 var lineOffsets = [];
\r
1930 var text = this._content;
\r
1931 var isLineStart = true;
\r
1932 for (var i = 0; i < text.length; i++) {
\r
1933 if (isLineStart) {
\r
1934 lineOffsets.push(i);
\r
1935 isLineStart = false;
\r
1937 var ch = text.charAt(i);
\r
1938 isLineStart = (ch === '\r' || ch === '\n');
\r
1939 if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') {
\r
1943 if (isLineStart && text.length > 0) {
\r
1944 lineOffsets.push(text.length);
\r
1946 this._lineOffsets = lineOffsets;
\r
1948 return this._lineOffsets;
\r
1950 FullTextDocument.prototype.positionAt = function (offset) {
\r
1951 offset = Math.max(Math.min(offset, this._content.length), 0);
\r
1952 var lineOffsets = this.getLineOffsets();
\r
1953 var low = 0, high = lineOffsets.length;
\r
1955 return Position.create(0, offset);
\r
1957 while (low < high) {
\r
1958 var mid = Math.floor((low + high) / 2);
\r
1959 if (lineOffsets[mid] > offset) {
\r
1966 // low is the least x for which the line offset is larger than the current offset
\r
1967 // or array.length if no line offset is larger than the current offset
\r
1968 var line = low - 1;
\r
1969 return Position.create(line, offset - lineOffsets[line]);
\r
1971 FullTextDocument.prototype.offsetAt = function (position) {
\r
1972 var lineOffsets = this.getLineOffsets();
\r
1973 if (position.line >= lineOffsets.length) {
\r
1974 return this._content.length;
\r
1976 else if (position.line < 0) {
\r
1979 var lineOffset = lineOffsets[position.line];
\r
1980 var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
\r
1981 return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
\r
1983 Object.defineProperty(FullTextDocument.prototype, "lineCount", {
\r
1984 get: function () {
\r
1985 return this.getLineOffsets().length;
\r
1988 configurable: true
\r
1990 return FullTextDocument;
\r
1994 var toString = Object.prototype.toString;
\r
1995 function defined(value) {
\r
1996 return typeof value !== 'undefined';
\r
1998 Is.defined = defined;
\r
1999 function undefined(value) {
\r
2000 return typeof value === 'undefined';
\r
2002 Is.undefined = undefined;
\r
2003 function boolean(value) {
\r
2004 return value === true || value === false;
\r
2006 Is.boolean = boolean;
\r
2007 function string(value) {
\r
2008 return toString.call(value) === '[object String]';
\r
2010 Is.string = string;
\r
2011 function number(value) {
\r
2012 return toString.call(value) === '[object Number]';
\r
2014 Is.number = number;
\r
2015 function func(value) {
\r
2016 return toString.call(value) === '[object Function]';
\r
2019 function objectLiteral(value) {
\r
2020 // Strictly speaking class instances pass this check as well. Since the LSP
\r
2021 // doesn't use classes we ignore this for now. If we do we need to add something
\r
2022 // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
\r
2023 return value !== null && typeof value === 'object';
\r
2025 Is.objectLiteral = objectLiteral;
\r
2026 function typedArray(value, check) {
\r
2027 return Array.isArray(value) && value.every(check);
\r
2029 Is.typedArray = typedArray;
\r
2030 })(Is || (Is = {}));
\r
2035 /***/ (function(module, exports, __webpack_require__) {
2039 var __importDefault = (this && this.__importDefault) || function (mod) {
2040 return (mod && mod.__esModule) ? mod : { "default": mod };
2042 Object.defineProperty(exports, "__esModule", { value: true });
2043 /******************************************************************
2044 MIT License http://www.opensource.org/licenses/mit-license.php
2045 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
2046 *******************************************************************/
2047 const coc_nvim_1 = __webpack_require__(1);
2048 const vscode_languageserver_protocol_1 = __webpack_require__(8);
2049 const os_1 = __importDefault(__webpack_require__(2));
2050 class SnippetsList extends coc_nvim_1.BasicList {
2051 constructor(nvim, manager, mru) {
2053 this.manager = manager;
2055 this.name = 'snippets';
2056 this.description = 'snippets list';
2057 this.addLocationActions();
2059 async loadItems(context) {
2060 let { window } = context;
2061 let valid = await window.valid;
2064 let buf = await window.buffer;
2065 let doc = coc_nvim_1.workspace.getDocument(buf.id);
2068 let snippets = await this.manager.getSnippets(doc.filetype);
2070 let recents = await this.mru.load();
2071 for (let snip of snippets) {
2072 let pos = vscode_languageserver_protocol_1.Position.create(snip.lnum, 0);
2073 let location = vscode_languageserver_protocol_1.Location.create(coc_nvim_1.Uri.file(snip.filepath).toString(), vscode_languageserver_protocol_1.Range.create(pos, pos));
2074 let prefix = snip.prefix;
2075 if (prefix.length < 20) {
2076 prefix = `${prefix}${' '.repeat(20 - prefix.length)}`;
2078 let idx = recents.indexOf(snip.prefix);
2080 label: `${prefix}\t${snip.description}\t${snip.filepath.replace(os_1.default.homedir(), '~')}`,
2081 filterText: `${snip.prefix} ${snip.description}`,
2083 recentScore: idx == -1 ? -1 : recents.length - idx
2088 async doHighlight() {
2089 let { nvim } = coc_nvim_1.workspace;
2090 nvim.pauseNotification();
2091 nvim.command('syntax match CocSnippetsPrefix /\\v^\\S+/ contained containedin=CocSnippetsLine', true);
2092 nvim.command('syntax match CocSnippetsFile /\\v\\t\\S+$/ contained containedin=CocSnippetsLine', true);
2093 nvim.command('highlight default link CocSnippetsPrefix Identifier', true);
2094 nvim.command('highlight default link CocSnippetsFile Comment', true);
2095 await nvim.resumeNotification();
2098 exports.default = SnippetsList;
2103 /***/ (function(module, exports, __webpack_require__) {
2106 /* --------------------------------------------------------------------------------------------
\r
2107 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
2108 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
2109 * ------------------------------------------------------------------------------------------ */
\r
2111 function __export(m) {
\r
2112 for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
\r
2114 Object.defineProperty(exports, "__esModule", { value: true });
\r
2115 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
2116 exports.ErrorCodes = vscode_jsonrpc_1.ErrorCodes;
\r
2117 exports.ResponseError = vscode_jsonrpc_1.ResponseError;
\r
2118 exports.CancellationToken = vscode_jsonrpc_1.CancellationToken;
\r
2119 exports.CancellationTokenSource = vscode_jsonrpc_1.CancellationTokenSource;
\r
2120 exports.Disposable = vscode_jsonrpc_1.Disposable;
\r
2121 exports.Event = vscode_jsonrpc_1.Event;
\r
2122 exports.Emitter = vscode_jsonrpc_1.Emitter;
\r
2123 exports.Trace = vscode_jsonrpc_1.Trace;
\r
2124 exports.TraceFormat = vscode_jsonrpc_1.TraceFormat;
\r
2125 exports.SetTraceNotification = vscode_jsonrpc_1.SetTraceNotification;
\r
2126 exports.LogTraceNotification = vscode_jsonrpc_1.LogTraceNotification;
\r
2127 exports.RequestType = vscode_jsonrpc_1.RequestType;
\r
2128 exports.RequestType0 = vscode_jsonrpc_1.RequestType0;
\r
2129 exports.NotificationType = vscode_jsonrpc_1.NotificationType;
\r
2130 exports.NotificationType0 = vscode_jsonrpc_1.NotificationType0;
\r
2131 exports.MessageReader = vscode_jsonrpc_1.MessageReader;
\r
2132 exports.MessageWriter = vscode_jsonrpc_1.MessageWriter;
\r
2133 exports.ConnectionStrategy = vscode_jsonrpc_1.ConnectionStrategy;
\r
2134 exports.StreamMessageReader = vscode_jsonrpc_1.StreamMessageReader;
\r
2135 exports.StreamMessageWriter = vscode_jsonrpc_1.StreamMessageWriter;
\r
2136 exports.IPCMessageReader = vscode_jsonrpc_1.IPCMessageReader;
\r
2137 exports.IPCMessageWriter = vscode_jsonrpc_1.IPCMessageWriter;
\r
2138 exports.createClientPipeTransport = vscode_jsonrpc_1.createClientPipeTransport;
\r
2139 exports.createServerPipeTransport = vscode_jsonrpc_1.createServerPipeTransport;
\r
2140 exports.generateRandomPipeName = vscode_jsonrpc_1.generateRandomPipeName;
\r
2141 exports.createClientSocketTransport = vscode_jsonrpc_1.createClientSocketTransport;
\r
2142 exports.createServerSocketTransport = vscode_jsonrpc_1.createServerSocketTransport;
\r
2143 exports.ProgressType = vscode_jsonrpc_1.ProgressType;
\r
2144 __export(__webpack_require__(6));
\r
2145 __export(__webpack_require__(21));
\r
2146 const callHierarchy = __webpack_require__(33);
\r
2147 const st = __webpack_require__(34);
\r
2149 (function (Proposed) {
\r
2150 let CallHierarchyPrepareRequest;
\r
2151 (function (CallHierarchyPrepareRequest) {
\r
2152 CallHierarchyPrepareRequest.method = callHierarchy.CallHierarchyPrepareRequest.method;
\r
2153 CallHierarchyPrepareRequest.type = callHierarchy.CallHierarchyPrepareRequest.type;
\r
2154 })(CallHierarchyPrepareRequest = Proposed.CallHierarchyPrepareRequest || (Proposed.CallHierarchyPrepareRequest = {}));
\r
2155 let CallHierarchyIncomingCallsRequest;
\r
2156 (function (CallHierarchyIncomingCallsRequest) {
\r
2157 CallHierarchyIncomingCallsRequest.method = callHierarchy.CallHierarchyIncomingCallsRequest.method;
\r
2158 CallHierarchyIncomingCallsRequest.type = callHierarchy.CallHierarchyIncomingCallsRequest.type;
\r
2159 })(CallHierarchyIncomingCallsRequest = Proposed.CallHierarchyIncomingCallsRequest || (Proposed.CallHierarchyIncomingCallsRequest = {}));
\r
2160 let CallHierarchyOutgoingCallsRequest;
\r
2161 (function (CallHierarchyOutgoingCallsRequest) {
\r
2162 CallHierarchyOutgoingCallsRequest.method = callHierarchy.CallHierarchyOutgoingCallsRequest.method;
\r
2163 CallHierarchyOutgoingCallsRequest.type = callHierarchy.CallHierarchyOutgoingCallsRequest.type;
\r
2164 })(CallHierarchyOutgoingCallsRequest = Proposed.CallHierarchyOutgoingCallsRequest || (Proposed.CallHierarchyOutgoingCallsRequest = {}));
\r
2165 Proposed.SemanticTokenTypes = st.SemanticTokenTypes;
\r
2166 Proposed.SemanticTokenModifiers = st.SemanticTokenModifiers;
\r
2167 Proposed.SemanticTokens = st.SemanticTokens;
\r
2168 let SemanticTokensRequest;
\r
2169 (function (SemanticTokensRequest) {
\r
2170 SemanticTokensRequest.method = st.SemanticTokensRequest.method;
\r
2171 SemanticTokensRequest.type = st.SemanticTokensRequest.type;
\r
2172 })(SemanticTokensRequest = Proposed.SemanticTokensRequest || (Proposed.SemanticTokensRequest = {}));
\r
2173 let SemanticTokensEditsRequest;
\r
2174 (function (SemanticTokensEditsRequest) {
\r
2175 SemanticTokensEditsRequest.method = st.SemanticTokensEditsRequest.method;
\r
2176 SemanticTokensEditsRequest.type = st.SemanticTokensEditsRequest.type;
\r
2177 })(SemanticTokensEditsRequest = Proposed.SemanticTokensEditsRequest || (Proposed.SemanticTokensEditsRequest = {}));
\r
2178 let SemanticTokensRangeRequest;
\r
2179 (function (SemanticTokensRangeRequest) {
\r
2180 SemanticTokensRangeRequest.method = st.SemanticTokensRangeRequest.method;
\r
2181 SemanticTokensRangeRequest.type = st.SemanticTokensRangeRequest.type;
\r
2182 })(SemanticTokensRangeRequest = Proposed.SemanticTokensRangeRequest || (Proposed.SemanticTokensRangeRequest = {}));
\r
2183 })(Proposed = exports.Proposed || (exports.Proposed = {}));
\r
2184 function createProtocolConnection(reader, writer, logger, strategy) {
\r
2185 return vscode_jsonrpc_1.createMessageConnection(reader, writer, logger, strategy);
\r
2187 exports.createProtocolConnection = createProtocolConnection;
\r
2192 /***/ (function(module, exports, __webpack_require__) {
2195 /* --------------------------------------------------------------------------------------------
\r
2196 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
2197 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
2198 * ------------------------------------------------------------------------------------------ */
\r
2199 /// <reference path="../typings/thenable.d.ts" />
\r
2201 function __export(m) {
\r
2202 for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
\r
2204 Object.defineProperty(exports, "__esModule", { value: true });
\r
2205 const Is = __webpack_require__(10);
\r
2206 const messages_1 = __webpack_require__(11);
\r
2207 exports.RequestType = messages_1.RequestType;
\r
2208 exports.RequestType0 = messages_1.RequestType0;
\r
2209 exports.RequestType1 = messages_1.RequestType1;
\r
2210 exports.RequestType2 = messages_1.RequestType2;
\r
2211 exports.RequestType3 = messages_1.RequestType3;
\r
2212 exports.RequestType4 = messages_1.RequestType4;
\r
2213 exports.RequestType5 = messages_1.RequestType5;
\r
2214 exports.RequestType6 = messages_1.RequestType6;
\r
2215 exports.RequestType7 = messages_1.RequestType7;
\r
2216 exports.RequestType8 = messages_1.RequestType8;
\r
2217 exports.RequestType9 = messages_1.RequestType9;
\r
2218 exports.ResponseError = messages_1.ResponseError;
\r
2219 exports.ErrorCodes = messages_1.ErrorCodes;
\r
2220 exports.NotificationType = messages_1.NotificationType;
\r
2221 exports.NotificationType0 = messages_1.NotificationType0;
\r
2222 exports.NotificationType1 = messages_1.NotificationType1;
\r
2223 exports.NotificationType2 = messages_1.NotificationType2;
\r
2224 exports.NotificationType3 = messages_1.NotificationType3;
\r
2225 exports.NotificationType4 = messages_1.NotificationType4;
\r
2226 exports.NotificationType5 = messages_1.NotificationType5;
\r
2227 exports.NotificationType6 = messages_1.NotificationType6;
\r
2228 exports.NotificationType7 = messages_1.NotificationType7;
\r
2229 exports.NotificationType8 = messages_1.NotificationType8;
\r
2230 exports.NotificationType9 = messages_1.NotificationType9;
\r
2231 const messageReader_1 = __webpack_require__(12);
\r
2232 exports.MessageReader = messageReader_1.MessageReader;
\r
2233 exports.StreamMessageReader = messageReader_1.StreamMessageReader;
\r
2234 exports.IPCMessageReader = messageReader_1.IPCMessageReader;
\r
2235 exports.SocketMessageReader = messageReader_1.SocketMessageReader;
\r
2236 const messageWriter_1 = __webpack_require__(14);
\r
2237 exports.MessageWriter = messageWriter_1.MessageWriter;
\r
2238 exports.StreamMessageWriter = messageWriter_1.StreamMessageWriter;
\r
2239 exports.IPCMessageWriter = messageWriter_1.IPCMessageWriter;
\r
2240 exports.SocketMessageWriter = messageWriter_1.SocketMessageWriter;
\r
2241 const events_1 = __webpack_require__(13);
\r
2242 exports.Disposable = events_1.Disposable;
\r
2243 exports.Event = events_1.Event;
\r
2244 exports.Emitter = events_1.Emitter;
\r
2245 const cancellation_1 = __webpack_require__(15);
\r
2246 exports.CancellationTokenSource = cancellation_1.CancellationTokenSource;
\r
2247 exports.CancellationToken = cancellation_1.CancellationToken;
\r
2248 const linkedMap_1 = __webpack_require__(16);
\r
2249 __export(__webpack_require__(17));
\r
2250 __export(__webpack_require__(20));
\r
2251 var CancelNotification;
\r
2252 (function (CancelNotification) {
\r
2253 CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');
\r
2254 })(CancelNotification || (CancelNotification = {}));
\r
2255 var ProgressNotification;
\r
2256 (function (ProgressNotification) {
\r
2257 ProgressNotification.type = new messages_1.NotificationType('$/progress');
\r
2258 })(ProgressNotification || (ProgressNotification = {}));
\r
2259 class ProgressType {
\r
2263 exports.ProgressType = ProgressType;
\r
2264 exports.NullLogger = Object.freeze({
\r
2271 (function (Trace) {
\r
2272 Trace[Trace["Off"] = 0] = "Off";
\r
2273 Trace[Trace["Messages"] = 1] = "Messages";
\r
2274 Trace[Trace["Verbose"] = 2] = "Verbose";
\r
2275 })(Trace = exports.Trace || (exports.Trace = {}));
\r
2276 (function (Trace) {
\r
2277 function fromString(value) {
\r
2278 if (!Is.string(value)) {
\r
2281 value = value.toLowerCase();
\r
2286 return Trace.Messages;
\r
2288 return Trace.Verbose;
\r
2293 Trace.fromString = fromString;
\r
2294 function toString(value) {
\r
2298 case Trace.Messages:
\r
2299 return 'messages';
\r
2300 case Trace.Verbose:
\r
2306 Trace.toString = toString;
\r
2307 })(Trace = exports.Trace || (exports.Trace = {}));
\r
2309 (function (TraceFormat) {
\r
2310 TraceFormat["Text"] = "text";
\r
2311 TraceFormat["JSON"] = "json";
\r
2312 })(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));
\r
2313 (function (TraceFormat) {
\r
2314 function fromString(value) {
\r
2315 value = value.toLowerCase();
\r
2316 if (value === 'json') {
\r
2317 return TraceFormat.JSON;
\r
2320 return TraceFormat.Text;
\r
2323 TraceFormat.fromString = fromString;
\r
2324 })(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));
\r
2325 var SetTraceNotification;
\r
2326 (function (SetTraceNotification) {
\r
2327 SetTraceNotification.type = new messages_1.NotificationType('$/setTraceNotification');
\r
2328 })(SetTraceNotification = exports.SetTraceNotification || (exports.SetTraceNotification = {}));
\r
2329 var LogTraceNotification;
\r
2330 (function (LogTraceNotification) {
\r
2331 LogTraceNotification.type = new messages_1.NotificationType('$/logTraceNotification');
\r
2332 })(LogTraceNotification = exports.LogTraceNotification || (exports.LogTraceNotification = {}));
\r
2333 var ConnectionErrors;
\r
2334 (function (ConnectionErrors) {
\r
2336 * The connection is closed.
\r
2338 ConnectionErrors[ConnectionErrors["Closed"] = 1] = "Closed";
\r
2340 * The connection got disposed.
\r
2342 ConnectionErrors[ConnectionErrors["Disposed"] = 2] = "Disposed";
\r
2344 * The connection is already in listening mode.
\r
2346 ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
\r
2347 })(ConnectionErrors = exports.ConnectionErrors || (exports.ConnectionErrors = {}));
\r
2348 class ConnectionError extends Error {
\r
2349 constructor(code, message) {
\r
2352 Object.setPrototypeOf(this, ConnectionError.prototype);
\r
2355 exports.ConnectionError = ConnectionError;
\r
2356 var ConnectionStrategy;
\r
2357 (function (ConnectionStrategy) {
\r
2358 function is(value) {
\r
2359 let candidate = value;
\r
2360 return candidate && Is.func(candidate.cancelUndispatched);
\r
2362 ConnectionStrategy.is = is;
\r
2363 })(ConnectionStrategy = exports.ConnectionStrategy || (exports.ConnectionStrategy = {}));
\r
2364 var ConnectionState;
\r
2365 (function (ConnectionState) {
\r
2366 ConnectionState[ConnectionState["New"] = 1] = "New";
\r
2367 ConnectionState[ConnectionState["Listening"] = 2] = "Listening";
\r
2368 ConnectionState[ConnectionState["Closed"] = 3] = "Closed";
\r
2369 ConnectionState[ConnectionState["Disposed"] = 4] = "Disposed";
\r
2370 })(ConnectionState || (ConnectionState = {}));
\r
2371 function _createMessageConnection(messageReader, messageWriter, logger, strategy) {
\r
2372 let sequenceNumber = 0;
\r
2373 let notificationSquenceNumber = 0;
\r
2374 let unknownResponseSquenceNumber = 0;
\r
2375 const version = '2.0';
\r
2376 let starRequestHandler = undefined;
\r
2377 let requestHandlers = Object.create(null);
\r
2378 let starNotificationHandler = undefined;
\r
2379 let notificationHandlers = Object.create(null);
\r
2380 let progressHandlers = new Map();
\r
2382 let messageQueue = new linkedMap_1.LinkedMap();
\r
2383 let responsePromises = Object.create(null);
\r
2384 let requestTokens = Object.create(null);
\r
2385 let trace = Trace.Off;
\r
2386 let traceFormat = TraceFormat.Text;
\r
2388 let state = ConnectionState.New;
\r
2389 let errorEmitter = new events_1.Emitter();
\r
2390 let closeEmitter = new events_1.Emitter();
\r
2391 let unhandledNotificationEmitter = new events_1.Emitter();
\r
2392 let unhandledProgressEmitter = new events_1.Emitter();
\r
2393 let disposeEmitter = new events_1.Emitter();
\r
2394 function createRequestQueueKey(id) {
\r
2395 return 'req-' + id.toString();
\r
2397 function createResponseQueueKey(id) {
\r
2398 if (id === null) {
\r
2399 return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();
\r
2402 return 'res-' + id.toString();
\r
2405 function createNotificationQueueKey() {
\r
2406 return 'not-' + (++notificationSquenceNumber).toString();
\r
2408 function addMessageToQueue(queue, message) {
\r
2409 if (messages_1.isRequestMessage(message)) {
\r
2410 queue.set(createRequestQueueKey(message.id), message);
\r
2412 else if (messages_1.isResponseMessage(message)) {
\r
2413 queue.set(createResponseQueueKey(message.id), message);
\r
2416 queue.set(createNotificationQueueKey(), message);
\r
2419 function cancelUndispatched(_message) {
\r
2422 function isListening() {
\r
2423 return state === ConnectionState.Listening;
\r
2425 function isClosed() {
\r
2426 return state === ConnectionState.Closed;
\r
2428 function isDisposed() {
\r
2429 return state === ConnectionState.Disposed;
\r
2431 function closeHandler() {
\r
2432 if (state === ConnectionState.New || state === ConnectionState.Listening) {
\r
2433 state = ConnectionState.Closed;
\r
2434 closeEmitter.fire(undefined);
\r
2436 // If the connection is disposed don't sent close events.
\r
2438 function readErrorHandler(error) {
\r
2439 errorEmitter.fire([error, undefined, undefined]);
\r
2441 function writeErrorHandler(data) {
\r
2442 errorEmitter.fire(data);
\r
2444 messageReader.onClose(closeHandler);
\r
2445 messageReader.onError(readErrorHandler);
\r
2446 messageWriter.onClose(closeHandler);
\r
2447 messageWriter.onError(writeErrorHandler);
\r
2448 function triggerMessageQueue() {
\r
2449 if (timer || messageQueue.size === 0) {
\r
2452 timer = setImmediate(() => {
\r
2453 timer = undefined;
\r
2454 processMessageQueue();
\r
2457 function processMessageQueue() {
\r
2458 if (messageQueue.size === 0) {
\r
2461 let message = messageQueue.shift();
\r
2463 if (messages_1.isRequestMessage(message)) {
\r
2464 handleRequest(message);
\r
2466 else if (messages_1.isNotificationMessage(message)) {
\r
2467 handleNotification(message);
\r
2469 else if (messages_1.isResponseMessage(message)) {
\r
2470 handleResponse(message);
\r
2473 handleInvalidMessage(message);
\r
2477 triggerMessageQueue();
\r
2480 let callback = (message) => {
\r
2482 // We have received a cancellation message. Check if the message is still in the queue
\r
2483 // and cancel it if allowed to do so.
\r
2484 if (messages_1.isNotificationMessage(message) && message.method === CancelNotification.type.method) {
\r
2485 let key = createRequestQueueKey(message.params.id);
\r
2486 let toCancel = messageQueue.get(key);
\r
2487 if (messages_1.isRequestMessage(toCancel)) {
\r
2488 let response = strategy && strategy.cancelUndispatched ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);
\r
2489 if (response && (response.error !== void 0 || response.result !== void 0)) {
\r
2490 messageQueue.delete(key);
\r
2491 response.id = toCancel.id;
\r
2492 traceSendingResponse(response, message.method, Date.now());
\r
2493 messageWriter.write(response);
\r
2498 addMessageToQueue(messageQueue, message);
\r
2501 triggerMessageQueue();
\r
2504 function handleRequest(requestMessage) {
\r
2505 if (isDisposed()) {
\r
2506 // we return here silently since we fired an event when the
\r
2507 // connection got disposed.
\r
2510 function reply(resultOrError, method, startTime) {
\r
2513 id: requestMessage.id
\r
2515 if (resultOrError instanceof messages_1.ResponseError) {
\r
2516 message.error = resultOrError.toJson();
\r
2519 message.result = resultOrError === void 0 ? null : resultOrError;
\r
2521 traceSendingResponse(message, method, startTime);
\r
2522 messageWriter.write(message);
\r
2524 function replyError(error, method, startTime) {
\r
2527 id: requestMessage.id,
\r
2528 error: error.toJson()
\r
2530 traceSendingResponse(message, method, startTime);
\r
2531 messageWriter.write(message);
\r
2533 function replySuccess(result, method, startTime) {
\r
2534 // The JSON RPC defines that a response must either have a result or an error
\r
2535 // So we can't treat undefined as a valid response result.
\r
2536 if (result === void 0) {
\r
2541 id: requestMessage.id,
\r
2544 traceSendingResponse(message, method, startTime);
\r
2545 messageWriter.write(message);
\r
2547 traceReceivedRequest(requestMessage);
\r
2548 let element = requestHandlers[requestMessage.method];
\r
2550 let requestHandler;
\r
2552 type = element.type;
\r
2553 requestHandler = element.handler;
\r
2555 let startTime = Date.now();
\r
2556 if (requestHandler || starRequestHandler) {
\r
2557 let cancellationSource = new cancellation_1.CancellationTokenSource();
\r
2558 let tokenKey = String(requestMessage.id);
\r
2559 requestTokens[tokenKey] = cancellationSource;
\r
2561 let handlerResult;
\r
2562 if (requestMessage.params === void 0 || (type !== void 0 && type.numberOfParams === 0)) {
\r
2563 handlerResult = requestHandler
\r
2564 ? requestHandler(cancellationSource.token)
\r
2565 : starRequestHandler(requestMessage.method, cancellationSource.token);
\r
2567 else if (Is.array(requestMessage.params) && (type === void 0 || type.numberOfParams > 1)) {
\r
2568 handlerResult = requestHandler
\r
2569 ? requestHandler(...requestMessage.params, cancellationSource.token)
\r
2570 : starRequestHandler(requestMessage.method, ...requestMessage.params, cancellationSource.token);
\r
2573 handlerResult = requestHandler
\r
2574 ? requestHandler(requestMessage.params, cancellationSource.token)
\r
2575 : starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);
\r
2577 let promise = handlerResult;
\r
2578 if (!handlerResult) {
\r
2579 delete requestTokens[tokenKey];
\r
2580 replySuccess(handlerResult, requestMessage.method, startTime);
\r
2582 else if (promise.then) {
\r
2583 promise.then((resultOrError) => {
\r
2584 delete requestTokens[tokenKey];
\r
2585 reply(resultOrError, requestMessage.method, startTime);
\r
2587 delete requestTokens[tokenKey];
\r
2588 if (error instanceof messages_1.ResponseError) {
\r
2589 replyError(error, requestMessage.method, startTime);
\r
2591 else if (error && Is.string(error.message)) {
\r
2592 replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
\r
2595 replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
\r
2600 delete requestTokens[tokenKey];
\r
2601 reply(handlerResult, requestMessage.method, startTime);
\r
2605 delete requestTokens[tokenKey];
\r
2606 if (error instanceof messages_1.ResponseError) {
\r
2607 reply(error, requestMessage.method, startTime);
\r
2609 else if (error && Is.string(error.message)) {
\r
2610 replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
\r
2613 replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
\r
2618 replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);
\r
2621 function handleResponse(responseMessage) {
\r
2622 if (isDisposed()) {
\r
2623 // See handle request.
\r
2626 if (responseMessage.id === null) {
\r
2627 if (responseMessage.error) {
\r
2628 logger.error(`Received response message without id: Error is: \n${JSON.stringify(responseMessage.error, undefined, 4)}`);
\r
2631 logger.error(`Received response message without id. No further error information provided.`);
\r
2635 let key = String(responseMessage.id);
\r
2636 let responsePromise = responsePromises[key];
\r
2637 traceReceivedResponse(responseMessage, responsePromise);
\r
2638 if (responsePromise) {
\r
2639 delete responsePromises[key];
\r
2641 if (responseMessage.error) {
\r
2642 let error = responseMessage.error;
\r
2643 responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));
\r
2645 else if (responseMessage.result !== void 0) {
\r
2646 responsePromise.resolve(responseMessage.result);
\r
2649 throw new Error('Should never happen.');
\r
2653 if (error.message) {
\r
2654 logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);
\r
2657 logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);
\r
2663 function handleNotification(message) {
\r
2664 if (isDisposed()) {
\r
2665 // See handle request.
\r
2668 let type = undefined;
\r
2669 let notificationHandler;
\r
2670 if (message.method === CancelNotification.type.method) {
\r
2671 notificationHandler = (params) => {
\r
2672 let id = params.id;
\r
2673 let source = requestTokens[String(id)];
\r
2680 let element = notificationHandlers[message.method];
\r
2682 notificationHandler = element.handler;
\r
2683 type = element.type;
\r
2686 if (notificationHandler || starNotificationHandler) {
\r
2688 traceReceivedNotification(message);
\r
2689 if (message.params === void 0 || (type !== void 0 && type.numberOfParams === 0)) {
\r
2690 notificationHandler ? notificationHandler() : starNotificationHandler(message.method);
\r
2692 else if (Is.array(message.params) && (type === void 0 || type.numberOfParams > 1)) {
\r
2693 notificationHandler ? notificationHandler(...message.params) : starNotificationHandler(message.method, ...message.params);
\r
2696 notificationHandler ? notificationHandler(message.params) : starNotificationHandler(message.method, message.params);
\r
2700 if (error.message) {
\r
2701 logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
\r
2704 logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
\r
2709 unhandledNotificationEmitter.fire(message);
\r
2712 function handleInvalidMessage(message) {
\r
2714 logger.error('Received empty message.');
\r
2717 logger.error(`Received message which is neither a response nor a notification message:\n${JSON.stringify(message, null, 4)}`);
\r
2718 // Test whether we find an id to reject the promise
\r
2719 let responseMessage = message;
\r
2720 if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {
\r
2721 let key = String(responseMessage.id);
\r
2722 let responseHandler = responsePromises[key];
\r
2723 if (responseHandler) {
\r
2724 responseHandler.reject(new Error('The received response has neither a result nor an error property.'));
\r
2728 function traceSendingRequest(message) {
\r
2729 if (trace === Trace.Off || !tracer) {
\r
2732 if (traceFormat === TraceFormat.Text) {
\r
2733 let data = undefined;
\r
2734 if (trace === Trace.Verbose && message.params) {
\r
2735 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
\r
2737 tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);
\r
2740 logLSPMessage('send-request', message);
\r
2743 function traceSendingNotification(message) {
\r
2744 if (trace === Trace.Off || !tracer) {
\r
2747 if (traceFormat === TraceFormat.Text) {
\r
2748 let data = undefined;
\r
2749 if (trace === Trace.Verbose) {
\r
2750 if (message.params) {
\r
2751 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
\r
2754 data = 'No parameters provided.\n\n';
\r
2757 tracer.log(`Sending notification '${message.method}'.`, data);
\r
2760 logLSPMessage('send-notification', message);
\r
2763 function traceSendingResponse(message, method, startTime) {
\r
2764 if (trace === Trace.Off || !tracer) {
\r
2767 if (traceFormat === TraceFormat.Text) {
\r
2768 let data = undefined;
\r
2769 if (trace === Trace.Verbose) {
\r
2770 if (message.error && message.error.data) {
\r
2771 data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\n\n`;
\r
2774 if (message.result) {
\r
2775 data = `Result: ${JSON.stringify(message.result, null, 4)}\n\n`;
\r
2777 else if (message.error === void 0) {
\r
2778 data = 'No result returned.\n\n';
\r
2782 tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);
\r
2785 logLSPMessage('send-response', message);
\r
2788 function traceReceivedRequest(message) {
\r
2789 if (trace === Trace.Off || !tracer) {
\r
2792 if (traceFormat === TraceFormat.Text) {
\r
2793 let data = undefined;
\r
2794 if (trace === Trace.Verbose && message.params) {
\r
2795 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
\r
2797 tracer.log(`Received request '${message.method} - (${message.id})'.`, data);
\r
2800 logLSPMessage('receive-request', message);
\r
2803 function traceReceivedNotification(message) {
\r
2804 if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {
\r
2807 if (traceFormat === TraceFormat.Text) {
\r
2808 let data = undefined;
\r
2809 if (trace === Trace.Verbose) {
\r
2810 if (message.params) {
\r
2811 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
\r
2814 data = 'No parameters provided.\n\n';
\r
2817 tracer.log(`Received notification '${message.method}'.`, data);
\r
2820 logLSPMessage('receive-notification', message);
\r
2823 function traceReceivedResponse(message, responsePromise) {
\r
2824 if (trace === Trace.Off || !tracer) {
\r
2827 if (traceFormat === TraceFormat.Text) {
\r
2828 let data = undefined;
\r
2829 if (trace === Trace.Verbose) {
\r
2830 if (message.error && message.error.data) {
\r
2831 data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\n\n`;
\r
2834 if (message.result) {
\r
2835 data = `Result: ${JSON.stringify(message.result, null, 4)}\n\n`;
\r
2837 else if (message.error === void 0) {
\r
2838 data = 'No result returned.\n\n';
\r
2842 if (responsePromise) {
\r
2843 let error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';
\r
2844 tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);
\r
2847 tracer.log(`Received response ${message.id} without active response promise.`, data);
\r
2851 logLSPMessage('receive-response', message);
\r
2854 function logLSPMessage(type, message) {
\r
2855 if (!tracer || trace === Trace.Off) {
\r
2858 const lspMessage = {
\r
2859 isLSPMessage: true,
\r
2862 timestamp: Date.now()
\r
2864 tracer.log(lspMessage);
\r
2866 function throwIfClosedOrDisposed() {
\r
2868 throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
\r
2870 if (isDisposed()) {
\r
2871 throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');
\r
2874 function throwIfListening() {
\r
2875 if (isListening()) {
\r
2876 throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');
\r
2879 function throwIfNotListening() {
\r
2880 if (!isListening()) {
\r
2881 throw new Error('Call listen() first.');
\r
2884 function undefinedToNull(param) {
\r
2885 if (param === void 0) {
\r
2892 function computeMessageParams(type, params) {
\r
2894 let numberOfParams = type.numberOfParams;
\r
2895 switch (numberOfParams) {
\r
2900 result = undefinedToNull(params[0]);
\r
2904 for (let i = 0; i < params.length && i < numberOfParams; i++) {
\r
2905 result.push(undefinedToNull(params[i]));
\r
2907 if (params.length < numberOfParams) {
\r
2908 for (let i = params.length; i < numberOfParams; i++) {
\r
2909 result.push(null);
\r
2916 let connection = {
\r
2917 sendNotification: (type, ...params) => {
\r
2918 throwIfClosedOrDisposed();
\r
2920 let messageParams;
\r
2921 if (Is.string(type)) {
\r
2923 switch (params.length) {
\r
2925 messageParams = null;
\r
2928 messageParams = params[0];
\r
2931 messageParams = params;
\r
2936 method = type.method;
\r
2937 messageParams = computeMessageParams(type, params);
\r
2939 let notificationMessage = {
\r
2942 params: messageParams
\r
2944 traceSendingNotification(notificationMessage);
\r
2945 messageWriter.write(notificationMessage);
\r
2947 onNotification: (type, handler) => {
\r
2948 throwIfClosedOrDisposed();
\r
2949 if (Is.func(type)) {
\r
2950 starNotificationHandler = type;
\r
2952 else if (handler) {
\r
2953 if (Is.string(type)) {
\r
2954 notificationHandlers[type] = { type: undefined, handler };
\r
2957 notificationHandlers[type.method] = { type, handler };
\r
2961 onProgress: (_type, token, handler) => {
\r
2962 if (progressHandlers.has(token)) {
\r
2963 throw new Error(`Progress handler for token ${token} already registered`);
\r
2965 progressHandlers.set(token, handler);
\r
2968 progressHandlers.delete(token);
\r
2972 sendProgress: (_type, token, value) => {
\r
2973 connection.sendNotification(ProgressNotification.type, { token, value });
\r
2975 onUnhandledProgress: unhandledProgressEmitter.event,
\r
2976 sendRequest: (type, ...params) => {
\r
2977 throwIfClosedOrDisposed();
\r
2978 throwIfNotListening();
\r
2980 let messageParams;
\r
2981 let token = undefined;
\r
2982 if (Is.string(type)) {
\r
2984 switch (params.length) {
\r
2986 messageParams = null;
\r
2989 // The cancellation token is optional so it can also be undefined.
\r
2990 if (cancellation_1.CancellationToken.is(params[0])) {
\r
2991 messageParams = null;
\r
2992 token = params[0];
\r
2995 messageParams = undefinedToNull(params[0]);
\r
2999 const last = params.length - 1;
\r
3000 if (cancellation_1.CancellationToken.is(params[last])) {
\r
3001 token = params[last];
\r
3002 if (params.length === 2) {
\r
3003 messageParams = undefinedToNull(params[0]);
\r
3006 messageParams = params.slice(0, last).map(value => undefinedToNull(value));
\r
3010 messageParams = params.map(value => undefinedToNull(value));
\r
3016 method = type.method;
\r
3017 messageParams = computeMessageParams(type, params);
\r
3018 let numberOfParams = type.numberOfParams;
\r
3019 token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;
\r
3021 let id = sequenceNumber++;
\r
3022 let result = new Promise((resolve, reject) => {
\r
3023 let requestMessage = {
\r
3027 params: messageParams
\r
3029 let responsePromise = { method: method, timerStart: Date.now(), resolve, reject };
\r
3030 traceSendingRequest(requestMessage);
\r
3032 messageWriter.write(requestMessage);
\r
3035 // Writing the message failed. So we need to reject the promise.
\r
3036 responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));
\r
3037 responsePromise = null;
\r
3039 if (responsePromise) {
\r
3040 responsePromises[String(id)] = responsePromise;
\r
3044 token.onCancellationRequested(() => {
\r
3045 connection.sendNotification(CancelNotification.type, { id });
\r
3050 onRequest: (type, handler) => {
\r
3051 throwIfClosedOrDisposed();
\r
3052 if (Is.func(type)) {
\r
3053 starRequestHandler = type;
\r
3055 else if (handler) {
\r
3056 if (Is.string(type)) {
\r
3057 requestHandlers[type] = { type: undefined, handler };
\r
3060 requestHandlers[type.method] = { type, handler };
\r
3064 trace: (_value, _tracer, sendNotificationOrTraceOptions) => {
\r
3065 let _sendNotification = false;
\r
3066 let _traceFormat = TraceFormat.Text;
\r
3067 if (sendNotificationOrTraceOptions !== void 0) {
\r
3068 if (Is.boolean(sendNotificationOrTraceOptions)) {
\r
3069 _sendNotification = sendNotificationOrTraceOptions;
\r
3072 _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;
\r
3073 _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;
\r
3077 traceFormat = _traceFormat;
\r
3078 if (trace === Trace.Off) {
\r
3079 tracer = undefined;
\r
3084 if (_sendNotification && !isClosed() && !isDisposed()) {
\r
3085 connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });
\r
3088 onError: errorEmitter.event,
\r
3089 onClose: closeEmitter.event,
\r
3090 onUnhandledNotification: unhandledNotificationEmitter.event,
\r
3091 onDispose: disposeEmitter.event,
\r
3093 if (isDisposed()) {
\r
3096 state = ConnectionState.Disposed;
\r
3097 disposeEmitter.fire(undefined);
\r
3098 let error = new Error('Connection got disposed.');
\r
3099 Object.keys(responsePromises).forEach((key) => {
\r
3100 responsePromises[key].reject(error);
\r
3102 responsePromises = Object.create(null);
\r
3103 requestTokens = Object.create(null);
\r
3104 messageQueue = new linkedMap_1.LinkedMap();
\r
3105 // Test for backwards compatibility
\r
3106 if (Is.func(messageWriter.dispose)) {
\r
3107 messageWriter.dispose();
\r
3109 if (Is.func(messageReader.dispose)) {
\r
3110 messageReader.dispose();
\r
3114 throwIfClosedOrDisposed();
\r
3115 throwIfListening();
\r
3116 state = ConnectionState.Listening;
\r
3117 messageReader.listen(callback);
\r
3120 // eslint-disable-next-line no-console
\r
3121 console.log('inspect');
\r
3124 connection.onNotification(LogTraceNotification.type, (params) => {
\r
3125 if (trace === Trace.Off || !tracer) {
\r
3128 tracer.log(params.message, trace === Trace.Verbose ? params.verbose : undefined);
\r
3130 connection.onNotification(ProgressNotification.type, (params) => {
\r
3131 const handler = progressHandlers.get(params.token);
\r
3133 handler(params.value);
\r
3136 unhandledProgressEmitter.fire(params);
\r
3139 return connection;
\r
3141 function isMessageReader(value) {
\r
3142 return value.listen !== void 0 && value.read === void 0;
\r
3144 function isMessageWriter(value) {
\r
3145 return value.write !== void 0 && value.end === void 0;
\r
3147 function createMessageConnection(input, output, logger, strategy) {
\r
3149 logger = exports.NullLogger;
\r
3151 let reader = isMessageReader(input) ? input : new messageReader_1.StreamMessageReader(input);
\r
3152 let writer = isMessageWriter(output) ? output : new messageWriter_1.StreamMessageWriter(output);
\r
3153 return _createMessageConnection(reader, writer, logger, strategy);
\r
3155 exports.createMessageConnection = createMessageConnection;
\r
3160 /***/ (function(module, exports, __webpack_require__) {
3163 /* --------------------------------------------------------------------------------------------
\r
3164 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
3165 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
3166 * ------------------------------------------------------------------------------------------ */
\r
3168 Object.defineProperty(exports, "__esModule", { value: true });
\r
3169 function boolean(value) {
\r
3170 return value === true || value === false;
\r
3172 exports.boolean = boolean;
\r
3173 function string(value) {
\r
3174 return typeof value === 'string' || value instanceof String;
\r
3176 exports.string = string;
\r
3177 function number(value) {
\r
3178 return typeof value === 'number' || value instanceof Number;
\r
3180 exports.number = number;
\r
3181 function error(value) {
\r
3182 return value instanceof Error;
\r
3184 exports.error = error;
\r
3185 function func(value) {
\r
3186 return typeof value === 'function';
\r
3188 exports.func = func;
\r
3189 function array(value) {
\r
3190 return Array.isArray(value);
\r
3192 exports.array = array;
\r
3193 function stringArray(value) {
\r
3194 return array(value) && value.every(elem => string(elem));
\r
3196 exports.stringArray = stringArray;
\r
3201 /***/ (function(module, exports, __webpack_require__) {
3204 /* --------------------------------------------------------------------------------------------
\r
3205 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
3206 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
3207 * ------------------------------------------------------------------------------------------ */
\r
3209 Object.defineProperty(exports, "__esModule", { value: true });
\r
3210 const is = __webpack_require__(10);
\r
3212 * Predefined error codes.
\r
3215 (function (ErrorCodes) {
\r
3216 // Defined by JSON RPC
\r
3217 ErrorCodes.ParseError = -32700;
\r
3218 ErrorCodes.InvalidRequest = -32600;
\r
3219 ErrorCodes.MethodNotFound = -32601;
\r
3220 ErrorCodes.InvalidParams = -32602;
\r
3221 ErrorCodes.InternalError = -32603;
\r
3222 ErrorCodes.serverErrorStart = -32099;
\r
3223 ErrorCodes.serverErrorEnd = -32000;
\r
3224 ErrorCodes.ServerNotInitialized = -32002;
\r
3225 ErrorCodes.UnknownErrorCode = -32001;
\r
3226 // Defined by the protocol.
\r
3227 ErrorCodes.RequestCancelled = -32800;
\r
3228 ErrorCodes.ContentModified = -32801;
\r
3229 // Defined by VSCode library.
\r
3230 ErrorCodes.MessageWriteError = 1;
\r
3231 ErrorCodes.MessageReadError = 2;
\r
3232 })(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {}));
\r
3234 * An error object return in a response in case a request
\r
3237 class ResponseError extends Error {
\r
3238 constructor(code, message, data) {
\r
3240 this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;
\r
3242 Object.setPrototypeOf(this, ResponseError.prototype);
\r
3247 message: this.message,
\r
3252 exports.ResponseError = ResponseError;
\r
3254 * An abstract implementation of a MessageType.
\r
3256 class AbstractMessageType {
\r
3257 constructor(_method, _numberOfParams) {
\r
3258 this._method = _method;
\r
3259 this._numberOfParams = _numberOfParams;
\r
3262 return this._method;
\r
3264 get numberOfParams() {
\r
3265 return this._numberOfParams;
\r
3268 exports.AbstractMessageType = AbstractMessageType;
\r
3270 * Classes to type request response pairs
\r
3272 * The type parameter RO will be removed in the next major version
\r
3273 * of the JSON RPC library since it is a LSP concept and doesn't
\r
3274 * belong here. For now it is tagged as default never.
\r
3276 class RequestType0 extends AbstractMessageType {
\r
3277 constructor(method) {
\r
3281 exports.RequestType0 = RequestType0;
\r
3282 class RequestType extends AbstractMessageType {
\r
3283 constructor(method) {
\r
3287 exports.RequestType = RequestType;
\r
3288 class RequestType1 extends AbstractMessageType {
\r
3289 constructor(method) {
\r
3293 exports.RequestType1 = RequestType1;
\r
3294 class RequestType2 extends AbstractMessageType {
\r
3295 constructor(method) {
\r
3299 exports.RequestType2 = RequestType2;
\r
3300 class RequestType3 extends AbstractMessageType {
\r
3301 constructor(method) {
\r
3305 exports.RequestType3 = RequestType3;
\r
3306 class RequestType4 extends AbstractMessageType {
\r
3307 constructor(method) {
\r
3311 exports.RequestType4 = RequestType4;
\r
3312 class RequestType5 extends AbstractMessageType {
\r
3313 constructor(method) {
\r
3317 exports.RequestType5 = RequestType5;
\r
3318 class RequestType6 extends AbstractMessageType {
\r
3319 constructor(method) {
\r
3323 exports.RequestType6 = RequestType6;
\r
3324 class RequestType7 extends AbstractMessageType {
\r
3325 constructor(method) {
\r
3329 exports.RequestType7 = RequestType7;
\r
3330 class RequestType8 extends AbstractMessageType {
\r
3331 constructor(method) {
\r
3335 exports.RequestType8 = RequestType8;
\r
3336 class RequestType9 extends AbstractMessageType {
\r
3337 constructor(method) {
\r
3341 exports.RequestType9 = RequestType9;
\r
3343 * The type parameter RO will be removed in the next major version
\r
3344 * of the JSON RPC library since it is a LSP concept and doesn't
\r
3345 * belong here. For now it is tagged as default never.
\r
3347 class NotificationType extends AbstractMessageType {
\r
3348 constructor(method) {
\r
3350 this._ = undefined;
\r
3353 exports.NotificationType = NotificationType;
\r
3354 class NotificationType0 extends AbstractMessageType {
\r
3355 constructor(method) {
\r
3359 exports.NotificationType0 = NotificationType0;
\r
3360 class NotificationType1 extends AbstractMessageType {
\r
3361 constructor(method) {
\r
3365 exports.NotificationType1 = NotificationType1;
\r
3366 class NotificationType2 extends AbstractMessageType {
\r
3367 constructor(method) {
\r
3371 exports.NotificationType2 = NotificationType2;
\r
3372 class NotificationType3 extends AbstractMessageType {
\r
3373 constructor(method) {
\r
3377 exports.NotificationType3 = NotificationType3;
\r
3378 class NotificationType4 extends AbstractMessageType {
\r
3379 constructor(method) {
\r
3383 exports.NotificationType4 = NotificationType4;
\r
3384 class NotificationType5 extends AbstractMessageType {
\r
3385 constructor(method) {
\r
3389 exports.NotificationType5 = NotificationType5;
\r
3390 class NotificationType6 extends AbstractMessageType {
\r
3391 constructor(method) {
\r
3395 exports.NotificationType6 = NotificationType6;
\r
3396 class NotificationType7 extends AbstractMessageType {
\r
3397 constructor(method) {
\r
3401 exports.NotificationType7 = NotificationType7;
\r
3402 class NotificationType8 extends AbstractMessageType {
\r
3403 constructor(method) {
\r
3407 exports.NotificationType8 = NotificationType8;
\r
3408 class NotificationType9 extends AbstractMessageType {
\r
3409 constructor(method) {
\r
3413 exports.NotificationType9 = NotificationType9;
\r
3415 * Tests if the given message is a request message
\r
3417 function isRequestMessage(message) {
\r
3418 let candidate = message;
\r
3419 return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));
\r
3421 exports.isRequestMessage = isRequestMessage;
\r
3423 * Tests if the given message is a notification message
\r
3425 function isNotificationMessage(message) {
\r
3426 let candidate = message;
\r
3427 return candidate && is.string(candidate.method) && message.id === void 0;
\r
3429 exports.isNotificationMessage = isNotificationMessage;
\r
3431 * Tests if the given message is a response message
\r
3433 function isResponseMessage(message) {
\r
3434 let candidate = message;
\r
3435 return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);
\r
3437 exports.isResponseMessage = isResponseMessage;
\r
3442 /***/ (function(module, exports, __webpack_require__) {
3445 /* --------------------------------------------------------------------------------------------
\r
3446 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
3447 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
3448 * ------------------------------------------------------------------------------------------ */
\r
3450 Object.defineProperty(exports, "__esModule", { value: true });
\r
3451 const events_1 = __webpack_require__(13);
\r
3452 const Is = __webpack_require__(10);
\r
3453 let DefaultSize = 8192;
\r
3454 let CR = Buffer.from('\r', 'ascii')[0];
\r
3455 let LF = Buffer.from('\n', 'ascii')[0];
\r
3456 let CRLF = '\r\n';
\r
3457 class MessageBuffer {
\r
3458 constructor(encoding = 'utf8') {
\r
3459 this.encoding = encoding;
\r
3461 this.buffer = Buffer.allocUnsafe(DefaultSize);
\r
3464 var toAppend = chunk;
\r
3465 if (typeof (chunk) === 'string') {
\r
3467 var bufferLen = Buffer.byteLength(str, this.encoding);
\r
3468 toAppend = Buffer.allocUnsafe(bufferLen);
\r
3469 toAppend.write(str, 0, bufferLen, this.encoding);
\r
3471 if (this.buffer.length - this.index >= toAppend.length) {
\r
3472 toAppend.copy(this.buffer, this.index, 0, toAppend.length);
\r
3475 var newSize = (Math.ceil((this.index + toAppend.length) / DefaultSize) + 1) * DefaultSize;
\r
3476 if (this.index === 0) {
\r
3477 this.buffer = Buffer.allocUnsafe(newSize);
\r
3478 toAppend.copy(this.buffer, 0, 0, toAppend.length);
\r
3481 this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
\r
3484 this.index += toAppend.length;
\r
3486 tryReadHeaders() {
\r
3487 let result = undefined;
\r
3489 while (current + 3 < this.index && (this.buffer[current] !== CR || this.buffer[current + 1] !== LF || this.buffer[current + 2] !== CR || this.buffer[current + 3] !== LF)) {
\r
3492 // No header / body separator found (e.g CRLFCRLF)
\r
3493 if (current + 3 >= this.index) {
\r
3496 result = Object.create(null);
\r
3497 let headers = this.buffer.toString('ascii', 0, current).split(CRLF);
\r
3498 headers.forEach((header) => {
\r
3499 let index = header.indexOf(':');
\r
3500 if (index === -1) {
\r
3501 throw new Error('Message header must separate key and value using :');
\r
3503 let key = header.substr(0, index);
\r
3504 let value = header.substr(index + 1).trim();
\r
3505 result[key] = value;
\r
3507 let nextStart = current + 4;
\r
3508 this.buffer = this.buffer.slice(nextStart);
\r
3509 this.index = this.index - nextStart;
\r
3512 tryReadContent(length) {
\r
3513 if (this.index < length) {
\r
3516 let result = this.buffer.toString(this.encoding, 0, length);
\r
3517 let nextStart = length;
\r
3518 this.buffer.copy(this.buffer, 0, nextStart);
\r
3519 this.index = this.index - nextStart;
\r
3522 get numberOfBytes() {
\r
3523 return this.index;
\r
3526 var MessageReader;
\r
3527 (function (MessageReader) {
\r
3528 function is(value) {
\r
3529 let candidate = value;
\r
3530 return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&
\r
3531 Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);
\r
3533 MessageReader.is = is;
\r
3534 })(MessageReader = exports.MessageReader || (exports.MessageReader = {}));
\r
3535 class AbstractMessageReader {
\r
3537 this.errorEmitter = new events_1.Emitter();
\r
3538 this.closeEmitter = new events_1.Emitter();
\r
3539 this.partialMessageEmitter = new events_1.Emitter();
\r
3542 this.errorEmitter.dispose();
\r
3543 this.closeEmitter.dispose();
\r
3546 return this.errorEmitter.event;
\r
3548 fireError(error) {
\r
3549 this.errorEmitter.fire(this.asError(error));
\r
3552 return this.closeEmitter.event;
\r
3555 this.closeEmitter.fire(undefined);
\r
3557 get onPartialMessage() {
\r
3558 return this.partialMessageEmitter.event;
\r
3560 firePartialMessage(info) {
\r
3561 this.partialMessageEmitter.fire(info);
\r
3564 if (error instanceof Error) {
\r
3568 return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);
\r
3572 exports.AbstractMessageReader = AbstractMessageReader;
\r
3573 class StreamMessageReader extends AbstractMessageReader {
\r
3574 constructor(readable, encoding = 'utf8') {
\r
3576 this.readable = readable;
\r
3577 this.buffer = new MessageBuffer(encoding);
\r
3578 this._partialMessageTimeout = 10000;
\r
3580 set partialMessageTimeout(timeout) {
\r
3581 this._partialMessageTimeout = timeout;
\r
3583 get partialMessageTimeout() {
\r
3584 return this._partialMessageTimeout;
\r
3586 listen(callback) {
\r
3587 this.nextMessageLength = -1;
\r
3588 this.messageToken = 0;
\r
3589 this.partialMessageTimer = undefined;
\r
3590 this.callback = callback;
\r
3591 this.readable.on('data', (data) => {
\r
3592 this.onData(data);
\r
3594 this.readable.on('error', (error) => this.fireError(error));
\r
3595 this.readable.on('close', () => this.fireClose());
\r
3598 this.buffer.append(data);
\r
3600 if (this.nextMessageLength === -1) {
\r
3601 let headers = this.buffer.tryReadHeaders();
\r
3605 let contentLength = headers['Content-Length'];
\r
3606 if (!contentLength) {
\r
3607 throw new Error('Header must provide a Content-Length property.');
\r
3609 let length = parseInt(contentLength);
\r
3610 if (isNaN(length)) {
\r
3611 throw new Error('Content-Length value must be a number.');
\r
3613 this.nextMessageLength = length;
\r
3614 // Take the encoding form the header. For compatibility
\r
3615 // treat both utf-8 and utf8 as node utf8
\r
3617 var msg = this.buffer.tryReadContent(this.nextMessageLength);
\r
3618 if (msg === null) {
\r
3619 /** We haven't received the full message yet. */
\r
3620 this.setPartialMessageTimer();
\r
3623 this.clearPartialMessageTimer();
\r
3624 this.nextMessageLength = -1;
\r
3625 this.messageToken++;
\r
3626 var json = JSON.parse(msg);
\r
3627 this.callback(json);
\r
3630 clearPartialMessageTimer() {
\r
3631 if (this.partialMessageTimer) {
\r
3632 clearTimeout(this.partialMessageTimer);
\r
3633 this.partialMessageTimer = undefined;
\r
3636 setPartialMessageTimer() {
\r
3637 this.clearPartialMessageTimer();
\r
3638 if (this._partialMessageTimeout <= 0) {
\r
3641 this.partialMessageTimer = setTimeout((token, timeout) => {
\r
3642 this.partialMessageTimer = undefined;
\r
3643 if (token === this.messageToken) {
\r
3644 this.firePartialMessage({ messageToken: token, waitingTime: timeout });
\r
3645 this.setPartialMessageTimer();
\r
3647 }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);
\r
3650 exports.StreamMessageReader = StreamMessageReader;
\r
3651 class IPCMessageReader extends AbstractMessageReader {
\r
3652 constructor(process) {
\r
3654 this.process = process;
\r
3655 let eventEmitter = this.process;
\r
3656 eventEmitter.on('error', (error) => this.fireError(error));
\r
3657 eventEmitter.on('close', () => this.fireClose());
\r
3659 listen(callback) {
\r
3660 this.process.on('message', callback);
\r
3663 exports.IPCMessageReader = IPCMessageReader;
\r
3664 class SocketMessageReader extends StreamMessageReader {
\r
3665 constructor(socket, encoding = 'utf-8') {
\r
3666 super(socket, encoding);
\r
3669 exports.SocketMessageReader = SocketMessageReader;
\r
3674 /***/ (function(module, exports, __webpack_require__) {
3677 /* --------------------------------------------------------------------------------------------
\r
3678 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
3679 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
3680 * ------------------------------------------------------------------------------------------ */
\r
3682 Object.defineProperty(exports, "__esModule", { value: true });
\r
3684 (function (Disposable) {
\r
3685 function create(func) {
\r
3690 Disposable.create = create;
\r
3691 })(Disposable = exports.Disposable || (exports.Disposable = {}));
\r
3693 (function (Event) {
\r
3694 const _disposable = { dispose() { } };
\r
3695 Event.None = function () { return _disposable; };
\r
3696 })(Event = exports.Event || (exports.Event = {}));
\r
3697 class CallbackList {
\r
3698 add(callback, context = null, bucket) {
\r
3699 if (!this._callbacks) {
\r
3700 this._callbacks = [];
\r
3701 this._contexts = [];
\r
3703 this._callbacks.push(callback);
\r
3704 this._contexts.push(context);
\r
3705 if (Array.isArray(bucket)) {
\r
3706 bucket.push({ dispose: () => this.remove(callback, context) });
\r
3709 remove(callback, context = null) {
\r
3710 if (!this._callbacks) {
\r
3713 var foundCallbackWithDifferentContext = false;
\r
3714 for (var i = 0, len = this._callbacks.length; i < len; i++) {
\r
3715 if (this._callbacks[i] === callback) {
\r
3716 if (this._contexts[i] === context) {
\r
3717 // callback & context match => remove it
\r
3718 this._callbacks.splice(i, 1);
\r
3719 this._contexts.splice(i, 1);
\r
3723 foundCallbackWithDifferentContext = true;
\r
3727 if (foundCallbackWithDifferentContext) {
\r
3728 throw new Error('When adding a listener with a context, you should remove it with the same context');
\r
3732 if (!this._callbacks) {
\r
3735 var ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);
\r
3736 for (var i = 0, len = callbacks.length; i < len; i++) {
\r
3738 ret.push(callbacks[i].apply(contexts[i], args));
\r
3741 // eslint-disable-next-line no-console
\r
3748 return !this._callbacks || this._callbacks.length === 0;
\r
3751 this._callbacks = undefined;
\r
3752 this._contexts = undefined;
\r
3756 constructor(_options) {
\r
3757 this._options = _options;
\r
3760 * For the public to allow to subscribe
\r
3761 * to events from this Emitter
\r
3764 if (!this._event) {
\r
3765 this._event = (listener, thisArgs, disposables) => {
\r
3766 if (!this._callbacks) {
\r
3767 this._callbacks = new CallbackList();
\r
3769 if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
\r
3770 this._options.onFirstListenerAdd(this);
\r
3772 this._callbacks.add(listener, thisArgs);
\r
3776 this._callbacks.remove(listener, thisArgs);
\r
3777 result.dispose = Emitter._noop;
\r
3778 if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {
\r
3779 this._options.onLastListenerRemove(this);
\r
3783 if (Array.isArray(disposables)) {
\r
3784 disposables.push(result);
\r
3789 return this._event;
\r
3792 * To be kept private to fire an event to
\r
3796 if (this._callbacks) {
\r
3797 this._callbacks.invoke.call(this._callbacks, event);
\r
3801 if (this._callbacks) {
\r
3802 this._callbacks.dispose();
\r
3803 this._callbacks = undefined;
\r
3807 exports.Emitter = Emitter;
\r
3808 Emitter._noop = function () { };
\r
3813 /***/ (function(module, exports, __webpack_require__) {
3816 /* --------------------------------------------------------------------------------------------
\r
3817 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
3818 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
3819 * ------------------------------------------------------------------------------------------ */
\r
3821 Object.defineProperty(exports, "__esModule", { value: true });
\r
3822 const events_1 = __webpack_require__(13);
\r
3823 const Is = __webpack_require__(10);
\r
3824 let ContentLength = 'Content-Length: ';
\r
3825 let CRLF = '\r\n';
\r
3826 var MessageWriter;
\r
3827 (function (MessageWriter) {
\r
3828 function is(value) {
\r
3829 let candidate = value;
\r
3830 return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&
\r
3831 Is.func(candidate.onError) && Is.func(candidate.write);
\r
3833 MessageWriter.is = is;
\r
3834 })(MessageWriter = exports.MessageWriter || (exports.MessageWriter = {}));
\r
3835 class AbstractMessageWriter {
\r
3837 this.errorEmitter = new events_1.Emitter();
\r
3838 this.closeEmitter = new events_1.Emitter();
\r
3841 this.errorEmitter.dispose();
\r
3842 this.closeEmitter.dispose();
\r
3845 return this.errorEmitter.event;
\r
3847 fireError(error, message, count) {
\r
3848 this.errorEmitter.fire([this.asError(error), message, count]);
\r
3851 return this.closeEmitter.event;
\r
3854 this.closeEmitter.fire(undefined);
\r
3857 if (error instanceof Error) {
\r
3861 return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);
\r
3865 exports.AbstractMessageWriter = AbstractMessageWriter;
\r
3866 class StreamMessageWriter extends AbstractMessageWriter {
\r
3867 constructor(writable, encoding = 'utf8') {
\r
3869 this.writable = writable;
\r
3870 this.encoding = encoding;
\r
3871 this.errorCount = 0;
\r
3872 this.writable.on('error', (error) => this.fireError(error));
\r
3873 this.writable.on('close', () => this.fireClose());
\r
3876 let json = JSON.stringify(msg);
\r
3877 let contentLength = Buffer.byteLength(json, this.encoding);
\r
3879 ContentLength, contentLength.toString(), CRLF,
\r
3883 // Header must be written in ASCII encoding
\r
3884 this.writable.write(headers.join(''), 'ascii');
\r
3885 // Now write the content. This can be written in any encoding
\r
3886 this.writable.write(json, this.encoding);
\r
3887 this.errorCount = 0;
\r
3890 this.errorCount++;
\r
3891 this.fireError(error, msg, this.errorCount);
\r
3895 exports.StreamMessageWriter = StreamMessageWriter;
\r
3896 class IPCMessageWriter extends AbstractMessageWriter {
\r
3897 constructor(process) {
\r
3899 this.process = process;
\r
3900 this.errorCount = 0;
\r
3902 this.sending = false;
\r
3903 let eventEmitter = this.process;
\r
3904 eventEmitter.on('error', (error) => this.fireError(error));
\r
3905 eventEmitter.on('close', () => this.fireClose);
\r
3908 if (!this.sending && this.queue.length === 0) {
\r
3909 // See https://github.com/nodejs/node/issues/7657
\r
3910 this.doWriteMessage(msg);
\r
3913 this.queue.push(msg);
\r
3916 doWriteMessage(msg) {
\r
3918 if (this.process.send) {
\r
3919 this.sending = true;
\r
3920 this.process.send(msg, undefined, undefined, (error) => {
\r
3921 this.sending = false;
\r
3923 this.errorCount++;
\r
3924 this.fireError(error, msg, this.errorCount);
\r
3927 this.errorCount = 0;
\r
3929 if (this.queue.length > 0) {
\r
3930 this.doWriteMessage(this.queue.shift());
\r
3936 this.errorCount++;
\r
3937 this.fireError(error, msg, this.errorCount);
\r
3941 exports.IPCMessageWriter = IPCMessageWriter;
\r
3942 class SocketMessageWriter extends AbstractMessageWriter {
\r
3943 constructor(socket, encoding = 'utf8') {
\r
3945 this.socket = socket;
\r
3947 this.sending = false;
\r
3948 this.encoding = encoding;
\r
3949 this.errorCount = 0;
\r
3950 this.socket.on('error', (error) => this.fireError(error));
\r
3951 this.socket.on('close', () => this.fireClose());
\r
3955 this.socket.destroy();
\r
3958 if (!this.sending && this.queue.length === 0) {
\r
3959 // See https://github.com/nodejs/node/issues/7657
\r
3960 this.doWriteMessage(msg);
\r
3963 this.queue.push(msg);
\r
3966 doWriteMessage(msg) {
\r
3967 let json = JSON.stringify(msg);
\r
3968 let contentLength = Buffer.byteLength(json, this.encoding);
\r
3970 ContentLength, contentLength.toString(), CRLF,
\r
3974 // Header must be written in ASCII encoding
\r
3975 this.sending = true;
\r
3976 this.socket.write(headers.join(''), 'ascii', (error) => {
\r
3978 this.handleError(error, msg);
\r
3981 // Now write the content. This can be written in any encoding
\r
3982 this.socket.write(json, this.encoding, (error) => {
\r
3983 this.sending = false;
\r
3985 this.handleError(error, msg);
\r
3988 this.errorCount = 0;
\r
3990 if (this.queue.length > 0) {
\r
3991 this.doWriteMessage(this.queue.shift());
\r
3996 this.handleError(error, msg);
\r
4001 this.handleError(error, msg);
\r
4004 handleError(error, msg) {
\r
4005 this.errorCount++;
\r
4006 this.fireError(error, msg, this.errorCount);
\r
4009 exports.SocketMessageWriter = SocketMessageWriter;
\r
4014 /***/ (function(module, exports, __webpack_require__) {
4017 /*---------------------------------------------------------------------------------------------
\r
4018 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
4019 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
4020 *--------------------------------------------------------------------------------------------*/
\r
4022 Object.defineProperty(exports, "__esModule", { value: true });
\r
4023 const events_1 = __webpack_require__(13);
\r
4024 const Is = __webpack_require__(10);
\r
4025 var CancellationToken;
\r
4026 (function (CancellationToken) {
\r
4027 CancellationToken.None = Object.freeze({
\r
4028 isCancellationRequested: false,
\r
4029 onCancellationRequested: events_1.Event.None
\r
4031 CancellationToken.Cancelled = Object.freeze({
\r
4032 isCancellationRequested: true,
\r
4033 onCancellationRequested: events_1.Event.None
\r
4035 function is(value) {
\r
4036 let candidate = value;
\r
4037 return candidate && (candidate === CancellationToken.None
\r
4038 || candidate === CancellationToken.Cancelled
\r
4039 || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));
\r
4041 CancellationToken.is = is;
\r
4042 })(CancellationToken = exports.CancellationToken || (exports.CancellationToken = {}));
\r
4043 const shortcutEvent = Object.freeze(function (callback, context) {
\r
4044 let handle = setTimeout(callback.bind(context), 0);
\r
4045 return { dispose() { clearTimeout(handle); } };
\r
4047 class MutableToken {
\r
4049 this._isCancelled = false;
\r
4052 if (!this._isCancelled) {
\r
4053 this._isCancelled = true;
\r
4054 if (this._emitter) {
\r
4055 this._emitter.fire(undefined);
\r
4060 get isCancellationRequested() {
\r
4061 return this._isCancelled;
\r
4063 get onCancellationRequested() {
\r
4064 if (this._isCancelled) {
\r
4065 return shortcutEvent;
\r
4067 if (!this._emitter) {
\r
4068 this._emitter = new events_1.Emitter();
\r
4070 return this._emitter.event;
\r
4073 if (this._emitter) {
\r
4074 this._emitter.dispose();
\r
4075 this._emitter = undefined;
\r
4079 class CancellationTokenSource {
\r
4081 if (!this._token) {
\r
4082 // be lazy and create the token only when
\r
4083 // actually needed
\r
4084 this._token = new MutableToken();
\r
4086 return this._token;
\r
4089 if (!this._token) {
\r
4090 // save an object by returning the default
\r
4091 // cancelled token when cancellation happens
\r
4092 // before someone asks for the token
\r
4093 this._token = CancellationToken.Cancelled;
\r
4096 this._token.cancel();
\r
4100 if (!this._token) {
\r
4101 // ensure to initialize with an empty token if we had none
\r
4102 this._token = CancellationToken.None;
\r
4104 else if (this._token instanceof MutableToken) {
\r
4105 // actually dispose
\r
4106 this._token.dispose();
\r
4110 exports.CancellationTokenSource = CancellationTokenSource;
\r
4115 /***/ (function(module, exports, __webpack_require__) {
4119 /*---------------------------------------------------------------------------------------------
\r
4120 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
4121 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
4122 *--------------------------------------------------------------------------------------------*/
\r
4123 Object.defineProperty(exports, "__esModule", { value: true });
\r
4125 (function (Touch) {
\r
4129 })(Touch = exports.Touch || (exports.Touch = {}));
\r
4132 this._map = new Map();
\r
4133 this._head = undefined;
\r
4134 this._tail = undefined;
\r
4138 this._map.clear();
\r
4139 this._head = undefined;
\r
4140 this._tail = undefined;
\r
4144 return !this._head && !this._tail;
\r
4147 return this._size;
\r
4150 return this._map.has(key);
\r
4153 const item = this._map.get(key);
\r
4157 return item.value;
\r
4159 set(key, value, touch = Touch.None) {
\r
4160 let item = this._map.get(key);
\r
4162 item.value = value;
\r
4163 if (touch !== Touch.None) {
\r
4164 this.touch(item, touch);
\r
4168 item = { key, value, next: undefined, previous: undefined };
\r
4171 this.addItemLast(item);
\r
4174 this.addItemFirst(item);
\r
4177 this.addItemLast(item);
\r
4180 this.addItemLast(item);
\r
4183 this._map.set(key, item);
\r
4188 const item = this._map.get(key);
\r
4192 this._map.delete(key);
\r
4193 this.removeItem(item);
\r
4198 if (!this._head && !this._tail) {
\r
4201 if (!this._head || !this._tail) {
\r
4202 throw new Error('Invalid list');
\r
4204 const item = this._head;
\r
4205 this._map.delete(item.key);
\r
4206 this.removeItem(item);
\r
4208 return item.value;
\r
4210 forEach(callbackfn, thisArg) {
\r
4211 let current = this._head;
\r
4214 callbackfn.bind(thisArg)(current.value, current.key, this);
\r
4217 callbackfn(current.value, current.key, this);
\r
4219 current = current.next;
\r
4222 forEachReverse(callbackfn, thisArg) {
\r
4223 let current = this._tail;
\r
4226 callbackfn.bind(thisArg)(current.value, current.key, this);
\r
4229 callbackfn(current.value, current.key, this);
\r
4231 current = current.previous;
\r
4236 let current = this._head;
\r
4238 result.push(current.value);
\r
4239 current = current.next;
\r
4245 let current = this._head;
\r
4247 result.push(current.key);
\r
4248 current = current.next;
\r
4252 /* JSON RPC run on es5 which has no Symbol.iterator
\r
4253 public keys(): IterableIterator<K> {
\r
4254 let current = this._head;
\r
4255 let iterator: IterableIterator<K> = {
\r
4256 [Symbol.iterator]() {
\r
4259 next():IteratorResult<K> {
\r
4261 let result = { value: current.key, done: false };
\r
4262 current = current.next;
\r
4265 return { value: undefined, done: true };
\r
4272 public values(): IterableIterator<V> {
\r
4273 let current = this._head;
\r
4274 let iterator: IterableIterator<V> = {
\r
4275 [Symbol.iterator]() {
\r
4278 next():IteratorResult<V> {
\r
4280 let result = { value: current.value, done: false };
\r
4281 current = current.next;
\r
4284 return { value: undefined, done: true };
\r
4291 addItemFirst(item) {
\r
4292 // First time Insert
\r
4293 if (!this._head && !this._tail) {
\r
4294 this._tail = item;
\r
4296 else if (!this._head) {
\r
4297 throw new Error('Invalid list');
\r
4300 item.next = this._head;
\r
4301 this._head.previous = item;
\r
4303 this._head = item;
\r
4305 addItemLast(item) {
\r
4306 // First time Insert
\r
4307 if (!this._head && !this._tail) {
\r
4308 this._head = item;
\r
4310 else if (!this._tail) {
\r
4311 throw new Error('Invalid list');
\r
4314 item.previous = this._tail;
\r
4315 this._tail.next = item;
\r
4317 this._tail = item;
\r
4319 removeItem(item) {
\r
4320 if (item === this._head && item === this._tail) {
\r
4321 this._head = undefined;
\r
4322 this._tail = undefined;
\r
4324 else if (item === this._head) {
\r
4325 this._head = item.next;
\r
4327 else if (item === this._tail) {
\r
4328 this._tail = item.previous;
\r
4331 const next = item.next;
\r
4332 const previous = item.previous;
\r
4333 if (!next || !previous) {
\r
4334 throw new Error('Invalid list');
\r
4336 next.previous = previous;
\r
4337 previous.next = next;
\r
4340 touch(item, touch) {
\r
4341 if (!this._head || !this._tail) {
\r
4342 throw new Error('Invalid list');
\r
4344 if ((touch !== Touch.First && touch !== Touch.Last)) {
\r
4347 if (touch === Touch.First) {
\r
4348 if (item === this._head) {
\r
4351 const next = item.next;
\r
4352 const previous = item.previous;
\r
4353 // Unlink the item
\r
4354 if (item === this._tail) {
\r
4355 // previous must be defined since item was not head but is tail
\r
4356 // So there are more than on item in the map
\r
4357 previous.next = undefined;
\r
4358 this._tail = previous;
\r
4361 // Both next and previous are not undefined since item was neither head nor tail.
\r
4362 next.previous = previous;
\r
4363 previous.next = next;
\r
4365 // Insert the node at head
\r
4366 item.previous = undefined;
\r
4367 item.next = this._head;
\r
4368 this._head.previous = item;
\r
4369 this._head = item;
\r
4371 else if (touch === Touch.Last) {
\r
4372 if (item === this._tail) {
\r
4375 const next = item.next;
\r
4376 const previous = item.previous;
\r
4377 // Unlink the item.
\r
4378 if (item === this._head) {
\r
4379 // next must be defined since item was not tail but is head
\r
4380 // So there are more than on item in the map
\r
4381 next.previous = undefined;
\r
4382 this._head = next;
\r
4385 // Both next and previous are not undefined since item was neither head nor tail.
\r
4386 next.previous = previous;
\r
4387 previous.next = next;
\r
4389 item.next = undefined;
\r
4390 item.previous = this._tail;
\r
4391 this._tail.next = item;
\r
4392 this._tail = item;
\r
4396 exports.LinkedMap = LinkedMap;
\r
4401 /***/ (function(module, exports, __webpack_require__) {
4404 /* --------------------------------------------------------------------------------------------
\r
4405 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
4406 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
4407 * ------------------------------------------------------------------------------------------ */
\r
4409 Object.defineProperty(exports, "__esModule", { value: true });
\r
4410 const path_1 = __webpack_require__(4);
\r
4411 const os_1 = __webpack_require__(2);
\r
4412 const crypto_1 = __webpack_require__(18);
\r
4413 const net_1 = __webpack_require__(19);
\r
4414 const messageReader_1 = __webpack_require__(12);
\r
4415 const messageWriter_1 = __webpack_require__(14);
\r
4416 function generateRandomPipeName() {
\r
4417 const randomSuffix = crypto_1.randomBytes(21).toString('hex');
\r
4418 if (process.platform === 'win32') {
\r
4419 return `\\\\.\\pipe\\vscode-jsonrpc-${randomSuffix}-sock`;
\r
4422 // Mac/Unix: use socket file
\r
4423 return path_1.join(os_1.tmpdir(), `vscode-${randomSuffix}.sock`);
\r
4426 exports.generateRandomPipeName = generateRandomPipeName;
\r
4427 function createClientPipeTransport(pipeName, encoding = 'utf-8') {
\r
4428 let connectResolve;
\r
4429 let connected = new Promise((resolve, _reject) => {
\r
4430 connectResolve = resolve;
\r
4432 return new Promise((resolve, reject) => {
\r
4433 let server = net_1.createServer((socket) => {
\r
4436 new messageReader_1.SocketMessageReader(socket, encoding),
\r
4437 new messageWriter_1.SocketMessageWriter(socket, encoding)
\r
4440 server.on('error', reject);
\r
4441 server.listen(pipeName, () => {
\r
4442 server.removeListener('error', reject);
\r
4444 onConnected: () => { return connected; }
\r
4449 exports.createClientPipeTransport = createClientPipeTransport;
\r
4450 function createServerPipeTransport(pipeName, encoding = 'utf-8') {
\r
4451 const socket = net_1.createConnection(pipeName);
\r
4453 new messageReader_1.SocketMessageReader(socket, encoding),
\r
4454 new messageWriter_1.SocketMessageWriter(socket, encoding)
\r
4457 exports.createServerPipeTransport = createServerPipeTransport;
\r
4462 /***/ (function(module, exports) {
4464 module.exports = require("crypto");
4468 /***/ (function(module, exports) {
4470 module.exports = require("net");
4474 /***/ (function(module, exports, __webpack_require__) {
4477 /* --------------------------------------------------------------------------------------------
\r
4478 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
4479 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
4480 * ------------------------------------------------------------------------------------------ */
\r
4482 Object.defineProperty(exports, "__esModule", { value: true });
\r
4483 const net_1 = __webpack_require__(19);
\r
4484 const messageReader_1 = __webpack_require__(12);
\r
4485 const messageWriter_1 = __webpack_require__(14);
\r
4486 function createClientSocketTransport(port, encoding = 'utf-8') {
\r
4487 let connectResolve;
\r
4488 let connected = new Promise((resolve, _reject) => {
\r
4489 connectResolve = resolve;
\r
4491 return new Promise((resolve, reject) => {
\r
4492 let server = net_1.createServer((socket) => {
\r
4495 new messageReader_1.SocketMessageReader(socket, encoding),
\r
4496 new messageWriter_1.SocketMessageWriter(socket, encoding)
\r
4499 server.on('error', reject);
\r
4500 server.listen(port, '127.0.0.1', () => {
\r
4501 server.removeListener('error', reject);
\r
4503 onConnected: () => { return connected; }
\r
4508 exports.createClientSocketTransport = createClientSocketTransport;
\r
4509 function createServerSocketTransport(port, encoding = 'utf-8') {
\r
4510 const socket = net_1.createConnection(port, '127.0.0.1');
\r
4512 new messageReader_1.SocketMessageReader(socket, encoding),
\r
4513 new messageWriter_1.SocketMessageWriter(socket, encoding)
\r
4516 exports.createServerSocketTransport = createServerSocketTransport;
\r
4521 /***/ (function(module, exports, __webpack_require__) {
4524 /* --------------------------------------------------------------------------------------------
\r
4525 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
4526 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
4527 * ------------------------------------------------------------------------------------------ */
\r
4529 Object.defineProperty(exports, "__esModule", { value: true });
\r
4530 const Is = __webpack_require__(22);
\r
4531 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
4532 const messages_1 = __webpack_require__(23);
\r
4533 const protocol_implementation_1 = __webpack_require__(24);
\r
4534 exports.ImplementationRequest = protocol_implementation_1.ImplementationRequest;
\r
4535 const protocol_typeDefinition_1 = __webpack_require__(25);
\r
4536 exports.TypeDefinitionRequest = protocol_typeDefinition_1.TypeDefinitionRequest;
\r
4537 const protocol_workspaceFolders_1 = __webpack_require__(26);
\r
4538 exports.WorkspaceFoldersRequest = protocol_workspaceFolders_1.WorkspaceFoldersRequest;
\r
4539 exports.DidChangeWorkspaceFoldersNotification = protocol_workspaceFolders_1.DidChangeWorkspaceFoldersNotification;
\r
4540 const protocol_configuration_1 = __webpack_require__(27);
\r
4541 exports.ConfigurationRequest = protocol_configuration_1.ConfigurationRequest;
\r
4542 const protocol_colorProvider_1 = __webpack_require__(28);
\r
4543 exports.DocumentColorRequest = protocol_colorProvider_1.DocumentColorRequest;
\r
4544 exports.ColorPresentationRequest = protocol_colorProvider_1.ColorPresentationRequest;
\r
4545 const protocol_foldingRange_1 = __webpack_require__(29);
\r
4546 exports.FoldingRangeRequest = protocol_foldingRange_1.FoldingRangeRequest;
\r
4547 const protocol_declaration_1 = __webpack_require__(30);
\r
4548 exports.DeclarationRequest = protocol_declaration_1.DeclarationRequest;
\r
4549 const protocol_selectionRange_1 = __webpack_require__(31);
\r
4550 exports.SelectionRangeRequest = protocol_selectionRange_1.SelectionRangeRequest;
\r
4551 const protocol_progress_1 = __webpack_require__(32);
\r
4552 exports.WorkDoneProgress = protocol_progress_1.WorkDoneProgress;
\r
4553 exports.WorkDoneProgressCreateRequest = protocol_progress_1.WorkDoneProgressCreateRequest;
\r
4554 exports.WorkDoneProgressCancelNotification = protocol_progress_1.WorkDoneProgressCancelNotification;
\r
4555 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
\r
4556 let __noDynamicImport;
\r
4558 * The DocumentFilter namespace provides helper functions to work with
\r
4559 * [DocumentFilter](#DocumentFilter) literals.
\r
4561 var DocumentFilter;
\r
4562 (function (DocumentFilter) {
\r
4563 function is(value) {
\r
4564 const candidate = value;
\r
4565 return Is.string(candidate.language) || Is.string(candidate.scheme) || Is.string(candidate.pattern);
\r
4567 DocumentFilter.is = is;
\r
4568 })(DocumentFilter = exports.DocumentFilter || (exports.DocumentFilter = {}));
\r
4570 * The DocumentSelector namespace provides helper functions to work with
\r
4571 * [DocumentSelector](#DocumentSelector)s.
\r
4573 var DocumentSelector;
\r
4574 (function (DocumentSelector) {
\r
4575 function is(value) {
\r
4576 if (!Array.isArray(value)) {
\r
4579 for (let elem of value) {
\r
4580 if (!Is.string(elem) && !DocumentFilter.is(elem)) {
\r
4586 DocumentSelector.is = is;
\r
4587 })(DocumentSelector = exports.DocumentSelector || (exports.DocumentSelector = {}));
\r
4589 * The `client/registerCapability` request is sent from the server to the client to register a new capability
\r
4590 * handler on the client side.
\r
4592 var RegistrationRequest;
\r
4593 (function (RegistrationRequest) {
\r
4594 RegistrationRequest.type = new messages_1.ProtocolRequestType('client/registerCapability');
\r
4595 })(RegistrationRequest = exports.RegistrationRequest || (exports.RegistrationRequest = {}));
\r
4597 * The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability
\r
4598 * handler on the client side.
\r
4600 var UnregistrationRequest;
\r
4601 (function (UnregistrationRequest) {
\r
4602 UnregistrationRequest.type = new messages_1.ProtocolRequestType('client/unregisterCapability');
\r
4603 })(UnregistrationRequest = exports.UnregistrationRequest || (exports.UnregistrationRequest = {}));
\r
4604 var ResourceOperationKind;
\r
4605 (function (ResourceOperationKind) {
\r
4607 * Supports creating new files and folders.
\r
4609 ResourceOperationKind.Create = 'create';
\r
4611 * Supports renaming existing files and folders.
\r
4613 ResourceOperationKind.Rename = 'rename';
\r
4615 * Supports deleting existing files and folders.
\r
4617 ResourceOperationKind.Delete = 'delete';
\r
4618 })(ResourceOperationKind = exports.ResourceOperationKind || (exports.ResourceOperationKind = {}));
\r
4619 var FailureHandlingKind;
\r
4620 (function (FailureHandlingKind) {
\r
4622 * Applying the workspace change is simply aborted if one of the changes provided
\r
4623 * fails. All operations executed before the failing operation stay executed.
\r
4625 FailureHandlingKind.Abort = 'abort';
\r
4627 * All operations are executed transactional. That means they either all
\r
4628 * succeed or no changes at all are applied to the workspace.
\r
4630 FailureHandlingKind.Transactional = 'transactional';
\r
4632 * If the workspace edit contains only textual file changes they are executed transactional.
\r
4633 * If resource changes (create, rename or delete file) are part of the change the failure
\r
4634 * handling startegy is abort.
\r
4636 FailureHandlingKind.TextOnlyTransactional = 'textOnlyTransactional';
\r
4638 * The client tries to undo the operations already executed. But there is no
\r
4639 * guarantee that this is succeeding.
\r
4641 FailureHandlingKind.Undo = 'undo';
\r
4642 })(FailureHandlingKind = exports.FailureHandlingKind || (exports.FailureHandlingKind = {}));
\r
4644 * The StaticRegistrationOptions namespace provides helper functions to work with
\r
4645 * [StaticRegistrationOptions](#StaticRegistrationOptions) literals.
\r
4647 var StaticRegistrationOptions;
\r
4648 (function (StaticRegistrationOptions) {
\r
4649 function hasId(value) {
\r
4650 const candidate = value;
\r
4651 return candidate && Is.string(candidate.id) && candidate.id.length > 0;
\r
4653 StaticRegistrationOptions.hasId = hasId;
\r
4654 })(StaticRegistrationOptions = exports.StaticRegistrationOptions || (exports.StaticRegistrationOptions = {}));
\r
4656 * The TextDocumentRegistrationOptions namespace provides helper functions to work with
\r
4657 * [TextDocumentRegistrationOptions](#TextDocumentRegistrationOptions) literals.
\r
4659 var TextDocumentRegistrationOptions;
\r
4660 (function (TextDocumentRegistrationOptions) {
\r
4661 function is(value) {
\r
4662 const candidate = value;
\r
4663 return candidate && (candidate.documentSelector === null || DocumentSelector.is(candidate.documentSelector));
\r
4665 TextDocumentRegistrationOptions.is = is;
\r
4666 })(TextDocumentRegistrationOptions = exports.TextDocumentRegistrationOptions || (exports.TextDocumentRegistrationOptions = {}));
\r
4668 * The WorkDoneProgressOptions namespace provides helper functions to work with
\r
4669 * [WorkDoneProgressOptions](#WorkDoneProgressOptions) literals.
\r
4671 var WorkDoneProgressOptions;
\r
4672 (function (WorkDoneProgressOptions) {
\r
4673 function is(value) {
\r
4674 const candidate = value;
\r
4675 return Is.objectLiteral(candidate) && (candidate.workDoneProgress === undefined || Is.boolean(candidate.workDoneProgress));
\r
4677 WorkDoneProgressOptions.is = is;
\r
4678 function hasWorkDoneProgress(value) {
\r
4679 const candidate = value;
\r
4680 return candidate && Is.boolean(candidate.workDoneProgress);
\r
4682 WorkDoneProgressOptions.hasWorkDoneProgress = hasWorkDoneProgress;
\r
4683 })(WorkDoneProgressOptions = exports.WorkDoneProgressOptions || (exports.WorkDoneProgressOptions = {}));
\r
4685 * The initialize request is sent from the client to the server.
\r
4686 * It is sent once as the request after starting up the server.
\r
4687 * The requests parameter is of type [InitializeParams](#InitializeParams)
\r
4688 * the response if of type [InitializeResult](#InitializeResult) of a Thenable that
\r
4689 * resolves to such.
\r
4691 var InitializeRequest;
\r
4692 (function (InitializeRequest) {
\r
4693 InitializeRequest.type = new messages_1.ProtocolRequestType('initialize');
\r
4694 })(InitializeRequest = exports.InitializeRequest || (exports.InitializeRequest = {}));
\r
4696 * Known error codes for an `InitializeError`;
\r
4698 var InitializeError;
\r
4699 (function (InitializeError) {
\r
4701 * If the protocol version provided by the client can't be handled by the server.
\r
4702 * @deprecated This initialize error got replaced by client capabilities. There is
\r
4703 * no version handshake in version 3.0x
\r
4705 InitializeError.unknownProtocolVersion = 1;
\r
4706 })(InitializeError = exports.InitializeError || (exports.InitializeError = {}));
\r
4708 * The intialized notification is sent from the client to the
\r
4709 * server after the client is fully initialized and the server
\r
4710 * is allowed to send requests from the server to the client.
\r
4712 var InitializedNotification;
\r
4713 (function (InitializedNotification) {
\r
4714 InitializedNotification.type = new messages_1.ProtocolNotificationType('initialized');
\r
4715 })(InitializedNotification = exports.InitializedNotification || (exports.InitializedNotification = {}));
\r
4716 //---- Shutdown Method ----
\r
4718 * A shutdown request is sent from the client to the server.
\r
4719 * It is sent once when the client decides to shutdown the
\r
4720 * server. The only notification that is sent after a shutdown request
\r
4721 * is the exit event.
\r
4723 var ShutdownRequest;
\r
4724 (function (ShutdownRequest) {
\r
4725 ShutdownRequest.type = new messages_1.ProtocolRequestType0('shutdown');
\r
4726 })(ShutdownRequest = exports.ShutdownRequest || (exports.ShutdownRequest = {}));
\r
4727 //---- Exit Notification ----
\r
4729 * The exit event is sent from the client to the server to
\r
4730 * ask the server to exit its process.
\r
4732 var ExitNotification;
\r
4733 (function (ExitNotification) {
\r
4734 ExitNotification.type = new messages_1.ProtocolNotificationType0('exit');
\r
4735 })(ExitNotification = exports.ExitNotification || (exports.ExitNotification = {}));
\r
4737 * The configuration change notification is sent from the client to the server
\r
4738 * when the client's configuration has changed. The notification contains
\r
4739 * the changed configuration as defined by the language client.
\r
4741 var DidChangeConfigurationNotification;
\r
4742 (function (DidChangeConfigurationNotification) {
\r
4743 DidChangeConfigurationNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeConfiguration');
\r
4744 })(DidChangeConfigurationNotification = exports.DidChangeConfigurationNotification || (exports.DidChangeConfigurationNotification = {}));
\r
4745 //---- Message show and log notifications ----
\r
4747 * The message type
\r
4750 (function (MessageType) {
\r
4752 * An error message.
\r
4754 MessageType.Error = 1;
\r
4756 * A warning message.
\r
4758 MessageType.Warning = 2;
\r
4760 * An information message.
\r
4762 MessageType.Info = 3;
\r
4766 MessageType.Log = 4;
\r
4767 })(MessageType = exports.MessageType || (exports.MessageType = {}));
\r
4769 * The show message notification is sent from a server to a client to ask
\r
4770 * the client to display a particular message in the user interface.
\r
4772 var ShowMessageNotification;
\r
4773 (function (ShowMessageNotification) {
\r
4774 ShowMessageNotification.type = new messages_1.ProtocolNotificationType('window/showMessage');
\r
4775 })(ShowMessageNotification = exports.ShowMessageNotification || (exports.ShowMessageNotification = {}));
\r
4777 * The show message request is sent from the server to the client to show a message
\r
4778 * and a set of options actions to the user.
\r
4780 var ShowMessageRequest;
\r
4781 (function (ShowMessageRequest) {
\r
4782 ShowMessageRequest.type = new messages_1.ProtocolRequestType('window/showMessageRequest');
\r
4783 })(ShowMessageRequest = exports.ShowMessageRequest || (exports.ShowMessageRequest = {}));
\r
4785 * The log message notification is sent from the server to the client to ask
\r
4786 * the client to log a particular message.
\r
4788 var LogMessageNotification;
\r
4789 (function (LogMessageNotification) {
\r
4790 LogMessageNotification.type = new messages_1.ProtocolNotificationType('window/logMessage');
\r
4791 })(LogMessageNotification = exports.LogMessageNotification || (exports.LogMessageNotification = {}));
\r
4792 //---- Telemetry notification
\r
4794 * The telemetry event notification is sent from the server to the client to ask
\r
4795 * the client to log telemetry data.
\r
4797 var TelemetryEventNotification;
\r
4798 (function (TelemetryEventNotification) {
\r
4799 TelemetryEventNotification.type = new messages_1.ProtocolNotificationType('telemetry/event');
\r
4800 })(TelemetryEventNotification = exports.TelemetryEventNotification || (exports.TelemetryEventNotification = {}));
\r
4802 * Defines how the host (editor) should sync
\r
4803 * document changes to the language server.
\r
4805 var TextDocumentSyncKind;
\r
4806 (function (TextDocumentSyncKind) {
\r
4808 * Documents should not be synced at all.
\r
4810 TextDocumentSyncKind.None = 0;
\r
4812 * Documents are synced by always sending the full content
\r
4813 * of the document.
\r
4815 TextDocumentSyncKind.Full = 1;
\r
4817 * Documents are synced by sending the full content on open.
\r
4818 * After that only incremental updates to the document are
\r
4821 TextDocumentSyncKind.Incremental = 2;
\r
4822 })(TextDocumentSyncKind = exports.TextDocumentSyncKind || (exports.TextDocumentSyncKind = {}));
\r
4824 * The document open notification is sent from the client to the server to signal
\r
4825 * newly opened text documents. The document's truth is now managed by the client
\r
4826 * and the server must not try to read the document's truth using the document's
\r
4827 * uri. Open in this sense means it is managed by the client. It doesn't necessarily
\r
4828 * mean that its content is presented in an editor. An open notification must not
\r
4829 * be sent more than once without a corresponding close notification send before.
\r
4830 * This means open and close notification must be balanced and the max open count
\r
4833 var DidOpenTextDocumentNotification;
\r
4834 (function (DidOpenTextDocumentNotification) {
\r
4835 DidOpenTextDocumentNotification.method = 'textDocument/didOpen';
\r
4836 DidOpenTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidOpenTextDocumentNotification.method);
\r
4837 })(DidOpenTextDocumentNotification = exports.DidOpenTextDocumentNotification || (exports.DidOpenTextDocumentNotification = {}));
\r
4839 * The document change notification is sent from the client to the server to signal
\r
4840 * changes to a text document.
\r
4842 var DidChangeTextDocumentNotification;
\r
4843 (function (DidChangeTextDocumentNotification) {
\r
4844 DidChangeTextDocumentNotification.method = 'textDocument/didChange';
\r
4845 DidChangeTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidChangeTextDocumentNotification.method);
\r
4846 })(DidChangeTextDocumentNotification = exports.DidChangeTextDocumentNotification || (exports.DidChangeTextDocumentNotification = {}));
\r
4848 * The document close notification is sent from the client to the server when
\r
4849 * the document got closed in the client. The document's truth now exists where
\r
4850 * the document's uri points to (e.g. if the document's uri is a file uri the
\r
4851 * truth now exists on disk). As with the open notification the close notification
\r
4852 * is about managing the document's content. Receiving a close notification
\r
4853 * doesn't mean that the document was open in an editor before. A close
\r
4854 * notification requires a previous open notification to be sent.
\r
4856 var DidCloseTextDocumentNotification;
\r
4857 (function (DidCloseTextDocumentNotification) {
\r
4858 DidCloseTextDocumentNotification.method = 'textDocument/didClose';
\r
4859 DidCloseTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidCloseTextDocumentNotification.method);
\r
4860 })(DidCloseTextDocumentNotification = exports.DidCloseTextDocumentNotification || (exports.DidCloseTextDocumentNotification = {}));
\r
4862 * The document save notification is sent from the client to the server when
\r
4863 * the document got saved in the client.
\r
4865 var DidSaveTextDocumentNotification;
\r
4866 (function (DidSaveTextDocumentNotification) {
\r
4867 DidSaveTextDocumentNotification.method = 'textDocument/didSave';
\r
4868 DidSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidSaveTextDocumentNotification.method);
\r
4869 })(DidSaveTextDocumentNotification = exports.DidSaveTextDocumentNotification || (exports.DidSaveTextDocumentNotification = {}));
\r
4871 * Represents reasons why a text document is saved.
\r
4873 var TextDocumentSaveReason;
\r
4874 (function (TextDocumentSaveReason) {
\r
4876 * Manually triggered, e.g. by the user pressing save, by starting debugging,
\r
4877 * or by an API call.
\r
4879 TextDocumentSaveReason.Manual = 1;
\r
4881 * Automatic after a delay.
\r
4883 TextDocumentSaveReason.AfterDelay = 2;
\r
4885 * When the editor lost focus.
\r
4887 TextDocumentSaveReason.FocusOut = 3;
\r
4888 })(TextDocumentSaveReason = exports.TextDocumentSaveReason || (exports.TextDocumentSaveReason = {}));
\r
4890 * A document will save notification is sent from the client to the server before
\r
4891 * the document is actually saved.
\r
4893 var WillSaveTextDocumentNotification;
\r
4894 (function (WillSaveTextDocumentNotification) {
\r
4895 WillSaveTextDocumentNotification.method = 'textDocument/willSave';
\r
4896 WillSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(WillSaveTextDocumentNotification.method);
\r
4897 })(WillSaveTextDocumentNotification = exports.WillSaveTextDocumentNotification || (exports.WillSaveTextDocumentNotification = {}));
\r
4899 * A document will save request is sent from the client to the server before
\r
4900 * the document is actually saved. The request can return an array of TextEdits
\r
4901 * which will be applied to the text document before it is saved. Please note that
\r
4902 * clients might drop results if computing the text edits took too long or if a
\r
4903 * server constantly fails on this request. This is done to keep the save fast and
\r
4906 var WillSaveTextDocumentWaitUntilRequest;
\r
4907 (function (WillSaveTextDocumentWaitUntilRequest) {
\r
4908 WillSaveTextDocumentWaitUntilRequest.method = 'textDocument/willSaveWaitUntil';
\r
4909 WillSaveTextDocumentWaitUntilRequest.type = new messages_1.ProtocolRequestType(WillSaveTextDocumentWaitUntilRequest.method);
\r
4910 })(WillSaveTextDocumentWaitUntilRequest = exports.WillSaveTextDocumentWaitUntilRequest || (exports.WillSaveTextDocumentWaitUntilRequest = {}));
\r
4912 * The watched files notification is sent from the client to the server when
\r
4913 * the client detects changes to file watched by the language client.
\r
4915 var DidChangeWatchedFilesNotification;
\r
4916 (function (DidChangeWatchedFilesNotification) {
\r
4917 DidChangeWatchedFilesNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWatchedFiles');
\r
4918 })(DidChangeWatchedFilesNotification = exports.DidChangeWatchedFilesNotification || (exports.DidChangeWatchedFilesNotification = {}));
\r
4920 * The file event type
\r
4922 var FileChangeType;
\r
4923 (function (FileChangeType) {
\r
4925 * The file got created.
\r
4927 FileChangeType.Created = 1;
\r
4929 * The file got changed.
\r
4931 FileChangeType.Changed = 2;
\r
4933 * The file got deleted.
\r
4935 FileChangeType.Deleted = 3;
\r
4936 })(FileChangeType = exports.FileChangeType || (exports.FileChangeType = {}));
\r
4938 (function (WatchKind) {
\r
4940 * Interested in create events.
\r
4942 WatchKind.Create = 1;
\r
4944 * Interested in change events
\r
4946 WatchKind.Change = 2;
\r
4948 * Interested in delete events
\r
4950 WatchKind.Delete = 4;
\r
4951 })(WatchKind = exports.WatchKind || (exports.WatchKind = {}));
\r
4953 * Diagnostics notification are sent from the server to the client to signal
\r
4954 * results of validation runs.
\r
4956 var PublishDiagnosticsNotification;
\r
4957 (function (PublishDiagnosticsNotification) {
\r
4958 PublishDiagnosticsNotification.type = new messages_1.ProtocolNotificationType('textDocument/publishDiagnostics');
\r
4959 })(PublishDiagnosticsNotification = exports.PublishDiagnosticsNotification || (exports.PublishDiagnosticsNotification = {}));
\r
4961 * How a completion was triggered
\r
4963 var CompletionTriggerKind;
\r
4964 (function (CompletionTriggerKind) {
\r
4966 * Completion was triggered by typing an identifier (24x7 code
\r
4967 * complete), manual invocation (e.g Ctrl+Space) or via API.
\r
4969 CompletionTriggerKind.Invoked = 1;
\r
4971 * Completion was triggered by a trigger character specified by
\r
4972 * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
\r
4974 CompletionTriggerKind.TriggerCharacter = 2;
\r
4976 * Completion was re-triggered as current completion list is incomplete
\r
4978 CompletionTriggerKind.TriggerForIncompleteCompletions = 3;
\r
4979 })(CompletionTriggerKind = exports.CompletionTriggerKind || (exports.CompletionTriggerKind = {}));
\r
4981 * Request to request completion at a given text document position. The request's
\r
4982 * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response
\r
4983 * is of type [CompletionItem[]](#CompletionItem) or [CompletionList](#CompletionList)
\r
4984 * or a Thenable that resolves to such.
\r
4986 * The request can delay the computation of the [`detail`](#CompletionItem.detail)
\r
4987 * and [`documentation`](#CompletionItem.documentation) properties to the `completionItem/resolve`
\r
4988 * request. However, properties that are needed for the initial sorting and filtering, like `sortText`,
\r
4989 * `filterText`, `insertText`, and `textEdit`, must not be changed during resolve.
\r
4991 var CompletionRequest;
\r
4992 (function (CompletionRequest) {
\r
4993 CompletionRequest.method = 'textDocument/completion';
\r
4994 CompletionRequest.type = new messages_1.ProtocolRequestType(CompletionRequest.method);
\r
4995 /** @deprecated Use CompletionRequest.type */
\r
4996 CompletionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
4997 })(CompletionRequest = exports.CompletionRequest || (exports.CompletionRequest = {}));
\r
4999 * Request to resolve additional information for a given completion item.The request's
\r
5000 * parameter is of type [CompletionItem](#CompletionItem) the response
\r
5001 * is of type [CompletionItem](#CompletionItem) or a Thenable that resolves to such.
\r
5003 var CompletionResolveRequest;
\r
5004 (function (CompletionResolveRequest) {
\r
5005 CompletionResolveRequest.method = 'completionItem/resolve';
\r
5006 CompletionResolveRequest.type = new messages_1.ProtocolRequestType(CompletionResolveRequest.method);
\r
5007 })(CompletionResolveRequest = exports.CompletionResolveRequest || (exports.CompletionResolveRequest = {}));
\r
5009 * Request to request hover information at a given text document position. The request's
\r
5010 * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response is of
\r
5011 * type [Hover](#Hover) or a Thenable that resolves to such.
\r
5014 (function (HoverRequest) {
\r
5015 HoverRequest.method = 'textDocument/hover';
\r
5016 HoverRequest.type = new messages_1.ProtocolRequestType(HoverRequest.method);
\r
5017 })(HoverRequest = exports.HoverRequest || (exports.HoverRequest = {}));
\r
5019 * How a signature help was triggered.
\r
5023 var SignatureHelpTriggerKind;
\r
5024 (function (SignatureHelpTriggerKind) {
\r
5026 * Signature help was invoked manually by the user or by a command.
\r
5028 SignatureHelpTriggerKind.Invoked = 1;
\r
5030 * Signature help was triggered by a trigger character.
\r
5032 SignatureHelpTriggerKind.TriggerCharacter = 2;
\r
5034 * Signature help was triggered by the cursor moving or by the document content changing.
\r
5036 SignatureHelpTriggerKind.ContentChange = 3;
\r
5037 })(SignatureHelpTriggerKind = exports.SignatureHelpTriggerKind || (exports.SignatureHelpTriggerKind = {}));
\r
5038 var SignatureHelpRequest;
\r
5039 (function (SignatureHelpRequest) {
\r
5040 SignatureHelpRequest.method = 'textDocument/signatureHelp';
\r
5041 SignatureHelpRequest.type = new messages_1.ProtocolRequestType(SignatureHelpRequest.method);
\r
5042 })(SignatureHelpRequest = exports.SignatureHelpRequest || (exports.SignatureHelpRequest = {}));
\r
5044 * A request to resolve the definition location of a symbol at a given text
\r
5045 * document position. The request's parameter is of type [TextDocumentPosition]
\r
5046 * (#TextDocumentPosition) the response is of either type [Definition](#Definition)
\r
5047 * or a typed array of [DefinitionLink](#DefinitionLink) or a Thenable that resolves
\r
5050 var DefinitionRequest;
\r
5051 (function (DefinitionRequest) {
\r
5052 DefinitionRequest.method = 'textDocument/definition';
\r
5053 DefinitionRequest.type = new messages_1.ProtocolRequestType(DefinitionRequest.method);
\r
5054 /** @deprecated Use DefinitionRequest.type */
\r
5055 DefinitionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5056 })(DefinitionRequest = exports.DefinitionRequest || (exports.DefinitionRequest = {}));
\r
5058 * A request to resolve project-wide references for the symbol denoted
\r
5059 * by the given text document position. The request's parameter is of
\r
5060 * type [ReferenceParams](#ReferenceParams) the response is of type
\r
5061 * [Location[]](#Location) or a Thenable that resolves to such.
\r
5063 var ReferencesRequest;
\r
5064 (function (ReferencesRequest) {
\r
5065 ReferencesRequest.method = 'textDocument/references';
\r
5066 ReferencesRequest.type = new messages_1.ProtocolRequestType(ReferencesRequest.method);
\r
5067 /** @deprecated Use ReferencesRequest.type */
\r
5068 ReferencesRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5069 })(ReferencesRequest = exports.ReferencesRequest || (exports.ReferencesRequest = {}));
\r
5071 * Request to resolve a [DocumentHighlight](#DocumentHighlight) for a given
\r
5072 * text document position. The request's parameter is of type [TextDocumentPosition]
\r
5073 * (#TextDocumentPosition) the request response is of type [DocumentHighlight[]]
\r
5074 * (#DocumentHighlight) or a Thenable that resolves to such.
\r
5076 var DocumentHighlightRequest;
\r
5077 (function (DocumentHighlightRequest) {
\r
5078 DocumentHighlightRequest.method = 'textDocument/documentHighlight';
\r
5079 DocumentHighlightRequest.type = new messages_1.ProtocolRequestType(DocumentHighlightRequest.method);
\r
5080 /** @deprecated Use DocumentHighlightRequest.type */
\r
5081 DocumentHighlightRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5082 })(DocumentHighlightRequest = exports.DocumentHighlightRequest || (exports.DocumentHighlightRequest = {}));
\r
5084 * A request to list all symbols found in a given text document. The request's
\r
5085 * parameter is of type [TextDocumentIdentifier](#TextDocumentIdentifier) the
\r
5086 * response is of type [SymbolInformation[]](#SymbolInformation) or a Thenable
\r
5087 * that resolves to such.
\r
5089 var DocumentSymbolRequest;
\r
5090 (function (DocumentSymbolRequest) {
\r
5091 DocumentSymbolRequest.method = 'textDocument/documentSymbol';
\r
5092 DocumentSymbolRequest.type = new messages_1.ProtocolRequestType(DocumentSymbolRequest.method);
\r
5093 /** @deprecated Use DocumentSymbolRequest.type */
\r
5094 DocumentSymbolRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5095 })(DocumentSymbolRequest = exports.DocumentSymbolRequest || (exports.DocumentSymbolRequest = {}));
\r
5097 * A request to provide commands for the given text document and range.
\r
5099 var CodeActionRequest;
\r
5100 (function (CodeActionRequest) {
\r
5101 CodeActionRequest.method = 'textDocument/codeAction';
\r
5102 CodeActionRequest.type = new messages_1.ProtocolRequestType(CodeActionRequest.method);
\r
5103 /** @deprecated Use CodeActionRequest.type */
\r
5104 CodeActionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5105 })(CodeActionRequest = exports.CodeActionRequest || (exports.CodeActionRequest = {}));
\r
5107 * A request to list project-wide symbols matching the query string given
\r
5108 * by the [WorkspaceSymbolParams](#WorkspaceSymbolParams). The response is
\r
5109 * of type [SymbolInformation[]](#SymbolInformation) or a Thenable that
\r
5110 * resolves to such.
\r
5112 var WorkspaceSymbolRequest;
\r
5113 (function (WorkspaceSymbolRequest) {
\r
5114 WorkspaceSymbolRequest.method = 'workspace/symbol';
\r
5115 WorkspaceSymbolRequest.type = new messages_1.ProtocolRequestType(WorkspaceSymbolRequest.method);
\r
5116 /** @deprecated Use WorkspaceSymbolRequest.type */
\r
5117 WorkspaceSymbolRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5118 })(WorkspaceSymbolRequest = exports.WorkspaceSymbolRequest || (exports.WorkspaceSymbolRequest = {}));
\r
5120 * A request to provide code lens for the given text document.
\r
5122 var CodeLensRequest;
\r
5123 (function (CodeLensRequest) {
\r
5124 CodeLensRequest.type = new messages_1.ProtocolRequestType('textDocument/codeLens');
\r
5125 /** @deprecated Use CodeLensRequest.type */
\r
5126 CodeLensRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5127 })(CodeLensRequest = exports.CodeLensRequest || (exports.CodeLensRequest = {}));
\r
5129 * A request to resolve a command for a given code lens.
\r
5131 var CodeLensResolveRequest;
\r
5132 (function (CodeLensResolveRequest) {
\r
5133 CodeLensResolveRequest.type = new messages_1.ProtocolRequestType('codeLens/resolve');
\r
5134 })(CodeLensResolveRequest = exports.CodeLensResolveRequest || (exports.CodeLensResolveRequest = {}));
\r
5136 * A request to provide document links
\r
5138 var DocumentLinkRequest;
\r
5139 (function (DocumentLinkRequest) {
\r
5140 DocumentLinkRequest.method = 'textDocument/documentLink';
\r
5141 DocumentLinkRequest.type = new messages_1.ProtocolRequestType(DocumentLinkRequest.method);
\r
5142 /** @deprecated Use DocumentLinkRequest.type */
\r
5143 DocumentLinkRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5144 })(DocumentLinkRequest = exports.DocumentLinkRequest || (exports.DocumentLinkRequest = {}));
\r
5146 * Request to resolve additional information for a given document link. The request's
\r
5147 * parameter is of type [DocumentLink](#DocumentLink) the response
\r
5148 * is of type [DocumentLink](#DocumentLink) or a Thenable that resolves to such.
\r
5150 var DocumentLinkResolveRequest;
\r
5151 (function (DocumentLinkResolveRequest) {
\r
5152 DocumentLinkResolveRequest.type = new messages_1.ProtocolRequestType('documentLink/resolve');
\r
5153 })(DocumentLinkResolveRequest = exports.DocumentLinkResolveRequest || (exports.DocumentLinkResolveRequest = {}));
\r
5155 * A request to to format a whole document.
\r
5157 var DocumentFormattingRequest;
\r
5158 (function (DocumentFormattingRequest) {
\r
5159 DocumentFormattingRequest.method = 'textDocument/formatting';
\r
5160 DocumentFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentFormattingRequest.method);
\r
5161 })(DocumentFormattingRequest = exports.DocumentFormattingRequest || (exports.DocumentFormattingRequest = {}));
\r
5163 * A request to to format a range in a document.
\r
5165 var DocumentRangeFormattingRequest;
\r
5166 (function (DocumentRangeFormattingRequest) {
\r
5167 DocumentRangeFormattingRequest.method = 'textDocument/rangeFormatting';
\r
5168 DocumentRangeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentRangeFormattingRequest.method);
\r
5169 })(DocumentRangeFormattingRequest = exports.DocumentRangeFormattingRequest || (exports.DocumentRangeFormattingRequest = {}));
\r
5171 * A request to format a document on type.
\r
5173 var DocumentOnTypeFormattingRequest;
\r
5174 (function (DocumentOnTypeFormattingRequest) {
\r
5175 DocumentOnTypeFormattingRequest.method = 'textDocument/onTypeFormatting';
\r
5176 DocumentOnTypeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentOnTypeFormattingRequest.method);
\r
5177 })(DocumentOnTypeFormattingRequest = exports.DocumentOnTypeFormattingRequest || (exports.DocumentOnTypeFormattingRequest = {}));
\r
5179 * A request to rename a symbol.
\r
5181 var RenameRequest;
\r
5182 (function (RenameRequest) {
\r
5183 RenameRequest.method = 'textDocument/rename';
\r
5184 RenameRequest.type = new messages_1.ProtocolRequestType(RenameRequest.method);
\r
5185 })(RenameRequest = exports.RenameRequest || (exports.RenameRequest = {}));
\r
5187 * A request to test and perform the setup necessary for a rename.
\r
5189 var PrepareRenameRequest;
\r
5190 (function (PrepareRenameRequest) {
\r
5191 PrepareRenameRequest.method = 'textDocument/prepareRename';
\r
5192 PrepareRenameRequest.type = new messages_1.ProtocolRequestType(PrepareRenameRequest.method);
\r
5193 })(PrepareRenameRequest = exports.PrepareRenameRequest || (exports.PrepareRenameRequest = {}));
\r
5195 * A request send from the client to the server to execute a command. The request might return
\r
5196 * a workspace edit which the client will apply to the workspace.
\r
5198 var ExecuteCommandRequest;
\r
5199 (function (ExecuteCommandRequest) {
\r
5200 ExecuteCommandRequest.type = new messages_1.ProtocolRequestType('workspace/executeCommand');
\r
5201 })(ExecuteCommandRequest = exports.ExecuteCommandRequest || (exports.ExecuteCommandRequest = {}));
\r
5203 * A request sent from the server to the client to modified certain resources.
\r
5205 var ApplyWorkspaceEditRequest;
\r
5206 (function (ApplyWorkspaceEditRequest) {
\r
5207 ApplyWorkspaceEditRequest.type = new messages_1.ProtocolRequestType('workspace/applyEdit');
\r
5208 })(ApplyWorkspaceEditRequest = exports.ApplyWorkspaceEditRequest || (exports.ApplyWorkspaceEditRequest = {}));
\r
5213 /***/ (function(module, exports, __webpack_require__) {
5216 /* --------------------------------------------------------------------------------------------
\r
5217 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5218 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5219 * ------------------------------------------------------------------------------------------ */
\r
5221 Object.defineProperty(exports, "__esModule", { value: true });
\r
5222 function boolean(value) {
\r
5223 return value === true || value === false;
\r
5225 exports.boolean = boolean;
\r
5226 function string(value) {
\r
5227 return typeof value === 'string' || value instanceof String;
\r
5229 exports.string = string;
\r
5230 function number(value) {
\r
5231 return typeof value === 'number' || value instanceof Number;
\r
5233 exports.number = number;
\r
5234 function error(value) {
\r
5235 return value instanceof Error;
\r
5237 exports.error = error;
\r
5238 function func(value) {
\r
5239 return typeof value === 'function';
\r
5241 exports.func = func;
\r
5242 function array(value) {
\r
5243 return Array.isArray(value);
\r
5245 exports.array = array;
\r
5246 function stringArray(value) {
\r
5247 return array(value) && value.every(elem => string(elem));
\r
5249 exports.stringArray = stringArray;
\r
5250 function typedArray(value, check) {
\r
5251 return Array.isArray(value) && value.every(check);
\r
5253 exports.typedArray = typedArray;
\r
5254 function objectLiteral(value) {
\r
5255 // Strictly speaking class instances pass this check as well. Since the LSP
\r
5256 // doesn't use classes we ignore this for now. If we do we need to add something
\r
5257 // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
\r
5258 return value !== null && typeof value === 'object';
\r
5260 exports.objectLiteral = objectLiteral;
\r
5265 /***/ (function(module, exports, __webpack_require__) {
5268 /* --------------------------------------------------------------------------------------------
\r
5269 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5270 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5271 * ------------------------------------------------------------------------------------------ */
\r
5273 Object.defineProperty(exports, "__esModule", { value: true });
\r
5274 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5275 class ProtocolRequestType0 extends vscode_jsonrpc_1.RequestType0 {
\r
5276 constructor(method) {
\r
5280 exports.ProtocolRequestType0 = ProtocolRequestType0;
\r
5281 class ProtocolRequestType extends vscode_jsonrpc_1.RequestType {
\r
5282 constructor(method) {
\r
5286 exports.ProtocolRequestType = ProtocolRequestType;
\r
5287 class ProtocolNotificationType extends vscode_jsonrpc_1.NotificationType {
\r
5288 constructor(method) {
\r
5292 exports.ProtocolNotificationType = ProtocolNotificationType;
\r
5293 class ProtocolNotificationType0 extends vscode_jsonrpc_1.NotificationType0 {
\r
5294 constructor(method) {
\r
5298 exports.ProtocolNotificationType0 = ProtocolNotificationType0;
\r
5303 /***/ (function(module, exports, __webpack_require__) {
5306 /* --------------------------------------------------------------------------------------------
\r
5307 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5308 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5309 * ------------------------------------------------------------------------------------------ */
\r
5311 Object.defineProperty(exports, "__esModule", { value: true });
\r
5312 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5313 const messages_1 = __webpack_require__(23);
\r
5314 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
\r
5315 let __noDynamicImport;
\r
5317 * A request to resolve the implementation locations of a symbol at a given text
\r
5318 * document position. The request's parameter is of type [TextDocumentPositioParams]
\r
5319 * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a
\r
5320 * Thenable that resolves to such.
\r
5322 var ImplementationRequest;
\r
5323 (function (ImplementationRequest) {
\r
5324 ImplementationRequest.method = 'textDocument/implementation';
\r
5325 ImplementationRequest.type = new messages_1.ProtocolRequestType(ImplementationRequest.method);
\r
5326 /** @deprecated Use ImplementationRequest.type */
\r
5327 ImplementationRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5328 })(ImplementationRequest = exports.ImplementationRequest || (exports.ImplementationRequest = {}));
\r
5333 /***/ (function(module, exports, __webpack_require__) {
5336 /* --------------------------------------------------------------------------------------------
\r
5337 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5338 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5339 * ------------------------------------------------------------------------------------------ */
\r
5341 Object.defineProperty(exports, "__esModule", { value: true });
\r
5342 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5343 const messages_1 = __webpack_require__(23);
\r
5344 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
\r
5345 let __noDynamicImport;
\r
5347 * A request to resolve the type definition locations of a symbol at a given text
\r
5348 * document position. The request's parameter is of type [TextDocumentPositioParams]
\r
5349 * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a
\r
5350 * Thenable that resolves to such.
\r
5352 var TypeDefinitionRequest;
\r
5353 (function (TypeDefinitionRequest) {
\r
5354 TypeDefinitionRequest.method = 'textDocument/typeDefinition';
\r
5355 TypeDefinitionRequest.type = new messages_1.ProtocolRequestType(TypeDefinitionRequest.method);
\r
5356 /** @deprecated Use TypeDefinitionRequest.type */
\r
5357 TypeDefinitionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5358 })(TypeDefinitionRequest = exports.TypeDefinitionRequest || (exports.TypeDefinitionRequest = {}));
\r
5363 /***/ (function(module, exports, __webpack_require__) {
5366 /* --------------------------------------------------------------------------------------------
\r
5367 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5368 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5369 * ------------------------------------------------------------------------------------------ */
\r
5371 Object.defineProperty(exports, "__esModule", { value: true });
\r
5372 const messages_1 = __webpack_require__(23);
\r
5374 * The `workspace/workspaceFolders` is sent from the server to the client to fetch the open workspace folders.
\r
5376 var WorkspaceFoldersRequest;
\r
5377 (function (WorkspaceFoldersRequest) {
\r
5378 WorkspaceFoldersRequest.type = new messages_1.ProtocolRequestType0('workspace/workspaceFolders');
\r
5379 })(WorkspaceFoldersRequest = exports.WorkspaceFoldersRequest || (exports.WorkspaceFoldersRequest = {}));
\r
5381 * The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server when the workspace
\r
5382 * folder configuration changes.
\r
5384 var DidChangeWorkspaceFoldersNotification;
\r
5385 (function (DidChangeWorkspaceFoldersNotification) {
\r
5386 DidChangeWorkspaceFoldersNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWorkspaceFolders');
\r
5387 })(DidChangeWorkspaceFoldersNotification = exports.DidChangeWorkspaceFoldersNotification || (exports.DidChangeWorkspaceFoldersNotification = {}));
\r
5392 /***/ (function(module, exports, __webpack_require__) {
5395 /* --------------------------------------------------------------------------------------------
\r
5396 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5397 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5398 * ------------------------------------------------------------------------------------------ */
\r
5400 Object.defineProperty(exports, "__esModule", { value: true });
\r
5401 const messages_1 = __webpack_require__(23);
\r
5403 * The 'workspace/configuration' request is sent from the server to the client to fetch a certain
\r
5404 * configuration setting.
\r
5406 * This pull model replaces the old push model were the client signaled configuration change via an
\r
5407 * event. If the server still needs to react to configuration changes (since the server caches the
\r
5408 * result of `workspace/configuration` requests) the server should register for an empty configuration
\r
5409 * change event and empty the cache if such an event is received.
\r
5411 var ConfigurationRequest;
\r
5412 (function (ConfigurationRequest) {
\r
5413 ConfigurationRequest.type = new messages_1.ProtocolRequestType('workspace/configuration');
\r
5414 })(ConfigurationRequest = exports.ConfigurationRequest || (exports.ConfigurationRequest = {}));
\r
5419 /***/ (function(module, exports, __webpack_require__) {
5422 /* --------------------------------------------------------------------------------------------
\r
5423 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5424 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5425 * ------------------------------------------------------------------------------------------ */
\r
5427 Object.defineProperty(exports, "__esModule", { value: true });
\r
5428 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5429 const messages_1 = __webpack_require__(23);
\r
5431 * A request to list all color symbols found in a given text document. The request's
\r
5432 * parameter is of type [DocumentColorParams](#DocumentColorParams) the
\r
5433 * response is of type [ColorInformation[]](#ColorInformation) or a Thenable
\r
5434 * that resolves to such.
\r
5436 var DocumentColorRequest;
\r
5437 (function (DocumentColorRequest) {
\r
5438 DocumentColorRequest.method = 'textDocument/documentColor';
\r
5439 DocumentColorRequest.type = new messages_1.ProtocolRequestType(DocumentColorRequest.method);
\r
5440 /** @deprecated Use DocumentColorRequest.type */
\r
5441 DocumentColorRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5442 })(DocumentColorRequest = exports.DocumentColorRequest || (exports.DocumentColorRequest = {}));
\r
5444 * A request to list all presentation for a color. The request's
\r
5445 * parameter is of type [ColorPresentationParams](#ColorPresentationParams) the
\r
5446 * response is of type [ColorInformation[]](#ColorInformation) or a Thenable
\r
5447 * that resolves to such.
\r
5449 var ColorPresentationRequest;
\r
5450 (function (ColorPresentationRequest) {
\r
5451 ColorPresentationRequest.type = new messages_1.ProtocolRequestType('textDocument/colorPresentation');
\r
5452 })(ColorPresentationRequest = exports.ColorPresentationRequest || (exports.ColorPresentationRequest = {}));
\r
5457 /***/ (function(module, exports, __webpack_require__) {
5461 /*---------------------------------------------------------------------------------------------
\r
5462 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5463 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5464 *--------------------------------------------------------------------------------------------*/
\r
5465 Object.defineProperty(exports, "__esModule", { value: true });
\r
5466 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5467 const messages_1 = __webpack_require__(23);
\r
5469 * Enum of known range kinds
\r
5471 var FoldingRangeKind;
\r
5472 (function (FoldingRangeKind) {
\r
5474 * Folding range for a comment
\r
5476 FoldingRangeKind["Comment"] = "comment";
\r
5478 * Folding range for a imports or includes
\r
5480 FoldingRangeKind["Imports"] = "imports";
\r
5482 * Folding range for a region (e.g. `#region`)
\r
5484 FoldingRangeKind["Region"] = "region";
\r
5485 })(FoldingRangeKind = exports.FoldingRangeKind || (exports.FoldingRangeKind = {}));
\r
5487 * A request to provide folding ranges in a document. The request's
\r
5488 * parameter is of type [FoldingRangeParams](#FoldingRangeParams), the
\r
5489 * response is of type [FoldingRangeList](#FoldingRangeList) or a Thenable
\r
5490 * that resolves to such.
\r
5492 var FoldingRangeRequest;
\r
5493 (function (FoldingRangeRequest) {
\r
5494 FoldingRangeRequest.method = 'textDocument/foldingRange';
\r
5495 FoldingRangeRequest.type = new messages_1.ProtocolRequestType(FoldingRangeRequest.method);
\r
5496 /** @deprecated Use FoldingRangeRequest.type */
\r
5497 FoldingRangeRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5498 })(FoldingRangeRequest = exports.FoldingRangeRequest || (exports.FoldingRangeRequest = {}));
\r
5503 /***/ (function(module, exports, __webpack_require__) {
5506 /* --------------------------------------------------------------------------------------------
\r
5507 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5508 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5509 * ------------------------------------------------------------------------------------------ */
\r
5511 Object.defineProperty(exports, "__esModule", { value: true });
\r
5512 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5513 const messages_1 = __webpack_require__(23);
\r
5514 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
\r
5515 let __noDynamicImport;
\r
5517 * A request to resolve the type definition locations of a symbol at a given text
\r
5518 * document position. The request's parameter is of type [TextDocumentPositioParams]
\r
5519 * (#TextDocumentPositionParams) the response is of type [Declaration](#Declaration)
\r
5520 * or a typed array of [DeclarationLink](#DeclarationLink) or a Thenable that resolves
\r
5523 var DeclarationRequest;
\r
5524 (function (DeclarationRequest) {
\r
5525 DeclarationRequest.method = 'textDocument/declaration';
\r
5526 DeclarationRequest.type = new messages_1.ProtocolRequestType(DeclarationRequest.method);
\r
5527 /** @deprecated Use DeclarationRequest.type */
\r
5528 DeclarationRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5529 })(DeclarationRequest = exports.DeclarationRequest || (exports.DeclarationRequest = {}));
\r
5534 /***/ (function(module, exports, __webpack_require__) {
5538 /*---------------------------------------------------------------------------------------------
\r
5539 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5540 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5541 *--------------------------------------------------------------------------------------------*/
\r
5542 Object.defineProperty(exports, "__esModule", { value: true });
\r
5543 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5544 const messages_1 = __webpack_require__(23);
\r
5546 * A request to provide selection ranges in a document. The request's
\r
5547 * parameter is of type [SelectionRangeParams](#SelectionRangeParams), the
\r
5548 * response is of type [SelectionRange[]](#SelectionRange[]) or a Thenable
\r
5549 * that resolves to such.
\r
5551 var SelectionRangeRequest;
\r
5552 (function (SelectionRangeRequest) {
\r
5553 SelectionRangeRequest.method = 'textDocument/selectionRange';
\r
5554 SelectionRangeRequest.type = new messages_1.ProtocolRequestType(SelectionRangeRequest.method);
\r
5555 /** @deprecated Use SelectionRangeRequest.type */
\r
5556 SelectionRangeRequest.resultType = new vscode_jsonrpc_1.ProgressType();
\r
5557 })(SelectionRangeRequest = exports.SelectionRangeRequest || (exports.SelectionRangeRequest = {}));
\r
5562 /***/ (function(module, exports, __webpack_require__) {
5565 /* --------------------------------------------------------------------------------------------
\r
5566 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5567 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5568 * ------------------------------------------------------------------------------------------ */
\r
5570 Object.defineProperty(exports, "__esModule", { value: true });
\r
5571 const vscode_jsonrpc_1 = __webpack_require__(9);
\r
5572 const messages_1 = __webpack_require__(23);
\r
5573 var WorkDoneProgress;
\r
5574 (function (WorkDoneProgress) {
\r
5575 WorkDoneProgress.type = new vscode_jsonrpc_1.ProgressType();
\r
5576 })(WorkDoneProgress = exports.WorkDoneProgress || (exports.WorkDoneProgress = {}));
\r
5578 * The `window/workDoneProgress/create` request is sent from the server to the client to initiate progress
\r
5579 * reporting from the server.
\r
5581 var WorkDoneProgressCreateRequest;
\r
5582 (function (WorkDoneProgressCreateRequest) {
\r
5583 WorkDoneProgressCreateRequest.type = new messages_1.ProtocolRequestType('window/workDoneProgress/create');
\r
5584 })(WorkDoneProgressCreateRequest = exports.WorkDoneProgressCreateRequest || (exports.WorkDoneProgressCreateRequest = {}));
\r
5586 * The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress
\r
5587 * initiated on the server side.
\r
5589 var WorkDoneProgressCancelNotification;
\r
5590 (function (WorkDoneProgressCancelNotification) {
\r
5591 WorkDoneProgressCancelNotification.type = new messages_1.ProtocolNotificationType('window/workDoneProgress/cancel');
\r
5592 })(WorkDoneProgressCancelNotification = exports.WorkDoneProgressCancelNotification || (exports.WorkDoneProgressCancelNotification = {}));
\r
5597 /***/ (function(module, exports, __webpack_require__) {
5600 /* --------------------------------------------------------------------------------------------
\r
5601 * Copyright (c) TypeFox and others. All rights reserved.
\r
5602 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5603 * ------------------------------------------------------------------------------------------ */
\r
5605 Object.defineProperty(exports, "__esModule", { value: true });
\r
5606 const messages_1 = __webpack_require__(23);
\r
5608 * A request to result a `CallHierarchyItem` in a document at a given position.
\r
5609 * Can be used as an input to a incoming or outgoing call hierarchy.
\r
5611 * @since 3.16.0 - Proposed state
\r
5613 var CallHierarchyPrepareRequest;
\r
5614 (function (CallHierarchyPrepareRequest) {
\r
5615 CallHierarchyPrepareRequest.method = 'textDocument/prepareCallHierarchy';
\r
5616 CallHierarchyPrepareRequest.type = new messages_1.ProtocolRequestType(CallHierarchyPrepareRequest.method);
\r
5617 })(CallHierarchyPrepareRequest = exports.CallHierarchyPrepareRequest || (exports.CallHierarchyPrepareRequest = {}));
\r
5619 * A request to resolve the incoming calls for a given `CallHierarchyItem`.
\r
5621 * @since 3.16.0 - Proposed state
\r
5623 var CallHierarchyIncomingCallsRequest;
\r
5624 (function (CallHierarchyIncomingCallsRequest) {
\r
5625 CallHierarchyIncomingCallsRequest.method = 'callHierarchy/incomingCalls';
\r
5626 CallHierarchyIncomingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyIncomingCallsRequest.method);
\r
5627 })(CallHierarchyIncomingCallsRequest = exports.CallHierarchyIncomingCallsRequest || (exports.CallHierarchyIncomingCallsRequest = {}));
\r
5629 * A request to resolve the outgoing calls for a given `CallHierarchyItem`.
\r
5631 * @since 3.16.0 - Proposed state
\r
5633 var CallHierarchyOutgoingCallsRequest;
\r
5634 (function (CallHierarchyOutgoingCallsRequest) {
\r
5635 CallHierarchyOutgoingCallsRequest.method = 'callHierarchy/outgoingCalls';
\r
5636 CallHierarchyOutgoingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyOutgoingCallsRequest.method);
\r
5637 })(CallHierarchyOutgoingCallsRequest = exports.CallHierarchyOutgoingCallsRequest || (exports.CallHierarchyOutgoingCallsRequest = {}));
\r
5642 /***/ (function(module, exports, __webpack_require__) {
5645 /* --------------------------------------------------------------------------------------------
\r
5646 * Copyright (c) Microsoft Corporation. All rights reserved.
\r
5647 * Licensed under the MIT License. See License.txt in the project root for license information.
\r
5648 * ------------------------------------------------------------------------------------------ */
\r
5650 Object.defineProperty(exports, "__esModule", { value: true });
\r
5651 const messages_1 = __webpack_require__(23);
\r
5653 * A set of predefined token types. This set is not fixed
\r
5654 * an clients can specify additional token types via the
\r
5655 * corresponding client capabilities.
\r
5657 * @since 3.16.0 - Proposed state
\r
5659 var SemanticTokenTypes;
\r
5660 (function (SemanticTokenTypes) {
\r
5661 SemanticTokenTypes["comment"] = "comment";
\r
5662 SemanticTokenTypes["keyword"] = "keyword";
\r
5663 SemanticTokenTypes["string"] = "string";
\r
5664 SemanticTokenTypes["number"] = "number";
\r
5665 SemanticTokenTypes["regexp"] = "regexp";
\r
5666 SemanticTokenTypes["operator"] = "operator";
\r
5667 SemanticTokenTypes["namespace"] = "namespace";
\r
5668 SemanticTokenTypes["type"] = "type";
\r
5669 SemanticTokenTypes["struct"] = "struct";
\r
5670 SemanticTokenTypes["class"] = "class";
\r
5671 SemanticTokenTypes["interface"] = "interface";
\r
5672 SemanticTokenTypes["enum"] = "enum";
\r
5673 SemanticTokenTypes["typeParameter"] = "typeParameter";
\r
5674 SemanticTokenTypes["function"] = "function";
\r
5675 SemanticTokenTypes["member"] = "member";
\r
5676 SemanticTokenTypes["property"] = "property";
\r
5677 SemanticTokenTypes["macro"] = "macro";
\r
5678 SemanticTokenTypes["variable"] = "variable";
\r
5679 SemanticTokenTypes["parameter"] = "parameter";
\r
5680 SemanticTokenTypes["label"] = "label";
\r
5681 })(SemanticTokenTypes = exports.SemanticTokenTypes || (exports.SemanticTokenTypes = {}));
\r
5683 * A set of predefined token modifiers. This set is not fixed
\r
5684 * an clients can specify additional token types via the
\r
5685 * corresponding client capabilities.
\r
5687 * @since 3.16.0 - Proposed state
\r
5689 var SemanticTokenModifiers;
\r
5690 (function (SemanticTokenModifiers) {
\r
5691 SemanticTokenModifiers["documentation"] = "documentation";
\r
5692 SemanticTokenModifiers["declaration"] = "declaration";
\r
5693 SemanticTokenModifiers["definition"] = "definition";
\r
5694 SemanticTokenModifiers["reference"] = "reference";
\r
5695 SemanticTokenModifiers["static"] = "static";
\r
5696 SemanticTokenModifiers["abstract"] = "abstract";
\r
5697 SemanticTokenModifiers["deprecated"] = "deprecated";
\r
5698 SemanticTokenModifiers["async"] = "async";
\r
5699 SemanticTokenModifiers["volatile"] = "volatile";
\r
5700 SemanticTokenModifiers["readonly"] = "readonly";
\r
5701 })(SemanticTokenModifiers = exports.SemanticTokenModifiers || (exports.SemanticTokenModifiers = {}));
\r
5703 * @since 3.16.0 - Proposed state
\r
5705 var SemanticTokens;
\r
5706 (function (SemanticTokens) {
\r
5707 function is(value) {
\r
5708 const candidate = value;
\r
5709 return candidate !== undefined && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&
\r
5710 Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');
\r
5712 SemanticTokens.is = is;
\r
5713 })(SemanticTokens = exports.SemanticTokens || (exports.SemanticTokens = {}));
\r
5715 * @since 3.16.0 - Proposed state
\r
5717 var SemanticTokensRequest;
\r
5718 (function (SemanticTokensRequest) {
\r
5719 SemanticTokensRequest.method = 'textDocument/semanticTokens';
\r
5720 SemanticTokensRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRequest.method);
\r
5721 })(SemanticTokensRequest = exports.SemanticTokensRequest || (exports.SemanticTokensRequest = {}));
\r
5723 * @since 3.16.0 - Proposed state
\r
5725 var SemanticTokensEditsRequest;
\r
5726 (function (SemanticTokensEditsRequest) {
\r
5727 SemanticTokensEditsRequest.method = 'textDocument/semanticTokens/edits';
\r
5728 SemanticTokensEditsRequest.type = new messages_1.ProtocolRequestType(SemanticTokensEditsRequest.method);
\r
5729 })(SemanticTokensEditsRequest = exports.SemanticTokensEditsRequest || (exports.SemanticTokensEditsRequest = {}));
\r
5731 * @since 3.16.0 - Proposed state
\r
5733 var SemanticTokensRangeRequest;
\r
5734 (function (SemanticTokensRangeRequest) {
\r
5735 SemanticTokensRangeRequest.method = 'textDocument/semanticTokens/range';
\r
5736 SemanticTokensRangeRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRangeRequest.method);
\r
5737 })(SemanticTokensRangeRequest = exports.SemanticTokensRangeRequest || (exports.SemanticTokensRangeRequest = {}));
\r
5742 /***/ (function(module, exports, __webpack_require__) {
5746 var __importDefault = (this && this.__importDefault) || function (mod) {
5747 return (mod && mod.__esModule) ? mod : { "default": mod };
5749 Object.defineProperty(exports, "__esModule", { value: true });
5750 /******************************************************************
5751 MIT License http://www.opensource.org/licenses/mit-license.php
5752 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
5753 *******************************************************************/
5754 const coc_nvim_1 = __webpack_require__(1);
5755 const path_1 = __importDefault(__webpack_require__(4));
5756 const vscode_languageserver_protocol_1 = __webpack_require__(8);
5757 const types_1 = __webpack_require__(36);
5758 const util_1 = __webpack_require__(37);
5759 class ProviderManager {
5761 this.providers = new Map();
5763 regist(provider, name) {
5764 this.providers.set(name, provider);
5765 return vscode_languageserver_protocol_1.Disposable.create(() => {
5766 this.providers.delete(name);
5770 return this.providers.size > 0;
5773 let providers = Array.from(this.providers.values());
5774 await Promise.all(providers.map(provider => {
5775 return provider.init();
5778 async getSnippets(filetype) {
5779 let names = Array.from(this.providers.keys());
5781 for (let name of names) {
5782 let provider = this.providers.get(name);
5783 let snippets = await provider.getSnippets(filetype);
5784 snippets.map(s => s.provider = name);
5785 list.push(...snippets);
5789 async getSnippetFiles(filetype) {
5791 for (let provider of this.providers.values()) {
5792 let res = await provider.getSnippetFiles(filetype);
5793 files = files.concat(res);
5797 async getTriggerSnippets(autoTrigger = false) {
5798 let bufnr = await coc_nvim_1.workspace.nvim.call('bufnr', '%');
5799 let doc = coc_nvim_1.workspace.getDocument(bufnr);
5802 await doc.patchChange();
5803 let position = await coc_nvim_1.workspace.getCursorPosition();
5804 let names = Array.from(this.providers.keys());
5806 for (let name of names) {
5807 let provider = this.providers.get(name);
5808 let items = await provider.getTriggerSnippets(doc, position, autoTrigger);
5809 for (let item of items) {
5810 if (list.findIndex(o => o.prefix == item.prefix) == -1) {
5815 list.sort((a, b) => b.priority - a.priority);
5816 if (list.length > 1 && list[0].priority > 0) {
5817 list = list.filter(o => o.priority > 0);
5821 async provideCompletionItems(document, position, _token, context) {
5822 let doc = coc_nvim_1.workspace.getDocument(document.uri);
5825 let snippets = await this.getSnippets(doc.filetype);
5826 let currline = doc.getline(position.line, true);
5827 let { input, col } = context.option;
5828 let character = characterIndex(currline, col);
5829 let before_content = currline.slice(0, character);
5831 let contextPrefixes = [];
5832 for (let snip of snippets) {
5833 let contentBehind = before_content;
5834 if (contextPrefixes.indexOf(snip.prefix) !== -1)
5836 if (snip.regex != null && snip.prefix == '')
5839 let provider = this.providers.get(snip.provider);
5840 let valid = await provider.checkContext(snip.context);
5843 contextPrefixes.push(snip.prefix);
5845 let head = this.getPrefixHead(doc, snip.prefix);
5846 if (input.length == 0 && !before_content.endsWith(snip.prefix))
5850 kind: vscode_languageserver_protocol_1.CompletionItemKind.Snippet,
5851 filterText: snip.prefix,
5852 detail: snip.description,
5853 insertTextFormat: vscode_languageserver_protocol_1.InsertTextFormat.Snippet
5857 provider: snip.provider,
5858 filepath: `${path_1.default.basename(snip.filepath)}:${snip.lnum}`
5861 if (!input.length || snip.prefix && input[0] != snip.prefix[0])
5863 let content = before_content + snip.prefix;
5864 let ms = content.match(snip.regex);
5868 else if (head && before_content.endsWith(head)) {
5869 contentBehind = before_content.slice(0, -head.length);
5870 let prefix = snip.prefix.slice(head.length);
5871 Object.assign(item, {
5873 range: vscode_languageserver_protocol_1.Range.create({ line: position.line, character: character - head.length }, position),
5878 else if (input.length == 0) {
5879 let { prefix } = snip;
5880 contentBehind = before_content.slice(0, -prefix.length);
5881 Object.assign(item, {
5884 range: vscode_languageserver_protocol_1.Range.create({ line: position.line, character: character - prefix.length }, position),
5889 if (snip.triggerKind == types_1.TriggerKind.LineBegin && contentBehind.trim().length)
5891 if (snip.triggerKind == types_1.TriggerKind.SpaceBefore) {
5892 if (contentBehind.length && !/\s/.test(contentBehind[contentBehind.length - 1])) {
5896 if (!item.textEdit) {
5898 range: vscode_languageserver_protocol_1.Range.create({ line: position.line, character }, position),
5902 item.data.location = `${snip.filepath}:${snip.lnum}`;
5903 item.data.line = contentBehind + snip.prefix;
5908 async resolveCompletionItem(item) {
5909 let provider = this.providers.get(item.data.provider);
5911 let filetype = await coc_nvim_1.workspace.nvim.eval('&filetype');
5912 let insertSnippet = await provider.resolveSnippetBody(item.data.snip, item.textEdit.range, item.data.line);
5913 item.textEdit.newText = insertSnippet;
5914 if (coc_nvim_1.snippetManager) {
5915 let snip = await Promise.resolve(coc_nvim_1.snippetManager.resolveSnippet(insertSnippet));
5916 item.documentation = {
5918 value: util_1.markdownBlock(snip.toString(), filetype)
5924 getPrefixHead(doc, prefix) {
5926 for (let idx = prefix.length - 1; idx >= 0; idx--) {
5927 if (!doc.isWord(prefix[idx])) {
5932 return res == 0 ? '' : prefix.slice(0, res + 1);
5935 exports.ProviderManager = ProviderManager;
5936 function characterIndex(content, byteIndex) {
5937 let buf = Buffer.from(content, 'utf8');
5938 return buf.slice(0, byteIndex).toString('utf8').length;
5940 exports.characterIndex = characterIndex;
5945 /***/ (function(module, exports, __webpack_require__) {
5949 Object.defineProperty(exports, "__esModule", { value: true });
5951 (function (TriggerKind) {
5952 TriggerKind[TriggerKind["SpaceBefore"] = 0] = "SpaceBefore";
5953 TriggerKind[TriggerKind["LineBegin"] = 1] = "LineBegin";
5954 TriggerKind[TriggerKind["WordBoundary"] = 2] = "WordBoundary";
5955 TriggerKind[TriggerKind["InWord"] = 3] = "InWord";
5956 })(TriggerKind = exports.TriggerKind || (exports.TriggerKind = {}));
5961 /***/ (function(module, exports, __webpack_require__) {
5965 var __importDefault = (this && this.__importDefault) || function (mod) {
5966 return (mod && mod.__esModule) ? mod : { "default": mod };
5968 Object.defineProperty(exports, "__esModule", { value: true });
5969 /******************************************************************
5970 MIT License http://www.opensource.org/licenses/mit-license.php
5971 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
5972 *******************************************************************/
5973 const pify_1 = __importDefault(__webpack_require__(38));
5974 const fs_1 = __importDefault(__webpack_require__(3));
5975 const crypto_1 = __importDefault(__webpack_require__(18));
5976 const BASE64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_';
5977 function tostr(bytes) {
5980 for (i = 0; i < bytes.length; i++) {
5981 r.push(BASE64[bytes[i] % 64]);
5986 return tostr(crypto_1.default.randomBytes(10));
5989 function replaceText(content, items) {
5991 items.sort((a, b) => a.index - b.index);
5992 let item = items.shift();
5993 for (let i = 0; i < content.length; i++) {
5994 let idx = item ? item.index : null;
5995 if (idx == null || i != idx) {
5996 res = res + content[i];
5999 res = res + item.newText;
6000 i = i + item.length;
6004 exports.replaceText = replaceText;
6005 function flatten(arr) {
6006 return arr.reduce((p, curr) => p.concat(curr), []);
6008 exports.flatten = flatten;
6009 async function statAsync(filepath) {
6011 return await pify_1.default(fs_1.default.stat)(filepath);
6017 exports.statAsync = statAsync;
6018 async function writeFileAsync(fullpath, content) {
6019 await pify_1.default(fs_1.default.writeFile)(fullpath, content, 'utf8');
6021 exports.writeFileAsync = writeFileAsync;
6022 async function readFileAsync(fullpath, encoding = 'utf8') {
6023 return await pify_1.default(fs_1.default.readFile)(fullpath, encoding);
6025 exports.readFileAsync = readFileAsync;
6026 async function readdirAsync(filepath) {
6028 return await pify_1.default(fs_1.default.readdir)(filepath);
6034 exports.readdirAsync = readdirAsync;
6035 function headTail(line) {
6037 let ms = line.match(/^(\S+)\s+(.*)/);
6040 return [ms[1], ms[2]];
6042 exports.headTail = headTail;
6043 function memorize(_target, key, descriptor) {
6044 let fn = descriptor.get;
6045 if (typeof fn !== 'function')
6047 let memoKey = '$' + key;
6048 descriptor.get = function (...args) {
6049 if (this.hasOwnProperty(memoKey))
6050 return Promise.resolve(this[memoKey]);
6051 return new Promise((resolve, reject) => {
6052 Promise.resolve(fn.apply(this, args)).then(res => {
6053 this[memoKey] = res;
6061 exports.memorize = memorize;
6062 function trimQuote(str) {
6063 if (str.startsWith('"') || str.startsWith("'"))
6064 return str.slice(1, -1);
6067 exports.trimQuote = trimQuote;
6068 function distinct(array, keyFn) {
6070 return array.filter((element, position) => {
6071 return array.indexOf(element) === position;
6074 const seen = Object.create(null);
6075 return array.filter(elem => {
6076 const key = keyFn(elem);
6084 exports.distinct = distinct;
6085 const conditionRe = /\(\?\(\?:\w+\).+\|/;
6086 const bellRe = /\\a/;
6087 const commentRe = /\(\?#.*?\)/;
6088 const stringStartRe = /\\A/;
6089 const namedCaptureRe = /\(\?P<\w+>.*?\)/;
6090 const namedReferenceRe = /\(\?P=(\w+)\)/;
6091 const braceRe = /\^\]/;
6092 const regex = new RegExp(`${bellRe.source}|${commentRe.source}|${stringStartRe.source}|${namedCaptureRe.source}|${namedReferenceRe.source}|${braceRe}`, 'g');
6094 * Convert python regex to javascript regex,
6095 * throw error when unsupported pattern found
6098 * @param {string} str
6101 function convertRegex(str) {
6102 if (str.indexOf('\\z') !== -1) {
6103 throw new Error('pattern \\z not supported');
6105 if (str.indexOf('(?s)') !== -1) {
6106 throw new Error('pattern (?s) not supported');
6108 if (str.indexOf('(?x)') !== -1) {
6109 throw new Error('pattern (?x) not supported');
6111 if (str.indexOf('\n') !== -1) {
6112 throw new Error('multiple line pattern not supported');
6114 if (conditionRe.test(str)) {
6115 throw new Error('condition pattern not supported');
6117 return str.replace(regex, (match, p1) => {
6122 if (match.startsWith('(?#'))
6126 if (match.startsWith('(?P<'))
6127 return '(?' + match.slice(3);
6128 if (match.startsWith('(?P='))
6129 return `\\k<${p1}>`;
6133 exports.convertRegex = convertRegex;
6135 return new Promise(resolve => {
6141 exports.wait = wait;
6142 function getRegexText(prefix) {
6143 if (prefix.startsWith('^'))
6144 prefix = prefix.slice(1);
6145 if (prefix.endsWith('$'))
6146 prefix = prefix.slice(0, -1);
6147 let content = prefix.replace(/\(.*\)\??/g, '');
6148 content = content.replace(/\\/g, '');
6151 exports.getRegexText = getRegexText;
6152 function markdownBlock(code, filetype) {
6153 filetype = filetype == 'javascriptreact' ? 'javascript' : filetype;
6154 filetype = filetype == 'typescriptreact' ? 'typescript' : filetype;
6155 return '``` ' + filetype + '\n' + code + '\n```';
6157 exports.markdownBlock = markdownBlock;
6162 /***/ (function(module, exports, __webpack_require__) {
6167 const processFn = (fn, options, proxy, unwrapped) => function (...arguments_) {
6168 const P = options.promiseModule;
6170 return new P((resolve, reject) => {
6171 if (options.multiArgs) {
6172 arguments_.push((...result) => {
6173 if (options.errorFirst) {
6184 } else if (options.errorFirst) {
6185 arguments_.push((error, result) => {
6193 arguments_.push(resolve);
6196 const self = this === proxy ? unwrapped : this;
6197 Reflect.apply(fn, self, arguments_);
6201 const filterCache = new WeakMap();
6203 module.exports = (input, options) => {
6205 exclude: [/.+(?:Sync|Stream)$/],
6207 promiseModule: Promise,
6211 const objectType = typeof input;
6212 if (!(input !== null && (objectType === 'object' || objectType === 'function'))) {
6213 throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objectType}\``);
6216 const filter = (target, key) => {
6217 let cached = filterCache.get(target);
6221 filterCache.set(target, cached);
6224 if (key in cached) {
6228 const match = pattern => (typeof pattern === 'string' || typeof key === 'symbol') ? key === pattern : pattern.test(key);
6229 const desc = Reflect.getOwnPropertyDescriptor(target, key);
6230 const writableOrConfigurableOwn = (desc === undefined || desc.writable || desc.configurable);
6231 const included = options.include ? options.include.some(match) : !options.exclude.some(match);
6232 const shouldFilter = included && writableOrConfigurableOwn;
6233 cached[key] = shouldFilter;
6234 return shouldFilter;
6237 const cache = new WeakMap();
6239 const proxy = new Proxy(input, {
6240 apply(target, thisArg, args) {
6241 const cached = cache.get(target);
6244 return Reflect.apply(cached, thisArg, args);
6247 const pified = options.excludeMain ? target : processFn(target, options, proxy, target);
6248 cache.set(target, pified);
6249 return Reflect.apply(pified, thisArg, args);
6253 const property = target[key];
6255 // eslint-disable-next-line no-use-extend-native/no-use-extend-native
6256 if (!filter(target, key) || property === Function.prototype[key]) {
6260 const cached = cache.get(property);
6266 if (typeof property === 'function') {
6267 const pified = processFn(property, options, proxy, target);
6268 cache.set(property, pified);
6282 /***/ (function(module, exports, __webpack_require__) {
6286 var __importDefault = (this && this.__importDefault) || function (mod) {
6287 return (mod && mod.__esModule) ? mod : { "default": mod };
6289 Object.defineProperty(exports, "__esModule", { value: true });
6290 /******************************************************************
6291 MIT License http://www.opensource.org/licenses/mit-license.php
6292 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
6293 *******************************************************************/
6294 const coc_nvim_1 = __webpack_require__(1);
6295 const fs_1 = __importDefault(__webpack_require__(3));
6296 const path_1 = __importDefault(__webpack_require__(4));
6297 const readline_1 = __importDefault(__webpack_require__(40));
6298 const vscode_languageserver_types_1 = __webpack_require__(6);
6299 const baseProvider_1 = __importDefault(__webpack_require__(41));
6300 const types_1 = __webpack_require__(36);
6301 const util_1 = __webpack_require__(37);
6302 const parser_1 = __importDefault(__webpack_require__(42));
6303 class SnipmateProvider extends baseProvider_1.default {
6304 constructor(channel, trace, config) {
6306 this.channel = channel;
6308 this.snippetFiles = [];
6309 this.disposables = [];
6310 coc_nvim_1.workspace.onDidSaveTextDocument(async (doc) => {
6311 let uri = coc_nvim_1.Uri.parse(doc.uri);
6312 if (uri.scheme != 'file')
6314 let filepath = uri.fsPath;
6315 if (!fs_1.default.existsSync(filepath))
6317 let snippetFile = this.snippetFiles.find(s => s.filepath == filepath);
6319 await this.loadSnippetsFromFile(snippetFile.filetype, snippetFile.directory, filepath);
6320 }, null, this.disposables);
6323 let arr = await this.getAllSnippetFiles();
6324 let { nvim } = coc_nvim_1.workspace;
6325 let author = await nvim.getVar('snips_author');
6327 await nvim.setVar('snips_author', this.config.author);
6328 await Promise.all(arr.map(({ filepath, directory, filetype }) => {
6329 return this.loadSnippetsFromFile(filetype, directory, filepath);
6332 async loadSnippetsFromFile(filetype, directory, filepath) {
6333 let snippets = await this.parseSnippetsFile(filepath);
6334 let idx = this.snippetFiles.findIndex(o => o.filepath == filepath);
6336 this.snippetFiles.splice(idx, 1);
6337 this.snippetFiles.push({
6343 if (this.trace == 'verbose') {
6344 this.channel.appendLine(`[Info ${(new Date()).toLocaleTimeString()}] Loaded ${snippets.length} snippets from: ${filepath}`);
6348 * Resolve snippet body to inserted text.
6351 * @param {Snippet} snippet
6352 * @param {Range} _range
6353 * @param {string} _line
6354 * @returns {Promise<string>}
6356 async resolveSnippetBody(snippet, _range, _line) {
6357 let parser = new parser_1.default(snippet.body);
6359 let { nvim } = coc_nvim_1.workspace;
6360 while (!parser.eof()) {
6361 if (parser.curr == '`') {
6362 let idx = parser.nextIndex('`', true, false);
6364 resolved = resolved + parser.eatTo(parser.len);
6367 let code = parser.eatTo(idx + 1);
6368 code = code.slice(1, -1);
6369 if (code.startsWith('Filename')) {
6370 resolved = resolved + await nvim.call('expand', '%:p:t');
6374 resolved = resolved + await nvim.eval(code);
6377 this.channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}] Error on eval: ${code}`);
6382 parser.iterate(ch => {
6387 resolved = resolved + ch;
6395 * Parse snippets from snippets file.
6398 * @param {string} filepath
6399 * @returns {Promise<Snippet[]>}
6401 parseSnippetsFile(filepath) {
6403 const rl = readline_1.default.createInterface({
6404 input: fs_1.default.createReadStream(filepath, 'utf8'),
6410 let description = '';
6411 rl.on('line', line => {
6413 if (line.startsWith('#'))
6415 if (line.startsWith('snippet')) {
6416 line = line.replace(/\s*$/, '');
6417 if (lines.length && prefix) {
6420 lnum: lnum - lines.length - 1,
6421 body: lines.join('\n').replace(/\s+$/, ''),
6424 triggerKind: types_1.TriggerKind.SpaceBefore
6428 let ms = line.match(/^snippet\s+(\S+)(?:\s(.+))?$/);
6431 this.channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}] Broken line on ${filepath}:${lnum}`);
6435 description = ms[2] || '';
6439 if (line.indexOf('VISUAL') !== -1) {
6440 line = line.replace(/\$(\{?)VISUAL\b(:[^\}])?(\}?)/g, '$$$1TM_SELECTED_TEXT$2$3');
6442 if (line.startsWith('\t')) {
6443 lines.push(line.slice(1));
6450 return new Promise(resolve => {
6451 rl.on('close', async () => {
6455 lnum: lnum - lines.length - 1,
6456 body: lines.join('\n'),
6459 triggerKind: types_1.TriggerKind.SpaceBefore
6466 async getTriggerSnippets(document, position, autoTrigger) {
6469 let snippets = await this.getSnippets(document.filetype);
6470 let line = document.getline(position.line);
6471 line = line.slice(0, position.character);
6472 if (!line || line[line.length - 1] == ' ')
6474 snippets = snippets.filter(s => {
6476 if (!line.endsWith(prefix))
6478 let pre = line.slice(0, line.length - prefix.length);
6479 return pre.length == 0 || /\s/.test(pre[pre.length - 1]);
6482 for (let s of snippets) {
6483 let character = position.character - s.prefix.length;
6484 let range = vscode_languageserver_types_1.Range.create(position.line, character, position.line, position.character);
6485 let newText = await this.resolveSnippetBody(s, range, line);
6488 description: s.description,
6489 location: s.filepath,
6497 async getSnippetFiles(filetype) {
6498 let filetypes = this.getFiletypes(filetype);
6500 for (let s of this.snippetFiles) {
6501 if (filetypes.indexOf(s.filetype) !== -1) {
6502 res.push(s.filepath);
6507 async getSnippets(filetype) {
6508 let filetypes = this.getFiletypes(filetype);
6509 filetypes.push('_');
6510 let snippetFiles = this.snippetFiles.filter(o => filetypes.indexOf(o.filetype) !== -1);
6512 snippetFiles.sort((a, b) => {
6513 if (a.filetype == b.filetype)
6515 if (a.filetype == filetype)
6519 for (let file of snippetFiles) {
6520 let { snippets } = file;
6521 for (let snip of snippets) {
6527 async getAllSnippetFiles() {
6528 let { nvim } = coc_nvim_1.workspace;
6529 let opt = await nvim.eval('&rtp');
6530 let rtps = opt.split(',');
6532 for (let rtp of rtps) {
6533 let items = await this.getSnippetFileItems(path_1.default.join(rtp, 'snippets'));
6538 async getSnippetFileItems(directory) {
6540 let stat = await util_1.statAsync(directory);
6541 if (stat && stat.isDirectory()) {
6542 let files = await util_1.readdirAsync(directory);
6544 for (let f of files) {
6545 let file = path_1.default.join(directory, f);
6546 if (file.endsWith('.snippets')) {
6547 let basename = path_1.default.basename(f, '.snippets');
6548 let filetype = basename.split('-', 2)[0];
6549 res.push({ filepath: file, directory, filetype });
6552 let stat = await util_1.statAsync(file);
6553 if (stat && stat.isDirectory()) {
6554 let files = await util_1.readdirAsync(file);
6555 for (let filename of files) {
6556 if (filename.endsWith('.snippets')) {
6557 res.push({ filepath: path_1.default.join(file, filename), directory, filetype: f });
6568 exports.SnipmateProvider = SnipmateProvider;
6573 /***/ (function(module, exports) {
6575 module.exports = require("readline");
6579 /***/ (function(module, exports, __webpack_require__) {
6583 Object.defineProperty(exports, "__esModule", { value: true });
6584 const coc_nvim_1 = __webpack_require__(1);
6585 const util_1 = __webpack_require__(37);
6586 class BaseProvider {
6587 constructor(config) {
6588 this.config = config;
6590 async checkContext(_context) {
6593 getExtendsFiletypes(filetype, exists = new Set()) {
6594 if (exists.has(filetype))
6596 let extend = this.config.extends ? this.config.extends[filetype] : null;
6597 exists.add(filetype);
6598 if (!extend || extend.length == 0)
6600 return extend.reduce((arr, curr) => {
6601 return arr.concat([curr], this.getExtendsFiletypes(curr, exists));
6604 getFiletypes(filetype) {
6605 let filetypes = [filetype];
6606 if (filetype.indexOf('.') !== -1) {
6607 filetypes.push(...filetype.split('.'));
6609 if (filetype == 'javascript.jsx')
6610 filetypes.push('javascriptreact');
6611 if (filetype == 'typescript.jsx' || filetype == 'typescript.tsx')
6612 filetypes.push('typescriptreact');
6613 let map = coc_nvim_1.workspace.env.filetypeMap;
6614 if (map && map[filetype]) {
6615 filetypes.push(map[filetype]);
6617 let extendFiletypes = filetypes.reduce((arr, curr) => {
6618 return arr.concat(this.getExtendsFiletypes(curr));
6620 filetypes.push(...extendFiletypes);
6621 filetypes.reverse();
6622 return util_1.distinct(filetypes);
6625 exports.default = BaseProvider;
6630 /***/ (function(module, exports, __webpack_require__) {
6634 /******************************************************************
6635 MIT License http://www.opensource.org/licenses/mit-license.php
6636 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
6637 *******************************************************************/
6638 Object.defineProperty(exports, "__esModule", { value: true });
6640 * A very basic parser
6645 constructor(_content) {
6646 this._content = _content;
6650 return this._curr >= this._content.length;
6653 for (let i = this._curr; i <= this._content.length; i++) {
6654 let ch = this._content[i];
6655 if (!ch || /\S/.test(ch)) {
6665 return this._content[this._curr] || '';
6668 return this._content.length;
6671 return this._content.slice(this._curr + 1, this._curr + 1 + count);
6673 nextIndex(character, checkEscape = true, allowEnd = true) {
6674 if (this._curr >= this.len - 1)
6675 return allowEnd ? this.len - 1 : -1;
6676 let i = this._curr + 1;
6677 let pre = this.curr || '';
6678 while (i != this.len - 1) {
6679 let ch = this._content[i];
6680 if (ch == character && (!checkEscape || pre !== '\\')) {
6686 if (!allowEnd && i == this.len - 1 && character != this._content[i]) {
6692 return this._content[this._curr - 1] || '';
6695 while (this._curr < this._content.length) {
6696 let fine = fn(this.curr, this._curr);
6697 if (fine === false) {
6700 this._curr = this._curr + 1;
6704 let end = this._curr + count;
6705 end = Math.min(end, this.len);
6706 let str = this._content.slice(this._curr, end);
6710 // make curr to index, return contnet between curr (inclusive) and index (exclusive)
6712 if (index == this._curr)
6714 let str = this._content.slice(this._curr, index);
6719 exports.default = Parser;
6724 /***/ (function(module, exports, __webpack_require__) {
6728 var __importDefault = (this && this.__importDefault) || function (mod) {
6729 return (mod && mod.__esModule) ? mod : { "default": mod };
6731 Object.defineProperty(exports, "__esModule", { value: true });
6732 const coc_nvim_1 = __webpack_require__(1);
6733 const fs_1 = __importDefault(__webpack_require__(3));
6734 const jsonc_parser_1 = __webpack_require__(44);
6735 const os_1 = __importDefault(__webpack_require__(2));
6736 const path_1 = __importDefault(__webpack_require__(4));
6737 const util_1 = __importDefault(__webpack_require__(5));
6738 const vscode_languageserver_types_1 = __webpack_require__(6);
6739 const baseProvider_1 = __importDefault(__webpack_require__(41));
6740 const types_1 = __webpack_require__(36);
6741 const util_2 = __webpack_require__(37);
6742 class TextmateProvider extends baseProvider_1.default {
6743 constructor(channel, trace, config) {
6745 this.channel = channel;
6747 this._snippetCache = {};
6748 this._userSnippets = {};
6749 if (config.loadFromExtensions) {
6750 coc_nvim_1.extensions.onDidLoadExtension(extension => {
6751 this.loadSnippetsFromExtension(extension).catch(e => {
6752 channel.appendLine(`[Error] ${e.message}`);
6755 coc_nvim_1.extensions.onDidUnloadExtension(id => {
6756 delete this._snippetCache[id];
6761 if (this.config.loadFromExtensions) {
6762 for (let extension of coc_nvim_1.extensions.all) {
6763 await this.loadSnippetsFromExtension(extension);
6766 let paths = this.config.snippetsRoots;
6767 if (paths && paths.length) {
6768 for (let dir of paths) {
6769 await this.loadSnippetsFromRoot(dir);
6773 async getSnippetFiles(filetype) {
6774 let filetypes = this.getFiletypes(filetype);
6776 if (this.config.loadFromExtensions) {
6777 for (let key of Object.keys(this._snippetCache)) {
6778 let cache = this._snippetCache[key];
6779 for (let filetype of filetypes) {
6780 let snippets = cache[filetype];
6781 if (snippets && snippets.length) {
6782 filepaths.push(snippets[0].filepath);
6787 for (let filetype of filetypes) {
6788 let snippets = this._userSnippets[filetype];
6789 if (snippets && snippets.length) {
6790 for (let snip of snippets) {
6791 let { filepath } = snip;
6792 if (filepaths.indexOf(filepath) == -1) {
6793 filepaths.push(filepath);
6798 return util_2.distinct(filepaths);
6800 async getTriggerSnippets(document, position, autoTrigger) {
6803 let line = document.getline(position.line);
6804 line = line.slice(0, position.character);
6805 let snippets = await this.getSnippets(document.filetype);
6806 if (!snippets || !snippets.length)
6809 for (let snip of snippets) {
6810 let { prefix } = snip;
6811 if (!line.endsWith(prefix))
6813 let pre = line.slice(0, line.length - prefix.length);
6814 // not allowed after word
6815 if (pre.length && /\w/.test(pre[pre.length - 1]))
6819 range: vscode_languageserver_types_1.Range.create(position.line, position.character - prefix.length, position.line, position.character),
6821 location: snip.filepath,
6822 description: snip.description,
6828 async getSnippets(filetype) {
6830 let filetypes = this.getFiletypes(filetype);
6831 let added = new Set();
6832 for (let key of Object.keys(this._snippetCache)) {
6833 let cache = this._snippetCache[key];
6834 for (let filetype of filetypes) {
6835 let snippets = cache[filetype];
6837 for (let snip of snippets) {
6838 if (!added.has(snip.prefix)) {
6839 added.add(snip.prefix);
6846 for (let filetype of filetypes) {
6847 let snippets = this._userSnippets[filetype];
6848 if (snippets && snippets.length) {
6849 for (let snip of snippets) {
6850 if (!added.has(snip.prefix)) {
6851 added.add(snip.prefix);
6859 async resolveSnippetBody(snip, _range) {
6862 async loadSnippetsFromExtension(extension) {
6863 let { packageJSON } = extension;
6864 if (packageJSON.contributes && packageJSON.contributes.snippets) {
6865 let { snippets } = packageJSON.contributes;
6867 extensionId: extension.id,
6870 for (let item of snippets) {
6871 let p = path_1.default.join(extension.extensionPath, item.path);
6872 let { language } = item;
6874 languageId: language,
6878 if (snippets && snippets.length) {
6879 await this.loadSnippetsFromDefinition(def);
6883 async loadSnippetsFromRoot(root) {
6884 let { _userSnippets } = this;
6885 if (root.startsWith('~'))
6886 root = root.replace(/^~/, os_1.default.homedir());
6887 let files = await util_1.default.promisify(fs_1.default.readdir)(root, 'utf8');
6888 files = files.filter(f => f.endsWith('.json') || f.endsWith('.code-snippets'));
6889 await Promise.all(files.map(file => {
6890 file = path_1.default.join(root, file);
6891 let basename = path_1.default.basename(file, '.json');
6892 basename = basename.replace(/\.code-snippets$/, '');
6893 return this.loadSnippetsFromFile(file).then(snippets => {
6894 _userSnippets[basename] = snippets;
6898 async loadSnippetsFromDefinition(def) {
6899 let { extensionId, snippets } = def;
6900 let cache = this._snippetCache[extensionId] = {};
6901 for (let item of snippets) {
6902 let { languageId } = item;
6903 if (!fs_1.default.existsSync(item.filepath))
6905 let arr = await this.loadSnippetsFromFile(item.filepath);
6906 let exists = cache[languageId] || [];
6907 cache[languageId] = [...exists, ...arr];
6910 async loadSnippetsFromFile(snippetFilePath) {
6911 const contents = await new Promise((resolve, reject) => {
6912 fs_1.default.readFile(snippetFilePath, "utf8", (err, data) => {
6918 const snippets = this.loadSnippetsFromText(snippetFilePath, contents);
6919 if (this.trace == 'verbose') {
6920 this.channel.appendLine(`[Info ${(new Date()).toLocaleDateString()}] Loaded ${snippets.length} snippets from ${snippetFilePath}`);
6924 loadSnippetsFromText(filepath, contents) {
6928 let snippetObject = jsonc_parser_1.parse(contents, errors, { allowTrailingComma: true });
6929 if (errors.length) {
6930 this.channel.appendLine(`[Error ${(new Date()).toLocaleDateString()}] parser error: ${errors[0].error}`);
6932 if (snippetObject) {
6933 for (let key of Object.keys(snippetObject)) {
6934 snippets.push(snippetObject[key]);
6939 this.channel.appendLine(`[Error ${(new Date()).toLocaleDateString()}] ${ex.stack}`);
6942 const normalizedSnippets = snippets.map((snip) => {
6943 let prefix = Array.isArray(snip.prefix) ? snip.prefix[0] : snip.prefix;
6947 body: typeof snip.body === 'string' ? snip.body : snip.body.join('\n'),
6949 description: typeof snip.description === 'string' ? snip.description : typeof snip.description !== 'undefined' ? snip.description.join('\n') : '',
6950 triggerKind: types_1.TriggerKind.WordBoundary
6953 return normalizedSnippets;
6956 exports.TextmateProvider = TextmateProvider;
6961 /***/ (function(module, __webpack_exports__, __webpack_require__) {
6964 __webpack_require__.r(__webpack_exports__);
6965 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createScanner", function() { return createScanner; });
6966 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocation", function() { return getLocation; });
6967 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; });
6968 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseTree", function() { return parseTree; });
6969 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNodeAtLocation", function() { return findNodeAtLocation; });
6970 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNodeAtOffset", function() { return findNodeAtOffset; });
6971 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNodePath", function() { return getNodePath; });
6972 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNodeValue", function() { return getNodeValue; });
6973 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "visit", function() { return visit; });
6974 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stripComments", function() { return stripComments; });
6975 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "printParseErrorCode", function() { return printParseErrorCode; });
6976 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "format", function() { return format; });
6977 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modify", function() { return modify; });
6978 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyEdits", function() { return applyEdits; });
6979 /* harmony import */ var _impl_format__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(45);
6980 /* harmony import */ var _impl_edit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47);
6981 /* harmony import */ var _impl_scanner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46);
6982 /* harmony import */ var _impl_parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(48);
6983 /*---------------------------------------------------------------------------------------------
6984 * Copyright (c) Microsoft Corporation. All rights reserved.
6985 * Licensed under the MIT License. See License.txt in the project root for license information.
6986 *--------------------------------------------------------------------------------------------*/
6993 * Creates a JSON scanner on the given text.
6994 * If ignoreTrivia is set, whitespaces or comments are ignored.
6996 var createScanner = _impl_scanner__WEBPACK_IMPORTED_MODULE_2__["createScanner"];
6998 * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.
7000 var getLocation = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["getLocation"];
7002 * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.
7003 * Therefore, always check the errors list to find out if the input was valid.
7005 var parse = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["parse"];
7007 * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.
7009 var parseTree = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["parseTree"];
7011 * Finds the node at the given path in a JSON DOM.
7013 var findNodeAtLocation = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["findNodeAtLocation"];
7015 * Finds the innermost node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.
7017 var findNodeAtOffset = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["findNodeAtOffset"];
7019 * Gets the JSON path of the given JSON DOM node
7021 var getNodePath = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["getNodePath"];
7023 * Evaluates the JavaScript object of the given JSON DOM node
7025 var getNodeValue = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["getNodeValue"];
7027 * Parses the given text and invokes the visitor functions for each object, array and literal reached.
7029 var visit = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["visit"];
7031 * Takes JSON with JavaScript-style comments and remove
7032 * them. Optionally replaces every none-newline character
7033 * of comments with a replaceCharacter
7035 var stripComments = _impl_parser__WEBPACK_IMPORTED_MODULE_3__["stripComments"];
7036 function printParseErrorCode(code) {
7038 case 1 /* InvalidSymbol */: return 'InvalidSymbol';
7039 case 2 /* InvalidNumberFormat */: return 'InvalidNumberFormat';
7040 case 3 /* PropertyNameExpected */: return 'PropertyNameExpected';
7041 case 4 /* ValueExpected */: return 'ValueExpected';
7042 case 5 /* ColonExpected */: return 'ColonExpected';
7043 case 6 /* CommaExpected */: return 'CommaExpected';
7044 case 7 /* CloseBraceExpected */: return 'CloseBraceExpected';
7045 case 8 /* CloseBracketExpected */: return 'CloseBracketExpected';
7046 case 9 /* EndOfFileExpected */: return 'EndOfFileExpected';
7047 case 10 /* InvalidCommentToken */: return 'InvalidCommentToken';
7048 case 11 /* UnexpectedEndOfComment */: return 'UnexpectedEndOfComment';
7049 case 12 /* UnexpectedEndOfString */: return 'UnexpectedEndOfString';
7050 case 13 /* UnexpectedEndOfNumber */: return 'UnexpectedEndOfNumber';
7051 case 14 /* InvalidUnicode */: return 'InvalidUnicode';
7052 case 15 /* InvalidEscapeCharacter */: return 'InvalidEscapeCharacter';
7053 case 16 /* InvalidCharacter */: return 'InvalidCharacter';
7055 return '<unknown ParseErrorCode>';
7058 * Computes the edits needed to format a JSON document.
7060 * @param documentText The input text
7061 * @param range The range to format or `undefined` to format the full content
7062 * @param options The formatting options
7063 * @returns A list of edit operations describing the formatting changes to the original document. Edits can be either inserts, replacements or
7064 * removals of text segments. All offsets refer to the original state of the document. No two edits must change or remove the same range of
7065 * text in the original document. However, multiple edits can have
7066 * the same offset, for example multiple inserts, or an insert followed by a remove or replace. The order in the array defines which edit is applied first.
7067 * To apply edits to an input, you can use `applyEdits`.
7069 function format(documentText, range, options) {
7070 return _impl_format__WEBPACK_IMPORTED_MODULE_0__["format"](documentText, range, options);
7073 * Computes the edits needed to modify a value in the JSON document.
7075 * @param documentText The input text
7076 * @param path The path of the value to change. The path represents either to the document root, a property or an array item.
7077 * If the path points to an non-existing property or item, it will be created.
7078 * @param value The new value for the specified property or item. If the value is undefined,
7079 * the property or item will be removed.
7080 * @param options Options
7081 * @returns A list of edit operations describing the formatting changes to the original document. Edits can be either inserts, replacements or
7082 * removals of text segments. All offsets refer to the original state of the document. No two edits must change or remove the same range of
7083 * text in the original document. However, multiple edits can have
7084 * the same offset, for example multiple inserts, or an insert followed by a remove or replace. The order in the array defines which edit is applied first.
7085 * To apply edits to an input, you can use `applyEdits`.
7087 function modify(text, path, value, options) {
7088 return _impl_edit__WEBPACK_IMPORTED_MODULE_1__["setProperty"](text, path, value, options.formattingOptions, options.getInsertionIndex);
7091 * Applies edits to a input string.
7093 function applyEdits(text, edits) {
7094 for (var i = edits.length - 1; i >= 0; i--) {
7095 text = _impl_edit__WEBPACK_IMPORTED_MODULE_1__["applyEdit"](text, edits[i]);
7103 /***/ (function(module, __webpack_exports__, __webpack_require__) {
7106 __webpack_require__.r(__webpack_exports__);
7107 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "format", function() { return format; });
7108 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEOL", function() { return isEOL; });
7109 /* harmony import */ var _scanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(46);
7110 /*---------------------------------------------------------------------------------------------
7111 * Copyright (c) Microsoft Corporation. All rights reserved.
7112 * Licensed under the MIT License. See License.txt in the project root for license information.
7113 *--------------------------------------------------------------------------------------------*/
7116 function format(documentText, range, options) {
7117 var initialIndentLevel;
7119 var formatTextStart;
7123 rangeStart = range.offset;
7124 rangeEnd = rangeStart + range.length;
7125 formatTextStart = rangeStart;
7126 while (formatTextStart > 0 && !isEOL(documentText, formatTextStart - 1)) {
7129 var endOffset = rangeEnd;
7130 while (endOffset < documentText.length && !isEOL(documentText, endOffset)) {
7133 formatText = documentText.substring(formatTextStart, endOffset);
7134 initialIndentLevel = computeIndentLevel(formatText, options);
7137 formatText = documentText;
7138 initialIndentLevel = 0;
7139 formatTextStart = 0;
7141 rangeEnd = documentText.length;
7143 var eol = getEOL(options, documentText);
7144 var lineBreak = false;
7145 var indentLevel = 0;
7147 if (options.insertSpaces) {
7148 indentValue = repeat(' ', options.tabSize || 4);
7153 var scanner = Object(_scanner__WEBPACK_IMPORTED_MODULE_0__["createScanner"])(formatText, false);
7154 var hasError = false;
7155 function newLineAndIndent() {
7156 return eol + repeat(indentValue, initialIndentLevel + indentLevel);
7158 function scanNext() {
7159 var token = scanner.scan();
7161 while (token === 15 /* Trivia */ || token === 14 /* LineBreakTrivia */) {
7162 lineBreak = lineBreak || (token === 14 /* LineBreakTrivia */);
7163 token = scanner.scan();
7165 hasError = token === 16 /* Unknown */ || scanner.getTokenError() !== 0 /* None */;
7168 var editOperations = [];
7169 function addEdit(text, startOffset, endOffset) {
7170 if (!hasError && startOffset < rangeEnd && endOffset > rangeStart && documentText.substring(startOffset, endOffset) !== text) {
7171 editOperations.push({ offset: startOffset, length: endOffset - startOffset, content: text });
7174 var firstToken = scanNext();
7175 if (firstToken !== 17 /* EOF */) {
7176 var firstTokenStart = scanner.getTokenOffset() + formatTextStart;
7177 var initialIndent = repeat(indentValue, initialIndentLevel);
7178 addEdit(initialIndent, formatTextStart, firstTokenStart);
7180 while (firstToken !== 17 /* EOF */) {
7181 var firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;
7182 var secondToken = scanNext();
7183 var replaceContent = '';
7184 while (!lineBreak && (secondToken === 12 /* LineCommentTrivia */ || secondToken === 13 /* BlockCommentTrivia */)) {
7185 // comments on the same line: keep them on the same line, but ignore them otherwise
7186 var commentTokenStart = scanner.getTokenOffset() + formatTextStart;
7187 addEdit(' ', firstTokenEnd, commentTokenStart);
7188 firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;
7189 replaceContent = secondToken === 12 /* LineCommentTrivia */ ? newLineAndIndent() : '';
7190 secondToken = scanNext();
7192 if (secondToken === 2 /* CloseBraceToken */) {
7193 if (firstToken !== 1 /* OpenBraceToken */) {
7195 replaceContent = newLineAndIndent();
7198 else if (secondToken === 4 /* CloseBracketToken */) {
7199 if (firstToken !== 3 /* OpenBracketToken */) {
7201 replaceContent = newLineAndIndent();
7205 switch (firstToken) {
7206 case 3 /* OpenBracketToken */:
7207 case 1 /* OpenBraceToken */:
7209 replaceContent = newLineAndIndent();
7211 case 5 /* CommaToken */:
7212 case 12 /* LineCommentTrivia */:
7213 replaceContent = newLineAndIndent();
7215 case 13 /* BlockCommentTrivia */:
7217 replaceContent = newLineAndIndent();
7220 // symbol following comment on the same line: keep on same line, separate with ' '
7221 replaceContent = ' ';
7224 case 6 /* ColonToken */:
7225 replaceContent = ' ';
7227 case 10 /* StringLiteral */:
7228 if (secondToken === 6 /* ColonToken */) {
7229 replaceContent = '';
7233 case 7 /* NullKeyword */:
7234 case 8 /* TrueKeyword */:
7235 case 9 /* FalseKeyword */:
7236 case 11 /* NumericLiteral */:
7237 case 2 /* CloseBraceToken */:
7238 case 4 /* CloseBracketToken */:
7239 if (secondToken === 12 /* LineCommentTrivia */ || secondToken === 13 /* BlockCommentTrivia */) {
7240 replaceContent = ' ';
7242 else if (secondToken !== 5 /* CommaToken */ && secondToken !== 17 /* EOF */) {
7246 case 16 /* Unknown */:
7250 if (lineBreak && (secondToken === 12 /* LineCommentTrivia */ || secondToken === 13 /* BlockCommentTrivia */)) {
7251 replaceContent = newLineAndIndent();
7254 var secondTokenStart = scanner.getTokenOffset() + formatTextStart;
7255 addEdit(replaceContent, firstTokenEnd, secondTokenStart);
7256 firstToken = secondToken;
7258 return editOperations;
7260 function repeat(s, count) {
7262 for (var i = 0; i < count; i++) {
7267 function computeIndentLevel(content, options) {
7270 var tabSize = options.tabSize || 4;
7271 while (i < content.length) {
7272 var ch = content.charAt(i);
7276 else if (ch === '\t') {
7284 return Math.floor(nChars / tabSize);
7286 function getEOL(options, text) {
7287 for (var i = 0; i < text.length; i++) {
7288 var ch = text.charAt(i);
7290 if (i + 1 < text.length && text.charAt(i + 1) === '\n') {
7295 else if (ch === '\n') {
7299 return (options && options.eol) || '\n';
7301 function isEOL(text, offset) {
7302 return '\r\n'.indexOf(text.charAt(offset)) !== -1;
7308 /***/ (function(module, __webpack_exports__, __webpack_require__) {
7311 __webpack_require__.r(__webpack_exports__);
7312 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createScanner", function() { return createScanner; });
7313 /*---------------------------------------------------------------------------------------------
7314 * Copyright (c) Microsoft Corporation. All rights reserved.
7315 * Licensed under the MIT License. See License.txt in the project root for license information.
7316 *--------------------------------------------------------------------------------------------*/
7319 * Creates a JSON scanner on the given text.
7320 * If ignoreTrivia is set, whitespaces or comments are ignored.
7322 function createScanner(text, ignoreTrivia) {
7323 if (ignoreTrivia === void 0) { ignoreTrivia = false; }
7324 var len = text.length;
7325 var pos = 0, value = '', tokenOffset = 0, token = 16 /* Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* None */;
7326 function scanHexDigits(count, exact) {
7329 while (digits < count || !exact) {
7330 var ch = text.charCodeAt(pos);
7331 if (ch >= 48 /* _0 */ && ch <= 57 /* _9 */) {
7332 value = value * 16 + ch - 48 /* _0 */;
7334 else if (ch >= 65 /* A */ && ch <= 70 /* F */) {
7335 value = value * 16 + ch - 65 /* A */ + 10;
7337 else if (ch >= 97 /* a */ && ch <= 102 /* f */) {
7338 value = value * 16 + ch - 97 /* a */ + 10;
7346 if (digits < count) {
7351 function setPosition(newPosition) {
7355 token = 16 /* Unknown */;
7356 scanError = 0 /* None */;
7358 function scanNumber() {
7360 if (text.charCodeAt(pos) === 48 /* _0 */) {
7365 while (pos < text.length && isDigit(text.charCodeAt(pos))) {
7369 if (pos < text.length && text.charCodeAt(pos) === 46 /* dot */) {
7371 if (pos < text.length && isDigit(text.charCodeAt(pos))) {
7373 while (pos < text.length && isDigit(text.charCodeAt(pos))) {
7378 scanError = 3 /* UnexpectedEndOfNumber */;
7379 return text.substring(start, pos);
7383 if (pos < text.length && (text.charCodeAt(pos) === 69 /* E */ || text.charCodeAt(pos) === 101 /* e */)) {
7385 if (pos < text.length && text.charCodeAt(pos) === 43 /* plus */ || text.charCodeAt(pos) === 45 /* minus */) {
7388 if (pos < text.length && isDigit(text.charCodeAt(pos))) {
7390 while (pos < text.length && isDigit(text.charCodeAt(pos))) {
7396 scanError = 3 /* UnexpectedEndOfNumber */;
7399 return text.substring(start, end);
7401 function scanString() {
7402 var result = '', start = pos;
7405 result += text.substring(start, pos);
7406 scanError = 2 /* UnexpectedEndOfString */;
7409 var ch = text.charCodeAt(pos);
7410 if (ch === 34 /* doubleQuote */) {
7411 result += text.substring(start, pos);
7415 if (ch === 92 /* backslash */) {
7416 result += text.substring(start, pos);
7419 scanError = 2 /* UnexpectedEndOfString */;
7422 var ch2 = text.charCodeAt(pos++);
7424 case 34 /* doubleQuote */:
7427 case 92 /* backslash */:
7430 case 47 /* slash */:
7449 var ch3 = scanHexDigits(4, true);
7451 result += String.fromCharCode(ch3);
7454 scanError = 4 /* InvalidUnicode */;
7458 scanError = 5 /* InvalidEscapeCharacter */;
7463 if (ch >= 0 && ch <= 0x1f) {
7464 if (isLineBreak(ch)) {
7465 result += text.substring(start, pos);
7466 scanError = 2 /* UnexpectedEndOfString */;
7470 scanError = 6 /* InvalidCharacter */;
7471 // mark as error but continue with string
7478 function scanNext() {
7480 scanError = 0 /* None */;
7482 lineStartOffset = lineNumber;
7483 prevTokenLineStartOffset = tokenLineStartOffset;
7487 return token = 17 /* EOF */;
7489 var code = text.charCodeAt(pos);
7490 // trivia: whitespace
7491 if (isWhiteSpace(code)) {
7494 value += String.fromCharCode(code);
7495 code = text.charCodeAt(pos);
7496 } while (isWhiteSpace(code));
7497 return token = 15 /* Trivia */;
7500 if (isLineBreak(code)) {
7502 value += String.fromCharCode(code);
7503 if (code === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) {
7508 tokenLineStartOffset = pos;
7509 return token = 14 /* LineBreakTrivia */;
7513 case 123 /* openBrace */:
7515 return token = 1 /* OpenBraceToken */;
7516 case 125 /* closeBrace */:
7518 return token = 2 /* CloseBraceToken */;
7519 case 91 /* openBracket */:
7521 return token = 3 /* OpenBracketToken */;
7522 case 93 /* closeBracket */:
7524 return token = 4 /* CloseBracketToken */;
7525 case 58 /* colon */:
7527 return token = 6 /* ColonToken */;
7528 case 44 /* comma */:
7530 return token = 5 /* CommaToken */;
7532 case 34 /* doubleQuote */:
7534 value = scanString();
7535 return token = 10 /* StringLiteral */;
7537 case 47 /* slash */:
7538 var start = pos - 1;
7539 // Single-line comment
7540 if (text.charCodeAt(pos + 1) === 47 /* slash */) {
7543 if (isLineBreak(text.charCodeAt(pos))) {
7548 value = text.substring(start, pos);
7549 return token = 12 /* LineCommentTrivia */;
7551 // Multi-line comment
7552 if (text.charCodeAt(pos + 1) === 42 /* asterisk */) {
7554 var safeLength = len - 1; // For lookahead.
7555 var commentClosed = false;
7556 while (pos < safeLength) {
7557 var ch = text.charCodeAt(pos);
7558 if (ch === 42 /* asterisk */ && text.charCodeAt(pos + 1) === 47 /* slash */) {
7560 commentClosed = true;
7564 if (isLineBreak(ch)) {
7565 if (ch === 13 /* carriageReturn */ && text.charCodeAt(pos) === 10 /* lineFeed */) {
7569 tokenLineStartOffset = pos;
7572 if (!commentClosed) {
7574 scanError = 1 /* UnexpectedEndOfComment */;
7576 value = text.substring(start, pos);
7577 return token = 13 /* BlockCommentTrivia */;
7579 // just a single slash
7580 value += String.fromCharCode(code);
7582 return token = 16 /* Unknown */;
7584 case 45 /* minus */:
7585 value += String.fromCharCode(code);
7587 if (pos === len || !isDigit(text.charCodeAt(pos))) {
7588 return token = 16 /* Unknown */;
7590 // found a minus, followed by a number so
7591 // we fall through to proceed with scanning
7603 value += scanNumber();
7604 return token = 11 /* NumericLiteral */;
7605 // literals and unknown symbols
7607 // is a literal? Read the full word.
7608 while (pos < len && isUnknownContentCharacter(code)) {
7610 code = text.charCodeAt(pos);
7612 if (tokenOffset !== pos) {
7613 value = text.substring(tokenOffset, pos);
7614 // keywords: true, false, null
7616 case 'true': return token = 8 /* TrueKeyword */;
7617 case 'false': return token = 9 /* FalseKeyword */;
7618 case 'null': return token = 7 /* NullKeyword */;
7620 return token = 16 /* Unknown */;
7623 value += String.fromCharCode(code);
7625 return token = 16 /* Unknown */;
7628 function isUnknownContentCharacter(code) {
7629 if (isWhiteSpace(code) || isLineBreak(code)) {
7633 case 125 /* closeBrace */:
7634 case 93 /* closeBracket */:
7635 case 123 /* openBrace */:
7636 case 91 /* openBracket */:
7637 case 34 /* doubleQuote */:
7638 case 58 /* colon */:
7639 case 44 /* comma */:
7640 case 47 /* slash */:
7645 function scanNextNonTrivia() {
7648 result = scanNext();
7649 } while (result >= 12 /* LineCommentTrivia */ && result <= 15 /* Trivia */);
7653 setPosition: setPosition,
7654 getPosition: function () { return pos; },
7655 scan: ignoreTrivia ? scanNextNonTrivia : scanNext,
7656 getToken: function () { return token; },
7657 getTokenValue: function () { return value; },
7658 getTokenOffset: function () { return tokenOffset; },
7659 getTokenLength: function () { return pos - tokenOffset; },
7660 getTokenStartLine: function () { return lineStartOffset; },
7661 getTokenStartCharacter: function () { return tokenOffset - prevTokenLineStartOffset; },
7662 getTokenError: function () { return scanError; },
7665 function isWhiteSpace(ch) {
7666 return ch === 32 /* space */ || ch === 9 /* tab */ || ch === 11 /* verticalTab */ || ch === 12 /* formFeed */ ||
7667 ch === 160 /* nonBreakingSpace */ || ch === 5760 /* ogham */ || ch >= 8192 /* enQuad */ && ch <= 8203 /* zeroWidthSpace */ ||
7668 ch === 8239 /* narrowNoBreakSpace */ || ch === 8287 /* mathematicalSpace */ || ch === 12288 /* ideographicSpace */ || ch === 65279 /* byteOrderMark */;
7670 function isLineBreak(ch) {
7671 return ch === 10 /* lineFeed */ || ch === 13 /* carriageReturn */ || ch === 8232 /* lineSeparator */ || ch === 8233 /* paragraphSeparator */;
7673 function isDigit(ch) {
7674 return ch >= 48 /* _0 */ && ch <= 57 /* _9 */;
7680 /***/ (function(module, __webpack_exports__, __webpack_require__) {
7683 __webpack_require__.r(__webpack_exports__);
7684 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeProperty", function() { return removeProperty; });
7685 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setProperty", function() { return setProperty; });
7686 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyEdit", function() { return applyEdit; });
7687 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWS", function() { return isWS; });
7688 /* harmony import */ var _format__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(45);
7689 /* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(48);
7690 /*---------------------------------------------------------------------------------------------
7691 * Copyright (c) Microsoft Corporation. All rights reserved.
7692 * Licensed under the MIT License. See License.txt in the project root for license information.
7693 *--------------------------------------------------------------------------------------------*/
7697 function removeProperty(text, path, formattingOptions) {
7698 return setProperty(text, path, void 0, formattingOptions);
7700 function setProperty(text, originalPath, value, formattingOptions, getInsertionIndex) {
7702 var path = originalPath.slice();
7704 var root = Object(_parser__WEBPACK_IMPORTED_MODULE_1__["parseTree"])(text, errors);
7705 var parent = void 0;
7706 var lastSegment = void 0;
7707 while (path.length > 0) {
7708 lastSegment = path.pop();
7709 parent = Object(_parser__WEBPACK_IMPORTED_MODULE_1__["findNodeAtLocation"])(root, path);
7710 if (parent === void 0 && value !== void 0) {
7711 if (typeof lastSegment === 'string') {
7712 value = (_a = {}, _a[lastSegment] = value, _a);
7724 if (value === void 0) { // delete
7725 throw new Error('Can not delete in empty document');
7727 return withFormatting(text, { offset: root ? root.offset : 0, length: root ? root.length : 0, content: JSON.stringify(value) }, formattingOptions);
7729 else if (parent.type === 'object' && typeof lastSegment === 'string' && Array.isArray(parent.children)) {
7730 var existing = Object(_parser__WEBPACK_IMPORTED_MODULE_1__["findNodeAtLocation"])(parent, [lastSegment]);
7731 if (existing !== void 0) {
7732 if (value === void 0) { // delete
7733 if (!existing.parent) {
7734 throw new Error('Malformed AST');
7736 var propertyIndex = parent.children.indexOf(existing.parent);
7737 var removeBegin = void 0;
7738 var removeEnd = existing.parent.offset + existing.parent.length;
7739 if (propertyIndex > 0) {
7740 // remove the comma of the previous node
7741 var previous = parent.children[propertyIndex - 1];
7742 removeBegin = previous.offset + previous.length;
7745 removeBegin = parent.offset + 1;
7746 if (parent.children.length > 1) {
7747 // remove the comma of the next node
7748 var next = parent.children[1];
7749 removeEnd = next.offset;
7752 return withFormatting(text, { offset: removeBegin, length: removeEnd - removeBegin, content: '' }, formattingOptions);
7755 // set value of existing property
7756 return withFormatting(text, { offset: existing.offset, length: existing.length, content: JSON.stringify(value) }, formattingOptions);
7760 if (value === void 0) { // delete
7761 return []; // property does not exist, nothing to do
7763 var newProperty = JSON.stringify(lastSegment) + ": " + JSON.stringify(value);
7764 var index = getInsertionIndex ? getInsertionIndex(parent.children.map(function (p) { return p.children[0].value; })) : parent.children.length;
7767 var previous = parent.children[index - 1];
7768 edit = { offset: previous.offset + previous.length, length: 0, content: ',' + newProperty };
7770 else if (parent.children.length === 0) {
7771 edit = { offset: parent.offset + 1, length: 0, content: newProperty };
7774 edit = { offset: parent.offset + 1, length: 0, content: newProperty + ',' };
7776 return withFormatting(text, edit, formattingOptions);
7779 else if (parent.type === 'array' && typeof lastSegment === 'number' && Array.isArray(parent.children)) {
7780 var insertIndex = lastSegment;
7781 if (insertIndex === -1) {
7783 var newProperty = "" + JSON.stringify(value);
7785 if (parent.children.length === 0) {
7786 edit = { offset: parent.offset + 1, length: 0, content: newProperty };
7789 var previous = parent.children[parent.children.length - 1];
7790 edit = { offset: previous.offset + previous.length, length: 0, content: ',' + newProperty };
7792 return withFormatting(text, edit, formattingOptions);
7795 if (value === void 0 && parent.children.length >= 0) {
7797 var removalIndex = lastSegment;
7798 var toRemove = parent.children[removalIndex];
7800 if (parent.children.length === 1) {
7802 edit = { offset: parent.offset + 1, length: parent.length - 2, content: '' };
7804 else if (parent.children.length - 1 === removalIndex) {
7806 var previous = parent.children[removalIndex - 1];
7807 var offset = previous.offset + previous.length;
7808 var parentEndOffset = parent.offset + parent.length;
7809 edit = { offset: offset, length: parentEndOffset - 2 - offset, content: '' };
7812 edit = { offset: toRemove.offset, length: parent.children[removalIndex + 1].offset - toRemove.offset, content: '' };
7814 return withFormatting(text, edit, formattingOptions);
7817 throw new Error('Array modification not supported yet');
7822 throw new Error("Can not add " + (typeof lastSegment !== 'number' ? 'index' : 'property') + " to parent of type " + parent.type);
7825 function withFormatting(text, edit, formattingOptions) {
7827 var newText = applyEdit(text, edit);
7828 // format the new text
7829 var begin = edit.offset;
7830 var end = edit.offset + edit.content.length;
7831 if (edit.length === 0 || edit.content.length === 0) { // insert or remove
7832 while (begin > 0 && !Object(_format__WEBPACK_IMPORTED_MODULE_0__["isEOL"])(newText, begin - 1)) {
7835 while (end < newText.length && !Object(_format__WEBPACK_IMPORTED_MODULE_0__["isEOL"])(newText, end)) {
7839 var edits = Object(_format__WEBPACK_IMPORTED_MODULE_0__["format"])(newText, { offset: begin, length: end - begin }, formattingOptions);
7840 // apply the formatting edits and track the begin and end offsets of the changes
7841 for (var i = edits.length - 1; i >= 0; i--) {
7842 var edit_1 = edits[i];
7843 newText = applyEdit(newText, edit_1);
7844 begin = Math.min(begin, edit_1.offset);
7845 end = Math.max(end, edit_1.offset + edit_1.length);
7846 end += edit_1.content.length - edit_1.length;
7848 // create a single edit with all changes
7849 var editLength = text.length - (newText.length - end) - begin;
7850 return [{ offset: begin, length: editLength, content: newText.substring(begin, end) }];
7852 function applyEdit(text, edit) {
7853 return text.substring(0, edit.offset) + edit.content + text.substring(edit.offset + edit.length);
7855 function isWS(text, offset) {
7856 return '\r\n \t'.indexOf(text.charAt(offset)) !== -1;
7862 /***/ (function(module, __webpack_exports__, __webpack_require__) {
7865 __webpack_require__.r(__webpack_exports__);
7866 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocation", function() { return getLocation; });
7867 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; });
7868 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseTree", function() { return parseTree; });
7869 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNodeAtLocation", function() { return findNodeAtLocation; });
7870 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNodePath", function() { return getNodePath; });
7871 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNodeValue", function() { return getNodeValue; });
7872 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "contains", function() { return contains; });
7873 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNodeAtOffset", function() { return findNodeAtOffset; });
7874 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "visit", function() { return visit; });
7875 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stripComments", function() { return stripComments; });
7876 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNodeType", function() { return getNodeType; });
7877 /* harmony import */ var _scanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(46);
7878 /*---------------------------------------------------------------------------------------------
7879 * Copyright (c) Microsoft Corporation. All rights reserved.
7880 * Licensed under the MIT License. See License.txt in the project root for license information.
7881 *--------------------------------------------------------------------------------------------*/
7885 (function (ParseOptions) {
7886 ParseOptions.DEFAULT = {
7887 allowTrailingComma: false
7889 })(ParseOptions || (ParseOptions = {}));
7891 * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.
7893 function getLocation(text, position) {
7894 var segments = []; // strings or numbers
7895 var earlyReturnException = new Object();
7896 var previousNode = undefined;
7897 var previousNodeInst = {
7904 var isAtPropertyKey = false;
7905 function setPreviousNode(value, offset, length, type) {
7906 previousNodeInst.value = value;
7907 previousNodeInst.offset = offset;
7908 previousNodeInst.length = length;
7909 previousNodeInst.type = type;
7910 previousNodeInst.colonOffset = undefined;
7911 previousNode = previousNodeInst;
7915 onObjectBegin: function (offset, length) {
7916 if (position <= offset) {
7917 throw earlyReturnException;
7919 previousNode = undefined;
7920 isAtPropertyKey = position > offset;
7921 segments.push(''); // push a placeholder (will be replaced)
7923 onObjectProperty: function (name, offset, length) {
7924 if (position < offset) {
7925 throw earlyReturnException;
7927 setPreviousNode(name, offset, length, 'property');
7928 segments[segments.length - 1] = name;
7929 if (position <= offset + length) {
7930 throw earlyReturnException;
7933 onObjectEnd: function (offset, length) {
7934 if (position <= offset) {
7935 throw earlyReturnException;
7937 previousNode = undefined;
7940 onArrayBegin: function (offset, length) {
7941 if (position <= offset) {
7942 throw earlyReturnException;
7944 previousNode = undefined;
7947 onArrayEnd: function (offset, length) {
7948 if (position <= offset) {
7949 throw earlyReturnException;
7951 previousNode = undefined;
7954 onLiteralValue: function (value, offset, length) {
7955 if (position < offset) {
7956 throw earlyReturnException;
7958 setPreviousNode(value, offset, length, getNodeType(value));
7959 if (position <= offset + length) {
7960 throw earlyReturnException;
7963 onSeparator: function (sep, offset, length) {
7964 if (position <= offset) {
7965 throw earlyReturnException;
7967 if (sep === ':' && previousNode && previousNode.type === 'property') {
7968 previousNode.colonOffset = offset;
7969 isAtPropertyKey = false;
7970 previousNode = undefined;
7972 else if (sep === ',') {
7973 var last = segments[segments.length - 1];
7974 if (typeof last === 'number') {
7975 segments[segments.length - 1] = last + 1;
7978 isAtPropertyKey = true;
7979 segments[segments.length - 1] = '';
7981 previousNode = undefined;
7987 if (e !== earlyReturnException) {
7993 previousNode: previousNode,
7994 isAtPropertyKey: isAtPropertyKey,
7995 matches: function (pattern) {
7997 for (var i = 0; k < pattern.length && i < segments.length; i++) {
7998 if (pattern[k] === segments[i] || pattern[k] === '*') {
8001 else if (pattern[k] !== '**') {
8005 return k === pattern.length;
8010 * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.
8011 * Therefore always check the errors list to find out if the input was valid.
8013 function parse(text, errors, options) {
8014 if (errors === void 0) { errors = []; }
8015 if (options === void 0) { options = ParseOptions.DEFAULT; }
8016 var currentProperty = null;
8017 var currentParent = [];
8018 var previousParents = [];
8019 function onValue(value) {
8020 if (Array.isArray(currentParent)) {
8021 currentParent.push(value);
8023 else if (currentProperty !== null) {
8024 currentParent[currentProperty] = value;
8028 onObjectBegin: function () {
8031 previousParents.push(currentParent);
8032 currentParent = object;
8033 currentProperty = null;
8035 onObjectProperty: function (name) {
8036 currentProperty = name;
8038 onObjectEnd: function () {
8039 currentParent = previousParents.pop();
8041 onArrayBegin: function () {
8044 previousParents.push(currentParent);
8045 currentParent = array;
8046 currentProperty = null;
8048 onArrayEnd: function () {
8049 currentParent = previousParents.pop();
8051 onLiteralValue: onValue,
8052 onError: function (error, offset, length) {
8053 errors.push({ error: error, offset: offset, length: length });
8056 visit(text, visitor, options);
8057 return currentParent[0];
8060 * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.
8062 function parseTree(text, errors, options) {
8063 if (errors === void 0) { errors = []; }
8064 if (options === void 0) { options = ParseOptions.DEFAULT; }
8065 var currentParent = { type: 'array', offset: -1, length: -1, children: [], parent: undefined }; // artificial root
8066 function ensurePropertyComplete(endOffset) {
8067 if (currentParent.type === 'property') {
8068 currentParent.length = endOffset - currentParent.offset;
8069 currentParent = currentParent.parent;
8072 function onValue(valueNode) {
8073 currentParent.children.push(valueNode);
8077 onObjectBegin: function (offset) {
8078 currentParent = onValue({ type: 'object', offset: offset, length: -1, parent: currentParent, children: [] });
8080 onObjectProperty: function (name, offset, length) {
8081 currentParent = onValue({ type: 'property', offset: offset, length: -1, parent: currentParent, children: [] });
8082 currentParent.children.push({ type: 'string', value: name, offset: offset, length: length, parent: currentParent });
8084 onObjectEnd: function (offset, length) {
8085 ensurePropertyComplete(offset + length); // in case of a missing value for a property: make sure property is complete
8086 currentParent.length = offset + length - currentParent.offset;
8087 currentParent = currentParent.parent;
8088 ensurePropertyComplete(offset + length);
8090 onArrayBegin: function (offset, length) {
8091 currentParent = onValue({ type: 'array', offset: offset, length: -1, parent: currentParent, children: [] });
8093 onArrayEnd: function (offset, length) {
8094 currentParent.length = offset + length - currentParent.offset;
8095 currentParent = currentParent.parent;
8096 ensurePropertyComplete(offset + length);
8098 onLiteralValue: function (value, offset, length) {
8099 onValue({ type: getNodeType(value), offset: offset, length: length, parent: currentParent, value: value });
8100 ensurePropertyComplete(offset + length);
8102 onSeparator: function (sep, offset, length) {
8103 if (currentParent.type === 'property') {
8105 currentParent.colonOffset = offset;
8107 else if (sep === ',') {
8108 ensurePropertyComplete(offset);
8112 onError: function (error, offset, length) {
8113 errors.push({ error: error, offset: offset, length: length });
8116 visit(text, visitor, options);
8117 var result = currentParent.children[0];
8119 delete result.parent;
8124 * Finds the node at the given path in a JSON DOM.
8126 function findNodeAtLocation(root, path) {
8131 for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {
8132 var segment = path_1[_i];
8133 if (typeof segment === 'string') {
8134 if (node.type !== 'object' || !Array.isArray(node.children)) {
8138 for (var _a = 0, _b = node.children; _a < _b.length; _a++) {
8139 var propertyNode = _b[_a];
8140 if (Array.isArray(propertyNode.children) && propertyNode.children[0].value === segment) {
8141 node = propertyNode.children[1];
8151 var index = segment;
8152 if (node.type !== 'array' || index < 0 || !Array.isArray(node.children) || index >= node.children.length) {
8155 node = node.children[index];
8161 * Gets the JSON path of the given JSON DOM node
8163 function getNodePath(node) {
8164 if (!node.parent || !node.parent.children) {
8167 var path = getNodePath(node.parent);
8168 if (node.parent.type === 'property') {
8169 var key = node.parent.children[0].value;
8172 else if (node.parent.type === 'array') {
8173 var index = node.parent.children.indexOf(node);
8181 * Evaluates the JavaScript object of the given JSON DOM node
8183 function getNodeValue(node) {
8184 switch (node.type) {
8186 return node.children.map(getNodeValue);
8188 var obj = Object.create(null);
8189 for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
8191 var valueNode = prop.children[1];
8193 obj[prop.children[0].value] = getNodeValue(valueNode);
8206 function contains(node, offset, includeRightBound) {
8207 if (includeRightBound === void 0) { includeRightBound = false; }
8208 return (offset >= node.offset && offset < (node.offset + node.length)) || includeRightBound && (offset === (node.offset + node.length));
8211 * Finds the most inner node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.
8213 function findNodeAtOffset(node, offset, includeRightBound) {
8214 if (includeRightBound === void 0) { includeRightBound = false; }
8215 if (contains(node, offset, includeRightBound)) {
8216 var children = node.children;
8217 if (Array.isArray(children)) {
8218 for (var i = 0; i < children.length && children[i].offset <= offset; i++) {
8219 var item = findNodeAtOffset(children[i], offset, includeRightBound);
8230 * Parses the given text and invokes the visitor functions for each object, array and literal reached.
8232 function visit(text, visitor, options) {
8233 if (options === void 0) { options = ParseOptions.DEFAULT; }
8234 var _scanner = Object(_scanner__WEBPACK_IMPORTED_MODULE_0__["createScanner"])(text, false);
8235 function toNoArgVisit(visitFunction) {
8236 return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; };
8238 function toOneArgVisit(visitFunction) {
8239 return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; };
8241 var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError);
8242 var disallowComments = options && options.disallowComments;
8243 var allowTrailingComma = options && options.allowTrailingComma;
8244 function scanNext() {
8246 var token = _scanner.scan();
8247 switch (_scanner.getTokenError()) {
8248 case 4 /* InvalidUnicode */:
8249 handleError(14 /* InvalidUnicode */);
8251 case 5 /* InvalidEscapeCharacter */:
8252 handleError(15 /* InvalidEscapeCharacter */);
8254 case 3 /* UnexpectedEndOfNumber */:
8255 handleError(13 /* UnexpectedEndOfNumber */);
8257 case 1 /* UnexpectedEndOfComment */:
8258 if (!disallowComments) {
8259 handleError(11 /* UnexpectedEndOfComment */);
8262 case 2 /* UnexpectedEndOfString */:
8263 handleError(12 /* UnexpectedEndOfString */);
8265 case 6 /* InvalidCharacter */:
8266 handleError(16 /* InvalidCharacter */);
8270 case 12 /* LineCommentTrivia */:
8271 case 13 /* BlockCommentTrivia */:
8272 if (disallowComments) {
8273 handleError(10 /* InvalidCommentToken */);
8279 case 16 /* Unknown */:
8280 handleError(1 /* InvalidSymbol */);
8282 case 15 /* Trivia */:
8283 case 14 /* LineBreakTrivia */:
8290 function handleError(error, skipUntilAfter, skipUntil) {
8291 if (skipUntilAfter === void 0) { skipUntilAfter = []; }
8292 if (skipUntil === void 0) { skipUntil = []; }
8294 if (skipUntilAfter.length + skipUntil.length > 0) {
8295 var token = _scanner.getToken();
8296 while (token !== 17 /* EOF */) {
8297 if (skipUntilAfter.indexOf(token) !== -1) {
8301 else if (skipUntil.indexOf(token) !== -1) {
8308 function parseString(isValue) {
8309 var value = _scanner.getTokenValue();
8311 onLiteralValue(value);
8314 onObjectProperty(value);
8319 function parseLiteral() {
8320 switch (_scanner.getToken()) {
8321 case 11 /* NumericLiteral */:
8324 value = JSON.parse(_scanner.getTokenValue());
8325 if (typeof value !== 'number') {
8326 handleError(2 /* InvalidNumberFormat */);
8331 handleError(2 /* InvalidNumberFormat */);
8333 onLiteralValue(value);
8335 case 7 /* NullKeyword */:
8336 onLiteralValue(null);
8338 case 8 /* TrueKeyword */:
8339 onLiteralValue(true);
8341 case 9 /* FalseKeyword */:
8342 onLiteralValue(false);
8350 function parseProperty() {
8351 if (_scanner.getToken() !== 10 /* StringLiteral */) {
8352 handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);
8356 if (_scanner.getToken() === 6 /* ColonToken */) {
8358 scanNext(); // consume colon
8359 if (!parseValue()) {
8360 handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);
8364 handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);
8368 function parseObject() {
8370 scanNext(); // consume open brace
8371 var needsComma = false;
8372 while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) {
8373 if (_scanner.getToken() === 5 /* CommaToken */) {
8375 handleError(4 /* ValueExpected */, [], []);
8378 scanNext(); // consume comma
8379 if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) {
8383 else if (needsComma) {
8384 handleError(6 /* CommaExpected */, [], []);
8386 if (!parseProperty()) {
8387 handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);
8392 if (_scanner.getToken() !== 2 /* CloseBraceToken */) {
8393 handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []);
8396 scanNext(); // consume close brace
8400 function parseArray() {
8402 scanNext(); // consume open bracket
8403 var needsComma = false;
8404 while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) {
8405 if (_scanner.getToken() === 5 /* CommaToken */) {
8407 handleError(4 /* ValueExpected */, [], []);
8410 scanNext(); // consume comma
8411 if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) {
8415 else if (needsComma) {
8416 handleError(6 /* CommaExpected */, [], []);
8418 if (!parseValue()) {
8419 handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]);
8424 if (_scanner.getToken() !== 4 /* CloseBracketToken */) {
8425 handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []);
8428 scanNext(); // consume close bracket
8432 function parseValue() {
8433 switch (_scanner.getToken()) {
8434 case 3 /* OpenBracketToken */:
8435 return parseArray();
8436 case 1 /* OpenBraceToken */:
8437 return parseObject();
8438 case 10 /* StringLiteral */:
8439 return parseString(true);
8441 return parseLiteral();
8445 if (_scanner.getToken() === 17 /* EOF */) {
8446 if (options.allowEmptyContent) {
8449 handleError(4 /* ValueExpected */, [], []);
8452 if (!parseValue()) {
8453 handleError(4 /* ValueExpected */, [], []);
8456 if (_scanner.getToken() !== 17 /* EOF */) {
8457 handleError(9 /* EndOfFileExpected */, [], []);
8462 * Takes JSON with JavaScript-style comments and remove
8463 * them. Optionally replaces every none-newline character
8464 * of comments with a replaceCharacter
8466 function stripComments(text, replaceCh) {
8467 var _scanner = Object(_scanner__WEBPACK_IMPORTED_MODULE_0__["createScanner"])(text), parts = [], kind, offset = 0, pos;
8469 pos = _scanner.getPosition();
8470 kind = _scanner.scan();
8472 case 12 /* LineCommentTrivia */:
8473 case 13 /* BlockCommentTrivia */:
8475 if (offset !== pos) {
8476 parts.push(text.substring(offset, pos));
8478 if (replaceCh !== undefined) {
8479 parts.push(_scanner.getTokenValue().replace(/[^\r\n]/g, replaceCh));
8481 offset = _scanner.getPosition();
8484 } while (kind !== 17 /* EOF */);
8485 return parts.join('');
8487 function getNodeType(value) {
8488 switch (typeof value) {
8489 case 'boolean': return 'boolean';
8490 case 'number': return 'number';
8491 case 'string': return 'string';
8496 else if (Array.isArray(value)) {
8501 default: return 'null';
8508 /***/ (function(module, exports, __webpack_require__) {
8512 var __importDefault = (this && this.__importDefault) || function (mod) {
8513 return (mod && mod.__esModule) ? mod : { "default": mod };
8515 Object.defineProperty(exports, "__esModule", { value: true });
8516 /******************************************************************
8517 MIT License http://www.opensource.org/licenses/mit-license.php
8518 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
8519 *******************************************************************/
8520 const coc_nvim_1 = __webpack_require__(1);
8521 const fs_1 = __importDefault(__webpack_require__(3));
8522 const os_1 = __importDefault(__webpack_require__(2));
8523 const path_1 = __importDefault(__webpack_require__(4));
8524 const vscode_languageserver_types_1 = __webpack_require__(6);
8525 const baseProvider_1 = __importDefault(__webpack_require__(41));
8526 const types_1 = __webpack_require__(36);
8527 const ultisnipsParser_1 = __importDefault(__webpack_require__(50));
8528 const util_1 = __webpack_require__(37);
8529 const pythonCodes = new Map();
8530 class UltiSnippetsProvider extends baseProvider_1.default {
8531 constructor(channel, trace, config, context) {
8533 this.channel = channel;
8535 this.config = config;
8536 this.context = context;
8537 this.snippetFiles = [];
8538 this.disposables = [];
8539 this.directories = [];
8540 this.runtimeDirs = [];
8541 this.runtimeDirs = coc_nvim_1.workspace.env.runtimepath.split(',');
8542 coc_nvim_1.workspace.watchOption('runtimepath', async (_, newValue) => {
8543 let parts = newValue.split(',');
8544 let subFolders = await this.getSubFolders();
8546 for (let dir of parts) {
8547 if (this.runtimeDirs.indexOf(dir) == -1) {
8548 this.runtimeDirs.push(dir);
8549 let res = await this.getSnippetsFromPlugin(dir, subFolders);
8554 await Promise.all(items.map(({ filepath, directory, filetype }) => {
8555 return this.loadSnippetsFromFile(filetype, directory, filepath);
8557 let files = items.map(o => o.filepath);
8558 let pythonCode = '';
8559 for (let file of files) {
8560 let code = pythonCodes.get(file);
8562 pythonCode += `# ${file}\n` + code + '\n';
8566 pythonCodes.clear();
8567 await this.executePythonCode(pythonCode);
8570 }, this.disposables);
8572 checkLoaded(filepath) {
8573 return this.snippetFiles.findIndex(o => o.filepath == filepath) !== -1;
8576 let { nvim, env } = coc_nvim_1.workspace;
8577 let { runtimepath } = env;
8578 let { config } = this;
8579 for (let dir of config.directories) {
8580 if (dir.startsWith('~') || dir.indexOf('$') !== -1) {
8581 let res = await coc_nvim_1.workspace.nvim.call('expand', [dir]);
8582 this.directories.push(res);
8585 this.directories.push(dir);
8588 this.channel.appendLine(`[Info ${(new Date()).toLocaleTimeString()}] Using ultisnips directories: ${this.directories.join(' ')}`);
8589 let hasPythonx = await nvim.call('has', ['pythonx']);
8590 let pythonCode = await util_1.readFileAsync(this.context.asAbsolutePath('python/ultisnips.py'), 'utf8');
8591 if (hasPythonx && config.usePythonx) {
8592 this.pyMethod = 'pyx';
8595 this.pyMethod = config.pythonVersion == 3 ? 'py3' : 'py';
8597 this.channel.appendLine(`[Info ${(new Date()).toLocaleTimeString()}] Using ultisnips python command: ${this.pyMethod}`);
8598 this.parser = new ultisnipsParser_1.default(this.pyMethod, this.channel, this.trace);
8599 let arr = await this.getAllSnippetFiles(runtimepath);
8600 let files = arr.map(o => o.filepath);
8601 await Promise.all(arr.map(({ filepath, directory, filetype }) => {
8602 return this.loadSnippetsFromFile(filetype, directory, filepath);
8604 for (let file of files) {
8605 let code = pythonCodes.get(file);
8607 pythonCode += `\n# ${file}\n` + code + '\n';
8610 await this.executePythonCode(pythonCode);
8611 coc_nvim_1.workspace.onDidSaveTextDocument(async (doc) => {
8612 let uri = coc_nvim_1.Uri.parse(doc.uri);
8613 if (uri.scheme != 'file' || !doc.uri.endsWith('.snippets'))
8615 let filepath = uri.fsPath;
8616 if (!fs_1.default.existsSync(filepath))
8618 let snippetFile = this.snippetFiles.find(s => s.filepath == filepath);
8620 await this.loadSnippetsFromFile(snippetFile.filetype, snippetFile.directory, filepath);
8623 let filetype = path_1.default.basename(filepath, '.snippets');
8624 await this.loadSnippetsFromFile(filetype, path_1.default.dirname(filepath), filepath);
8626 }, null, this.disposables);
8628 async loadSnippetsFromFile(filetype, directory, filepath) {
8629 let { snippets, pythonCode, extendFiletypes, clearsnippets } = await this.parser.parseUltisnipsFile(filepath);
8630 let idx = this.snippetFiles.findIndex(o => o.filepath == filepath);
8632 this.snippetFiles.splice(idx, 1);
8633 this.snippetFiles.push({
8641 if (extendFiletypes) {
8642 let filetypes = this.config.extends[filetype] || [];
8643 filetypes = filetypes.concat(extendFiletypes);
8644 this.config.extends[filetype] = util_1.distinct(filetypes);
8646 if (this.trace == 'verbose') {
8647 this.channel.appendLine(`[Info ${(new Date()).toLocaleTimeString()}] Loaded ${snippets.length} snippets from: ${filepath}`);
8649 pythonCodes.set(filepath, pythonCode);
8651 async resolveSnippetBody(snippet, range, line) {
8652 let { nvim } = coc_nvim_1.workspace;
8653 let { body, context, originRegex } = snippet;
8654 let buf = await nvim.buffer;
8655 let filepath = await buf.name;
8656 let indentCount = await nvim.call('indent', '.');
8657 let ind = ' '.repeat(indentCount);
8658 if (body.indexOf('`!p') !== -1) {
8659 let values = new Map();
8660 let re = /\$\{(\d+)(?::([^}]+))?\}/g;
8662 // tslint:disable-next-line: no-conditional-assignment
8663 while (r = re.exec(body)) {
8664 let idx = parseInt(r[1], 10);
8665 let val = r[2] || '';
8666 let exists = values.get(idx);
8667 if (exists == null || (val && exists == "''")) {
8668 if (/^`!\w/.test(val) && val.endsWith('`')) {
8669 let code = val.slice(1).slice(0, -1);
8670 val = await this.parser.execute(code, this.pyMethod, ind);
8672 val = val.replace(/'/g, "\\'").replace(/\n/g, '\\n');
8673 values.set(idx, "'" + val + "'");
8677 // tslint:disable-next-line: no-conditional-assignment
8678 while (r = re.exec(body)) {
8679 let idx = parseInt(r[1], 10);
8680 if (!values.has(idx)) {
8681 values.set(idx, "''");
8684 let len = values.size == 0 ? 0 : Math.max.apply(null, Array.from(values.keys()));
8685 let vals = (new Array(len)).fill('""');
8686 for (let [idx, val] of values.entries()) {
8690 pyCodes.push('import re, os, vim, string, random');
8691 pyCodes.push(`t = ('', ${vals.join(',')})`);
8692 pyCodes.push(`fn = '${path_1.default.basename(filepath)}'`);
8693 pyCodes.push(`path = '${filepath}'`);
8695 pyCodes.push(`snip = ContextSnippet()`);
8696 pyCodes.push(`context = ${context}`);
8699 pyCodes.push(`context = {}`);
8701 let start = `(${range.start.line},${Buffer.byteLength(line.slice(0, range.start.character))})`;
8702 let end = `(${range.end.line},${Buffer.byteLength(line.slice(0, range.end.character))})`;
8703 pyCodes.push(`snip = SnippetUtil('${ind}', ${start}, ${end}, context)`);
8705 pyCodes.push(`pattern = re.compile(r"${originRegex.replace(/"/g, '\\"')}")`);
8706 pyCodes.push(`match = pattern.search("${line.replace(/"/g, '\\"')}")`);
8709 await nvim.command(`${this.pyMethod} ${pyCodes.join('\n')}`);
8712 this.channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}]: ${e.message}`);
8713 this.channel.appendLine(`code: ${pyCodes.join('\n')}`);
8716 return this.parser.resolveUltisnipsBody(body);
8718 async checkContext(context) {
8719 let { nvim } = coc_nvim_1.workspace;
8721 pyCodes.push('import re, os, vim, string, random');
8722 pyCodes.push(`snip = ContextSnippet()`);
8723 pyCodes.push(`context = ${context}`);
8724 await nvim.command(`${this.pyMethod} ${pyCodes.join('\n')}`);
8725 let res = await nvim.call(`${this.pyMethod}eval`, 'True if context else False');
8728 async getTriggerSnippets(document, position, autoTrigger) {
8729 let snippets = await this.getSnippets(document.filetype);
8730 let line = document.getline(position.line);
8731 line = line.slice(0, position.character);
8732 if (!line || line[line.length - 1] == ' ')
8734 snippets = snippets.filter(s => {
8735 let { prefix, regex } = s;
8736 if (autoTrigger && !s.autoTrigger)
8739 let ms = line.match(regex);
8744 if (!line.endsWith(prefix))
8746 if (s.triggerKind == types_1.TriggerKind.InWord)
8748 let pre = line.slice(0, line.length - prefix.length);
8749 if (s.triggerKind == types_1.TriggerKind.LineBegin)
8750 return pre.trim() == '';
8751 if (s.triggerKind == types_1.TriggerKind.SpaceBefore)
8752 return pre.length == 0 || /\s/.test(pre[pre.length - 1]);
8753 if (s.triggerKind == types_1.TriggerKind.WordBoundary)
8754 return pre.length == 0 || !document.isWord(pre[pre.length - 1]);
8757 snippets.sort((a, b) => {
8758 if (a.context && !b.context)
8760 if (b.context && !a.context)
8765 let contextPrefixes = [];
8766 for (let s of snippets) {
8769 let valid = await this.checkContext(s.context);
8772 contextPrefixes.push(s.context);
8774 else if (contextPrefixes.indexOf(s.prefix) !== -1) {
8777 if (s.regex == null) {
8778 character = position.character - s.prefix.length;
8781 let len = line.match(s.regex)[0].length;
8782 character = position.character - len;
8784 let range = vscode_languageserver_types_1.Range.create(position.line, character, position.line, position.character);
8785 let newText = await this.resolveSnippetBody(s, range, line);
8788 description: s.description,
8789 location: s.filepath,
8790 priority: s.priority,
8797 async getSnippetFiles(filetype) {
8798 let filetypes = this.getFiletypes(filetype);
8800 for (let s of this.snippetFiles) {
8801 if (filetypes.indexOf(s.filetype) !== -1) {
8802 res.push(s.filepath);
8807 async getSnippets(filetype) {
8808 let filetypes = this.getFiletypes(filetype);
8809 filetypes.push('all');
8810 let snippetFiles = this.snippetFiles.filter(o => filetypes.indexOf(o.filetype) !== -1);
8813 snippetFiles.sort((a, b) => {
8814 if (a.filetype == b.filetype)
8816 if (a.filetype == filetype)
8820 for (let file of snippetFiles) {
8821 let { snippets, clearsnippets } = file;
8822 if (typeof clearsnippets == 'number') {
8823 min = min ? Math.max(min, clearsnippets) : clearsnippets;
8825 for (let snip of snippets) {
8826 if (snip.regex || snip.context) {
8830 let idx = result.findIndex(o => o.prefix == snip.prefix && o.triggerKind == snip.triggerKind);
8835 let item = result[idx];
8836 if (snip.priority > item.priority) {
8844 result = result.filter(o => o.priority >= min);
8845 result.sort((a, b) => {
8846 if (a.context && !b.context)
8848 if (b.context && !a.context)
8854 async getAllSnippetFiles(runtimepath) {
8855 let { directories } = this;
8857 for (let directory of directories) {
8858 if (path_1.default.isAbsolute(directory)) {
8859 let items = await this.getSnippetFileItems(directory);
8863 let subFolders = await this.getSubFolders();
8864 let rtps = runtimepath.split(',');
8865 this.runtimeDirs = rtps;
8866 for (let rtp of rtps) {
8867 let items = await this.getSnippetsFromPlugin(rtp, subFolders);
8872 async getSubFolders() {
8873 let { directories } = this;
8874 directories = directories.filter(s => !path_1.default.isAbsolute(s));
8875 // use UltiSnipsSnippetDirectories
8876 let dirs = await coc_nvim_1.workspace.nvim.eval('get(g:, "UltiSnipsSnippetDirectories", [])');
8877 for (let dir of dirs) {
8878 if (directories.indexOf(dir) == -1) {
8879 directories.push(dir);
8884 async getSnippetsFromPlugin(directory, subFolders) {
8886 for (let folder of subFolders) {
8887 let items = await this.getSnippetFileItems(path_1.default.join(directory, folder));
8892 async getSnippetFileItems(directory) {
8894 let stat = await util_1.statAsync(directory);
8895 if (stat && stat.isDirectory()) {
8896 let files = await util_1.readdirAsync(directory);
8898 for (let f of files) {
8899 let file = path_1.default.join(directory, f);
8900 if (file.endsWith('.snippets')) {
8901 let basename = path_1.default.basename(f, '.snippets');
8902 let filetype = basename.split('_', 2)[0];
8903 res.push({ filepath: file, directory, filetype });
8906 let stat = await util_1.statAsync(file);
8907 if (stat && stat.isDirectory()) {
8908 let files = await util_1.readdirAsync(file);
8909 for (let filename of files) {
8910 if (filename.endsWith('.snippets')) {
8911 res.push({ filepath: path_1.default.join(file, filename), directory, filetype: f });
8921 async executePythonCode(pythonCode) {
8923 let dir = path_1.default.join(os_1.default.tmpdir(), `coc.nvim-${process.pid}`);
8924 if (!fs_1.default.existsSync(dir))
8925 fs_1.default.mkdirSync(dir);
8926 let tmpfile = path_1.default.join(os_1.default.tmpdir(), `coc.nvim-${process.pid}`, `coc-ultisnips-${util_1.uid()}.py`);
8927 fs_1.default.writeFileSync(tmpfile, '# -*- coding: utf-8 -*-\n' + pythonCode, 'utf8');
8928 await coc_nvim_1.workspace.nvim.command(`exe '${this.pyMethod}file '.fnameescape('${tmpfile}')`);
8929 pythonCodes.clear();
8932 this.channel.appendLine(`Error on execute python script:`);
8933 this.channel.append(e.message);
8934 coc_nvim_1.workspace.showMessage(`Error on execute python script: ${e.message}`, 'error');
8938 coc_nvim_1.disposeAll(this.disposables);
8941 exports.UltiSnippetsProvider = UltiSnippetsProvider;
8946 /***/ (function(module, exports, __webpack_require__) {
8950 var __importDefault = (this && this.__importDefault) || function (mod) {
8951 return (mod && mod.__esModule) ? mod : { "default": mod };
8953 Object.defineProperty(exports, "__esModule", { value: true });
8954 /******************************************************************
8955 MIT License http://www.opensource.org/licenses/mit-license.php
8956 Author Qiming Zhao <chemzqm@gmail> (https://github.com/chemzqm)
8957 *******************************************************************/
8958 const child_process_1 = __webpack_require__(51);
8959 const coc_nvim_1 = __webpack_require__(1);
8960 const fs_1 = __importDefault(__webpack_require__(3));
8961 const pify_1 = __importDefault(__webpack_require__(38));
8962 const readline_1 = __importDefault(__webpack_require__(40));
8963 const parser_1 = __importDefault(__webpack_require__(42));
8964 const types_1 = __webpack_require__(36);
8965 const util_1 = __webpack_require__(37);
8966 class UltiSnipsParser {
8967 constructor(pyMethod, channel, trace = 'error') {
8968 this.pyMethod = pyMethod;
8969 this.channel = channel;
8972 parseUltisnipsFile(filepath) {
8973 const rl = readline_1.default.createInterface({
8974 input: fs_1.default.createReadStream(filepath, 'utf8'),
8984 let clearsnippets = null;
8985 let parsedContext = null;
8986 let extendFiletypes = [];
8987 rl.on('line', line => {
8989 if (!block && (line.startsWith('#') || line.length == 0))
8991 const [head, tail] = util_1.headTail(line);
8995 let n = parseInt(tail.trim(), 10);
9000 let fts = tail.trim().split(/,\s+/);
9001 for (let ft of fts) {
9002 if (extendFiletypes.indexOf(ft) == -1) {
9003 extendFiletypes.push(ft);
9007 case 'clearsnippets':
9008 clearsnippets = priority;
9011 parsedContext = tail.replace(/^"(.+)"$/, '$1');
9021 if (head == 'endglobal' && block == 'global') {
9023 pycodes.push(...preLines);
9027 if (head == 'endsnippet' && block == 'snippet') {
9031 let body = preLines.join('\n');
9032 // convert placeholder regex to javascript regex
9033 body = body.replace(/((?:[^\\]?\$\{\w+?)\/)([^\n]*?[^\\])(?=\/)/g, (_match, p1, p2) => {
9034 return p1 + util_1.convertRegex(p2);
9036 let ms = first.match(/^(.+?)(?:\s+(?:"(.*?)")?(?:\s+"(.*?)")?(?:\s+(\w+))?)?\s*$/);
9038 let description = ms[2] || '';
9039 let context = ms[3];
9040 let option = ms[4] || '';
9041 if (prefix.length > 2 && prefix[0] == prefix[prefix.length - 1] && !/\w/.test(prefix[0])) {
9042 prefix = prefix.slice(1, prefix.length - 1);
9044 let isExpression = option.indexOf('r') !== -1;
9047 originRegex = prefix;
9048 prefix = util_1.convertRegex(prefix);
9049 prefix = prefix.endsWith('$') ? prefix : prefix + '$';
9051 regex = new RegExp(prefix);
9052 // get the real text
9053 prefix = util_1.getRegexText(prefix);
9056 this.error(`Convert regex error for: ${prefix}`);
9059 if (parsedContext) {
9060 context = parsedContext;
9062 else if (option.indexOf('e') == -1) {
9069 autoTrigger: option.indexOf('A') !== -1,
9070 lnum: lnum - preLines.length - 2,
9071 triggerKind: getTriggerKind(option),
9078 snippets.push(snippet);
9081 this.error(`Create snippet error on: ${filepath}:${lnum - preLines.length - 1} ${e.message}`);
9084 parsedContext = null;
9088 if (block == 'snippet' || block == 'global') {
9089 preLines.push(line);
9093 return new Promise(resolve => {
9094 rl.on('close', async () => {
9095 resolve({ snippets, clearsnippets, pythonCode: pycodes.join('\n'), extendFiletypes });
9099 async resolveUltisnipsBody(body) {
9100 let { pyMethod } = this;
9101 let parser = new parser_1.default(body);
9103 while (!parser.eof()) {
9104 let p = parser.prev();
9105 if (parser.curr == '`' && (!p || p != '\\')) {
9106 let idx = parser.nextIndex('`', true, false);
9108 resolved = resolved + parser.eatTo(parser.len);
9111 let code = parser.eatTo(idx + 1);
9112 code = code.slice(1, -1);
9113 let indent = resolved.split(/\n/).slice(-1)[0].match(/^\s*/)[0];
9114 resolved = resolved + await this.execute(code, pyMethod, indent);
9117 else if (parser.curr == '$') {
9118 let text = parser.next(7);
9119 if (text.startsWith('VISUAL') || text.startsWith('{VISUAL')) {
9121 resolved += '$' + text.replace('VISUAL', 'TM_SELECTED_TEXT');
9123 else if (!/^\d/.test(text) && !text.startsWith('{') && p != '\\') {
9124 // escape $ if it's not escaped and not a placeholder, ultisnips sucks
9125 resolved += '\\' + parser.eat(1);
9129 resolved += parser.eat(1);
9132 let prev = parser.prev() || '';
9133 parser.iterate(ch => {
9134 if (prev !== '\\' && (ch == '`' || ch == '$')) {
9138 resolved = resolved + ch;
9144 resolved = decode(resolved);
9145 this.debug(`resolved: ${resolved}`);
9148 async execute(code, pyMethod, indent) {
9149 let { nvim } = coc_nvim_1.workspace;
9151 if (code.startsWith('!')) {
9152 code = code.trim().slice(1);
9153 if (code.startsWith('p')) {
9154 code = code.slice(1).trim();
9155 let lines = code.split('\n');
9156 lines = lines.map(line => line.replace(/\t/g, ' '));
9157 lines = lines.map(line => ` ${line}`);
9158 lines.unshift('try:');
9159 lines.unshift('import traceback');
9160 lines.push('except Exception as e:');
9161 lines.push(' snip.rv = traceback.format_exc()');
9162 await nvim.command(`${pyMethod} ${lines.join('\n')}`);
9163 res = await nvim.call(`${pyMethod}eval`, 'snip.rv');
9165 else if (code.startsWith('v')) {
9166 code = code.replace(/^v\s*/, '');
9168 res = await nvim.eval(code);
9171 res = `Error: ${e.message}`;
9172 this.error(e.stack);
9178 res = await pify_1.default(child_process_1.exec)(code);
9181 res = `Error: ${e.message}`;
9182 this.error(`Error on eval ${code}: ` + e.stack);
9185 res = res.toString();
9186 res = res.replace(/\r?\n$/, '');
9187 let parts = res.split(/\r?\n/);
9188 if (parts.length > 1) {
9189 res = parts.map((s, idx) => {
9190 if (idx == 0 || s.length == 0)
9192 return `${indent}${s}`;
9200 this.channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}] ${str}`);
9203 if (!this.channel || this.trace == 'error')
9205 this.channel.appendLine(`[Debug ${(new Date()).toLocaleTimeString()}] ${str}`);
9208 exports.default = UltiSnipsParser;
9209 function decode(str) {
9210 return str.replace(/\\`/g, '`').replace(/\\{/g, '{');
9212 function getTriggerKind(option) {
9213 if (option.indexOf('w') !== -1) {
9214 return types_1.TriggerKind.WordBoundary;
9216 if (option.indexOf('b') !== -1) {
9217 return types_1.TriggerKind.LineBegin;
9219 if (option.indexOf('i') !== -1) {
9220 return types_1.TriggerKind.InWord;
9222 return types_1.TriggerKind.SpaceBefore;
9228 /***/ (function(module, exports) {
9230 module.exports = require("child_process");
9234 /***/ (function(module, exports) {
9237 * Returns a function, that, as long as it continues to be invoked, will not
9238 * be triggered. The function will be called after it stops being called for
9239 * N milliseconds. If `immediate` is passed, trigger the function on the
9240 * leading edge, instead of the trailing. The function also has a property 'clear'
9241 * that is a function which will clear the timer to prevent previously scheduled executions.
9243 * @source underscore.js
9244 * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/
9245 * @param {Function} function to wrap
9246 * @param {Number} timeout in ms (`100`)
9247 * @param {Boolean} whether to execute at the beginning (`false`)
9250 function debounce(func, wait, immediate){
9251 var timeout, args, context, timestamp, result;
9252 if (null == wait) wait = 100;
9255 var last = Date.now() - timestamp;
9257 if (last < wait && last >= 0) {
9258 timeout = setTimeout(later, wait - last);
9262 result = func.apply(context, args);
9263 context = args = null;
9268 var debounced = function(){
9271 timestamp = Date.now();
9272 var callNow = immediate && !timeout;
9273 if (!timeout) timeout = setTimeout(later, wait);
9275 result = func.apply(context, args);
9276 context = args = null;
9282 debounced.clear = function() {
9284 clearTimeout(timeout);
9289 debounced.flush = function() {
9291 result = func.apply(context, args);
9292 context = args = null;
9294 clearTimeout(timeout);
9302 // Adds compatibility for ES modules
9303 debounce.debounce = debounce;
9305 module.exports = debounce;
9310 /***/ (function(module, exports, __webpack_require__) {
9314 Object.defineProperty(exports, "__esModule", { value: true });
9315 const coc_nvim_1 = __webpack_require__(1);
9316 const vscode_languageserver_protocol_1 = __webpack_require__(8);
9317 const util_1 = __webpack_require__(37);
9318 const codesMap = new Map();
9319 codesMap.set(1, 'invalid snippet line, trigger requried.');
9320 codesMap.set(2, 'invalid snippet option, option "$1" not supported.');
9321 codesMap.set(3, 'invalid python expression, $1');
9322 codesMap.set(4, 'invalid code interpolation, #! not supported.');
9323 const validOptions = ['b', 'i', 'w', 'r', 'e', 'A'];
9324 class LanguageProvider {
9325 constructor(channel, trace = 'error') {
9326 this.channel = channel;
9328 this.disposables = [];
9329 this.collection = coc_nvim_1.languages.createDiagnosticCollection('snippets');
9330 for (let doc of coc_nvim_1.workspace.documents) {
9331 if (this.shouldValidate(doc.uri)) {
9332 this.validate(doc.uri, doc.getDocumentContent()).catch(e => {
9333 channel.appendLine(`[Error ${(new Date()).toLocaleTimeString()}]: ${e.message}`);
9337 coc_nvim_1.workspace.onDidOpenTextDocument(async (textDocument) => {
9338 let doc = coc_nvim_1.workspace.getDocument(textDocument.uri);
9339 if (!this.shouldValidate(doc.uri))
9341 await this.validate(doc.uri, doc.getDocumentContent());
9342 }, null, this.disposables);
9343 coc_nvim_1.workspace.onDidChangeTextDocument(async (ev) => {
9344 let doc = coc_nvim_1.workspace.getDocument(ev.textDocument.uri);
9345 if (!doc || !this.shouldValidate(doc.uri))
9347 await this.validate(doc.uri, doc.getDocumentContent());
9348 }, null, this.disposables);
9349 coc_nvim_1.workspace.onDidCloseTextDocument(e => {
9350 this.collection.delete(e.uri);
9351 }, null, this.disposables);
9353 shouldValidate(uri) {
9354 return uri.endsWith('.snippets');
9356 async validate(uri, content) {
9357 let lines = content.split('\n');
9358 let diagnostics = [];
9360 for (let line of lines) {
9361 if (/^snippet\s*$/.test(line)) {
9362 let range = vscode_languageserver_protocol_1.Range.create(curr, 0, curr, line.length);
9363 diagnostics.push(vscode_languageserver_protocol_1.Diagnostic.create(range, codesMap.get(1), vscode_languageserver_protocol_1.DiagnosticSeverity.Error, 1));
9366 if (line.startsWith('snippet ')) {
9367 let content = util_1.headTail(line)[1];
9368 let ms = content.match(/^(.+?)(?:\s+(?:"(.*?)")?(?:\s+"(.*?)")?(?:\s+(\w+))?)?$/);
9370 if (prefix.length > 2 && prefix[0] == prefix[prefix.length - 1] && !/\w/.test(prefix[0])) {
9371 prefix = prefix.slice(1, prefix.length - 1);
9373 let option = ms[4] || '';
9374 let isExpression = option.indexOf('r') !== -1;
9375 let startCharacter = line.length - option.length;
9376 for (let ch of option) {
9377 if (validOptions.indexOf(ch) == -1) {
9378 let range = vscode_languageserver_protocol_1.Range.create(curr, startCharacter, curr, startCharacter + 1);
9379 let message = codesMap.get(2).replace('$1', ch);
9380 diagnostics.push(vscode_languageserver_protocol_1.Diagnostic.create(range, message, vscode_languageserver_protocol_1.DiagnosticSeverity.Error, 2));
9382 startCharacter = startCharacter + 1;
9386 util_1.convertRegex(prefix);
9389 let start = line.indexOf(prefix);
9390 let range = vscode_languageserver_protocol_1.Range.create(curr, start, curr, start + prefix.length);
9391 let message = codesMap.get(3).replace('$1', e.message);
9392 diagnostics.push(vscode_languageserver_protocol_1.Diagnostic.create(range, message, vscode_languageserver_protocol_1.DiagnosticSeverity.Error, 3));
9397 let idx = line.indexOf('`#!');
9399 let range = vscode_languageserver_protocol_1.Range.create(curr, idx, curr, idx + 3);
9400 let message = codesMap.get(4);
9401 diagnostics.push(vscode_languageserver_protocol_1.Diagnostic.create(range, message, vscode_languageserver_protocol_1.DiagnosticSeverity.Error, 4));
9406 if (this.trace == 'verbose') {
9407 this.channel.appendLine(`[Debug ${(new Date()).toLocaleTimeString()}] diagnostics of ${uri} -> ${JSON.stringify(diagnostics)}`);
9409 this.collection.set(uri, diagnostics);
9411 provideCompletionItems(_document, position, _token, context) {
9412 let { input, col } = context.option;
9413 if (context.triggerCharacter == '$') {
9416 kind: vscode_languageserver_protocol_1.CompletionItemKind.Snippet,
9417 // tslint:disable-next-line: no-invalid-template-strings
9418 detail: '${VISUAL}',
9419 insertTextFormat: vscode_languageserver_protocol_1.InsertTextFormat.Snippet,
9421 range: vscode_languageserver_protocol_1.Range.create(position.line, position.character - 1, position.line, position.character),
9422 // tslint:disable-next-line: no-invalid-template-strings
9423 newText: '\\${VISUAL${1::default}\\}'
9427 if (col == 0 && 'snippet'.startsWith(input)) {
9430 kind: vscode_languageserver_protocol_1.CompletionItemKind.Snippet,
9431 detail: 'Snippet definition',
9432 insertTextFormat: vscode_languageserver_protocol_1.InsertTextFormat.Snippet,
9433 // tslint:disable-next-line: no-invalid-template-strings
9434 insertText: 'snippet ${1:Tab_trigger} "${2:Description}" ${3:b}\n$0\nendsnippet'
9439 async resolveCompletionItem(item) {
9440 // tslint:disable-next-line: deprecation
9441 let text = item.insertText || item.textEdit.newText;
9442 // tslint:disable-next-line: deprecation
9443 let snip = await Promise.resolve(coc_nvim_1.snippetManager.resolveSnippet(text));
9444 item.documentation = {
9446 value: util_1.markdownBlock(snip.toString(), 'snippets')
9451 exports.default = LanguageProvider;