UNPKG

coc-phpls

Version:

PHP language server extension for coc.nvim

227 lines 8.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WorkspaceDiscovery = void 0; const tslib_1 = require("tslib"); const fs = tslib_1.__importStar(require("fs-extra")); const discoverSymbolsRequestName = 'discoverSymbols'; const discoverReferencesRequestName = 'discoverReferences'; const forgetRequestName = 'forget'; const knownDocumentsRequestName = 'knownDocuments'; const phpLanguageId = 'php'; var WorkspaceDiscovery; (function (WorkspaceDiscovery) { const delayedDiscoverDebounceTime = 500; var delayedDiscoverUriArray = []; var delayedDiscoverTimer; function checkCacheThenDiscover(uriArray, checkModTime, token) { return knownDocumentsRequest(token).then((status) => { let timestamp = status.timestamp; let cachedUriSet = new Set(status.documents); let notKnown = []; let known = []; let uri; let uriString; for (let n = 0, l = uriArray.length; n < l; ++n) { uri = uriArray[n]; uriString = uri.toString(); if (cachedUriSet.has(uriString)) { known.push(uri); cachedUriSet.delete(uriString); } else { notKnown.push(uri); } } return forgetMany(Array.from(cachedUriSet)).then(() => { return checkModTime ? filterKnownByModtime(known, timestamp) : Promise.resolve([]); }).then((filteredUriArray) => { Array.prototype.push.apply(notKnown, filteredUriArray); return discover(notKnown, token); }); }); } WorkspaceDiscovery.checkCacheThenDiscover = checkCacheThenDiscover; function modTime(uri) { return fs.stat(uri.fsPath).then((stats) => { return [uri, stats.mtime.getTime()]; }).catch((err) => { if (err && err.message) { WorkspaceDiscovery.client.warn(err.message); } return [uri, 0]; }); } function filterKnownByModtime(knownUriArray, timestamp) { return new Promise((resolve, reject) => { if (!timestamp || knownUriArray.length < 1) { resolve(knownUriArray); } let filtered = []; let onResolved = (result) => { if (result[1] > timestamp) { //was modified since last shutdown filtered.push(result[0]); } --count; if (count < 1) { resolve(filtered); } else { let uri = knownUriArray.pop(); if (uri) { modTime(uri).then(onResolved); } } }; let count = knownUriArray.length; knownUriArray = knownUriArray.slice(0); let batchSize = Math.min(4, count); let uri; while (batchSize-- > 0 && (uri = knownUriArray.pop())) { modTime(uri).then(onResolved); } }); } function forgetMany(uriArray) { return new Promise((resolve, reject) => { if (uriArray.length < 1) { resolve(); } uriArray = uriArray.slice(0); let count = uriArray.length; let batchSize = Math.min(4, count); let onFulfilled = () => { --count; if (count < 1) { resolve(); } else { let uri = uriArray.pop(); if (uri) { forgetRequest(uri).then(onFulfilled, onFailed); } } }; let onFailed = (msg) => { WorkspaceDiscovery.client.warn(msg); onFulfilled(); }; let uri; while (batchSize-- > 0 && (uri = uriArray.pop())) { forgetRequest(uri).then(onFulfilled, onFailed); } }); } function discover(uriArray, token) { return discoverSymbolsMany(uriArray, token).then(() => { return discoverReferencesMany(uriArray, token); }); } WorkspaceDiscovery.discover = discover; function delayedDiscover(uri) { clearTimeout(delayedDiscoverTimer); delayedDiscoverTimer = undefined; if (delayedDiscoverUriArray.indexOf(uri) < 0) { delayedDiscoverUriArray.push(uri); } delayedDiscoverTimer = setTimeout(delayedDiscoverFlush, delayedDiscoverDebounceTime); } WorkspaceDiscovery.delayedDiscover = delayedDiscover; function delayedDiscoverFlush() { if (!delayedDiscoverTimer) { return; } clearTimeout(delayedDiscoverTimer); delayedDiscoverTimer = undefined; discover(delayedDiscoverUriArray); delayedDiscoverUriArray = []; } WorkspaceDiscovery.delayedDiscoverFlush = delayedDiscoverFlush; function forget(uri) { return forgetRequest(uri); } WorkspaceDiscovery.forget = forget; function discoverSymbols(uri) { return readTextDocumentItem(uri).then(discoverSymbolsRequest); } function discoverSymbolsMany(uriArray, token) { return discoverMany(discoverSymbols, uriArray, token); } function discoverReferences(uri) { return readTextDocumentItem(uri).then(discoverReferencesRequest); } function discoverReferencesMany(uriArray, token) { return discoverMany(discoverReferences, uriArray, token); } function discoverMany(discoverFn, uriArray, token) { if (uriArray.length < 1 || (token && token.isCancellationRequested)) { return Promise.resolve(0); } return new Promise((resolve, reject) => { let remaining = uriArray.length; let items = uriArray.slice(0); let item; let maxOpenFiles = 8; let cancelled = false; let onAlways = () => { --remaining; let uri; if (cancelled) { return; } else if (remaining < 1 || (token && token.isCancellationRequested && !cancelled)) { if (token && token.isCancellationRequested) { cancelled = true; } resolve(uriArray.length); } else if (uri = items.pop()) { discoverFn(uri, token).then(onResolve).catch(onReject); } }; let onResolve = (n) => { onAlways(); }; let onReject = (errMsg) => { WorkspaceDiscovery.client.warn(errMsg); onAlways(); }; while (maxOpenFiles > 0 && (item = items.pop())) { discoverFn(item, token).then(onResolve).catch(onReject); --maxOpenFiles; } }); } function readTextDocumentItem(uri) { return new Promise((resolve, reject) => { fs.readFile(uri.fsPath, (readErr, data) => { if (readErr) { reject(readErr.message); return; } let doc = { uri: uri.toString(), text: data.toString(), languageId: phpLanguageId, version: 0 }; if (doc.text.length > WorkspaceDiscovery.maxFileSizeBytes) { reject(`${uri} exceeds maximum file size.`); return; } resolve(doc); }); }); } function forgetRequest(uri) { return WorkspaceDiscovery.client.sendRequest(forgetRequestName, { uri: uri.toString() }); } function discoverSymbolsRequest(doc) { return WorkspaceDiscovery.client.sendRequest(discoverSymbolsRequestName, { textDocument: doc }); } function discoverReferencesRequest(doc) { return WorkspaceDiscovery.client.sendRequest(discoverReferencesRequestName, { textDocument: doc }); } function knownDocumentsRequest(token) { return WorkspaceDiscovery.client.sendRequest(knownDocumentsRequestName, token); } })(WorkspaceDiscovery = exports.WorkspaceDiscovery || (exports.WorkspaceDiscovery = {})); //# sourceMappingURL=workspaceDiscovery.js.map