13509 lines
478 KiB
JavaScript
13509 lines
478 KiB
JavaScript
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __markAsModule = (target) => __defProp(target, "__esModule", {value: true});
|
|
var __commonJS = (callback, module2) => () => {
|
|
if (!module2) {
|
|
module2 = {exports: {}};
|
|
callback(module2.exports, module2);
|
|
}
|
|
return module2.exports;
|
|
};
|
|
var __export = (target, all) => {
|
|
__markAsModule(target);
|
|
for (var name in all)
|
|
__defProp(target, name, {get: all[name], enumerable: true});
|
|
};
|
|
var __exportStar = (target, module2, desc) => {
|
|
__markAsModule(target);
|
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
|
for (let key of __getOwnPropNames(module2))
|
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
|
__defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable});
|
|
}
|
|
return target;
|
|
};
|
|
var __toModule = (module2) => {
|
|
if (module2 && module2.__esModule)
|
|
return module2;
|
|
return __exportStar(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", {value: module2, enumerable: true}), module2);
|
|
};
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/ral.js
|
|
var require_ral = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
var _ral;
|
|
function RAL() {
|
|
if (_ral === void 0) {
|
|
throw new Error(`No runtime abstraction layer installed`);
|
|
}
|
|
return _ral;
|
|
}
|
|
(function(RAL2) {
|
|
function install(ral) {
|
|
if (ral === void 0) {
|
|
throw new Error(`No runtime abstraction layer provided`);
|
|
}
|
|
_ral = ral;
|
|
}
|
|
RAL2.install = install;
|
|
})(RAL || (RAL = {}));
|
|
exports2.default = RAL;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/disposable.js
|
|
var require_disposable = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.Disposable = void 0;
|
|
var Disposable13;
|
|
(function(Disposable14) {
|
|
function create(func) {
|
|
return {
|
|
dispose: func
|
|
};
|
|
}
|
|
Disposable14.create = create;
|
|
})(Disposable13 = exports2.Disposable || (exports2.Disposable = {}));
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/messageBuffer.js
|
|
var require_messageBuffer = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.AbstractMessageBuffer = void 0;
|
|
var CR = 13;
|
|
var LF = 10;
|
|
var CRLF = "\r\n";
|
|
var AbstractMessageBuffer = class {
|
|
constructor(encoding = "utf-8") {
|
|
this._encoding = encoding;
|
|
this._chunks = [];
|
|
this._totalLength = 0;
|
|
}
|
|
get encoding() {
|
|
return this._encoding;
|
|
}
|
|
append(chunk) {
|
|
const toAppend = typeof chunk === "string" ? this.fromString(chunk, this._encoding) : chunk;
|
|
this._chunks.push(toAppend);
|
|
this._totalLength += toAppend.byteLength;
|
|
}
|
|
tryReadHeaders() {
|
|
if (this._chunks.length === 0) {
|
|
return void 0;
|
|
}
|
|
let state = 0;
|
|
let chunkIndex = 0;
|
|
let offset = 0;
|
|
let chunkBytesRead = 0;
|
|
row:
|
|
while (chunkIndex < this._chunks.length) {
|
|
const chunk = this._chunks[chunkIndex];
|
|
offset = 0;
|
|
column:
|
|
while (offset < chunk.length) {
|
|
const value = chunk[offset];
|
|
switch (value) {
|
|
case CR:
|
|
switch (state) {
|
|
case 0:
|
|
state = 1;
|
|
break;
|
|
case 2:
|
|
state = 3;
|
|
break;
|
|
default:
|
|
state = 0;
|
|
}
|
|
break;
|
|
case LF:
|
|
switch (state) {
|
|
case 1:
|
|
state = 2;
|
|
break;
|
|
case 3:
|
|
state = 4;
|
|
offset++;
|
|
break row;
|
|
default:
|
|
state = 0;
|
|
}
|
|
break;
|
|
default:
|
|
state = 0;
|
|
}
|
|
offset++;
|
|
}
|
|
chunkBytesRead += chunk.byteLength;
|
|
chunkIndex++;
|
|
}
|
|
if (state !== 4) {
|
|
return void 0;
|
|
}
|
|
const buffer = this._read(chunkBytesRead + offset);
|
|
const result = new Map();
|
|
const headers = this.toString(buffer, "ascii").split(CRLF);
|
|
if (headers.length < 2) {
|
|
return result;
|
|
}
|
|
for (let i = 0; i < headers.length - 2; i++) {
|
|
const header = headers[i];
|
|
const index = header.indexOf(":");
|
|
if (index === -1) {
|
|
throw new Error("Message header must separate key and value using :");
|
|
}
|
|
const key = header.substr(0, index);
|
|
const value = header.substr(index + 1).trim();
|
|
result.set(key, value);
|
|
}
|
|
return result;
|
|
}
|
|
tryReadBody(length) {
|
|
if (this._totalLength < length) {
|
|
return void 0;
|
|
}
|
|
return this._read(length);
|
|
}
|
|
get numberOfBytes() {
|
|
return this._totalLength;
|
|
}
|
|
_read(byteCount) {
|
|
if (byteCount === 0) {
|
|
return this.emptyBuffer();
|
|
}
|
|
if (byteCount > this._totalLength) {
|
|
throw new Error(`Cannot read so many bytes!`);
|
|
}
|
|
if (this._chunks[0].byteLength === byteCount) {
|
|
const chunk = this._chunks[0];
|
|
this._chunks.shift();
|
|
this._totalLength -= byteCount;
|
|
return this.asNative(chunk);
|
|
}
|
|
if (this._chunks[0].byteLength > byteCount) {
|
|
const chunk = this._chunks[0];
|
|
const result2 = this.asNative(chunk, byteCount);
|
|
this._chunks[0] = chunk.slice(byteCount);
|
|
this._totalLength -= byteCount;
|
|
return result2;
|
|
}
|
|
const result = this.allocNative(byteCount);
|
|
let resultOffset = 0;
|
|
let chunkIndex = 0;
|
|
while (byteCount > 0) {
|
|
const chunk = this._chunks[chunkIndex];
|
|
if (chunk.byteLength > byteCount) {
|
|
const chunkPart = chunk.slice(0, byteCount);
|
|
result.set(chunkPart, resultOffset);
|
|
resultOffset += byteCount;
|
|
this._chunks[chunkIndex] = chunk.slice(byteCount);
|
|
this._totalLength -= byteCount;
|
|
byteCount -= byteCount;
|
|
} else {
|
|
result.set(chunk, resultOffset);
|
|
resultOffset += chunk.byteLength;
|
|
this._chunks.shift();
|
|
this._totalLength -= chunk.byteLength;
|
|
byteCount -= chunk.byteLength;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
exports2.AbstractMessageBuffer = AbstractMessageBuffer;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/node/ril.js
|
|
var require_ril = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
var ral_1 = require_ral();
|
|
var util_1 = require("util");
|
|
var disposable_1 = require_disposable();
|
|
var messageBuffer_1 = require_messageBuffer();
|
|
var MessageBuffer = class extends messageBuffer_1.AbstractMessageBuffer {
|
|
constructor(encoding = "utf-8") {
|
|
super(encoding);
|
|
}
|
|
emptyBuffer() {
|
|
return MessageBuffer.emptyBuffer;
|
|
}
|
|
fromString(value, encoding) {
|
|
return Buffer.from(value, encoding);
|
|
}
|
|
toString(value, encoding) {
|
|
if (value instanceof Buffer) {
|
|
return value.toString(encoding);
|
|
} else {
|
|
return new util_1.TextDecoder(encoding).decode(value);
|
|
}
|
|
}
|
|
asNative(buffer, length) {
|
|
if (length === void 0) {
|
|
return buffer instanceof Buffer ? buffer : Buffer.from(buffer);
|
|
} else {
|
|
return buffer instanceof Buffer ? buffer.slice(0, length) : Buffer.from(buffer, 0, length);
|
|
}
|
|
}
|
|
allocNative(length) {
|
|
return Buffer.allocUnsafe(length);
|
|
}
|
|
};
|
|
MessageBuffer.emptyBuffer = Buffer.allocUnsafe(0);
|
|
var ReadableStreamWrapper = class {
|
|
constructor(stream) {
|
|
this.stream = stream;
|
|
}
|
|
onClose(listener) {
|
|
this.stream.on("close", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("close", listener));
|
|
}
|
|
onError(listener) {
|
|
this.stream.on("error", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("error", listener));
|
|
}
|
|
onEnd(listener) {
|
|
this.stream.on("end", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("end", listener));
|
|
}
|
|
onData(listener) {
|
|
this.stream.on("data", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("data", listener));
|
|
}
|
|
};
|
|
var WritableStreamWrapper = class {
|
|
constructor(stream) {
|
|
this.stream = stream;
|
|
}
|
|
onClose(listener) {
|
|
this.stream.on("close", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("close", listener));
|
|
}
|
|
onError(listener) {
|
|
this.stream.on("error", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("error", listener));
|
|
}
|
|
onEnd(listener) {
|
|
this.stream.on("end", listener);
|
|
return disposable_1.Disposable.create(() => this.stream.off("end", listener));
|
|
}
|
|
write(data, encoding) {
|
|
return new Promise((resolve, reject) => {
|
|
const callback = (error) => {
|
|
if (error === void 0 || error === null) {
|
|
resolve();
|
|
} else {
|
|
reject(error);
|
|
}
|
|
};
|
|
if (typeof data === "string") {
|
|
this.stream.write(data, encoding, callback);
|
|
} else {
|
|
this.stream.write(data, callback);
|
|
}
|
|
});
|
|
}
|
|
end() {
|
|
this.stream.end();
|
|
}
|
|
};
|
|
var _ril = Object.freeze({
|
|
messageBuffer: Object.freeze({
|
|
create: (encoding) => new MessageBuffer(encoding)
|
|
}),
|
|
applicationJson: Object.freeze({
|
|
encoder: Object.freeze({
|
|
name: "application/json",
|
|
encode: (msg, options) => {
|
|
try {
|
|
return Promise.resolve(Buffer.from(JSON.stringify(msg, void 0, 0), options.charset));
|
|
} catch (err) {
|
|
return Promise.reject(err);
|
|
}
|
|
}
|
|
}),
|
|
decoder: Object.freeze({
|
|
name: "application/json",
|
|
decode: (buffer, options) => {
|
|
try {
|
|
if (buffer instanceof Buffer) {
|
|
return Promise.resolve(JSON.parse(buffer.toString(options.charset)));
|
|
} else {
|
|
return Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));
|
|
}
|
|
} catch (err) {
|
|
return Promise.reject(err);
|
|
}
|
|
}
|
|
})
|
|
}),
|
|
stream: Object.freeze({
|
|
asReadableStream: (stream) => new ReadableStreamWrapper(stream),
|
|
asWritableStream: (stream) => new WritableStreamWrapper(stream)
|
|
}),
|
|
console,
|
|
timer: Object.freeze({
|
|
setTimeout(callback, ms, ...args) {
|
|
return setTimeout(callback, ms, ...args);
|
|
},
|
|
clearTimeout(handle) {
|
|
clearTimeout(handle);
|
|
},
|
|
setImmediate(callback, ...args) {
|
|
return setImmediate(callback, ...args);
|
|
},
|
|
clearImmediate(handle) {
|
|
clearImmediate(handle);
|
|
}
|
|
})
|
|
});
|
|
function RIL() {
|
|
return _ril;
|
|
}
|
|
(function(RIL2) {
|
|
function install() {
|
|
ral_1.default.install(_ril);
|
|
}
|
|
RIL2.install = install;
|
|
})(RIL || (RIL = {}));
|
|
exports2.default = RIL;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/is.js
|
|
var require_is = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.stringArray = exports2.array = exports2.func = exports2.error = exports2.number = exports2.string = exports2.boolean = void 0;
|
|
function boolean2(value) {
|
|
return value === true || value === false;
|
|
}
|
|
exports2.boolean = boolean2;
|
|
function string2(value) {
|
|
return typeof value === "string" || value instanceof String;
|
|
}
|
|
exports2.string = string2;
|
|
function number(value) {
|
|
return typeof value === "number" || value instanceof Number;
|
|
}
|
|
exports2.number = number;
|
|
function error(value) {
|
|
return value instanceof Error;
|
|
}
|
|
exports2.error = error;
|
|
function func(value) {
|
|
return typeof value === "function";
|
|
}
|
|
exports2.func = func;
|
|
function array(value) {
|
|
return Array.isArray(value);
|
|
}
|
|
exports2.array = array;
|
|
function stringArray(value) {
|
|
return array(value) && value.every((elem) => string2(elem));
|
|
}
|
|
exports2.stringArray = stringArray;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/messages.js
|
|
var require_messages = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.isResponseMessage = exports2.isNotificationMessage = exports2.isRequestMessage = exports2.NotificationType9 = exports2.NotificationType8 = exports2.NotificationType7 = exports2.NotificationType6 = exports2.NotificationType5 = exports2.NotificationType4 = exports2.NotificationType3 = exports2.NotificationType2 = exports2.NotificationType1 = exports2.NotificationType0 = exports2.NotificationType = exports2.RequestType9 = exports2.RequestType8 = exports2.RequestType7 = exports2.RequestType6 = exports2.RequestType5 = exports2.RequestType4 = exports2.RequestType3 = exports2.RequestType2 = exports2.RequestType1 = exports2.RequestType = exports2.RequestType0 = exports2.AbstractMessageSignature = exports2.ParameterStructures = exports2.ResponseError = exports2.ErrorCodes = void 0;
|
|
var is2 = require_is();
|
|
var ErrorCodes;
|
|
(function(ErrorCodes2) {
|
|
ErrorCodes2.ParseError = -32700;
|
|
ErrorCodes2.InvalidRequest = -32600;
|
|
ErrorCodes2.MethodNotFound = -32601;
|
|
ErrorCodes2.InvalidParams = -32602;
|
|
ErrorCodes2.InternalError = -32603;
|
|
ErrorCodes2.jsonrpcReservedErrorRangeStart = -32099;
|
|
ErrorCodes2.serverErrorStart = ErrorCodes2.jsonrpcReservedErrorRangeStart;
|
|
ErrorCodes2.MessageWriteError = -32099;
|
|
ErrorCodes2.MessageReadError = -32098;
|
|
ErrorCodes2.ServerNotInitialized = -32002;
|
|
ErrorCodes2.UnknownErrorCode = -32001;
|
|
ErrorCodes2.jsonrpcReservedErrorRangeEnd = -32e3;
|
|
ErrorCodes2.serverErrorEnd = ErrorCodes2.jsonrpcReservedErrorRangeEnd;
|
|
})(ErrorCodes = exports2.ErrorCodes || (exports2.ErrorCodes = {}));
|
|
var ResponseError = class extends Error {
|
|
constructor(code, message, data) {
|
|
super(message);
|
|
this.code = is2.number(code) ? code : ErrorCodes.UnknownErrorCode;
|
|
this.data = data;
|
|
Object.setPrototypeOf(this, ResponseError.prototype);
|
|
}
|
|
toJson() {
|
|
return {
|
|
code: this.code,
|
|
message: this.message,
|
|
data: this.data
|
|
};
|
|
}
|
|
};
|
|
exports2.ResponseError = ResponseError;
|
|
var ParameterStructures = class {
|
|
constructor(kind) {
|
|
this.kind = kind;
|
|
}
|
|
static is(value) {
|
|
return value === ParameterStructures.auto || value === ParameterStructures.byName || value === ParameterStructures.byPosition;
|
|
}
|
|
toString() {
|
|
return this.kind;
|
|
}
|
|
};
|
|
exports2.ParameterStructures = ParameterStructures;
|
|
ParameterStructures.auto = new ParameterStructures("auto");
|
|
ParameterStructures.byPosition = new ParameterStructures("byPosition");
|
|
ParameterStructures.byName = new ParameterStructures("byName");
|
|
var AbstractMessageSignature = class {
|
|
constructor(method, numberOfParams) {
|
|
this.method = method;
|
|
this.numberOfParams = numberOfParams;
|
|
}
|
|
get parameterStructures() {
|
|
return ParameterStructures.auto;
|
|
}
|
|
};
|
|
exports2.AbstractMessageSignature = AbstractMessageSignature;
|
|
var RequestType0 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 0);
|
|
}
|
|
};
|
|
exports2.RequestType0 = RequestType0;
|
|
var RequestType = class extends AbstractMessageSignature {
|
|
constructor(method, _parameterStructures = ParameterStructures.auto) {
|
|
super(method, 1);
|
|
this._parameterStructures = _parameterStructures;
|
|
}
|
|
get parameterStructures() {
|
|
return this._parameterStructures;
|
|
}
|
|
};
|
|
exports2.RequestType = RequestType;
|
|
var RequestType1 = class extends AbstractMessageSignature {
|
|
constructor(method, _parameterStructures = ParameterStructures.auto) {
|
|
super(method, 1);
|
|
this._parameterStructures = _parameterStructures;
|
|
}
|
|
get parameterStructures() {
|
|
return this._parameterStructures;
|
|
}
|
|
};
|
|
exports2.RequestType1 = RequestType1;
|
|
var RequestType2 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 2);
|
|
}
|
|
};
|
|
exports2.RequestType2 = RequestType2;
|
|
var RequestType3 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 3);
|
|
}
|
|
};
|
|
exports2.RequestType3 = RequestType3;
|
|
var RequestType4 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 4);
|
|
}
|
|
};
|
|
exports2.RequestType4 = RequestType4;
|
|
var RequestType5 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 5);
|
|
}
|
|
};
|
|
exports2.RequestType5 = RequestType5;
|
|
var RequestType6 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 6);
|
|
}
|
|
};
|
|
exports2.RequestType6 = RequestType6;
|
|
var RequestType7 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 7);
|
|
}
|
|
};
|
|
exports2.RequestType7 = RequestType7;
|
|
var RequestType8 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 8);
|
|
}
|
|
};
|
|
exports2.RequestType8 = RequestType8;
|
|
var RequestType9 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 9);
|
|
}
|
|
};
|
|
exports2.RequestType9 = RequestType9;
|
|
var NotificationType = class extends AbstractMessageSignature {
|
|
constructor(method, _parameterStructures = ParameterStructures.auto) {
|
|
super(method, 1);
|
|
this._parameterStructures = _parameterStructures;
|
|
}
|
|
get parameterStructures() {
|
|
return this._parameterStructures;
|
|
}
|
|
};
|
|
exports2.NotificationType = NotificationType;
|
|
var NotificationType0 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 0);
|
|
}
|
|
};
|
|
exports2.NotificationType0 = NotificationType0;
|
|
var NotificationType1 = class extends AbstractMessageSignature {
|
|
constructor(method, _parameterStructures = ParameterStructures.auto) {
|
|
super(method, 1);
|
|
this._parameterStructures = _parameterStructures;
|
|
}
|
|
get parameterStructures() {
|
|
return this._parameterStructures;
|
|
}
|
|
};
|
|
exports2.NotificationType1 = NotificationType1;
|
|
var NotificationType2 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 2);
|
|
}
|
|
};
|
|
exports2.NotificationType2 = NotificationType2;
|
|
var NotificationType3 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 3);
|
|
}
|
|
};
|
|
exports2.NotificationType3 = NotificationType3;
|
|
var NotificationType4 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 4);
|
|
}
|
|
};
|
|
exports2.NotificationType4 = NotificationType4;
|
|
var NotificationType5 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 5);
|
|
}
|
|
};
|
|
exports2.NotificationType5 = NotificationType5;
|
|
var NotificationType6 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 6);
|
|
}
|
|
};
|
|
exports2.NotificationType6 = NotificationType6;
|
|
var NotificationType7 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 7);
|
|
}
|
|
};
|
|
exports2.NotificationType7 = NotificationType7;
|
|
var NotificationType8 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 8);
|
|
}
|
|
};
|
|
exports2.NotificationType8 = NotificationType8;
|
|
var NotificationType9 = class extends AbstractMessageSignature {
|
|
constructor(method) {
|
|
super(method, 9);
|
|
}
|
|
};
|
|
exports2.NotificationType9 = NotificationType9;
|
|
function isRequestMessage(message) {
|
|
const candidate = message;
|
|
return candidate && is2.string(candidate.method) && (is2.string(candidate.id) || is2.number(candidate.id));
|
|
}
|
|
exports2.isRequestMessage = isRequestMessage;
|
|
function isNotificationMessage(message) {
|
|
const candidate = message;
|
|
return candidate && is2.string(candidate.method) && message.id === void 0;
|
|
}
|
|
exports2.isNotificationMessage = isNotificationMessage;
|
|
function isResponseMessage(message) {
|
|
const candidate = message;
|
|
return candidate && (candidate.result !== void 0 || !!candidate.error) && (is2.string(candidate.id) || is2.number(candidate.id) || candidate.id === null);
|
|
}
|
|
exports2.isResponseMessage = isResponseMessage;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/events.js
|
|
var require_events = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.Emitter = exports2.Event = void 0;
|
|
var ral_1 = require_ral();
|
|
var Event5;
|
|
(function(Event6) {
|
|
const _disposable = {dispose() {
|
|
}};
|
|
Event6.None = function() {
|
|
return _disposable;
|
|
};
|
|
})(Event5 = exports2.Event || (exports2.Event = {}));
|
|
var CallbackList = class {
|
|
add(callback, context = null, bucket) {
|
|
if (!this._callbacks) {
|
|
this._callbacks = [];
|
|
this._contexts = [];
|
|
}
|
|
this._callbacks.push(callback);
|
|
this._contexts.push(context);
|
|
if (Array.isArray(bucket)) {
|
|
bucket.push({dispose: () => this.remove(callback, context)});
|
|
}
|
|
}
|
|
remove(callback, context = null) {
|
|
if (!this._callbacks) {
|
|
return;
|
|
}
|
|
let foundCallbackWithDifferentContext = false;
|
|
for (let i = 0, len = this._callbacks.length; i < len; i++) {
|
|
if (this._callbacks[i] === callback) {
|
|
if (this._contexts[i] === context) {
|
|
this._callbacks.splice(i, 1);
|
|
this._contexts.splice(i, 1);
|
|
return;
|
|
} else {
|
|
foundCallbackWithDifferentContext = true;
|
|
}
|
|
}
|
|
}
|
|
if (foundCallbackWithDifferentContext) {
|
|
throw new Error("When adding a listener with a context, you should remove it with the same context");
|
|
}
|
|
}
|
|
invoke(...args) {
|
|
if (!this._callbacks) {
|
|
return [];
|
|
}
|
|
const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);
|
|
for (let i = 0, len = callbacks.length; i < len; i++) {
|
|
try {
|
|
ret.push(callbacks[i].apply(contexts[i], args));
|
|
} catch (e) {
|
|
ral_1.default().console.error(e);
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
isEmpty() {
|
|
return !this._callbacks || this._callbacks.length === 0;
|
|
}
|
|
dispose() {
|
|
this._callbacks = void 0;
|
|
this._contexts = void 0;
|
|
}
|
|
};
|
|
var Emitter6 = class {
|
|
constructor(_options) {
|
|
this._options = _options;
|
|
}
|
|
get event() {
|
|
if (!this._event) {
|
|
this._event = (listener, thisArgs, disposables) => {
|
|
if (!this._callbacks) {
|
|
this._callbacks = new CallbackList();
|
|
}
|
|
if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
|
|
this._options.onFirstListenerAdd(this);
|
|
}
|
|
this._callbacks.add(listener, thisArgs);
|
|
const result = {
|
|
dispose: () => {
|
|
if (!this._callbacks) {
|
|
return;
|
|
}
|
|
this._callbacks.remove(listener, thisArgs);
|
|
result.dispose = Emitter6._noop;
|
|
if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {
|
|
this._options.onLastListenerRemove(this);
|
|
}
|
|
}
|
|
};
|
|
if (Array.isArray(disposables)) {
|
|
disposables.push(result);
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
return this._event;
|
|
}
|
|
fire(event) {
|
|
if (this._callbacks) {
|
|
this._callbacks.invoke.call(this._callbacks, event);
|
|
}
|
|
}
|
|
dispose() {
|
|
if (this._callbacks) {
|
|
this._callbacks.dispose();
|
|
this._callbacks = void 0;
|
|
}
|
|
}
|
|
};
|
|
exports2.Emitter = Emitter6;
|
|
Emitter6._noop = function() {
|
|
};
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/cancellation.js
|
|
var require_cancellation = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.CancellationTokenSource = exports2.CancellationToken = void 0;
|
|
var ral_1 = require_ral();
|
|
var Is = require_is();
|
|
var events_1 = require_events();
|
|
var CancellationToken20;
|
|
(function(CancellationToken21) {
|
|
CancellationToken21.None = Object.freeze({
|
|
isCancellationRequested: false,
|
|
onCancellationRequested: events_1.Event.None
|
|
});
|
|
CancellationToken21.Cancelled = Object.freeze({
|
|
isCancellationRequested: true,
|
|
onCancellationRequested: events_1.Event.None
|
|
});
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && (candidate === CancellationToken21.None || candidate === CancellationToken21.Cancelled || Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested);
|
|
}
|
|
CancellationToken21.is = is2;
|
|
})(CancellationToken20 = exports2.CancellationToken || (exports2.CancellationToken = {}));
|
|
var shortcutEvent = Object.freeze(function(callback, context) {
|
|
const handle = ral_1.default().timer.setTimeout(callback.bind(context), 0);
|
|
return {dispose() {
|
|
ral_1.default().timer.clearTimeout(handle);
|
|
}};
|
|
});
|
|
var MutableToken = class {
|
|
constructor() {
|
|
this._isCancelled = false;
|
|
}
|
|
cancel() {
|
|
if (!this._isCancelled) {
|
|
this._isCancelled = true;
|
|
if (this._emitter) {
|
|
this._emitter.fire(void 0);
|
|
this.dispose();
|
|
}
|
|
}
|
|
}
|
|
get isCancellationRequested() {
|
|
return this._isCancelled;
|
|
}
|
|
get onCancellationRequested() {
|
|
if (this._isCancelled) {
|
|
return shortcutEvent;
|
|
}
|
|
if (!this._emitter) {
|
|
this._emitter = new events_1.Emitter();
|
|
}
|
|
return this._emitter.event;
|
|
}
|
|
dispose() {
|
|
if (this._emitter) {
|
|
this._emitter.dispose();
|
|
this._emitter = void 0;
|
|
}
|
|
}
|
|
};
|
|
var CancellationTokenSource4 = class {
|
|
get token() {
|
|
if (!this._token) {
|
|
this._token = new MutableToken();
|
|
}
|
|
return this._token;
|
|
}
|
|
cancel() {
|
|
if (!this._token) {
|
|
this._token = CancellationToken20.Cancelled;
|
|
} else {
|
|
this._token.cancel();
|
|
}
|
|
}
|
|
dispose() {
|
|
if (!this._token) {
|
|
this._token = CancellationToken20.None;
|
|
} else if (this._token instanceof MutableToken) {
|
|
this._token.dispose();
|
|
}
|
|
}
|
|
};
|
|
exports2.CancellationTokenSource = CancellationTokenSource4;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/messageReader.js
|
|
var require_messageReader = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ReadableStreamMessageReader = exports2.AbstractMessageReader = exports2.MessageReader = void 0;
|
|
var ral_1 = require_ral();
|
|
var Is = require_is();
|
|
var events_1 = require_events();
|
|
var MessageReader;
|
|
(function(MessageReader2) {
|
|
function is2(value) {
|
|
let candidate = value;
|
|
return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) && Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);
|
|
}
|
|
MessageReader2.is = is2;
|
|
})(MessageReader = exports2.MessageReader || (exports2.MessageReader = {}));
|
|
var AbstractMessageReader = class {
|
|
constructor() {
|
|
this.errorEmitter = new events_1.Emitter();
|
|
this.closeEmitter = new events_1.Emitter();
|
|
this.partialMessageEmitter = new events_1.Emitter();
|
|
}
|
|
dispose() {
|
|
this.errorEmitter.dispose();
|
|
this.closeEmitter.dispose();
|
|
}
|
|
get onError() {
|
|
return this.errorEmitter.event;
|
|
}
|
|
fireError(error) {
|
|
this.errorEmitter.fire(this.asError(error));
|
|
}
|
|
get onClose() {
|
|
return this.closeEmitter.event;
|
|
}
|
|
fireClose() {
|
|
this.closeEmitter.fire(void 0);
|
|
}
|
|
get onPartialMessage() {
|
|
return this.partialMessageEmitter.event;
|
|
}
|
|
firePartialMessage(info) {
|
|
this.partialMessageEmitter.fire(info);
|
|
}
|
|
asError(error) {
|
|
if (error instanceof Error) {
|
|
return error;
|
|
} else {
|
|
return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : "unknown"}`);
|
|
}
|
|
}
|
|
};
|
|
exports2.AbstractMessageReader = AbstractMessageReader;
|
|
var ResolvedMessageReaderOptions;
|
|
(function(ResolvedMessageReaderOptions2) {
|
|
function fromOptions(options) {
|
|
var _a;
|
|
let charset;
|
|
let result;
|
|
let contentDecoder;
|
|
const contentDecoders = new Map();
|
|
let contentTypeDecoder;
|
|
const contentTypeDecoders = new Map();
|
|
if (options === void 0 || typeof options === "string") {
|
|
charset = options !== null && options !== void 0 ? options : "utf-8";
|
|
} else {
|
|
charset = (_a = options.charset) !== null && _a !== void 0 ? _a : "utf-8";
|
|
if (options.contentDecoder !== void 0) {
|
|
contentDecoder = options.contentDecoder;
|
|
contentDecoders.set(contentDecoder.name, contentDecoder);
|
|
}
|
|
if (options.contentDecoders !== void 0) {
|
|
for (const decoder of options.contentDecoders) {
|
|
contentDecoders.set(decoder.name, decoder);
|
|
}
|
|
}
|
|
if (options.contentTypeDecoder !== void 0) {
|
|
contentTypeDecoder = options.contentTypeDecoder;
|
|
contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);
|
|
}
|
|
if (options.contentTypeDecoders !== void 0) {
|
|
for (const decoder of options.contentTypeDecoders) {
|
|
contentTypeDecoders.set(decoder.name, decoder);
|
|
}
|
|
}
|
|
}
|
|
if (contentTypeDecoder === void 0) {
|
|
contentTypeDecoder = ral_1.default().applicationJson.decoder;
|
|
contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);
|
|
}
|
|
return {charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders};
|
|
}
|
|
ResolvedMessageReaderOptions2.fromOptions = fromOptions;
|
|
})(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));
|
|
var ReadableStreamMessageReader = class extends AbstractMessageReader {
|
|
constructor(readable, options) {
|
|
super();
|
|
this.readable = readable;
|
|
this.options = ResolvedMessageReaderOptions.fromOptions(options);
|
|
this.buffer = ral_1.default().messageBuffer.create(this.options.charset);
|
|
this._partialMessageTimeout = 1e4;
|
|
this.nextMessageLength = -1;
|
|
this.messageToken = 0;
|
|
}
|
|
set partialMessageTimeout(timeout) {
|
|
this._partialMessageTimeout = timeout;
|
|
}
|
|
get partialMessageTimeout() {
|
|
return this._partialMessageTimeout;
|
|
}
|
|
listen(callback) {
|
|
this.nextMessageLength = -1;
|
|
this.messageToken = 0;
|
|
this.partialMessageTimer = void 0;
|
|
this.callback = callback;
|
|
const result = this.readable.onData((data) => {
|
|
this.onData(data);
|
|
});
|
|
this.readable.onError((error) => this.fireError(error));
|
|
this.readable.onClose(() => this.fireClose());
|
|
return result;
|
|
}
|
|
onData(data) {
|
|
this.buffer.append(data);
|
|
while (true) {
|
|
if (this.nextMessageLength === -1) {
|
|
const headers = this.buffer.tryReadHeaders();
|
|
if (!headers) {
|
|
return;
|
|
}
|
|
const contentLength = headers.get("Content-Length");
|
|
if (!contentLength) {
|
|
throw new Error("Header must provide a Content-Length property.");
|
|
}
|
|
const length = parseInt(contentLength);
|
|
if (isNaN(length)) {
|
|
throw new Error("Content-Length value must be a number.");
|
|
}
|
|
this.nextMessageLength = length;
|
|
}
|
|
const body = this.buffer.tryReadBody(this.nextMessageLength);
|
|
if (body === void 0) {
|
|
this.setPartialMessageTimer();
|
|
return;
|
|
}
|
|
this.clearPartialMessageTimer();
|
|
this.nextMessageLength = -1;
|
|
let p;
|
|
if (this.options.contentDecoder !== void 0) {
|
|
p = this.options.contentDecoder.decode(body);
|
|
} else {
|
|
p = Promise.resolve(body);
|
|
}
|
|
p.then((value) => {
|
|
this.options.contentTypeDecoder.decode(value, this.options).then((msg) => {
|
|
this.callback(msg);
|
|
}, (error) => {
|
|
this.fireError(error);
|
|
});
|
|
}, (error) => {
|
|
this.fireError(error);
|
|
});
|
|
}
|
|
}
|
|
clearPartialMessageTimer() {
|
|
if (this.partialMessageTimer) {
|
|
ral_1.default().timer.clearTimeout(this.partialMessageTimer);
|
|
this.partialMessageTimer = void 0;
|
|
}
|
|
}
|
|
setPartialMessageTimer() {
|
|
this.clearPartialMessageTimer();
|
|
if (this._partialMessageTimeout <= 0) {
|
|
return;
|
|
}
|
|
this.partialMessageTimer = ral_1.default().timer.setTimeout((token, timeout) => {
|
|
this.partialMessageTimer = void 0;
|
|
if (token === this.messageToken) {
|
|
this.firePartialMessage({messageToken: token, waitingTime: timeout});
|
|
this.setPartialMessageTimer();
|
|
}
|
|
}, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);
|
|
}
|
|
};
|
|
exports2.ReadableStreamMessageReader = ReadableStreamMessageReader;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/semaphore.js
|
|
var require_semaphore = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.Semaphore = void 0;
|
|
var ral_1 = require_ral();
|
|
var Semaphore = class {
|
|
constructor(capacity = 1) {
|
|
if (capacity <= 0) {
|
|
throw new Error("Capacity must be greater than 0");
|
|
}
|
|
this._capacity = capacity;
|
|
this._active = 0;
|
|
this._waiting = [];
|
|
}
|
|
lock(thunk) {
|
|
return new Promise((resolve, reject) => {
|
|
this._waiting.push({thunk, resolve, reject});
|
|
this.runNext();
|
|
});
|
|
}
|
|
get active() {
|
|
return this._active;
|
|
}
|
|
runNext() {
|
|
if (this._waiting.length === 0 || this._active === this._capacity) {
|
|
return;
|
|
}
|
|
ral_1.default().timer.setImmediate(() => this.doRunNext());
|
|
}
|
|
doRunNext() {
|
|
if (this._waiting.length === 0 || this._active === this._capacity) {
|
|
return;
|
|
}
|
|
const next = this._waiting.shift();
|
|
this._active++;
|
|
if (this._active > this._capacity) {
|
|
throw new Error(`To many thunks active`);
|
|
}
|
|
try {
|
|
const result = next.thunk();
|
|
if (result instanceof Promise) {
|
|
result.then((value) => {
|
|
this._active--;
|
|
next.resolve(value);
|
|
this.runNext();
|
|
}, (err) => {
|
|
this._active--;
|
|
next.reject(err);
|
|
this.runNext();
|
|
});
|
|
} else {
|
|
this._active--;
|
|
next.resolve(result);
|
|
this.runNext();
|
|
}
|
|
} catch (err) {
|
|
this._active--;
|
|
next.reject(err);
|
|
this.runNext();
|
|
}
|
|
}
|
|
};
|
|
exports2.Semaphore = Semaphore;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/messageWriter.js
|
|
var require_messageWriter = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.WriteableStreamMessageWriter = exports2.AbstractMessageWriter = exports2.MessageWriter = void 0;
|
|
var ral_1 = require_ral();
|
|
var Is = require_is();
|
|
var semaphore_1 = require_semaphore();
|
|
var events_1 = require_events();
|
|
var ContentLength2 = "Content-Length: ";
|
|
var CRLF = "\r\n";
|
|
var MessageWriter;
|
|
(function(MessageWriter2) {
|
|
function is2(value) {
|
|
let candidate = value;
|
|
return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) && Is.func(candidate.onError) && Is.func(candidate.write);
|
|
}
|
|
MessageWriter2.is = is2;
|
|
})(MessageWriter = exports2.MessageWriter || (exports2.MessageWriter = {}));
|
|
var AbstractMessageWriter = class {
|
|
constructor() {
|
|
this.errorEmitter = new events_1.Emitter();
|
|
this.closeEmitter = new events_1.Emitter();
|
|
}
|
|
dispose() {
|
|
this.errorEmitter.dispose();
|
|
this.closeEmitter.dispose();
|
|
}
|
|
get onError() {
|
|
return this.errorEmitter.event;
|
|
}
|
|
fireError(error, message, count) {
|
|
this.errorEmitter.fire([this.asError(error), message, count]);
|
|
}
|
|
get onClose() {
|
|
return this.closeEmitter.event;
|
|
}
|
|
fireClose() {
|
|
this.closeEmitter.fire(void 0);
|
|
}
|
|
asError(error) {
|
|
if (error instanceof Error) {
|
|
return error;
|
|
} else {
|
|
return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : "unknown"}`);
|
|
}
|
|
}
|
|
};
|
|
exports2.AbstractMessageWriter = AbstractMessageWriter;
|
|
var ResolvedMessageWriterOptions;
|
|
(function(ResolvedMessageWriterOptions2) {
|
|
function fromOptions(options) {
|
|
var _a, _b;
|
|
if (options === void 0 || typeof options === "string") {
|
|
return {charset: options !== null && options !== void 0 ? options : "utf-8", contentTypeEncoder: ral_1.default().applicationJson.encoder};
|
|
} else {
|
|
return {charset: (_a = options.charset) !== null && _a !== void 0 ? _a : "utf-8", contentEncoder: options.contentEncoder, contentTypeEncoder: (_b = options.contentTypeEncoder) !== null && _b !== void 0 ? _b : ral_1.default().applicationJson.encoder};
|
|
}
|
|
}
|
|
ResolvedMessageWriterOptions2.fromOptions = fromOptions;
|
|
})(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));
|
|
var WriteableStreamMessageWriter = class extends AbstractMessageWriter {
|
|
constructor(writable, options) {
|
|
super();
|
|
this.writable = writable;
|
|
this.options = ResolvedMessageWriterOptions.fromOptions(options);
|
|
this.errorCount = 0;
|
|
this.writeSemaphore = new semaphore_1.Semaphore(1);
|
|
this.writable.onError((error) => this.fireError(error));
|
|
this.writable.onClose(() => this.fireClose());
|
|
}
|
|
async write(msg) {
|
|
return this.writeSemaphore.lock(async () => {
|
|
const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {
|
|
if (this.options.contentEncoder !== void 0) {
|
|
return this.options.contentEncoder.encode(buffer);
|
|
} else {
|
|
return buffer;
|
|
}
|
|
});
|
|
return payload.then((buffer) => {
|
|
const headers = [];
|
|
headers.push(ContentLength2, buffer.byteLength.toString(), CRLF);
|
|
headers.push(CRLF);
|
|
return this.doWrite(msg, headers, buffer);
|
|
}, (error) => {
|
|
this.fireError(error);
|
|
throw error;
|
|
});
|
|
});
|
|
}
|
|
async doWrite(msg, headers, data) {
|
|
try {
|
|
await this.writable.write(headers.join(""), "ascii");
|
|
return this.writable.write(data);
|
|
} catch (error) {
|
|
this.handleError(error, msg);
|
|
return Promise.reject(error);
|
|
}
|
|
}
|
|
handleError(error, msg) {
|
|
this.errorCount++;
|
|
this.fireError(error, msg, this.errorCount);
|
|
}
|
|
end() {
|
|
this.writable.end();
|
|
}
|
|
};
|
|
exports2.WriteableStreamMessageWriter = WriteableStreamMessageWriter;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/linkedMap.js
|
|
var require_linkedMap = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.LRUCache = exports2.LinkedMap = exports2.Touch = void 0;
|
|
var Touch;
|
|
(function(Touch2) {
|
|
Touch2.None = 0;
|
|
Touch2.First = 1;
|
|
Touch2.AsOld = Touch2.First;
|
|
Touch2.Last = 2;
|
|
Touch2.AsNew = Touch2.Last;
|
|
})(Touch = exports2.Touch || (exports2.Touch = {}));
|
|
var LinkedMap = class {
|
|
constructor() {
|
|
this[Symbol.toStringTag] = "LinkedMap";
|
|
this._map = new Map();
|
|
this._head = void 0;
|
|
this._tail = void 0;
|
|
this._size = 0;
|
|
this._state = 0;
|
|
}
|
|
clear() {
|
|
this._map.clear();
|
|
this._head = void 0;
|
|
this._tail = void 0;
|
|
this._size = 0;
|
|
this._state++;
|
|
}
|
|
isEmpty() {
|
|
return !this._head && !this._tail;
|
|
}
|
|
get size() {
|
|
return this._size;
|
|
}
|
|
get first() {
|
|
var _a;
|
|
return (_a = this._head) === null || _a === void 0 ? void 0 : _a.value;
|
|
}
|
|
get last() {
|
|
var _a;
|
|
return (_a = this._tail) === null || _a === void 0 ? void 0 : _a.value;
|
|
}
|
|
has(key) {
|
|
return this._map.has(key);
|
|
}
|
|
get(key, touch = Touch.None) {
|
|
const item = this._map.get(key);
|
|
if (!item) {
|
|
return void 0;
|
|
}
|
|
if (touch !== Touch.None) {
|
|
this.touch(item, touch);
|
|
}
|
|
return item.value;
|
|
}
|
|
set(key, value, touch = Touch.None) {
|
|
let item = this._map.get(key);
|
|
if (item) {
|
|
item.value = value;
|
|
if (touch !== Touch.None) {
|
|
this.touch(item, touch);
|
|
}
|
|
} else {
|
|
item = {key, value, next: void 0, previous: void 0};
|
|
switch (touch) {
|
|
case Touch.None:
|
|
this.addItemLast(item);
|
|
break;
|
|
case Touch.First:
|
|
this.addItemFirst(item);
|
|
break;
|
|
case Touch.Last:
|
|
this.addItemLast(item);
|
|
break;
|
|
default:
|
|
this.addItemLast(item);
|
|
break;
|
|
}
|
|
this._map.set(key, item);
|
|
this._size++;
|
|
}
|
|
return this;
|
|
}
|
|
delete(key) {
|
|
return !!this.remove(key);
|
|
}
|
|
remove(key) {
|
|
const item = this._map.get(key);
|
|
if (!item) {
|
|
return void 0;
|
|
}
|
|
this._map.delete(key);
|
|
this.removeItem(item);
|
|
this._size--;
|
|
return item.value;
|
|
}
|
|
shift() {
|
|
if (!this._head && !this._tail) {
|
|
return void 0;
|
|
}
|
|
if (!this._head || !this._tail) {
|
|
throw new Error("Invalid list");
|
|
}
|
|
const item = this._head;
|
|
this._map.delete(item.key);
|
|
this.removeItem(item);
|
|
this._size--;
|
|
return item.value;
|
|
}
|
|
forEach(callbackfn, thisArg) {
|
|
const state = this._state;
|
|
let current = this._head;
|
|
while (current) {
|
|
if (thisArg) {
|
|
callbackfn.bind(thisArg)(current.value, current.key, this);
|
|
} else {
|
|
callbackfn(current.value, current.key, this);
|
|
}
|
|
if (this._state !== state) {
|
|
throw new Error(`LinkedMap got modified during iteration.`);
|
|
}
|
|
current = current.next;
|
|
}
|
|
}
|
|
keys() {
|
|
const map = this;
|
|
const state = this._state;
|
|
let current = this._head;
|
|
const iterator = {
|
|
[Symbol.iterator]() {
|
|
return iterator;
|
|
},
|
|
next() {
|
|
if (map._state !== state) {
|
|
throw new Error(`LinkedMap got modified during iteration.`);
|
|
}
|
|
if (current) {
|
|
const result = {value: current.key, done: false};
|
|
current = current.next;
|
|
return result;
|
|
} else {
|
|
return {value: void 0, done: true};
|
|
}
|
|
}
|
|
};
|
|
return iterator;
|
|
}
|
|
values() {
|
|
const map = this;
|
|
const state = this._state;
|
|
let current = this._head;
|
|
const iterator = {
|
|
[Symbol.iterator]() {
|
|
return iterator;
|
|
},
|
|
next() {
|
|
if (map._state !== state) {
|
|
throw new Error(`LinkedMap got modified during iteration.`);
|
|
}
|
|
if (current) {
|
|
const result = {value: current.value, done: false};
|
|
current = current.next;
|
|
return result;
|
|
} else {
|
|
return {value: void 0, done: true};
|
|
}
|
|
}
|
|
};
|
|
return iterator;
|
|
}
|
|
entries() {
|
|
const map = this;
|
|
const state = this._state;
|
|
let current = this._head;
|
|
const iterator = {
|
|
[Symbol.iterator]() {
|
|
return iterator;
|
|
},
|
|
next() {
|
|
if (map._state !== state) {
|
|
throw new Error(`LinkedMap got modified during iteration.`);
|
|
}
|
|
if (current) {
|
|
const result = {value: [current.key, current.value], done: false};
|
|
current = current.next;
|
|
return result;
|
|
} else {
|
|
return {value: void 0, done: true};
|
|
}
|
|
}
|
|
};
|
|
return iterator;
|
|
}
|
|
[Symbol.iterator]() {
|
|
return this.entries();
|
|
}
|
|
trimOld(newSize) {
|
|
if (newSize >= this.size) {
|
|
return;
|
|
}
|
|
if (newSize === 0) {
|
|
this.clear();
|
|
return;
|
|
}
|
|
let current = this._head;
|
|
let currentSize = this.size;
|
|
while (current && currentSize > newSize) {
|
|
this._map.delete(current.key);
|
|
current = current.next;
|
|
currentSize--;
|
|
}
|
|
this._head = current;
|
|
this._size = currentSize;
|
|
if (current) {
|
|
current.previous = void 0;
|
|
}
|
|
this._state++;
|
|
}
|
|
addItemFirst(item) {
|
|
if (!this._head && !this._tail) {
|
|
this._tail = item;
|
|
} else if (!this._head) {
|
|
throw new Error("Invalid list");
|
|
} else {
|
|
item.next = this._head;
|
|
this._head.previous = item;
|
|
}
|
|
this._head = item;
|
|
this._state++;
|
|
}
|
|
addItemLast(item) {
|
|
if (!this._head && !this._tail) {
|
|
this._head = item;
|
|
} else if (!this._tail) {
|
|
throw new Error("Invalid list");
|
|
} else {
|
|
item.previous = this._tail;
|
|
this._tail.next = item;
|
|
}
|
|
this._tail = item;
|
|
this._state++;
|
|
}
|
|
removeItem(item) {
|
|
if (item === this._head && item === this._tail) {
|
|
this._head = void 0;
|
|
this._tail = void 0;
|
|
} else if (item === this._head) {
|
|
if (!item.next) {
|
|
throw new Error("Invalid list");
|
|
}
|
|
item.next.previous = void 0;
|
|
this._head = item.next;
|
|
} else if (item === this._tail) {
|
|
if (!item.previous) {
|
|
throw new Error("Invalid list");
|
|
}
|
|
item.previous.next = void 0;
|
|
this._tail = item.previous;
|
|
} else {
|
|
const next = item.next;
|
|
const previous = item.previous;
|
|
if (!next || !previous) {
|
|
throw new Error("Invalid list");
|
|
}
|
|
next.previous = previous;
|
|
previous.next = next;
|
|
}
|
|
item.next = void 0;
|
|
item.previous = void 0;
|
|
this._state++;
|
|
}
|
|
touch(item, touch) {
|
|
if (!this._head || !this._tail) {
|
|
throw new Error("Invalid list");
|
|
}
|
|
if (touch !== Touch.First && touch !== Touch.Last) {
|
|
return;
|
|
}
|
|
if (touch === Touch.First) {
|
|
if (item === this._head) {
|
|
return;
|
|
}
|
|
const next = item.next;
|
|
const previous = item.previous;
|
|
if (item === this._tail) {
|
|
previous.next = void 0;
|
|
this._tail = previous;
|
|
} else {
|
|
next.previous = previous;
|
|
previous.next = next;
|
|
}
|
|
item.previous = void 0;
|
|
item.next = this._head;
|
|
this._head.previous = item;
|
|
this._head = item;
|
|
this._state++;
|
|
} else if (touch === Touch.Last) {
|
|
if (item === this._tail) {
|
|
return;
|
|
}
|
|
const next = item.next;
|
|
const previous = item.previous;
|
|
if (item === this._head) {
|
|
next.previous = void 0;
|
|
this._head = next;
|
|
} else {
|
|
next.previous = previous;
|
|
previous.next = next;
|
|
}
|
|
item.next = void 0;
|
|
item.previous = this._tail;
|
|
this._tail.next = item;
|
|
this._tail = item;
|
|
this._state++;
|
|
}
|
|
}
|
|
toJSON() {
|
|
const data = [];
|
|
this.forEach((value, key) => {
|
|
data.push([key, value]);
|
|
});
|
|
return data;
|
|
}
|
|
fromJSON(data) {
|
|
this.clear();
|
|
for (const [key, value] of data) {
|
|
this.set(key, value);
|
|
}
|
|
}
|
|
};
|
|
exports2.LinkedMap = LinkedMap;
|
|
var LRUCache = class extends LinkedMap {
|
|
constructor(limit, ratio = 1) {
|
|
super();
|
|
this._limit = limit;
|
|
this._ratio = Math.min(Math.max(0, ratio), 1);
|
|
}
|
|
get limit() {
|
|
return this._limit;
|
|
}
|
|
set limit(limit) {
|
|
this._limit = limit;
|
|
this.checkTrim();
|
|
}
|
|
get ratio() {
|
|
return this._ratio;
|
|
}
|
|
set ratio(ratio) {
|
|
this._ratio = Math.min(Math.max(0, ratio), 1);
|
|
this.checkTrim();
|
|
}
|
|
get(key, touch = Touch.AsNew) {
|
|
return super.get(key, touch);
|
|
}
|
|
peek(key) {
|
|
return super.get(key, Touch.None);
|
|
}
|
|
set(key, value) {
|
|
super.set(key, value, Touch.Last);
|
|
this.checkTrim();
|
|
return this;
|
|
}
|
|
checkTrim() {
|
|
if (this.size > this._limit) {
|
|
this.trimOld(Math.round(this._limit * this._ratio));
|
|
}
|
|
}
|
|
};
|
|
exports2.LRUCache = LRUCache;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/connection.js
|
|
var require_connection = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.createMessageConnection = exports2.ConnectionOptions = exports2.CancellationStrategy = exports2.CancellationSenderStrategy = exports2.CancellationReceiverStrategy = exports2.ConnectionStrategy = exports2.ConnectionError = exports2.ConnectionErrors = exports2.LogTraceNotification = exports2.SetTraceNotification = exports2.TraceFormat = exports2.Trace = exports2.NullLogger = exports2.ProgressType = void 0;
|
|
var ral_1 = require_ral();
|
|
var Is = require_is();
|
|
var messages_1 = require_messages();
|
|
var linkedMap_1 = require_linkedMap();
|
|
var events_1 = require_events();
|
|
var cancellation_1 = require_cancellation();
|
|
var CancelNotification;
|
|
(function(CancelNotification2) {
|
|
CancelNotification2.type = new messages_1.NotificationType("$/cancelRequest");
|
|
})(CancelNotification || (CancelNotification = {}));
|
|
var ProgressNotification;
|
|
(function(ProgressNotification2) {
|
|
ProgressNotification2.type = new messages_1.NotificationType("$/progress");
|
|
})(ProgressNotification || (ProgressNotification = {}));
|
|
var ProgressType = class {
|
|
constructor() {
|
|
}
|
|
};
|
|
exports2.ProgressType = ProgressType;
|
|
var StarRequestHandler;
|
|
(function(StarRequestHandler2) {
|
|
function is2(value) {
|
|
return Is.func(value);
|
|
}
|
|
StarRequestHandler2.is = is2;
|
|
})(StarRequestHandler || (StarRequestHandler = {}));
|
|
exports2.NullLogger = Object.freeze({
|
|
error: () => {
|
|
},
|
|
warn: () => {
|
|
},
|
|
info: () => {
|
|
},
|
|
log: () => {
|
|
}
|
|
});
|
|
var Trace2;
|
|
(function(Trace3) {
|
|
Trace3[Trace3["Off"] = 0] = "Off";
|
|
Trace3[Trace3["Messages"] = 1] = "Messages";
|
|
Trace3[Trace3["Verbose"] = 2] = "Verbose";
|
|
})(Trace2 = exports2.Trace || (exports2.Trace = {}));
|
|
(function(Trace3) {
|
|
function fromString(value) {
|
|
if (!Is.string(value)) {
|
|
return Trace3.Off;
|
|
}
|
|
value = value.toLowerCase();
|
|
switch (value) {
|
|
case "off":
|
|
return Trace3.Off;
|
|
case "messages":
|
|
return Trace3.Messages;
|
|
case "verbose":
|
|
return Trace3.Verbose;
|
|
default:
|
|
return Trace3.Off;
|
|
}
|
|
}
|
|
Trace3.fromString = fromString;
|
|
function toString2(value) {
|
|
switch (value) {
|
|
case Trace3.Off:
|
|
return "off";
|
|
case Trace3.Messages:
|
|
return "messages";
|
|
case Trace3.Verbose:
|
|
return "verbose";
|
|
default:
|
|
return "off";
|
|
}
|
|
}
|
|
Trace3.toString = toString2;
|
|
})(Trace2 = exports2.Trace || (exports2.Trace = {}));
|
|
var TraceFormat;
|
|
(function(TraceFormat2) {
|
|
TraceFormat2["Text"] = "text";
|
|
TraceFormat2["JSON"] = "json";
|
|
})(TraceFormat = exports2.TraceFormat || (exports2.TraceFormat = {}));
|
|
(function(TraceFormat2) {
|
|
function fromString(value) {
|
|
value = value.toLowerCase();
|
|
if (value === "json") {
|
|
return TraceFormat2.JSON;
|
|
} else {
|
|
return TraceFormat2.Text;
|
|
}
|
|
}
|
|
TraceFormat2.fromString = fromString;
|
|
})(TraceFormat = exports2.TraceFormat || (exports2.TraceFormat = {}));
|
|
var SetTraceNotification;
|
|
(function(SetTraceNotification2) {
|
|
SetTraceNotification2.type = new messages_1.NotificationType("$/setTrace");
|
|
})(SetTraceNotification = exports2.SetTraceNotification || (exports2.SetTraceNotification = {}));
|
|
var LogTraceNotification;
|
|
(function(LogTraceNotification2) {
|
|
LogTraceNotification2.type = new messages_1.NotificationType("$/logTrace");
|
|
})(LogTraceNotification = exports2.LogTraceNotification || (exports2.LogTraceNotification = {}));
|
|
var ConnectionErrors;
|
|
(function(ConnectionErrors2) {
|
|
ConnectionErrors2[ConnectionErrors2["Closed"] = 1] = "Closed";
|
|
ConnectionErrors2[ConnectionErrors2["Disposed"] = 2] = "Disposed";
|
|
ConnectionErrors2[ConnectionErrors2["AlreadyListening"] = 3] = "AlreadyListening";
|
|
})(ConnectionErrors = exports2.ConnectionErrors || (exports2.ConnectionErrors = {}));
|
|
var ConnectionError = class extends Error {
|
|
constructor(code, message) {
|
|
super(message);
|
|
this.code = code;
|
|
Object.setPrototypeOf(this, ConnectionError.prototype);
|
|
}
|
|
};
|
|
exports2.ConnectionError = ConnectionError;
|
|
var ConnectionStrategy;
|
|
(function(ConnectionStrategy2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && Is.func(candidate.cancelUndispatched);
|
|
}
|
|
ConnectionStrategy2.is = is2;
|
|
})(ConnectionStrategy = exports2.ConnectionStrategy || (exports2.ConnectionStrategy = {}));
|
|
var CancellationReceiverStrategy;
|
|
(function(CancellationReceiverStrategy2) {
|
|
CancellationReceiverStrategy2.Message = Object.freeze({
|
|
createCancellationTokenSource(_) {
|
|
return new cancellation_1.CancellationTokenSource();
|
|
}
|
|
});
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && Is.func(candidate.createCancellationTokenSource);
|
|
}
|
|
CancellationReceiverStrategy2.is = is2;
|
|
})(CancellationReceiverStrategy = exports2.CancellationReceiverStrategy || (exports2.CancellationReceiverStrategy = {}));
|
|
var CancellationSenderStrategy;
|
|
(function(CancellationSenderStrategy2) {
|
|
CancellationSenderStrategy2.Message = Object.freeze({
|
|
sendCancellation(conn, id) {
|
|
conn.sendNotification(CancelNotification.type, {id});
|
|
},
|
|
cleanup(_) {
|
|
}
|
|
});
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);
|
|
}
|
|
CancellationSenderStrategy2.is = is2;
|
|
})(CancellationSenderStrategy = exports2.CancellationSenderStrategy || (exports2.CancellationSenderStrategy = {}));
|
|
var CancellationStrategy;
|
|
(function(CancellationStrategy2) {
|
|
CancellationStrategy2.Message = Object.freeze({
|
|
receiver: CancellationReceiverStrategy.Message,
|
|
sender: CancellationSenderStrategy.Message
|
|
});
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);
|
|
}
|
|
CancellationStrategy2.is = is2;
|
|
})(CancellationStrategy = exports2.CancellationStrategy || (exports2.CancellationStrategy = {}));
|
|
var ConnectionOptions;
|
|
(function(ConnectionOptions2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy));
|
|
}
|
|
ConnectionOptions2.is = is2;
|
|
})(ConnectionOptions = exports2.ConnectionOptions || (exports2.ConnectionOptions = {}));
|
|
var ConnectionState;
|
|
(function(ConnectionState2) {
|
|
ConnectionState2[ConnectionState2["New"] = 1] = "New";
|
|
ConnectionState2[ConnectionState2["Listening"] = 2] = "Listening";
|
|
ConnectionState2[ConnectionState2["Closed"] = 3] = "Closed";
|
|
ConnectionState2[ConnectionState2["Disposed"] = 4] = "Disposed";
|
|
})(ConnectionState || (ConnectionState = {}));
|
|
function createMessageConnection(messageReader, messageWriter, _logger, options) {
|
|
const logger = _logger !== void 0 ? _logger : exports2.NullLogger;
|
|
let sequenceNumber = 0;
|
|
let notificationSquenceNumber = 0;
|
|
let unknownResponseSquenceNumber = 0;
|
|
const version = "2.0";
|
|
let starRequestHandler = void 0;
|
|
const requestHandlers = Object.create(null);
|
|
let starNotificationHandler = void 0;
|
|
const notificationHandlers = Object.create(null);
|
|
const progressHandlers = new Map();
|
|
let timer;
|
|
let messageQueue = new linkedMap_1.LinkedMap();
|
|
let responsePromises = Object.create(null);
|
|
let requestTokens = Object.create(null);
|
|
let trace = Trace2.Off;
|
|
let traceFormat = TraceFormat.Text;
|
|
let tracer;
|
|
let state = ConnectionState.New;
|
|
const errorEmitter = new events_1.Emitter();
|
|
const closeEmitter = new events_1.Emitter();
|
|
const unhandledNotificationEmitter = new events_1.Emitter();
|
|
const unhandledProgressEmitter = new events_1.Emitter();
|
|
const disposeEmitter = new events_1.Emitter();
|
|
const cancellationStrategy = options && options.cancellationStrategy ? options.cancellationStrategy : CancellationStrategy.Message;
|
|
function createRequestQueueKey(id) {
|
|
if (id === null) {
|
|
throw new Error(`Can't send requests with id null since the response can't be correlated.`);
|
|
}
|
|
return "req-" + id.toString();
|
|
}
|
|
function createResponseQueueKey(id) {
|
|
if (id === null) {
|
|
return "res-unknown-" + (++unknownResponseSquenceNumber).toString();
|
|
} else {
|
|
return "res-" + id.toString();
|
|
}
|
|
}
|
|
function createNotificationQueueKey() {
|
|
return "not-" + (++notificationSquenceNumber).toString();
|
|
}
|
|
function addMessageToQueue(queue, message) {
|
|
if (messages_1.isRequestMessage(message)) {
|
|
queue.set(createRequestQueueKey(message.id), message);
|
|
} else if (messages_1.isResponseMessage(message)) {
|
|
queue.set(createResponseQueueKey(message.id), message);
|
|
} else {
|
|
queue.set(createNotificationQueueKey(), message);
|
|
}
|
|
}
|
|
function cancelUndispatched(_message) {
|
|
return void 0;
|
|
}
|
|
function isListening() {
|
|
return state === ConnectionState.Listening;
|
|
}
|
|
function isClosed() {
|
|
return state === ConnectionState.Closed;
|
|
}
|
|
function isDisposed() {
|
|
return state === ConnectionState.Disposed;
|
|
}
|
|
function closeHandler() {
|
|
if (state === ConnectionState.New || state === ConnectionState.Listening) {
|
|
state = ConnectionState.Closed;
|
|
closeEmitter.fire(void 0);
|
|
}
|
|
}
|
|
function readErrorHandler(error) {
|
|
errorEmitter.fire([error, void 0, void 0]);
|
|
}
|
|
function writeErrorHandler(data) {
|
|
errorEmitter.fire(data);
|
|
}
|
|
messageReader.onClose(closeHandler);
|
|
messageReader.onError(readErrorHandler);
|
|
messageWriter.onClose(closeHandler);
|
|
messageWriter.onError(writeErrorHandler);
|
|
function triggerMessageQueue() {
|
|
if (timer || messageQueue.size === 0) {
|
|
return;
|
|
}
|
|
timer = ral_1.default().timer.setImmediate(() => {
|
|
timer = void 0;
|
|
processMessageQueue();
|
|
});
|
|
}
|
|
function processMessageQueue() {
|
|
if (messageQueue.size === 0) {
|
|
return;
|
|
}
|
|
const message = messageQueue.shift();
|
|
try {
|
|
if (messages_1.isRequestMessage(message)) {
|
|
handleRequest(message);
|
|
} else if (messages_1.isNotificationMessage(message)) {
|
|
handleNotification(message);
|
|
} else if (messages_1.isResponseMessage(message)) {
|
|
handleResponse(message);
|
|
} else {
|
|
handleInvalidMessage(message);
|
|
}
|
|
} finally {
|
|
triggerMessageQueue();
|
|
}
|
|
}
|
|
const callback = (message) => {
|
|
try {
|
|
if (messages_1.isNotificationMessage(message) && message.method === CancelNotification.type.method) {
|
|
const key = createRequestQueueKey(message.params.id);
|
|
const toCancel = messageQueue.get(key);
|
|
if (messages_1.isRequestMessage(toCancel)) {
|
|
const strategy = options === null || options === void 0 ? void 0 : options.connectionStrategy;
|
|
const response = strategy && strategy.cancelUndispatched ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);
|
|
if (response && (response.error !== void 0 || response.result !== void 0)) {
|
|
messageQueue.delete(key);
|
|
response.id = toCancel.id;
|
|
traceSendingResponse(response, message.method, Date.now());
|
|
messageWriter.write(response);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
addMessageToQueue(messageQueue, message);
|
|
} finally {
|
|
triggerMessageQueue();
|
|
}
|
|
};
|
|
function handleRequest(requestMessage) {
|
|
if (isDisposed()) {
|
|
return;
|
|
}
|
|
function reply(resultOrError, method, startTime2) {
|
|
const message = {
|
|
jsonrpc: version,
|
|
id: requestMessage.id
|
|
};
|
|
if (resultOrError instanceof messages_1.ResponseError) {
|
|
message.error = resultOrError.toJson();
|
|
} else {
|
|
message.result = resultOrError === void 0 ? null : resultOrError;
|
|
}
|
|
traceSendingResponse(message, method, startTime2);
|
|
messageWriter.write(message);
|
|
}
|
|
function replyError(error, method, startTime2) {
|
|
const message = {
|
|
jsonrpc: version,
|
|
id: requestMessage.id,
|
|
error: error.toJson()
|
|
};
|
|
traceSendingResponse(message, method, startTime2);
|
|
messageWriter.write(message);
|
|
}
|
|
function replySuccess(result, method, startTime2) {
|
|
if (result === void 0) {
|
|
result = null;
|
|
}
|
|
const message = {
|
|
jsonrpc: version,
|
|
id: requestMessage.id,
|
|
result
|
|
};
|
|
traceSendingResponse(message, method, startTime2);
|
|
messageWriter.write(message);
|
|
}
|
|
traceReceivedRequest(requestMessage);
|
|
const element = requestHandlers[requestMessage.method];
|
|
let type;
|
|
let requestHandler;
|
|
if (element) {
|
|
type = element.type;
|
|
requestHandler = element.handler;
|
|
}
|
|
const startTime = Date.now();
|
|
if (requestHandler || starRequestHandler) {
|
|
const tokenKey = String(requestMessage.id);
|
|
const cancellationSource = cancellationStrategy.receiver.createCancellationTokenSource(tokenKey);
|
|
requestTokens[tokenKey] = cancellationSource;
|
|
try {
|
|
let handlerResult;
|
|
if (requestHandler) {
|
|
if (requestMessage.params === void 0) {
|
|
if (type !== void 0 && type.numberOfParams !== 0) {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but recevied none.`), requestMessage.method, startTime);
|
|
return;
|
|
}
|
|
handlerResult = requestHandler(cancellationSource.token);
|
|
} else if (Array.isArray(requestMessage.params)) {
|
|
if (type !== void 0 && type.parameterStructures === messages_1.ParameterStructures.byName) {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);
|
|
return;
|
|
}
|
|
handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);
|
|
} else {
|
|
if (type !== void 0 && type.parameterStructures === messages_1.ParameterStructures.byPosition) {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);
|
|
return;
|
|
}
|
|
handlerResult = requestHandler(requestMessage.params, cancellationSource.token);
|
|
}
|
|
} else if (starRequestHandler) {
|
|
handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);
|
|
}
|
|
const promise = handlerResult;
|
|
if (!handlerResult) {
|
|
delete requestTokens[tokenKey];
|
|
replySuccess(handlerResult, requestMessage.method, startTime);
|
|
} else if (promise.then) {
|
|
promise.then((resultOrError) => {
|
|
delete requestTokens[tokenKey];
|
|
reply(resultOrError, requestMessage.method, startTime);
|
|
}, (error) => {
|
|
delete requestTokens[tokenKey];
|
|
if (error instanceof messages_1.ResponseError) {
|
|
replyError(error, requestMessage.method, startTime);
|
|
} else if (error && Is.string(error.message)) {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
|
|
} else {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
|
|
}
|
|
});
|
|
} else {
|
|
delete requestTokens[tokenKey];
|
|
reply(handlerResult, requestMessage.method, startTime);
|
|
}
|
|
} catch (error) {
|
|
delete requestTokens[tokenKey];
|
|
if (error instanceof messages_1.ResponseError) {
|
|
reply(error, requestMessage.method, startTime);
|
|
} else if (error && Is.string(error.message)) {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
|
|
} else {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
|
|
}
|
|
}
|
|
} else {
|
|
replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);
|
|
}
|
|
}
|
|
function handleResponse(responseMessage) {
|
|
if (isDisposed()) {
|
|
return;
|
|
}
|
|
if (responseMessage.id === null) {
|
|
if (responseMessage.error) {
|
|
logger.error(`Received response message without id: Error is:
|
|
${JSON.stringify(responseMessage.error, void 0, 4)}`);
|
|
} else {
|
|
logger.error(`Received response message without id. No further error information provided.`);
|
|
}
|
|
} else {
|
|
const key = String(responseMessage.id);
|
|
const responsePromise = responsePromises[key];
|
|
traceReceivedResponse(responseMessage, responsePromise);
|
|
if (responsePromise) {
|
|
delete responsePromises[key];
|
|
try {
|
|
if (responseMessage.error) {
|
|
const error = responseMessage.error;
|
|
responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));
|
|
} else if (responseMessage.result !== void 0) {
|
|
responsePromise.resolve(responseMessage.result);
|
|
} else {
|
|
throw new Error("Should never happen.");
|
|
}
|
|
} catch (error) {
|
|
if (error.message) {
|
|
logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);
|
|
} else {
|
|
logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function handleNotification(message) {
|
|
if (isDisposed()) {
|
|
return;
|
|
}
|
|
let type = void 0;
|
|
let notificationHandler;
|
|
if (message.method === CancelNotification.type.method) {
|
|
notificationHandler = (params) => {
|
|
const id = params.id;
|
|
const source = requestTokens[String(id)];
|
|
if (source) {
|
|
source.cancel();
|
|
}
|
|
};
|
|
} else {
|
|
const element = notificationHandlers[message.method];
|
|
if (element) {
|
|
notificationHandler = element.handler;
|
|
type = element.type;
|
|
}
|
|
}
|
|
if (notificationHandler || starNotificationHandler) {
|
|
try {
|
|
traceReceivedNotification(message);
|
|
if (notificationHandler) {
|
|
if (message.params === void 0) {
|
|
if (type !== void 0) {
|
|
if (type.numberOfParams !== 0 && type.parameterStructures !== messages_1.ParameterStructures.byName) {
|
|
logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but recevied none.`);
|
|
}
|
|
}
|
|
notificationHandler();
|
|
} else if (Array.isArray(message.params)) {
|
|
if (type !== void 0) {
|
|
if (type.parameterStructures === messages_1.ParameterStructures.byName) {
|
|
logger.error(`Notification ${message.method} defines parameters by name but received parameters by position`);
|
|
}
|
|
if (type.numberOfParams !== message.params.length) {
|
|
logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${message.params.length} argumennts`);
|
|
}
|
|
}
|
|
notificationHandler(...message.params);
|
|
} else {
|
|
if (type !== void 0 && type.parameterStructures === messages_1.ParameterStructures.byPosition) {
|
|
logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);
|
|
}
|
|
notificationHandler(message.params);
|
|
}
|
|
} else if (starNotificationHandler) {
|
|
starNotificationHandler(message.method, message.params);
|
|
}
|
|
} catch (error) {
|
|
if (error.message) {
|
|
logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
|
|
} else {
|
|
logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
|
|
}
|
|
}
|
|
} else {
|
|
unhandledNotificationEmitter.fire(message);
|
|
}
|
|
}
|
|
function handleInvalidMessage(message) {
|
|
if (!message) {
|
|
logger.error("Received empty message.");
|
|
return;
|
|
}
|
|
logger.error(`Received message which is neither a response nor a notification message:
|
|
${JSON.stringify(message, null, 4)}`);
|
|
const responseMessage = message;
|
|
if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {
|
|
const key = String(responseMessage.id);
|
|
const responseHandler = responsePromises[key];
|
|
if (responseHandler) {
|
|
responseHandler.reject(new Error("The received response has neither a result nor an error property."));
|
|
}
|
|
}
|
|
}
|
|
function traceSendingRequest(message) {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose && message.params) {
|
|
data = `Params: ${JSON.stringify(message.params, null, 4)}
|
|
|
|
`;
|
|
}
|
|
tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);
|
|
} else {
|
|
logLSPMessage("send-request", message);
|
|
}
|
|
}
|
|
function traceSendingNotification(message) {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose) {
|
|
if (message.params) {
|
|
data = `Params: ${JSON.stringify(message.params, null, 4)}
|
|
|
|
`;
|
|
} else {
|
|
data = "No parameters provided.\n\n";
|
|
}
|
|
}
|
|
tracer.log(`Sending notification '${message.method}'.`, data);
|
|
} else {
|
|
logLSPMessage("send-notification", message);
|
|
}
|
|
}
|
|
function traceSendingResponse(message, method, startTime) {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose) {
|
|
if (message.error && message.error.data) {
|
|
data = `Error data: ${JSON.stringify(message.error.data, null, 4)}
|
|
|
|
`;
|
|
} else {
|
|
if (message.result) {
|
|
data = `Result: ${JSON.stringify(message.result, null, 4)}
|
|
|
|
`;
|
|
} else if (message.error === void 0) {
|
|
data = "No result returned.\n\n";
|
|
}
|
|
}
|
|
}
|
|
tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);
|
|
} else {
|
|
logLSPMessage("send-response", message);
|
|
}
|
|
}
|
|
function traceReceivedRequest(message) {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose && message.params) {
|
|
data = `Params: ${JSON.stringify(message.params, null, 4)}
|
|
|
|
`;
|
|
}
|
|
tracer.log(`Received request '${message.method} - (${message.id})'.`, data);
|
|
} else {
|
|
logLSPMessage("receive-request", message);
|
|
}
|
|
}
|
|
function traceReceivedNotification(message) {
|
|
if (trace === Trace2.Off || !tracer || message.method === LogTraceNotification.type.method) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose) {
|
|
if (message.params) {
|
|
data = `Params: ${JSON.stringify(message.params, null, 4)}
|
|
|
|
`;
|
|
} else {
|
|
data = "No parameters provided.\n\n";
|
|
}
|
|
}
|
|
tracer.log(`Received notification '${message.method}'.`, data);
|
|
} else {
|
|
logLSPMessage("receive-notification", message);
|
|
}
|
|
}
|
|
function traceReceivedResponse(message, responsePromise) {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
if (traceFormat === TraceFormat.Text) {
|
|
let data = void 0;
|
|
if (trace === Trace2.Verbose) {
|
|
if (message.error && message.error.data) {
|
|
data = `Error data: ${JSON.stringify(message.error.data, null, 4)}
|
|
|
|
`;
|
|
} else {
|
|
if (message.result) {
|
|
data = `Result: ${JSON.stringify(message.result, null, 4)}
|
|
|
|
`;
|
|
} else if (message.error === void 0) {
|
|
data = "No result returned.\n\n";
|
|
}
|
|
}
|
|
}
|
|
if (responsePromise) {
|
|
const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : "";
|
|
tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);
|
|
} else {
|
|
tracer.log(`Received response ${message.id} without active response promise.`, data);
|
|
}
|
|
} else {
|
|
logLSPMessage("receive-response", message);
|
|
}
|
|
}
|
|
function logLSPMessage(type, message) {
|
|
if (!tracer || trace === Trace2.Off) {
|
|
return;
|
|
}
|
|
const lspMessage = {
|
|
isLSPMessage: true,
|
|
type,
|
|
message,
|
|
timestamp: Date.now()
|
|
};
|
|
tracer.log(lspMessage);
|
|
}
|
|
function throwIfClosedOrDisposed() {
|
|
if (isClosed()) {
|
|
throw new ConnectionError(ConnectionErrors.Closed, "Connection is closed.");
|
|
}
|
|
if (isDisposed()) {
|
|
throw new ConnectionError(ConnectionErrors.Disposed, "Connection is disposed.");
|
|
}
|
|
}
|
|
function throwIfListening() {
|
|
if (isListening()) {
|
|
throw new ConnectionError(ConnectionErrors.AlreadyListening, "Connection is already listening");
|
|
}
|
|
}
|
|
function throwIfNotListening() {
|
|
if (!isListening()) {
|
|
throw new Error("Call listen() first.");
|
|
}
|
|
}
|
|
function undefinedToNull(param) {
|
|
if (param === void 0) {
|
|
return null;
|
|
} else {
|
|
return param;
|
|
}
|
|
}
|
|
function nullToUndefined(param) {
|
|
if (param === null) {
|
|
return void 0;
|
|
} else {
|
|
return param;
|
|
}
|
|
}
|
|
function isNamedParam(param) {
|
|
return param !== void 0 && param !== null && !Array.isArray(param) && typeof param === "object";
|
|
}
|
|
function computeSingleParam(parameterStructures, param) {
|
|
switch (parameterStructures) {
|
|
case messages_1.ParameterStructures.auto:
|
|
if (isNamedParam(param)) {
|
|
return nullToUndefined(param);
|
|
} else {
|
|
return [undefinedToNull(param)];
|
|
}
|
|
break;
|
|
case messages_1.ParameterStructures.byName:
|
|
if (!isNamedParam(param)) {
|
|
throw new Error(`Recevied parameters by name but param is not an object literal.`);
|
|
}
|
|
return nullToUndefined(param);
|
|
case messages_1.ParameterStructures.byPosition:
|
|
return [undefinedToNull(param)];
|
|
default:
|
|
throw new Error(`Unknown parameter structure ${parameterStructures.toString()}`);
|
|
}
|
|
}
|
|
function computeMessageParams(type, params) {
|
|
let result;
|
|
const numberOfParams = type.numberOfParams;
|
|
switch (numberOfParams) {
|
|
case 0:
|
|
result = void 0;
|
|
break;
|
|
case 1:
|
|
result = computeSingleParam(type.parameterStructures, params[0]);
|
|
break;
|
|
default:
|
|
result = [];
|
|
for (let i = 0; i < params.length && i < numberOfParams; i++) {
|
|
result.push(undefinedToNull(params[i]));
|
|
}
|
|
if (params.length < numberOfParams) {
|
|
for (let i = params.length; i < numberOfParams; i++) {
|
|
result.push(null);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
const connection = {
|
|
sendNotification: (type, ...args) => {
|
|
throwIfClosedOrDisposed();
|
|
let method;
|
|
let messageParams;
|
|
if (Is.string(type)) {
|
|
method = type;
|
|
const first = args[0];
|
|
let paramStart = 0;
|
|
let parameterStructures = messages_1.ParameterStructures.auto;
|
|
if (messages_1.ParameterStructures.is(first)) {
|
|
paramStart = 1;
|
|
parameterStructures = first;
|
|
}
|
|
let paramEnd = args.length;
|
|
const numberOfParams = paramEnd - paramStart;
|
|
switch (numberOfParams) {
|
|
case 0:
|
|
messageParams = void 0;
|
|
break;
|
|
case 1:
|
|
messageParams = computeSingleParam(parameterStructures, args[paramStart]);
|
|
break;
|
|
default:
|
|
if (parameterStructures === messages_1.ParameterStructures.byName) {
|
|
throw new Error(`Recevied ${numberOfParams} parameters for 'by Name' notification parameter structure.`);
|
|
}
|
|
messageParams = args.slice(paramStart, paramEnd).map((value) => undefinedToNull(value));
|
|
break;
|
|
}
|
|
} else {
|
|
const params = args;
|
|
method = type.method;
|
|
messageParams = computeMessageParams(type, params);
|
|
}
|
|
const notificationMessage = {
|
|
jsonrpc: version,
|
|
method,
|
|
params: messageParams
|
|
};
|
|
traceSendingNotification(notificationMessage);
|
|
messageWriter.write(notificationMessage);
|
|
},
|
|
onNotification: (type, handler) => {
|
|
throwIfClosedOrDisposed();
|
|
let method;
|
|
if (Is.func(type)) {
|
|
starNotificationHandler = type;
|
|
} else if (handler) {
|
|
if (Is.string(type)) {
|
|
method = type;
|
|
notificationHandlers[type] = {type: void 0, handler};
|
|
} else {
|
|
method = type.method;
|
|
notificationHandlers[type.method] = {type, handler};
|
|
}
|
|
}
|
|
return {
|
|
dispose: () => {
|
|
if (method !== void 0) {
|
|
delete notificationHandlers[method];
|
|
} else {
|
|
starNotificationHandler = void 0;
|
|
}
|
|
}
|
|
};
|
|
},
|
|
onProgress: (_type, token, handler) => {
|
|
if (progressHandlers.has(token)) {
|
|
throw new Error(`Progress handler for token ${token} already registered`);
|
|
}
|
|
progressHandlers.set(token, handler);
|
|
return {
|
|
dispose: () => {
|
|
progressHandlers.delete(token);
|
|
}
|
|
};
|
|
},
|
|
sendProgress: (_type, token, value) => {
|
|
connection.sendNotification(ProgressNotification.type, {token, value});
|
|
},
|
|
onUnhandledProgress: unhandledProgressEmitter.event,
|
|
sendRequest: (type, ...args) => {
|
|
throwIfClosedOrDisposed();
|
|
throwIfNotListening();
|
|
let method;
|
|
let messageParams;
|
|
let token = void 0;
|
|
if (Is.string(type)) {
|
|
method = type;
|
|
const first = args[0];
|
|
const last = args[args.length - 1];
|
|
let paramStart = 0;
|
|
let parameterStructures = messages_1.ParameterStructures.auto;
|
|
if (messages_1.ParameterStructures.is(first)) {
|
|
paramStart = 1;
|
|
parameterStructures = first;
|
|
}
|
|
let paramEnd = args.length;
|
|
if (cancellation_1.CancellationToken.is(last)) {
|
|
paramEnd = paramEnd - 1;
|
|
token = last;
|
|
}
|
|
const numberOfParams = paramEnd - paramStart;
|
|
switch (numberOfParams) {
|
|
case 0:
|
|
messageParams = void 0;
|
|
break;
|
|
case 1:
|
|
messageParams = computeSingleParam(parameterStructures, args[paramStart]);
|
|
break;
|
|
default:
|
|
if (parameterStructures === messages_1.ParameterStructures.byName) {
|
|
throw new Error(`Recevied ${numberOfParams} parameters for 'by Name' request parameter structure.`);
|
|
}
|
|
messageParams = args.slice(paramStart, paramEnd).map((value) => undefinedToNull(value));
|
|
break;
|
|
}
|
|
} else {
|
|
const params = args;
|
|
method = type.method;
|
|
messageParams = computeMessageParams(type, params);
|
|
const numberOfParams = type.numberOfParams;
|
|
token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : void 0;
|
|
}
|
|
const id = sequenceNumber++;
|
|
let disposable;
|
|
if (token) {
|
|
disposable = token.onCancellationRequested(() => {
|
|
cancellationStrategy.sender.sendCancellation(connection, id);
|
|
});
|
|
}
|
|
const result = new Promise((resolve, reject) => {
|
|
const requestMessage = {
|
|
jsonrpc: version,
|
|
id,
|
|
method,
|
|
params: messageParams
|
|
};
|
|
const resolveWithCleanup = (r) => {
|
|
resolve(r);
|
|
cancellationStrategy.sender.cleanup(id);
|
|
disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
|
|
};
|
|
const rejectWithCleanup = (r) => {
|
|
reject(r);
|
|
cancellationStrategy.sender.cleanup(id);
|
|
disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
|
|
};
|
|
let responsePromise = {method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup};
|
|
traceSendingRequest(requestMessage);
|
|
try {
|
|
messageWriter.write(requestMessage);
|
|
} catch (e) {
|
|
responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, e.message ? e.message : "Unknown reason"));
|
|
responsePromise = null;
|
|
}
|
|
if (responsePromise) {
|
|
responsePromises[String(id)] = responsePromise;
|
|
}
|
|
});
|
|
return result;
|
|
},
|
|
onRequest: (type, handler) => {
|
|
throwIfClosedOrDisposed();
|
|
let method = null;
|
|
if (StarRequestHandler.is(type)) {
|
|
method = void 0;
|
|
starRequestHandler = type;
|
|
} else if (Is.string(type)) {
|
|
method = null;
|
|
if (handler !== void 0) {
|
|
method = type;
|
|
requestHandlers[type] = {handler, type: void 0};
|
|
}
|
|
} else {
|
|
if (handler !== void 0) {
|
|
method = type.method;
|
|
requestHandlers[type.method] = {type, handler};
|
|
}
|
|
}
|
|
return {
|
|
dispose: () => {
|
|
if (method === null) {
|
|
return;
|
|
}
|
|
if (method !== void 0) {
|
|
delete requestHandlers[method];
|
|
} else {
|
|
starRequestHandler = void 0;
|
|
}
|
|
}
|
|
};
|
|
},
|
|
trace: (_value, _tracer, sendNotificationOrTraceOptions) => {
|
|
let _sendNotification = false;
|
|
let _traceFormat = TraceFormat.Text;
|
|
if (sendNotificationOrTraceOptions !== void 0) {
|
|
if (Is.boolean(sendNotificationOrTraceOptions)) {
|
|
_sendNotification = sendNotificationOrTraceOptions;
|
|
} else {
|
|
_sendNotification = sendNotificationOrTraceOptions.sendNotification || false;
|
|
_traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;
|
|
}
|
|
}
|
|
trace = _value;
|
|
traceFormat = _traceFormat;
|
|
if (trace === Trace2.Off) {
|
|
tracer = void 0;
|
|
} else {
|
|
tracer = _tracer;
|
|
}
|
|
if (_sendNotification && !isClosed() && !isDisposed()) {
|
|
connection.sendNotification(SetTraceNotification.type, {value: Trace2.toString(_value)});
|
|
}
|
|
},
|
|
onError: errorEmitter.event,
|
|
onClose: closeEmitter.event,
|
|
onUnhandledNotification: unhandledNotificationEmitter.event,
|
|
onDispose: disposeEmitter.event,
|
|
end: () => {
|
|
messageWriter.end();
|
|
},
|
|
dispose: () => {
|
|
if (isDisposed()) {
|
|
return;
|
|
}
|
|
state = ConnectionState.Disposed;
|
|
disposeEmitter.fire(void 0);
|
|
const error = new Error("Connection got disposed.");
|
|
Object.keys(responsePromises).forEach((key) => {
|
|
responsePromises[key].reject(error);
|
|
});
|
|
responsePromises = Object.create(null);
|
|
requestTokens = Object.create(null);
|
|
messageQueue = new linkedMap_1.LinkedMap();
|
|
if (Is.func(messageWriter.dispose)) {
|
|
messageWriter.dispose();
|
|
}
|
|
if (Is.func(messageReader.dispose)) {
|
|
messageReader.dispose();
|
|
}
|
|
},
|
|
listen: () => {
|
|
throwIfClosedOrDisposed();
|
|
throwIfListening();
|
|
state = ConnectionState.Listening;
|
|
messageReader.listen(callback);
|
|
},
|
|
inspect: () => {
|
|
ral_1.default().console.log("inspect");
|
|
}
|
|
};
|
|
connection.onNotification(LogTraceNotification.type, (params) => {
|
|
if (trace === Trace2.Off || !tracer) {
|
|
return;
|
|
}
|
|
tracer.log(params.message, trace === Trace2.Verbose ? params.verbose : void 0);
|
|
});
|
|
connection.onNotification(ProgressNotification.type, (params) => {
|
|
const handler = progressHandlers.get(params.token);
|
|
if (handler) {
|
|
handler(params.value);
|
|
} else {
|
|
unhandledProgressEmitter.fire(params);
|
|
}
|
|
});
|
|
return connection;
|
|
}
|
|
exports2.createMessageConnection = createMessageConnection;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/common/api.js
|
|
var require_api = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.CancellationSenderStrategy = exports2.CancellationReceiverStrategy = exports2.ConnectionError = exports2.ConnectionErrors = exports2.LogTraceNotification = exports2.SetTraceNotification = exports2.TraceFormat = exports2.Trace = exports2.ProgressType = exports2.createMessageConnection = exports2.NullLogger = exports2.ConnectionOptions = exports2.ConnectionStrategy = exports2.WriteableStreamMessageWriter = exports2.AbstractMessageWriter = exports2.MessageWriter = exports2.ReadableStreamMessageReader = exports2.AbstractMessageReader = exports2.MessageReader = exports2.CancellationToken = exports2.CancellationTokenSource = exports2.Emitter = exports2.Event = exports2.Disposable = exports2.ParameterStructures = exports2.NotificationType9 = exports2.NotificationType8 = exports2.NotificationType7 = exports2.NotificationType6 = exports2.NotificationType5 = exports2.NotificationType4 = exports2.NotificationType3 = exports2.NotificationType2 = exports2.NotificationType1 = exports2.NotificationType0 = exports2.NotificationType = exports2.ErrorCodes = exports2.ResponseError = exports2.RequestType9 = exports2.RequestType8 = exports2.RequestType7 = exports2.RequestType6 = exports2.RequestType5 = exports2.RequestType4 = exports2.RequestType3 = exports2.RequestType2 = exports2.RequestType1 = exports2.RequestType0 = exports2.RequestType = exports2.RAL = void 0;
|
|
exports2.CancellationStrategy = void 0;
|
|
var messages_1 = require_messages();
|
|
Object.defineProperty(exports2, "RequestType", {enumerable: true, get: function() {
|
|
return messages_1.RequestType;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType0", {enumerable: true, get: function() {
|
|
return messages_1.RequestType0;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType1", {enumerable: true, get: function() {
|
|
return messages_1.RequestType1;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType2", {enumerable: true, get: function() {
|
|
return messages_1.RequestType2;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType3", {enumerable: true, get: function() {
|
|
return messages_1.RequestType3;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType4", {enumerable: true, get: function() {
|
|
return messages_1.RequestType4;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType5", {enumerable: true, get: function() {
|
|
return messages_1.RequestType5;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType6", {enumerable: true, get: function() {
|
|
return messages_1.RequestType6;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType7", {enumerable: true, get: function() {
|
|
return messages_1.RequestType7;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType8", {enumerable: true, get: function() {
|
|
return messages_1.RequestType8;
|
|
}});
|
|
Object.defineProperty(exports2, "RequestType9", {enumerable: true, get: function() {
|
|
return messages_1.RequestType9;
|
|
}});
|
|
Object.defineProperty(exports2, "ResponseError", {enumerable: true, get: function() {
|
|
return messages_1.ResponseError;
|
|
}});
|
|
Object.defineProperty(exports2, "ErrorCodes", {enumerable: true, get: function() {
|
|
return messages_1.ErrorCodes;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType0", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType0;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType1", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType1;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType2", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType2;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType3", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType3;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType4", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType4;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType5", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType5;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType6", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType6;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType7", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType7;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType8", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType8;
|
|
}});
|
|
Object.defineProperty(exports2, "NotificationType9", {enumerable: true, get: function() {
|
|
return messages_1.NotificationType9;
|
|
}});
|
|
Object.defineProperty(exports2, "ParameterStructures", {enumerable: true, get: function() {
|
|
return messages_1.ParameterStructures;
|
|
}});
|
|
var disposable_1 = require_disposable();
|
|
Object.defineProperty(exports2, "Disposable", {enumerable: true, get: function() {
|
|
return disposable_1.Disposable;
|
|
}});
|
|
var events_1 = require_events();
|
|
Object.defineProperty(exports2, "Event", {enumerable: true, get: function() {
|
|
return events_1.Event;
|
|
}});
|
|
Object.defineProperty(exports2, "Emitter", {enumerable: true, get: function() {
|
|
return events_1.Emitter;
|
|
}});
|
|
var cancellation_1 = require_cancellation();
|
|
Object.defineProperty(exports2, "CancellationTokenSource", {enumerable: true, get: function() {
|
|
return cancellation_1.CancellationTokenSource;
|
|
}});
|
|
Object.defineProperty(exports2, "CancellationToken", {enumerable: true, get: function() {
|
|
return cancellation_1.CancellationToken;
|
|
}});
|
|
var messageReader_1 = require_messageReader();
|
|
Object.defineProperty(exports2, "MessageReader", {enumerable: true, get: function() {
|
|
return messageReader_1.MessageReader;
|
|
}});
|
|
Object.defineProperty(exports2, "AbstractMessageReader", {enumerable: true, get: function() {
|
|
return messageReader_1.AbstractMessageReader;
|
|
}});
|
|
Object.defineProperty(exports2, "ReadableStreamMessageReader", {enumerable: true, get: function() {
|
|
return messageReader_1.ReadableStreamMessageReader;
|
|
}});
|
|
var messageWriter_1 = require_messageWriter();
|
|
Object.defineProperty(exports2, "MessageWriter", {enumerable: true, get: function() {
|
|
return messageWriter_1.MessageWriter;
|
|
}});
|
|
Object.defineProperty(exports2, "AbstractMessageWriter", {enumerable: true, get: function() {
|
|
return messageWriter_1.AbstractMessageWriter;
|
|
}});
|
|
Object.defineProperty(exports2, "WriteableStreamMessageWriter", {enumerable: true, get: function() {
|
|
return messageWriter_1.WriteableStreamMessageWriter;
|
|
}});
|
|
var connection_1 = require_connection();
|
|
Object.defineProperty(exports2, "ConnectionStrategy", {enumerable: true, get: function() {
|
|
return connection_1.ConnectionStrategy;
|
|
}});
|
|
Object.defineProperty(exports2, "ConnectionOptions", {enumerable: true, get: function() {
|
|
return connection_1.ConnectionOptions;
|
|
}});
|
|
Object.defineProperty(exports2, "NullLogger", {enumerable: true, get: function() {
|
|
return connection_1.NullLogger;
|
|
}});
|
|
Object.defineProperty(exports2, "createMessageConnection", {enumerable: true, get: function() {
|
|
return connection_1.createMessageConnection;
|
|
}});
|
|
Object.defineProperty(exports2, "ProgressType", {enumerable: true, get: function() {
|
|
return connection_1.ProgressType;
|
|
}});
|
|
Object.defineProperty(exports2, "Trace", {enumerable: true, get: function() {
|
|
return connection_1.Trace;
|
|
}});
|
|
Object.defineProperty(exports2, "TraceFormat", {enumerable: true, get: function() {
|
|
return connection_1.TraceFormat;
|
|
}});
|
|
Object.defineProperty(exports2, "SetTraceNotification", {enumerable: true, get: function() {
|
|
return connection_1.SetTraceNotification;
|
|
}});
|
|
Object.defineProperty(exports2, "LogTraceNotification", {enumerable: true, get: function() {
|
|
return connection_1.LogTraceNotification;
|
|
}});
|
|
Object.defineProperty(exports2, "ConnectionErrors", {enumerable: true, get: function() {
|
|
return connection_1.ConnectionErrors;
|
|
}});
|
|
Object.defineProperty(exports2, "ConnectionError", {enumerable: true, get: function() {
|
|
return connection_1.ConnectionError;
|
|
}});
|
|
Object.defineProperty(exports2, "CancellationReceiverStrategy", {enumerable: true, get: function() {
|
|
return connection_1.CancellationReceiverStrategy;
|
|
}});
|
|
Object.defineProperty(exports2, "CancellationSenderStrategy", {enumerable: true, get: function() {
|
|
return connection_1.CancellationSenderStrategy;
|
|
}});
|
|
Object.defineProperty(exports2, "CancellationStrategy", {enumerable: true, get: function() {
|
|
return connection_1.CancellationStrategy;
|
|
}});
|
|
var ral_1 = require_ral();
|
|
exports2.RAL = ral_1.default;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/lib/node/main.js
|
|
var require_main = __commonJS((exports2) => {
|
|
"use strict";
|
|
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
Object.defineProperty(o, k2, {enumerable: true, get: function() {
|
|
return m[k];
|
|
}});
|
|
} : function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
o[k2] = m[k];
|
|
});
|
|
var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) {
|
|
for (var p in m)
|
|
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p))
|
|
__createBinding(exports3, m, p);
|
|
};
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.createMessageConnection = exports2.createServerSocketTransport = exports2.createClientSocketTransport = exports2.createServerPipeTransport = exports2.createClientPipeTransport = exports2.generateRandomPipeName = exports2.StreamMessageWriter = exports2.StreamMessageReader = exports2.SocketMessageWriter = exports2.SocketMessageReader = exports2.IPCMessageWriter = exports2.IPCMessageReader = void 0;
|
|
var ril_1 = require_ril();
|
|
ril_1.default.install();
|
|
var api_1 = require_api();
|
|
var path9 = require("path");
|
|
var os3 = require("os");
|
|
var crypto_1 = require("crypto");
|
|
var net_1 = require("net");
|
|
__exportStar2(require_api(), exports2);
|
|
var IPCMessageReader = class extends api_1.AbstractMessageReader {
|
|
constructor(process2) {
|
|
super();
|
|
this.process = process2;
|
|
let eventEmitter = this.process;
|
|
eventEmitter.on("error", (error) => this.fireError(error));
|
|
eventEmitter.on("close", () => this.fireClose());
|
|
}
|
|
listen(callback) {
|
|
this.process.on("message", callback);
|
|
return api_1.Disposable.create(() => this.process.off("message", callback));
|
|
}
|
|
};
|
|
exports2.IPCMessageReader = IPCMessageReader;
|
|
var IPCMessageWriter = class extends api_1.AbstractMessageWriter {
|
|
constructor(process2) {
|
|
super();
|
|
this.process = process2;
|
|
this.errorCount = 0;
|
|
let eventEmitter = this.process;
|
|
eventEmitter.on("error", (error) => this.fireError(error));
|
|
eventEmitter.on("close", () => this.fireClose);
|
|
}
|
|
write(msg) {
|
|
try {
|
|
if (typeof this.process.send === "function") {
|
|
this.process.send(msg, void 0, void 0, (error) => {
|
|
if (error) {
|
|
this.errorCount++;
|
|
this.handleError(error, msg);
|
|
} else {
|
|
this.errorCount = 0;
|
|
}
|
|
});
|
|
}
|
|
return Promise.resolve();
|
|
} catch (error) {
|
|
this.handleError(error, msg);
|
|
return Promise.reject(error);
|
|
}
|
|
}
|
|
handleError(error, msg) {
|
|
this.errorCount++;
|
|
this.fireError(error, msg, this.errorCount);
|
|
}
|
|
end() {
|
|
}
|
|
};
|
|
exports2.IPCMessageWriter = IPCMessageWriter;
|
|
var SocketMessageReader = class extends api_1.ReadableStreamMessageReader {
|
|
constructor(socket, encoding = "utf-8") {
|
|
super(ril_1.default().stream.asReadableStream(socket), encoding);
|
|
}
|
|
};
|
|
exports2.SocketMessageReader = SocketMessageReader;
|
|
var SocketMessageWriter = class extends api_1.WriteableStreamMessageWriter {
|
|
constructor(socket, options) {
|
|
super(ril_1.default().stream.asWritableStream(socket), options);
|
|
this.socket = socket;
|
|
}
|
|
dispose() {
|
|
super.dispose();
|
|
this.socket.destroy();
|
|
}
|
|
};
|
|
exports2.SocketMessageWriter = SocketMessageWriter;
|
|
var StreamMessageReader = class extends api_1.ReadableStreamMessageReader {
|
|
constructor(readble, encoding) {
|
|
super(ril_1.default().stream.asReadableStream(readble), encoding);
|
|
}
|
|
};
|
|
exports2.StreamMessageReader = StreamMessageReader;
|
|
var StreamMessageWriter = class extends api_1.WriteableStreamMessageWriter {
|
|
constructor(writable, options) {
|
|
super(ril_1.default().stream.asWritableStream(writable), options);
|
|
}
|
|
};
|
|
exports2.StreamMessageWriter = StreamMessageWriter;
|
|
var XDG_RUNTIME_DIR = process.env["XDG_RUNTIME_DIR"];
|
|
var safeIpcPathLengths = new Map([
|
|
["linux", 107],
|
|
["darwin", 103]
|
|
]);
|
|
function generateRandomPipeName() {
|
|
const randomSuffix = crypto_1.randomBytes(21).toString("hex");
|
|
if (process.platform === "win32") {
|
|
return `\\\\.\\pipe\\vscode-jsonrpc-${randomSuffix}-sock`;
|
|
}
|
|
let result;
|
|
if (XDG_RUNTIME_DIR) {
|
|
result = path9.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`);
|
|
} else {
|
|
result = path9.join(os3.tmpdir(), `vscode-${randomSuffix}.sock`);
|
|
}
|
|
const limit = safeIpcPathLengths.get(process.platform);
|
|
if (limit !== void 0 && result.length >= limit) {
|
|
ril_1.default().console.warn(`WARNING: IPC handle "${result}" is longer than ${limit} characters.`);
|
|
}
|
|
return result;
|
|
}
|
|
exports2.generateRandomPipeName = generateRandomPipeName;
|
|
function createClientPipeTransport(pipeName, encoding = "utf-8") {
|
|
let connectResolve;
|
|
const connected = new Promise((resolve, _reject) => {
|
|
connectResolve = resolve;
|
|
});
|
|
return new Promise((resolve, reject) => {
|
|
let server = net_1.createServer((socket) => {
|
|
server.close();
|
|
connectResolve([
|
|
new SocketMessageReader(socket, encoding),
|
|
new SocketMessageWriter(socket, encoding)
|
|
]);
|
|
});
|
|
server.on("error", reject);
|
|
server.listen(pipeName, () => {
|
|
server.removeListener("error", reject);
|
|
resolve({
|
|
onConnected: () => {
|
|
return connected;
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
exports2.createClientPipeTransport = createClientPipeTransport;
|
|
function createServerPipeTransport(pipeName, encoding = "utf-8") {
|
|
const socket = net_1.createConnection(pipeName);
|
|
return [
|
|
new SocketMessageReader(socket, encoding),
|
|
new SocketMessageWriter(socket, encoding)
|
|
];
|
|
}
|
|
exports2.createServerPipeTransport = createServerPipeTransport;
|
|
function createClientSocketTransport(port, encoding = "utf-8") {
|
|
let connectResolve;
|
|
const connected = new Promise((resolve, _reject) => {
|
|
connectResolve = resolve;
|
|
});
|
|
return new Promise((resolve, reject) => {
|
|
const server = net_1.createServer((socket) => {
|
|
server.close();
|
|
connectResolve([
|
|
new SocketMessageReader(socket, encoding),
|
|
new SocketMessageWriter(socket, encoding)
|
|
]);
|
|
});
|
|
server.on("error", reject);
|
|
server.listen(port, "127.0.0.1", () => {
|
|
server.removeListener("error", reject);
|
|
resolve({
|
|
onConnected: () => {
|
|
return connected;
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
exports2.createClientSocketTransport = createClientSocketTransport;
|
|
function createServerSocketTransport(port, encoding = "utf-8") {
|
|
const socket = net_1.createConnection(port, "127.0.0.1");
|
|
return [
|
|
new SocketMessageReader(socket, encoding),
|
|
new SocketMessageWriter(socket, encoding)
|
|
];
|
|
}
|
|
exports2.createServerSocketTransport = createServerSocketTransport;
|
|
function isReadableStream(value) {
|
|
const candidate = value;
|
|
return candidate.read !== void 0 && candidate.addListener !== void 0;
|
|
}
|
|
function isWritableStream(value) {
|
|
const candidate = value;
|
|
return candidate.write !== void 0 && candidate.addListener !== void 0;
|
|
}
|
|
function createMessageConnection(input, output, logger, options) {
|
|
if (!logger) {
|
|
logger = api_1.NullLogger;
|
|
}
|
|
const reader = isReadableStream(input) ? new StreamMessageReader(input) : input;
|
|
const writer = isWritableStream(output) ? new StreamMessageWriter(output) : output;
|
|
if (api_1.ConnectionStrategy.is(options)) {
|
|
options = {connectionStrategy: options};
|
|
}
|
|
return api_1.createMessageConnection(reader, writer, logger, options);
|
|
}
|
|
exports2.createMessageConnection = createMessageConnection;
|
|
});
|
|
|
|
// node_modules/vscode-jsonrpc/node.js
|
|
var require_node = __commonJS((exports2, module2) => {
|
|
"use strict";
|
|
module2.exports = require_main();
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-types/lib/esm/main.js
|
|
var require_main2 = __commonJS((exports2) => {
|
|
__export(exports2, {
|
|
AnnotatedTextEdit: () => AnnotatedTextEdit,
|
|
ChangeAnnotation: () => ChangeAnnotation,
|
|
ChangeAnnotationIdentifier: () => ChangeAnnotationIdentifier,
|
|
CodeAction: () => CodeAction6,
|
|
CodeActionContext: () => CodeActionContext6,
|
|
CodeActionKind: () => CodeActionKind6,
|
|
CodeDescription: () => CodeDescription,
|
|
CodeLens: () => CodeLens2,
|
|
Color: () => Color,
|
|
ColorInformation: () => ColorInformation,
|
|
ColorPresentation: () => ColorPresentation,
|
|
Command: () => Command5,
|
|
CompletionItem: () => CompletionItem4,
|
|
CompletionItemKind: () => CompletionItemKind3,
|
|
CompletionItemTag: () => CompletionItemTag2,
|
|
CompletionList: () => CompletionList3,
|
|
CreateFile: () => CreateFile,
|
|
DeleteFile: () => DeleteFile,
|
|
Diagnostic: () => Diagnostic6,
|
|
DiagnosticRelatedInformation: () => DiagnosticRelatedInformation2,
|
|
DiagnosticSeverity: () => DiagnosticSeverity3,
|
|
DiagnosticTag: () => DiagnosticTag3,
|
|
DocumentHighlight: () => DocumentHighlight2,
|
|
DocumentHighlightKind: () => DocumentHighlightKind2,
|
|
DocumentLink: () => DocumentLink,
|
|
DocumentSymbol: () => DocumentSymbol2,
|
|
EOL: () => EOL,
|
|
FoldingRange: () => FoldingRange2,
|
|
FoldingRangeKind: () => FoldingRangeKind,
|
|
FormattingOptions: () => FormattingOptions,
|
|
Hover: () => Hover,
|
|
InsertReplaceEdit: () => InsertReplaceEdit,
|
|
InsertTextFormat: () => InsertTextFormat3,
|
|
InsertTextMode: () => InsertTextMode,
|
|
Location: () => Location4,
|
|
LocationLink: () => LocationLink,
|
|
MarkedString: () => MarkedString,
|
|
MarkupContent: () => MarkupContent3,
|
|
MarkupKind: () => MarkupKind3,
|
|
OptionalVersionedTextDocumentIdentifier: () => OptionalVersionedTextDocumentIdentifier,
|
|
ParameterInformation: () => ParameterInformation,
|
|
Position: () => Position10,
|
|
Range: () => Range17,
|
|
RenameFile: () => RenameFile,
|
|
SelectionRange: () => SelectionRange,
|
|
SignatureInformation: () => SignatureInformation,
|
|
SymbolInformation: () => SymbolInformation2,
|
|
SymbolKind: () => SymbolKind5,
|
|
SymbolTag: () => SymbolTag4,
|
|
TextDocument: () => TextDocument13,
|
|
TextDocumentEdit: () => TextDocumentEdit,
|
|
TextDocumentIdentifier: () => TextDocumentIdentifier,
|
|
TextDocumentItem: () => TextDocumentItem,
|
|
TextEdit: () => TextEdit6,
|
|
VersionedTextDocumentIdentifier: () => VersionedTextDocumentIdentifier,
|
|
WorkspaceChange: () => WorkspaceChange,
|
|
WorkspaceEdit: () => WorkspaceEdit6,
|
|
integer: () => integer,
|
|
uinteger: () => uinteger
|
|
});
|
|
"use strict";
|
|
var integer;
|
|
(function(integer2) {
|
|
integer2.MIN_VALUE = -2147483648;
|
|
integer2.MAX_VALUE = 2147483647;
|
|
})(integer || (integer = {}));
|
|
var uinteger;
|
|
(function(uinteger2) {
|
|
uinteger2.MIN_VALUE = 0;
|
|
uinteger2.MAX_VALUE = 2147483647;
|
|
})(uinteger || (uinteger = {}));
|
|
var Position10;
|
|
(function(Position11) {
|
|
function create(line, character) {
|
|
if (line === Number.MAX_VALUE) {
|
|
line = uinteger.MAX_VALUE;
|
|
}
|
|
if (character === Number.MAX_VALUE) {
|
|
character = uinteger.MAX_VALUE;
|
|
}
|
|
return {line, character};
|
|
}
|
|
Position11.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);
|
|
}
|
|
Position11.is = is2;
|
|
})(Position10 || (Position10 = {}));
|
|
var Range17;
|
|
(function(Range18) {
|
|
function create(one, two, three, four) {
|
|
if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {
|
|
return {start: Position10.create(one, two), end: Position10.create(three, four)};
|
|
} else if (Position10.is(one) && Position10.is(two)) {
|
|
return {start: one, end: two};
|
|
} else {
|
|
throw new Error("Range#create called with invalid arguments[" + one + ", " + two + ", " + three + ", " + four + "]");
|
|
}
|
|
}
|
|
Range18.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.objectLiteral(candidate) && Position10.is(candidate.start) && Position10.is(candidate.end);
|
|
}
|
|
Range18.is = is2;
|
|
})(Range17 || (Range17 = {}));
|
|
var Location4;
|
|
(function(Location5) {
|
|
function create(uri, range) {
|
|
return {uri, range};
|
|
}
|
|
Location5.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Range17.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));
|
|
}
|
|
Location5.is = is2;
|
|
})(Location4 || (Location4 = {}));
|
|
var LocationLink;
|
|
(function(LocationLink2) {
|
|
function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {
|
|
return {targetUri, targetRange, targetSelectionRange, originSelectionRange};
|
|
}
|
|
LocationLink2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Range17.is(candidate.targetRange) && Is.string(candidate.targetUri) && (Range17.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange)) && (Range17.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));
|
|
}
|
|
LocationLink2.is = is2;
|
|
})(LocationLink || (LocationLink = {}));
|
|
var Color;
|
|
(function(Color2) {
|
|
function create(red, green, blue, alpha) {
|
|
return {
|
|
red,
|
|
green,
|
|
blue,
|
|
alpha
|
|
};
|
|
}
|
|
Color2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.numberRange(candidate.red, 0, 1) && Is.numberRange(candidate.green, 0, 1) && Is.numberRange(candidate.blue, 0, 1) && Is.numberRange(candidate.alpha, 0, 1);
|
|
}
|
|
Color2.is = is2;
|
|
})(Color || (Color = {}));
|
|
var ColorInformation;
|
|
(function(ColorInformation2) {
|
|
function create(range, color) {
|
|
return {
|
|
range,
|
|
color
|
|
};
|
|
}
|
|
ColorInformation2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Range17.is(candidate.range) && Color.is(candidate.color);
|
|
}
|
|
ColorInformation2.is = is2;
|
|
})(ColorInformation || (ColorInformation = {}));
|
|
var ColorPresentation;
|
|
(function(ColorPresentation2) {
|
|
function create(label, textEdit, additionalTextEdits) {
|
|
return {
|
|
label,
|
|
textEdit,
|
|
additionalTextEdits
|
|
};
|
|
}
|
|
ColorPresentation2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.string(candidate.label) && (Is.undefined(candidate.textEdit) || TextEdit6.is(candidate)) && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit6.is));
|
|
}
|
|
ColorPresentation2.is = is2;
|
|
})(ColorPresentation || (ColorPresentation = {}));
|
|
var FoldingRangeKind;
|
|
(function(FoldingRangeKind2) {
|
|
FoldingRangeKind2["Comment"] = "comment";
|
|
FoldingRangeKind2["Imports"] = "imports";
|
|
FoldingRangeKind2["Region"] = "region";
|
|
})(FoldingRangeKind || (FoldingRangeKind = {}));
|
|
var FoldingRange2;
|
|
(function(FoldingRange3) {
|
|
function create(startLine, endLine, startCharacter, endCharacter, kind) {
|
|
var result = {
|
|
startLine,
|
|
endLine
|
|
};
|
|
if (Is.defined(startCharacter)) {
|
|
result.startCharacter = startCharacter;
|
|
}
|
|
if (Is.defined(endCharacter)) {
|
|
result.endCharacter = endCharacter;
|
|
}
|
|
if (Is.defined(kind)) {
|
|
result.kind = kind;
|
|
}
|
|
return result;
|
|
}
|
|
FoldingRange3.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine) && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter)) && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter)) && (Is.undefined(candidate.kind) || Is.string(candidate.kind));
|
|
}
|
|
FoldingRange3.is = is2;
|
|
})(FoldingRange2 || (FoldingRange2 = {}));
|
|
var DiagnosticRelatedInformation2;
|
|
(function(DiagnosticRelatedInformation3) {
|
|
function create(location, message) {
|
|
return {
|
|
location,
|
|
message
|
|
};
|
|
}
|
|
DiagnosticRelatedInformation3.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Location4.is(candidate.location) && Is.string(candidate.message);
|
|
}
|
|
DiagnosticRelatedInformation3.is = is2;
|
|
})(DiagnosticRelatedInformation2 || (DiagnosticRelatedInformation2 = {}));
|
|
var DiagnosticSeverity3;
|
|
(function(DiagnosticSeverity4) {
|
|
DiagnosticSeverity4.Error = 1;
|
|
DiagnosticSeverity4.Warning = 2;
|
|
DiagnosticSeverity4.Information = 3;
|
|
DiagnosticSeverity4.Hint = 4;
|
|
})(DiagnosticSeverity3 || (DiagnosticSeverity3 = {}));
|
|
var DiagnosticTag3;
|
|
(function(DiagnosticTag4) {
|
|
DiagnosticTag4.Unnecessary = 1;
|
|
DiagnosticTag4.Deprecated = 2;
|
|
})(DiagnosticTag3 || (DiagnosticTag3 = {}));
|
|
var CodeDescription;
|
|
(function(CodeDescription2) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate !== void 0 && candidate !== null && Is.string(candidate.href);
|
|
}
|
|
CodeDescription2.is = is2;
|
|
})(CodeDescription || (CodeDescription = {}));
|
|
var Diagnostic6;
|
|
(function(Diagnostic7) {
|
|
function create(range, message, severity, code, source, relatedInformation) {
|
|
var result = {range, message};
|
|
if (Is.defined(severity)) {
|
|
result.severity = severity;
|
|
}
|
|
if (Is.defined(code)) {
|
|
result.code = code;
|
|
}
|
|
if (Is.defined(source)) {
|
|
result.source = source;
|
|
}
|
|
if (Is.defined(relatedInformation)) {
|
|
result.relatedInformation = relatedInformation;
|
|
}
|
|
return result;
|
|
}
|
|
Diagnostic7.create = create;
|
|
function is2(value) {
|
|
var _a;
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Range17.is(candidate.range) && Is.string(candidate.message) && (Is.number(candidate.severity) || Is.undefined(candidate.severity)) && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code)) && (Is.undefined(candidate.codeDescription) || Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)) && (Is.string(candidate.source) || Is.undefined(candidate.source)) && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation2.is));
|
|
}
|
|
Diagnostic7.is = is2;
|
|
})(Diagnostic6 || (Diagnostic6 = {}));
|
|
var Command5;
|
|
(function(Command6) {
|
|
function create(title, command) {
|
|
var args = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
args[_i - 2] = arguments[_i];
|
|
}
|
|
var result = {title, command};
|
|
if (Is.defined(args) && args.length > 0) {
|
|
result.arguments = args;
|
|
}
|
|
return result;
|
|
}
|
|
Command6.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);
|
|
}
|
|
Command6.is = is2;
|
|
})(Command5 || (Command5 = {}));
|
|
var TextEdit6;
|
|
(function(TextEdit7) {
|
|
function replace(range, newText) {
|
|
return {range, newText};
|
|
}
|
|
TextEdit7.replace = replace;
|
|
function insert(position, newText) {
|
|
return {range: {start: position, end: position}, newText};
|
|
}
|
|
TextEdit7.insert = insert;
|
|
function del(range) {
|
|
return {range, newText: ""};
|
|
}
|
|
TextEdit7.del = del;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.objectLiteral(candidate) && Is.string(candidate.newText) && Range17.is(candidate.range);
|
|
}
|
|
TextEdit7.is = is2;
|
|
})(TextEdit6 || (TextEdit6 = {}));
|
|
var ChangeAnnotation;
|
|
(function(ChangeAnnotation2) {
|
|
function create(label, needsConfirmation, description) {
|
|
var result = {label};
|
|
if (needsConfirmation !== void 0) {
|
|
result.needsConfirmation = needsConfirmation;
|
|
}
|
|
if (description !== void 0) {
|
|
result.description = description;
|
|
}
|
|
return result;
|
|
}
|
|
ChangeAnnotation2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate !== void 0 && Is.objectLiteral(candidate) && Is.string(candidate.label) && (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === void 0) && (Is.string(candidate.description) || candidate.description === void 0);
|
|
}
|
|
ChangeAnnotation2.is = is2;
|
|
})(ChangeAnnotation || (ChangeAnnotation = {}));
|
|
var ChangeAnnotationIdentifier;
|
|
(function(ChangeAnnotationIdentifier2) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return typeof candidate === "string";
|
|
}
|
|
ChangeAnnotationIdentifier2.is = is2;
|
|
})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));
|
|
var AnnotatedTextEdit;
|
|
(function(AnnotatedTextEdit2) {
|
|
function replace(range, newText, annotation) {
|
|
return {range, newText, annotationId: annotation};
|
|
}
|
|
AnnotatedTextEdit2.replace = replace;
|
|
function insert(position, newText, annotation) {
|
|
return {range: {start: position, end: position}, newText, annotationId: annotation};
|
|
}
|
|
AnnotatedTextEdit2.insert = insert;
|
|
function del(range, annotation) {
|
|
return {range, newText: "", annotationId: annotation};
|
|
}
|
|
AnnotatedTextEdit2.del = del;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return TextEdit6.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));
|
|
}
|
|
AnnotatedTextEdit2.is = is2;
|
|
})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));
|
|
var TextDocumentEdit;
|
|
(function(TextDocumentEdit2) {
|
|
function create(textDocument, edits) {
|
|
return {textDocument, edits};
|
|
}
|
|
TextDocumentEdit2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument) && Array.isArray(candidate.edits);
|
|
}
|
|
TextDocumentEdit2.is = is2;
|
|
})(TextDocumentEdit || (TextDocumentEdit = {}));
|
|
var CreateFile;
|
|
(function(CreateFile2) {
|
|
function create(uri, options, annotation) {
|
|
var result = {
|
|
kind: "create",
|
|
uri
|
|
};
|
|
if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
|
|
result.options = options;
|
|
}
|
|
if (annotation !== void 0) {
|
|
result.annotationId = annotation;
|
|
}
|
|
return result;
|
|
}
|
|
CreateFile2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && candidate.kind === "create" && Is.string(candidate.uri) && (candidate.options === void 0 || (candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === void 0 || ChangeAnnotationIdentifier.is(candidate.annotationId));
|
|
}
|
|
CreateFile2.is = is2;
|
|
})(CreateFile || (CreateFile = {}));
|
|
var RenameFile;
|
|
(function(RenameFile2) {
|
|
function create(oldUri, newUri, options, annotation) {
|
|
var result = {
|
|
kind: "rename",
|
|
oldUri,
|
|
newUri
|
|
};
|
|
if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
|
|
result.options = options;
|
|
}
|
|
if (annotation !== void 0) {
|
|
result.annotationId = annotation;
|
|
}
|
|
return result;
|
|
}
|
|
RenameFile2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && candidate.kind === "rename" && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === void 0 || (candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === void 0 || ChangeAnnotationIdentifier.is(candidate.annotationId));
|
|
}
|
|
RenameFile2.is = is2;
|
|
})(RenameFile || (RenameFile = {}));
|
|
var DeleteFile;
|
|
(function(DeleteFile2) {
|
|
function create(uri, options, annotation) {
|
|
var result = {
|
|
kind: "delete",
|
|
uri
|
|
};
|
|
if (options !== void 0 && (options.recursive !== void 0 || options.ignoreIfNotExists !== void 0)) {
|
|
result.options = options;
|
|
}
|
|
if (annotation !== void 0) {
|
|
result.annotationId = annotation;
|
|
}
|
|
return result;
|
|
}
|
|
DeleteFile2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && candidate.kind === "delete" && Is.string(candidate.uri) && (candidate.options === void 0 || (candidate.options.recursive === void 0 || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === void 0 || Is.boolean(candidate.options.ignoreIfNotExists))) && (candidate.annotationId === void 0 || ChangeAnnotationIdentifier.is(candidate.annotationId));
|
|
}
|
|
DeleteFile2.is = is2;
|
|
})(DeleteFile || (DeleteFile = {}));
|
|
var WorkspaceEdit6;
|
|
(function(WorkspaceEdit7) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && (candidate.changes !== void 0 || candidate.documentChanges !== void 0) && (candidate.documentChanges === void 0 || candidate.documentChanges.every(function(change) {
|
|
if (Is.string(change.kind)) {
|
|
return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);
|
|
} else {
|
|
return TextDocumentEdit.is(change);
|
|
}
|
|
}));
|
|
}
|
|
WorkspaceEdit7.is = is2;
|
|
})(WorkspaceEdit6 || (WorkspaceEdit6 = {}));
|
|
var TextEditChangeImpl = function() {
|
|
function TextEditChangeImpl2(edits, changeAnnotations) {
|
|
this.edits = edits;
|
|
this.changeAnnotations = changeAnnotations;
|
|
}
|
|
TextEditChangeImpl2.prototype.insert = function(position, newText, annotation) {
|
|
var edit;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
edit = TextEdit6.insert(position, newText);
|
|
} else if (ChangeAnnotationIdentifier.is(annotation)) {
|
|
id = annotation;
|
|
edit = AnnotatedTextEdit.insert(position, newText, annotation);
|
|
} else {
|
|
this.assertChangeAnnotations(this.changeAnnotations);
|
|
id = this.changeAnnotations.manage(annotation);
|
|
edit = AnnotatedTextEdit.insert(position, newText, id);
|
|
}
|
|
this.edits.push(edit);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
TextEditChangeImpl2.prototype.replace = function(range, newText, annotation) {
|
|
var edit;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
edit = TextEdit6.replace(range, newText);
|
|
} else if (ChangeAnnotationIdentifier.is(annotation)) {
|
|
id = annotation;
|
|
edit = AnnotatedTextEdit.replace(range, newText, annotation);
|
|
} else {
|
|
this.assertChangeAnnotations(this.changeAnnotations);
|
|
id = this.changeAnnotations.manage(annotation);
|
|
edit = AnnotatedTextEdit.replace(range, newText, id);
|
|
}
|
|
this.edits.push(edit);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
TextEditChangeImpl2.prototype.delete = function(range, annotation) {
|
|
var edit;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
edit = TextEdit6.del(range);
|
|
} else if (ChangeAnnotationIdentifier.is(annotation)) {
|
|
id = annotation;
|
|
edit = AnnotatedTextEdit.del(range, annotation);
|
|
} else {
|
|
this.assertChangeAnnotations(this.changeAnnotations);
|
|
id = this.changeAnnotations.manage(annotation);
|
|
edit = AnnotatedTextEdit.del(range, id);
|
|
}
|
|
this.edits.push(edit);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
TextEditChangeImpl2.prototype.add = function(edit) {
|
|
this.edits.push(edit);
|
|
};
|
|
TextEditChangeImpl2.prototype.all = function() {
|
|
return this.edits;
|
|
};
|
|
TextEditChangeImpl2.prototype.clear = function() {
|
|
this.edits.splice(0, this.edits.length);
|
|
};
|
|
TextEditChangeImpl2.prototype.assertChangeAnnotations = function(value) {
|
|
if (value === void 0) {
|
|
throw new Error("Text edit change is not configured to manage change annotations.");
|
|
}
|
|
};
|
|
return TextEditChangeImpl2;
|
|
}();
|
|
var ChangeAnnotations = function() {
|
|
function ChangeAnnotations2(annotations) {
|
|
this._annotations = annotations === void 0 ? Object.create(null) : annotations;
|
|
this._counter = 0;
|
|
this._size = 0;
|
|
}
|
|
ChangeAnnotations2.prototype.all = function() {
|
|
return this._annotations;
|
|
};
|
|
Object.defineProperty(ChangeAnnotations2.prototype, "size", {
|
|
get: function() {
|
|
return this._size;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
ChangeAnnotations2.prototype.manage = function(idOrAnnotation, annotation) {
|
|
var id;
|
|
if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {
|
|
id = idOrAnnotation;
|
|
} else {
|
|
id = this.nextId();
|
|
annotation = idOrAnnotation;
|
|
}
|
|
if (this._annotations[id] !== void 0) {
|
|
throw new Error("Id " + id + " is already in use.");
|
|
}
|
|
if (annotation === void 0) {
|
|
throw new Error("No annotation provided for id " + id);
|
|
}
|
|
this._annotations[id] = annotation;
|
|
this._size++;
|
|
return id;
|
|
};
|
|
ChangeAnnotations2.prototype.nextId = function() {
|
|
this._counter++;
|
|
return this._counter.toString();
|
|
};
|
|
return ChangeAnnotations2;
|
|
}();
|
|
var WorkspaceChange = function() {
|
|
function WorkspaceChange2(workspaceEdit) {
|
|
var _this = this;
|
|
this._textEditChanges = Object.create(null);
|
|
if (workspaceEdit !== void 0) {
|
|
this._workspaceEdit = workspaceEdit;
|
|
if (workspaceEdit.documentChanges) {
|
|
this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);
|
|
workspaceEdit.changeAnnotations = this._changeAnnotations.all();
|
|
workspaceEdit.documentChanges.forEach(function(change) {
|
|
if (TextDocumentEdit.is(change)) {
|
|
var textEditChange = new TextEditChangeImpl(change.edits, _this._changeAnnotations);
|
|
_this._textEditChanges[change.textDocument.uri] = textEditChange;
|
|
}
|
|
});
|
|
} else if (workspaceEdit.changes) {
|
|
Object.keys(workspaceEdit.changes).forEach(function(key) {
|
|
var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);
|
|
_this._textEditChanges[key] = textEditChange;
|
|
});
|
|
}
|
|
} else {
|
|
this._workspaceEdit = {};
|
|
}
|
|
}
|
|
Object.defineProperty(WorkspaceChange2.prototype, "edit", {
|
|
get: function() {
|
|
this.initDocumentChanges();
|
|
if (this._changeAnnotations !== void 0) {
|
|
if (this._changeAnnotations.size === 0) {
|
|
this._workspaceEdit.changeAnnotations = void 0;
|
|
} else {
|
|
this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();
|
|
}
|
|
}
|
|
return this._workspaceEdit;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
WorkspaceChange2.prototype.getTextEditChange = function(key) {
|
|
if (OptionalVersionedTextDocumentIdentifier.is(key)) {
|
|
this.initDocumentChanges();
|
|
if (this._workspaceEdit.documentChanges === void 0) {
|
|
throw new Error("Workspace edit is not configured for document changes.");
|
|
}
|
|
var textDocument = {uri: key.uri, version: key.version};
|
|
var result = this._textEditChanges[textDocument.uri];
|
|
if (!result) {
|
|
var edits = [];
|
|
var textDocumentEdit = {
|
|
textDocument,
|
|
edits
|
|
};
|
|
this._workspaceEdit.documentChanges.push(textDocumentEdit);
|
|
result = new TextEditChangeImpl(edits, this._changeAnnotations);
|
|
this._textEditChanges[textDocument.uri] = result;
|
|
}
|
|
return result;
|
|
} else {
|
|
this.initChanges();
|
|
if (this._workspaceEdit.changes === void 0) {
|
|
throw new Error("Workspace edit is not configured for normal text edit changes.");
|
|
}
|
|
var result = this._textEditChanges[key];
|
|
if (!result) {
|
|
var edits = [];
|
|
this._workspaceEdit.changes[key] = edits;
|
|
result = new TextEditChangeImpl(edits);
|
|
this._textEditChanges[key] = result;
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
WorkspaceChange2.prototype.initDocumentChanges = function() {
|
|
if (this._workspaceEdit.documentChanges === void 0 && this._workspaceEdit.changes === void 0) {
|
|
this._changeAnnotations = new ChangeAnnotations();
|
|
this._workspaceEdit.documentChanges = [];
|
|
this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();
|
|
}
|
|
};
|
|
WorkspaceChange2.prototype.initChanges = function() {
|
|
if (this._workspaceEdit.documentChanges === void 0 && this._workspaceEdit.changes === void 0) {
|
|
this._workspaceEdit.changes = Object.create(null);
|
|
}
|
|
};
|
|
WorkspaceChange2.prototype.createFile = function(uri, optionsOrAnnotation, options) {
|
|
this.initDocumentChanges();
|
|
if (this._workspaceEdit.documentChanges === void 0) {
|
|
throw new Error("Workspace edit is not configured for document changes.");
|
|
}
|
|
var annotation;
|
|
if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {
|
|
annotation = optionsOrAnnotation;
|
|
} else {
|
|
options = optionsOrAnnotation;
|
|
}
|
|
var operation;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
operation = CreateFile.create(uri, options);
|
|
} else {
|
|
id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);
|
|
operation = CreateFile.create(uri, options, id);
|
|
}
|
|
this._workspaceEdit.documentChanges.push(operation);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
WorkspaceChange2.prototype.renameFile = function(oldUri, newUri, optionsOrAnnotation, options) {
|
|
this.initDocumentChanges();
|
|
if (this._workspaceEdit.documentChanges === void 0) {
|
|
throw new Error("Workspace edit is not configured for document changes.");
|
|
}
|
|
var annotation;
|
|
if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {
|
|
annotation = optionsOrAnnotation;
|
|
} else {
|
|
options = optionsOrAnnotation;
|
|
}
|
|
var operation;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
operation = RenameFile.create(oldUri, newUri, options);
|
|
} else {
|
|
id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);
|
|
operation = RenameFile.create(oldUri, newUri, options, id);
|
|
}
|
|
this._workspaceEdit.documentChanges.push(operation);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
WorkspaceChange2.prototype.deleteFile = function(uri, optionsOrAnnotation, options) {
|
|
this.initDocumentChanges();
|
|
if (this._workspaceEdit.documentChanges === void 0) {
|
|
throw new Error("Workspace edit is not configured for document changes.");
|
|
}
|
|
var annotation;
|
|
if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {
|
|
annotation = optionsOrAnnotation;
|
|
} else {
|
|
options = optionsOrAnnotation;
|
|
}
|
|
var operation;
|
|
var id;
|
|
if (annotation === void 0) {
|
|
operation = DeleteFile.create(uri, options);
|
|
} else {
|
|
id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);
|
|
operation = DeleteFile.create(uri, options, id);
|
|
}
|
|
this._workspaceEdit.documentChanges.push(operation);
|
|
if (id !== void 0) {
|
|
return id;
|
|
}
|
|
};
|
|
return WorkspaceChange2;
|
|
}();
|
|
var TextDocumentIdentifier;
|
|
(function(TextDocumentIdentifier2) {
|
|
function create(uri) {
|
|
return {uri};
|
|
}
|
|
TextDocumentIdentifier2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.uri);
|
|
}
|
|
TextDocumentIdentifier2.is = is2;
|
|
})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));
|
|
var VersionedTextDocumentIdentifier;
|
|
(function(VersionedTextDocumentIdentifier2) {
|
|
function create(uri, version) {
|
|
return {uri, version};
|
|
}
|
|
VersionedTextDocumentIdentifier2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);
|
|
}
|
|
VersionedTextDocumentIdentifier2.is = is2;
|
|
})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));
|
|
var OptionalVersionedTextDocumentIdentifier;
|
|
(function(OptionalVersionedTextDocumentIdentifier2) {
|
|
function create(uri, version) {
|
|
return {uri, version};
|
|
}
|
|
OptionalVersionedTextDocumentIdentifier2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));
|
|
}
|
|
OptionalVersionedTextDocumentIdentifier2.is = is2;
|
|
})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));
|
|
var TextDocumentItem;
|
|
(function(TextDocumentItem2) {
|
|
function create(uri, languageId, version, text) {
|
|
return {uri, languageId, version, text};
|
|
}
|
|
TextDocumentItem2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);
|
|
}
|
|
TextDocumentItem2.is = is2;
|
|
})(TextDocumentItem || (TextDocumentItem = {}));
|
|
var MarkupKind3;
|
|
(function(MarkupKind4) {
|
|
MarkupKind4.PlainText = "plaintext";
|
|
MarkupKind4.Markdown = "markdown";
|
|
})(MarkupKind3 || (MarkupKind3 = {}));
|
|
(function(MarkupKind4) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate === MarkupKind4.PlainText || candidate === MarkupKind4.Markdown;
|
|
}
|
|
MarkupKind4.is = is2;
|
|
})(MarkupKind3 || (MarkupKind3 = {}));
|
|
var MarkupContent3;
|
|
(function(MarkupContent4) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.objectLiteral(value) && MarkupKind3.is(candidate.kind) && Is.string(candidate.value);
|
|
}
|
|
MarkupContent4.is = is2;
|
|
})(MarkupContent3 || (MarkupContent3 = {}));
|
|
var CompletionItemKind3;
|
|
(function(CompletionItemKind4) {
|
|
CompletionItemKind4.Text = 1;
|
|
CompletionItemKind4.Method = 2;
|
|
CompletionItemKind4.Function = 3;
|
|
CompletionItemKind4.Constructor = 4;
|
|
CompletionItemKind4.Field = 5;
|
|
CompletionItemKind4.Variable = 6;
|
|
CompletionItemKind4.Class = 7;
|
|
CompletionItemKind4.Interface = 8;
|
|
CompletionItemKind4.Module = 9;
|
|
CompletionItemKind4.Property = 10;
|
|
CompletionItemKind4.Unit = 11;
|
|
CompletionItemKind4.Value = 12;
|
|
CompletionItemKind4.Enum = 13;
|
|
CompletionItemKind4.Keyword = 14;
|
|
CompletionItemKind4.Snippet = 15;
|
|
CompletionItemKind4.Color = 16;
|
|
CompletionItemKind4.File = 17;
|
|
CompletionItemKind4.Reference = 18;
|
|
CompletionItemKind4.Folder = 19;
|
|
CompletionItemKind4.EnumMember = 20;
|
|
CompletionItemKind4.Constant = 21;
|
|
CompletionItemKind4.Struct = 22;
|
|
CompletionItemKind4.Event = 23;
|
|
CompletionItemKind4.Operator = 24;
|
|
CompletionItemKind4.TypeParameter = 25;
|
|
})(CompletionItemKind3 || (CompletionItemKind3 = {}));
|
|
var InsertTextFormat3;
|
|
(function(InsertTextFormat4) {
|
|
InsertTextFormat4.PlainText = 1;
|
|
InsertTextFormat4.Snippet = 2;
|
|
})(InsertTextFormat3 || (InsertTextFormat3 = {}));
|
|
var CompletionItemTag2;
|
|
(function(CompletionItemTag3) {
|
|
CompletionItemTag3.Deprecated = 1;
|
|
})(CompletionItemTag2 || (CompletionItemTag2 = {}));
|
|
var InsertReplaceEdit;
|
|
(function(InsertReplaceEdit2) {
|
|
function create(newText, insert, replace) {
|
|
return {newText, insert, replace};
|
|
}
|
|
InsertReplaceEdit2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && Is.string(candidate.newText) && Range17.is(candidate.insert) && Range17.is(candidate.replace);
|
|
}
|
|
InsertReplaceEdit2.is = is2;
|
|
})(InsertReplaceEdit || (InsertReplaceEdit = {}));
|
|
var InsertTextMode;
|
|
(function(InsertTextMode2) {
|
|
InsertTextMode2.asIs = 1;
|
|
InsertTextMode2.adjustIndentation = 2;
|
|
})(InsertTextMode || (InsertTextMode = {}));
|
|
var CompletionItem4;
|
|
(function(CompletionItem5) {
|
|
function create(label) {
|
|
return {label};
|
|
}
|
|
CompletionItem5.create = create;
|
|
})(CompletionItem4 || (CompletionItem4 = {}));
|
|
var CompletionList3;
|
|
(function(CompletionList4) {
|
|
function create(items, isIncomplete) {
|
|
return {items: items ? items : [], isIncomplete: !!isIncomplete};
|
|
}
|
|
CompletionList4.create = create;
|
|
})(CompletionList3 || (CompletionList3 = {}));
|
|
var MarkedString;
|
|
(function(MarkedString2) {
|
|
function fromPlainText(plainText) {
|
|
return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, "\\$&");
|
|
}
|
|
MarkedString2.fromPlainText = fromPlainText;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.string(candidate) || Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value);
|
|
}
|
|
MarkedString2.is = is2;
|
|
})(MarkedString || (MarkedString = {}));
|
|
var Hover;
|
|
(function(Hover2) {
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return !!candidate && Is.objectLiteral(candidate) && (MarkupContent3.is(candidate.contents) || MarkedString.is(candidate.contents) || Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === void 0 || Range17.is(value.range));
|
|
}
|
|
Hover2.is = is2;
|
|
})(Hover || (Hover = {}));
|
|
var ParameterInformation;
|
|
(function(ParameterInformation2) {
|
|
function create(label, documentation) {
|
|
return documentation ? {label, documentation} : {label};
|
|
}
|
|
ParameterInformation2.create = create;
|
|
})(ParameterInformation || (ParameterInformation = {}));
|
|
var SignatureInformation;
|
|
(function(SignatureInformation2) {
|
|
function create(label, documentation) {
|
|
var parameters = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
parameters[_i - 2] = arguments[_i];
|
|
}
|
|
var result = {label};
|
|
if (Is.defined(documentation)) {
|
|
result.documentation = documentation;
|
|
}
|
|
if (Is.defined(parameters)) {
|
|
result.parameters = parameters;
|
|
} else {
|
|
result.parameters = [];
|
|
}
|
|
return result;
|
|
}
|
|
SignatureInformation2.create = create;
|
|
})(SignatureInformation || (SignatureInformation = {}));
|
|
var DocumentHighlightKind2;
|
|
(function(DocumentHighlightKind3) {
|
|
DocumentHighlightKind3.Text = 1;
|
|
DocumentHighlightKind3.Read = 2;
|
|
DocumentHighlightKind3.Write = 3;
|
|
})(DocumentHighlightKind2 || (DocumentHighlightKind2 = {}));
|
|
var DocumentHighlight2;
|
|
(function(DocumentHighlight3) {
|
|
function create(range, kind) {
|
|
var result = {range};
|
|
if (Is.number(kind)) {
|
|
result.kind = kind;
|
|
}
|
|
return result;
|
|
}
|
|
DocumentHighlight3.create = create;
|
|
})(DocumentHighlight2 || (DocumentHighlight2 = {}));
|
|
var SymbolKind5;
|
|
(function(SymbolKind6) {
|
|
SymbolKind6.File = 1;
|
|
SymbolKind6.Module = 2;
|
|
SymbolKind6.Namespace = 3;
|
|
SymbolKind6.Package = 4;
|
|
SymbolKind6.Class = 5;
|
|
SymbolKind6.Method = 6;
|
|
SymbolKind6.Property = 7;
|
|
SymbolKind6.Field = 8;
|
|
SymbolKind6.Constructor = 9;
|
|
SymbolKind6.Enum = 10;
|
|
SymbolKind6.Interface = 11;
|
|
SymbolKind6.Function = 12;
|
|
SymbolKind6.Variable = 13;
|
|
SymbolKind6.Constant = 14;
|
|
SymbolKind6.String = 15;
|
|
SymbolKind6.Number = 16;
|
|
SymbolKind6.Boolean = 17;
|
|
SymbolKind6.Array = 18;
|
|
SymbolKind6.Object = 19;
|
|
SymbolKind6.Key = 20;
|
|
SymbolKind6.Null = 21;
|
|
SymbolKind6.EnumMember = 22;
|
|
SymbolKind6.Struct = 23;
|
|
SymbolKind6.Event = 24;
|
|
SymbolKind6.Operator = 25;
|
|
SymbolKind6.TypeParameter = 26;
|
|
})(SymbolKind5 || (SymbolKind5 = {}));
|
|
var SymbolTag4;
|
|
(function(SymbolTag5) {
|
|
SymbolTag5.Deprecated = 1;
|
|
})(SymbolTag4 || (SymbolTag4 = {}));
|
|
var SymbolInformation2;
|
|
(function(SymbolInformation3) {
|
|
function create(name, kind, range, uri, containerName) {
|
|
var result = {
|
|
name,
|
|
kind,
|
|
location: {uri, range}
|
|
};
|
|
if (containerName) {
|
|
result.containerName = containerName;
|
|
}
|
|
return result;
|
|
}
|
|
SymbolInformation3.create = create;
|
|
})(SymbolInformation2 || (SymbolInformation2 = {}));
|
|
var DocumentSymbol2;
|
|
(function(DocumentSymbol3) {
|
|
function create(name, detail, kind, range, selectionRange, children) {
|
|
var result = {
|
|
name,
|
|
detail,
|
|
kind,
|
|
range,
|
|
selectionRange
|
|
};
|
|
if (children !== void 0) {
|
|
result.children = children;
|
|
}
|
|
return result;
|
|
}
|
|
DocumentSymbol3.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && Is.string(candidate.name) && Is.number(candidate.kind) && Range17.is(candidate.range) && Range17.is(candidate.selectionRange) && (candidate.detail === void 0 || Is.string(candidate.detail)) && (candidate.deprecated === void 0 || Is.boolean(candidate.deprecated)) && (candidate.children === void 0 || Array.isArray(candidate.children)) && (candidate.tags === void 0 || Array.isArray(candidate.tags));
|
|
}
|
|
DocumentSymbol3.is = is2;
|
|
})(DocumentSymbol2 || (DocumentSymbol2 = {}));
|
|
var CodeActionKind6;
|
|
(function(CodeActionKind7) {
|
|
CodeActionKind7.Empty = "";
|
|
CodeActionKind7.QuickFix = "quickfix";
|
|
CodeActionKind7.Refactor = "refactor";
|
|
CodeActionKind7.RefactorExtract = "refactor.extract";
|
|
CodeActionKind7.RefactorInline = "refactor.inline";
|
|
CodeActionKind7.RefactorRewrite = "refactor.rewrite";
|
|
CodeActionKind7.Source = "source";
|
|
CodeActionKind7.SourceOrganizeImports = "source.organizeImports";
|
|
CodeActionKind7.SourceFixAll = "source.fixAll";
|
|
})(CodeActionKind6 || (CodeActionKind6 = {}));
|
|
var CodeActionContext6;
|
|
(function(CodeActionContext7) {
|
|
function create(diagnostics, only) {
|
|
var result = {diagnostics};
|
|
if (only !== void 0 && only !== null) {
|
|
result.only = only;
|
|
}
|
|
return result;
|
|
}
|
|
CodeActionContext7.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic6.is) && (candidate.only === void 0 || Is.typedArray(candidate.only, Is.string));
|
|
}
|
|
CodeActionContext7.is = is2;
|
|
})(CodeActionContext6 || (CodeActionContext6 = {}));
|
|
var CodeAction6;
|
|
(function(CodeAction7) {
|
|
function create(title, kindOrCommandOrEdit, kind) {
|
|
var result = {title};
|
|
var checkKind = true;
|
|
if (typeof kindOrCommandOrEdit === "string") {
|
|
checkKind = false;
|
|
result.kind = kindOrCommandOrEdit;
|
|
} else if (Command5.is(kindOrCommandOrEdit)) {
|
|
result.command = kindOrCommandOrEdit;
|
|
} else {
|
|
result.edit = kindOrCommandOrEdit;
|
|
}
|
|
if (checkKind && kind !== void 0) {
|
|
result.kind = kind;
|
|
}
|
|
return result;
|
|
}
|
|
CodeAction7.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate && Is.string(candidate.title) && (candidate.diagnostics === void 0 || Is.typedArray(candidate.diagnostics, Diagnostic6.is)) && (candidate.kind === void 0 || Is.string(candidate.kind)) && (candidate.edit !== void 0 || candidate.command !== void 0) && (candidate.command === void 0 || Command5.is(candidate.command)) && (candidate.isPreferred === void 0 || Is.boolean(candidate.isPreferred)) && (candidate.edit === void 0 || WorkspaceEdit6.is(candidate.edit));
|
|
}
|
|
CodeAction7.is = is2;
|
|
})(CodeAction6 || (CodeAction6 = {}));
|
|
var CodeLens2;
|
|
(function(CodeLens3) {
|
|
function create(range, data) {
|
|
var result = {range};
|
|
if (Is.defined(data)) {
|
|
result.data = data;
|
|
}
|
|
return result;
|
|
}
|
|
CodeLens3.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Range17.is(candidate.range) && (Is.undefined(candidate.command) || Command5.is(candidate.command));
|
|
}
|
|
CodeLens3.is = is2;
|
|
})(CodeLens2 || (CodeLens2 = {}));
|
|
var FormattingOptions;
|
|
(function(FormattingOptions2) {
|
|
function create(tabSize, insertSpaces) {
|
|
return {tabSize, insertSpaces};
|
|
}
|
|
FormattingOptions2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);
|
|
}
|
|
FormattingOptions2.is = is2;
|
|
})(FormattingOptions || (FormattingOptions = {}));
|
|
var DocumentLink;
|
|
(function(DocumentLink2) {
|
|
function create(range, target, data) {
|
|
return {range, target, data};
|
|
}
|
|
DocumentLink2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Range17.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));
|
|
}
|
|
DocumentLink2.is = is2;
|
|
})(DocumentLink || (DocumentLink = {}));
|
|
var SelectionRange;
|
|
(function(SelectionRange2) {
|
|
function create(range, parent) {
|
|
return {range, parent};
|
|
}
|
|
SelectionRange2.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return candidate !== void 0 && Range17.is(candidate.range) && (candidate.parent === void 0 || SelectionRange2.is(candidate.parent));
|
|
}
|
|
SelectionRange2.is = is2;
|
|
})(SelectionRange || (SelectionRange = {}));
|
|
var EOL = ["\n", "\r\n", "\r"];
|
|
var TextDocument13;
|
|
(function(TextDocument14) {
|
|
function create(uri, languageId, version, content) {
|
|
return new FullTextDocument(uri, languageId, version, content);
|
|
}
|
|
TextDocument14.create = create;
|
|
function is2(value) {
|
|
var candidate = value;
|
|
return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount) && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;
|
|
}
|
|
TextDocument14.is = is2;
|
|
function applyEdits(document, edits) {
|
|
var text = document.getText();
|
|
var sortedEdits = mergeSort(edits, function(a, b) {
|
|
var diff = a.range.start.line - b.range.start.line;
|
|
if (diff === 0) {
|
|
return a.range.start.character - b.range.start.character;
|
|
}
|
|
return diff;
|
|
});
|
|
var lastModifiedOffset = text.length;
|
|
for (var i = sortedEdits.length - 1; i >= 0; i--) {
|
|
var e = sortedEdits[i];
|
|
var startOffset = document.offsetAt(e.range.start);
|
|
var endOffset = document.offsetAt(e.range.end);
|
|
if (endOffset <= lastModifiedOffset) {
|
|
text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);
|
|
} else {
|
|
throw new Error("Overlapping edit");
|
|
}
|
|
lastModifiedOffset = startOffset;
|
|
}
|
|
return text;
|
|
}
|
|
TextDocument14.applyEdits = applyEdits;
|
|
function mergeSort(data, compare) {
|
|
if (data.length <= 1) {
|
|
return data;
|
|
}
|
|
var p = data.length / 2 | 0;
|
|
var left = data.slice(0, p);
|
|
var right = data.slice(p);
|
|
mergeSort(left, compare);
|
|
mergeSort(right, compare);
|
|
var leftIdx = 0;
|
|
var rightIdx = 0;
|
|
var i = 0;
|
|
while (leftIdx < left.length && rightIdx < right.length) {
|
|
var ret = compare(left[leftIdx], right[rightIdx]);
|
|
if (ret <= 0) {
|
|
data[i++] = left[leftIdx++];
|
|
} else {
|
|
data[i++] = right[rightIdx++];
|
|
}
|
|
}
|
|
while (leftIdx < left.length) {
|
|
data[i++] = left[leftIdx++];
|
|
}
|
|
while (rightIdx < right.length) {
|
|
data[i++] = right[rightIdx++];
|
|
}
|
|
return data;
|
|
}
|
|
})(TextDocument13 || (TextDocument13 = {}));
|
|
var FullTextDocument = function() {
|
|
function FullTextDocument2(uri, languageId, version, content) {
|
|
this._uri = uri;
|
|
this._languageId = languageId;
|
|
this._version = version;
|
|
this._content = content;
|
|
this._lineOffsets = void 0;
|
|
}
|
|
Object.defineProperty(FullTextDocument2.prototype, "uri", {
|
|
get: function() {
|
|
return this._uri;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(FullTextDocument2.prototype, "languageId", {
|
|
get: function() {
|
|
return this._languageId;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
Object.defineProperty(FullTextDocument2.prototype, "version", {
|
|
get: function() {
|
|
return this._version;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
FullTextDocument2.prototype.getText = function(range) {
|
|
if (range) {
|
|
var start = this.offsetAt(range.start);
|
|
var end = this.offsetAt(range.end);
|
|
return this._content.substring(start, end);
|
|
}
|
|
return this._content;
|
|
};
|
|
FullTextDocument2.prototype.update = function(event, version) {
|
|
this._content = event.text;
|
|
this._version = version;
|
|
this._lineOffsets = void 0;
|
|
};
|
|
FullTextDocument2.prototype.getLineOffsets = function() {
|
|
if (this._lineOffsets === void 0) {
|
|
var lineOffsets = [];
|
|
var text = this._content;
|
|
var isLineStart = true;
|
|
for (var i = 0; i < text.length; i++) {
|
|
if (isLineStart) {
|
|
lineOffsets.push(i);
|
|
isLineStart = false;
|
|
}
|
|
var ch = text.charAt(i);
|
|
isLineStart = ch === "\r" || ch === "\n";
|
|
if (ch === "\r" && i + 1 < text.length && text.charAt(i + 1) === "\n") {
|
|
i++;
|
|
}
|
|
}
|
|
if (isLineStart && text.length > 0) {
|
|
lineOffsets.push(text.length);
|
|
}
|
|
this._lineOffsets = lineOffsets;
|
|
}
|
|
return this._lineOffsets;
|
|
};
|
|
FullTextDocument2.prototype.positionAt = function(offset) {
|
|
offset = Math.max(Math.min(offset, this._content.length), 0);
|
|
var lineOffsets = this.getLineOffsets();
|
|
var low = 0, high = lineOffsets.length;
|
|
if (high === 0) {
|
|
return Position10.create(0, offset);
|
|
}
|
|
while (low < high) {
|
|
var mid = Math.floor((low + high) / 2);
|
|
if (lineOffsets[mid] > offset) {
|
|
high = mid;
|
|
} else {
|
|
low = mid + 1;
|
|
}
|
|
}
|
|
var line = low - 1;
|
|
return Position10.create(line, offset - lineOffsets[line]);
|
|
};
|
|
FullTextDocument2.prototype.offsetAt = function(position) {
|
|
var lineOffsets = this.getLineOffsets();
|
|
if (position.line >= lineOffsets.length) {
|
|
return this._content.length;
|
|
} else if (position.line < 0) {
|
|
return 0;
|
|
}
|
|
var lineOffset = lineOffsets[position.line];
|
|
var nextLineOffset = position.line + 1 < lineOffsets.length ? lineOffsets[position.line + 1] : this._content.length;
|
|
return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
|
|
};
|
|
Object.defineProperty(FullTextDocument2.prototype, "lineCount", {
|
|
get: function() {
|
|
return this.getLineOffsets().length;
|
|
},
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
return FullTextDocument2;
|
|
}();
|
|
var Is;
|
|
(function(Is2) {
|
|
var toString2 = Object.prototype.toString;
|
|
function defined(value) {
|
|
return typeof value !== "undefined";
|
|
}
|
|
Is2.defined = defined;
|
|
function undefined2(value) {
|
|
return typeof value === "undefined";
|
|
}
|
|
Is2.undefined = undefined2;
|
|
function boolean2(value) {
|
|
return value === true || value === false;
|
|
}
|
|
Is2.boolean = boolean2;
|
|
function string2(value) {
|
|
return toString2.call(value) === "[object String]";
|
|
}
|
|
Is2.string = string2;
|
|
function number(value) {
|
|
return toString2.call(value) === "[object Number]";
|
|
}
|
|
Is2.number = number;
|
|
function numberRange(value, min, max) {
|
|
return toString2.call(value) === "[object Number]" && min <= value && value <= max;
|
|
}
|
|
Is2.numberRange = numberRange;
|
|
function integer2(value) {
|
|
return toString2.call(value) === "[object Number]" && -2147483648 <= value && value <= 2147483647;
|
|
}
|
|
Is2.integer = integer2;
|
|
function uinteger2(value) {
|
|
return toString2.call(value) === "[object Number]" && 0 <= value && value <= 2147483647;
|
|
}
|
|
Is2.uinteger = uinteger2;
|
|
function func(value) {
|
|
return toString2.call(value) === "[object Function]";
|
|
}
|
|
Is2.func = func;
|
|
function objectLiteral(value) {
|
|
return value !== null && typeof value === "object";
|
|
}
|
|
Is2.objectLiteral = objectLiteral;
|
|
function typedArray(value, check) {
|
|
return Array.isArray(value) && value.every(check);
|
|
}
|
|
Is2.typedArray = typedArray;
|
|
})(Is || (Is = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/messages.js
|
|
var require_messages2 = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ProtocolNotificationType = exports2.ProtocolNotificationType0 = exports2.ProtocolRequestType = exports2.ProtocolRequestType0 = exports2.RegistrationType = void 0;
|
|
var vscode_jsonrpc_1 = require_main();
|
|
var RegistrationType = class {
|
|
constructor(method) {
|
|
this.method = method;
|
|
}
|
|
};
|
|
exports2.RegistrationType = RegistrationType;
|
|
var ProtocolRequestType0 = class extends vscode_jsonrpc_1.RequestType0 {
|
|
constructor(method) {
|
|
super(method);
|
|
}
|
|
};
|
|
exports2.ProtocolRequestType0 = ProtocolRequestType0;
|
|
var ProtocolRequestType = class extends vscode_jsonrpc_1.RequestType {
|
|
constructor(method) {
|
|
super(method, vscode_jsonrpc_1.ParameterStructures.byName);
|
|
}
|
|
};
|
|
exports2.ProtocolRequestType = ProtocolRequestType;
|
|
var ProtocolNotificationType0 = class extends vscode_jsonrpc_1.NotificationType0 {
|
|
constructor(method) {
|
|
super(method);
|
|
}
|
|
};
|
|
exports2.ProtocolNotificationType0 = ProtocolNotificationType0;
|
|
var ProtocolNotificationType = class extends vscode_jsonrpc_1.NotificationType {
|
|
constructor(method) {
|
|
super(method, vscode_jsonrpc_1.ParameterStructures.byName);
|
|
}
|
|
};
|
|
exports2.ProtocolNotificationType = ProtocolNotificationType;
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/utils/is.js
|
|
var require_is2 = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.objectLiteral = exports2.typedArray = exports2.stringArray = exports2.array = exports2.func = exports2.error = exports2.number = exports2.string = exports2.boolean = void 0;
|
|
function boolean2(value) {
|
|
return value === true || value === false;
|
|
}
|
|
exports2.boolean = boolean2;
|
|
function string2(value) {
|
|
return typeof value === "string" || value instanceof String;
|
|
}
|
|
exports2.string = string2;
|
|
function number(value) {
|
|
return typeof value === "number" || value instanceof Number;
|
|
}
|
|
exports2.number = number;
|
|
function error(value) {
|
|
return value instanceof Error;
|
|
}
|
|
exports2.error = error;
|
|
function func(value) {
|
|
return typeof value === "function";
|
|
}
|
|
exports2.func = func;
|
|
function array(value) {
|
|
return Array.isArray(value);
|
|
}
|
|
exports2.array = array;
|
|
function stringArray(value) {
|
|
return array(value) && value.every((elem) => string2(elem));
|
|
}
|
|
exports2.stringArray = stringArray;
|
|
function typedArray(value, check) {
|
|
return Array.isArray(value) && value.every(check);
|
|
}
|
|
exports2.typedArray = typedArray;
|
|
function objectLiteral(value) {
|
|
return value !== null && typeof value === "object";
|
|
}
|
|
exports2.objectLiteral = objectLiteral;
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.js
|
|
var require_protocol_implementation = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ImplementationRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var ImplementationRequest;
|
|
(function(ImplementationRequest2) {
|
|
ImplementationRequest2.method = "textDocument/implementation";
|
|
ImplementationRequest2.type = new messages_1.ProtocolRequestType(ImplementationRequest2.method);
|
|
})(ImplementationRequest = exports2.ImplementationRequest || (exports2.ImplementationRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.js
|
|
var require_protocol_typeDefinition = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.TypeDefinitionRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var TypeDefinitionRequest;
|
|
(function(TypeDefinitionRequest2) {
|
|
TypeDefinitionRequest2.method = "textDocument/typeDefinition";
|
|
TypeDefinitionRequest2.type = new messages_1.ProtocolRequestType(TypeDefinitionRequest2.method);
|
|
})(TypeDefinitionRequest = exports2.TypeDefinitionRequest || (exports2.TypeDefinitionRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolders.js
|
|
var require_protocol_workspaceFolders = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.DidChangeWorkspaceFoldersNotification = exports2.WorkspaceFoldersRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var WorkspaceFoldersRequest;
|
|
(function(WorkspaceFoldersRequest2) {
|
|
WorkspaceFoldersRequest2.type = new messages_1.ProtocolRequestType0("workspace/workspaceFolders");
|
|
})(WorkspaceFoldersRequest = exports2.WorkspaceFoldersRequest || (exports2.WorkspaceFoldersRequest = {}));
|
|
var DidChangeWorkspaceFoldersNotification;
|
|
(function(DidChangeWorkspaceFoldersNotification2) {
|
|
DidChangeWorkspaceFoldersNotification2.type = new messages_1.ProtocolNotificationType("workspace/didChangeWorkspaceFolders");
|
|
})(DidChangeWorkspaceFoldersNotification = exports2.DidChangeWorkspaceFoldersNotification || (exports2.DidChangeWorkspaceFoldersNotification = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.js
|
|
var require_protocol_configuration = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ConfigurationRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var ConfigurationRequest;
|
|
(function(ConfigurationRequest2) {
|
|
ConfigurationRequest2.type = new messages_1.ProtocolRequestType("workspace/configuration");
|
|
})(ConfigurationRequest = exports2.ConfigurationRequest || (exports2.ConfigurationRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.js
|
|
var require_protocol_colorProvider = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ColorPresentationRequest = exports2.DocumentColorRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var DocumentColorRequest;
|
|
(function(DocumentColorRequest2) {
|
|
DocumentColorRequest2.method = "textDocument/documentColor";
|
|
DocumentColorRequest2.type = new messages_1.ProtocolRequestType(DocumentColorRequest2.method);
|
|
})(DocumentColorRequest = exports2.DocumentColorRequest || (exports2.DocumentColorRequest = {}));
|
|
var ColorPresentationRequest;
|
|
(function(ColorPresentationRequest2) {
|
|
ColorPresentationRequest2.type = new messages_1.ProtocolRequestType("textDocument/colorPresentation");
|
|
})(ColorPresentationRequest = exports2.ColorPresentationRequest || (exports2.ColorPresentationRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.js
|
|
var require_protocol_foldingRange = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.FoldingRangeRequest = exports2.FoldingRangeKind = void 0;
|
|
var messages_1 = require_messages2();
|
|
var FoldingRangeKind;
|
|
(function(FoldingRangeKind2) {
|
|
FoldingRangeKind2["Comment"] = "comment";
|
|
FoldingRangeKind2["Imports"] = "imports";
|
|
FoldingRangeKind2["Region"] = "region";
|
|
})(FoldingRangeKind = exports2.FoldingRangeKind || (exports2.FoldingRangeKind = {}));
|
|
var FoldingRangeRequest;
|
|
(function(FoldingRangeRequest2) {
|
|
FoldingRangeRequest2.method = "textDocument/foldingRange";
|
|
FoldingRangeRequest2.type = new messages_1.ProtocolRequestType(FoldingRangeRequest2.method);
|
|
})(FoldingRangeRequest = exports2.FoldingRangeRequest || (exports2.FoldingRangeRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.js
|
|
var require_protocol_declaration = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.DeclarationRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var DeclarationRequest;
|
|
(function(DeclarationRequest2) {
|
|
DeclarationRequest2.method = "textDocument/declaration";
|
|
DeclarationRequest2.type = new messages_1.ProtocolRequestType(DeclarationRequest2.method);
|
|
})(DeclarationRequest = exports2.DeclarationRequest || (exports2.DeclarationRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.js
|
|
var require_protocol_selectionRange = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.SelectionRangeRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var SelectionRangeRequest;
|
|
(function(SelectionRangeRequest2) {
|
|
SelectionRangeRequest2.method = "textDocument/selectionRange";
|
|
SelectionRangeRequest2.type = new messages_1.ProtocolRequestType(SelectionRangeRequest2.method);
|
|
})(SelectionRangeRequest = exports2.SelectionRangeRequest || (exports2.SelectionRangeRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.js
|
|
var require_protocol_progress = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.WorkDoneProgressCancelNotification = exports2.WorkDoneProgressCreateRequest = exports2.WorkDoneProgress = void 0;
|
|
var vscode_jsonrpc_1 = require_main();
|
|
var messages_1 = require_messages2();
|
|
var WorkDoneProgress;
|
|
(function(WorkDoneProgress2) {
|
|
WorkDoneProgress2.type = new vscode_jsonrpc_1.ProgressType();
|
|
function is2(value) {
|
|
return value === WorkDoneProgress2.type;
|
|
}
|
|
WorkDoneProgress2.is = is2;
|
|
})(WorkDoneProgress = exports2.WorkDoneProgress || (exports2.WorkDoneProgress = {}));
|
|
var WorkDoneProgressCreateRequest;
|
|
(function(WorkDoneProgressCreateRequest2) {
|
|
WorkDoneProgressCreateRequest2.type = new messages_1.ProtocolRequestType("window/workDoneProgress/create");
|
|
})(WorkDoneProgressCreateRequest = exports2.WorkDoneProgressCreateRequest || (exports2.WorkDoneProgressCreateRequest = {}));
|
|
var WorkDoneProgressCancelNotification;
|
|
(function(WorkDoneProgressCancelNotification2) {
|
|
WorkDoneProgressCancelNotification2.type = new messages_1.ProtocolNotificationType("window/workDoneProgress/cancel");
|
|
})(WorkDoneProgressCancelNotification = exports2.WorkDoneProgressCancelNotification || (exports2.WorkDoneProgressCancelNotification = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.js
|
|
var require_protocol_callHierarchy = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.CallHierarchyOutgoingCallsRequest = exports2.CallHierarchyIncomingCallsRequest = exports2.CallHierarchyPrepareRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var CallHierarchyPrepareRequest;
|
|
(function(CallHierarchyPrepareRequest2) {
|
|
CallHierarchyPrepareRequest2.method = "textDocument/prepareCallHierarchy";
|
|
CallHierarchyPrepareRequest2.type = new messages_1.ProtocolRequestType(CallHierarchyPrepareRequest2.method);
|
|
})(CallHierarchyPrepareRequest = exports2.CallHierarchyPrepareRequest || (exports2.CallHierarchyPrepareRequest = {}));
|
|
var CallHierarchyIncomingCallsRequest;
|
|
(function(CallHierarchyIncomingCallsRequest2) {
|
|
CallHierarchyIncomingCallsRequest2.method = "callHierarchy/incomingCalls";
|
|
CallHierarchyIncomingCallsRequest2.type = new messages_1.ProtocolRequestType(CallHierarchyIncomingCallsRequest2.method);
|
|
})(CallHierarchyIncomingCallsRequest = exports2.CallHierarchyIncomingCallsRequest || (exports2.CallHierarchyIncomingCallsRequest = {}));
|
|
var CallHierarchyOutgoingCallsRequest;
|
|
(function(CallHierarchyOutgoingCallsRequest2) {
|
|
CallHierarchyOutgoingCallsRequest2.method = "callHierarchy/outgoingCalls";
|
|
CallHierarchyOutgoingCallsRequest2.type = new messages_1.ProtocolRequestType(CallHierarchyOutgoingCallsRequest2.method);
|
|
})(CallHierarchyOutgoingCallsRequest = exports2.CallHierarchyOutgoingCallsRequest || (exports2.CallHierarchyOutgoingCallsRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.js
|
|
var require_protocol_semanticTokens = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.SemanticTokensRefreshRequest = exports2.SemanticTokensRangeRequest = exports2.SemanticTokensDeltaRequest = exports2.SemanticTokensRequest = exports2.SemanticTokensRegistrationType = exports2.TokenFormat = exports2.SemanticTokens = exports2.SemanticTokenModifiers = exports2.SemanticTokenTypes = void 0;
|
|
var messages_1 = require_messages2();
|
|
var SemanticTokenTypes;
|
|
(function(SemanticTokenTypes2) {
|
|
SemanticTokenTypes2["namespace"] = "namespace";
|
|
SemanticTokenTypes2["type"] = "type";
|
|
SemanticTokenTypes2["class"] = "class";
|
|
SemanticTokenTypes2["enum"] = "enum";
|
|
SemanticTokenTypes2["interface"] = "interface";
|
|
SemanticTokenTypes2["struct"] = "struct";
|
|
SemanticTokenTypes2["typeParameter"] = "typeParameter";
|
|
SemanticTokenTypes2["parameter"] = "parameter";
|
|
SemanticTokenTypes2["variable"] = "variable";
|
|
SemanticTokenTypes2["property"] = "property";
|
|
SemanticTokenTypes2["enumMember"] = "enumMember";
|
|
SemanticTokenTypes2["event"] = "event";
|
|
SemanticTokenTypes2["function"] = "function";
|
|
SemanticTokenTypes2["method"] = "method";
|
|
SemanticTokenTypes2["macro"] = "macro";
|
|
SemanticTokenTypes2["keyword"] = "keyword";
|
|
SemanticTokenTypes2["modifier"] = "modifier";
|
|
SemanticTokenTypes2["comment"] = "comment";
|
|
SemanticTokenTypes2["string"] = "string";
|
|
SemanticTokenTypes2["number"] = "number";
|
|
SemanticTokenTypes2["regexp"] = "regexp";
|
|
SemanticTokenTypes2["operator"] = "operator";
|
|
})(SemanticTokenTypes = exports2.SemanticTokenTypes || (exports2.SemanticTokenTypes = {}));
|
|
var SemanticTokenModifiers;
|
|
(function(SemanticTokenModifiers2) {
|
|
SemanticTokenModifiers2["declaration"] = "declaration";
|
|
SemanticTokenModifiers2["definition"] = "definition";
|
|
SemanticTokenModifiers2["readonly"] = "readonly";
|
|
SemanticTokenModifiers2["static"] = "static";
|
|
SemanticTokenModifiers2["deprecated"] = "deprecated";
|
|
SemanticTokenModifiers2["abstract"] = "abstract";
|
|
SemanticTokenModifiers2["async"] = "async";
|
|
SemanticTokenModifiers2["modification"] = "modification";
|
|
SemanticTokenModifiers2["documentation"] = "documentation";
|
|
SemanticTokenModifiers2["defaultLibrary"] = "defaultLibrary";
|
|
})(SemanticTokenModifiers = exports2.SemanticTokenModifiers || (exports2.SemanticTokenModifiers = {}));
|
|
var SemanticTokens;
|
|
(function(SemanticTokens2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate !== void 0 && (candidate.resultId === void 0 || typeof candidate.resultId === "string") && Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === "number");
|
|
}
|
|
SemanticTokens2.is = is2;
|
|
})(SemanticTokens = exports2.SemanticTokens || (exports2.SemanticTokens = {}));
|
|
var TokenFormat;
|
|
(function(TokenFormat2) {
|
|
TokenFormat2.Relative = "relative";
|
|
})(TokenFormat = exports2.TokenFormat || (exports2.TokenFormat = {}));
|
|
var SemanticTokensRegistrationType;
|
|
(function(SemanticTokensRegistrationType2) {
|
|
SemanticTokensRegistrationType2.method = "textDocument/semanticTokens";
|
|
SemanticTokensRegistrationType2.type = new messages_1.RegistrationType(SemanticTokensRegistrationType2.method);
|
|
})(SemanticTokensRegistrationType = exports2.SemanticTokensRegistrationType || (exports2.SemanticTokensRegistrationType = {}));
|
|
var SemanticTokensRequest;
|
|
(function(SemanticTokensRequest2) {
|
|
SemanticTokensRequest2.method = "textDocument/semanticTokens/full";
|
|
SemanticTokensRequest2.type = new messages_1.ProtocolRequestType(SemanticTokensRequest2.method);
|
|
})(SemanticTokensRequest = exports2.SemanticTokensRequest || (exports2.SemanticTokensRequest = {}));
|
|
var SemanticTokensDeltaRequest;
|
|
(function(SemanticTokensDeltaRequest2) {
|
|
SemanticTokensDeltaRequest2.method = "textDocument/semanticTokens/full/delta";
|
|
SemanticTokensDeltaRequest2.type = new messages_1.ProtocolRequestType(SemanticTokensDeltaRequest2.method);
|
|
})(SemanticTokensDeltaRequest = exports2.SemanticTokensDeltaRequest || (exports2.SemanticTokensDeltaRequest = {}));
|
|
var SemanticTokensRangeRequest;
|
|
(function(SemanticTokensRangeRequest2) {
|
|
SemanticTokensRangeRequest2.method = "textDocument/semanticTokens/range";
|
|
SemanticTokensRangeRequest2.type = new messages_1.ProtocolRequestType(SemanticTokensRangeRequest2.method);
|
|
})(SemanticTokensRangeRequest = exports2.SemanticTokensRangeRequest || (exports2.SemanticTokensRangeRequest = {}));
|
|
var SemanticTokensRefreshRequest;
|
|
(function(SemanticTokensRefreshRequest2) {
|
|
SemanticTokensRefreshRequest2.method = `workspace/semanticTokens/refresh`;
|
|
SemanticTokensRefreshRequest2.type = new messages_1.ProtocolRequestType0(SemanticTokensRefreshRequest2.method);
|
|
})(SemanticTokensRefreshRequest = exports2.SemanticTokensRefreshRequest || (exports2.SemanticTokensRefreshRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.js
|
|
var require_protocol_showDocument = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.ShowDocumentRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var ShowDocumentRequest;
|
|
(function(ShowDocumentRequest2) {
|
|
ShowDocumentRequest2.method = "window/showDocument";
|
|
ShowDocumentRequest2.type = new messages_1.ProtocolRequestType(ShowDocumentRequest2.method);
|
|
})(ShowDocumentRequest = exports2.ShowDocumentRequest || (exports2.ShowDocumentRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.js
|
|
var require_protocol_linkedEditingRange = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.LinkedEditingRangeRequest = void 0;
|
|
var messages_1 = require_messages2();
|
|
var LinkedEditingRangeRequest;
|
|
(function(LinkedEditingRangeRequest2) {
|
|
LinkedEditingRangeRequest2.method = "textDocument/linkedEditingRange";
|
|
LinkedEditingRangeRequest2.type = new messages_1.ProtocolRequestType(LinkedEditingRangeRequest2.method);
|
|
})(LinkedEditingRangeRequest = exports2.LinkedEditingRangeRequest || (exports2.LinkedEditingRangeRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.js
|
|
var require_protocol_fileOperations = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.WillDeleteFilesRequest = exports2.DidDeleteFilesNotification = exports2.DidRenameFilesNotification = exports2.WillRenameFilesRequest = exports2.DidCreateFilesNotification = exports2.WillCreateFilesRequest = exports2.FileOperationPatternKind = void 0;
|
|
var messages_1 = require_messages2();
|
|
var FileOperationPatternKind;
|
|
(function(FileOperationPatternKind2) {
|
|
FileOperationPatternKind2.file = "file";
|
|
FileOperationPatternKind2.folder = "folder";
|
|
})(FileOperationPatternKind = exports2.FileOperationPatternKind || (exports2.FileOperationPatternKind = {}));
|
|
var WillCreateFilesRequest;
|
|
(function(WillCreateFilesRequest2) {
|
|
WillCreateFilesRequest2.method = "workspace/willCreateFiles";
|
|
WillCreateFilesRequest2.type = new messages_1.ProtocolRequestType(WillCreateFilesRequest2.method);
|
|
})(WillCreateFilesRequest = exports2.WillCreateFilesRequest || (exports2.WillCreateFilesRequest = {}));
|
|
var DidCreateFilesNotification;
|
|
(function(DidCreateFilesNotification2) {
|
|
DidCreateFilesNotification2.method = "workspace/didCreateFiles";
|
|
DidCreateFilesNotification2.type = new messages_1.ProtocolNotificationType(DidCreateFilesNotification2.method);
|
|
})(DidCreateFilesNotification = exports2.DidCreateFilesNotification || (exports2.DidCreateFilesNotification = {}));
|
|
var WillRenameFilesRequest;
|
|
(function(WillRenameFilesRequest2) {
|
|
WillRenameFilesRequest2.method = "workspace/willRenameFiles";
|
|
WillRenameFilesRequest2.type = new messages_1.ProtocolRequestType(WillRenameFilesRequest2.method);
|
|
})(WillRenameFilesRequest = exports2.WillRenameFilesRequest || (exports2.WillRenameFilesRequest = {}));
|
|
var DidRenameFilesNotification;
|
|
(function(DidRenameFilesNotification2) {
|
|
DidRenameFilesNotification2.method = "workspace/didRenameFiles";
|
|
DidRenameFilesNotification2.type = new messages_1.ProtocolNotificationType(DidRenameFilesNotification2.method);
|
|
})(DidRenameFilesNotification = exports2.DidRenameFilesNotification || (exports2.DidRenameFilesNotification = {}));
|
|
var DidDeleteFilesNotification;
|
|
(function(DidDeleteFilesNotification2) {
|
|
DidDeleteFilesNotification2.method = "workspace/didDeleteFiles";
|
|
DidDeleteFilesNotification2.type = new messages_1.ProtocolNotificationType(DidDeleteFilesNotification2.method);
|
|
})(DidDeleteFilesNotification = exports2.DidDeleteFilesNotification || (exports2.DidDeleteFilesNotification = {}));
|
|
var WillDeleteFilesRequest;
|
|
(function(WillDeleteFilesRequest2) {
|
|
WillDeleteFilesRequest2.method = "workspace/willDeleteFiles";
|
|
WillDeleteFilesRequest2.type = new messages_1.ProtocolRequestType(WillDeleteFilesRequest2.method);
|
|
})(WillDeleteFilesRequest = exports2.WillDeleteFilesRequest || (exports2.WillDeleteFilesRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.js
|
|
var require_protocol_moniker = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.MonikerRequest = exports2.MonikerKind = exports2.UniquenessLevel = void 0;
|
|
var messages_1 = require_messages2();
|
|
var UniquenessLevel;
|
|
(function(UniquenessLevel2) {
|
|
UniquenessLevel2["document"] = "document";
|
|
UniquenessLevel2["project"] = "project";
|
|
UniquenessLevel2["group"] = "group";
|
|
UniquenessLevel2["scheme"] = "scheme";
|
|
UniquenessLevel2["global"] = "global";
|
|
})(UniquenessLevel = exports2.UniquenessLevel || (exports2.UniquenessLevel = {}));
|
|
var MonikerKind;
|
|
(function(MonikerKind2) {
|
|
MonikerKind2["import"] = "import";
|
|
MonikerKind2["export"] = "export";
|
|
MonikerKind2["local"] = "local";
|
|
})(MonikerKind = exports2.MonikerKind || (exports2.MonikerKind = {}));
|
|
var MonikerRequest;
|
|
(function(MonikerRequest2) {
|
|
MonikerRequest2.method = "textDocument/moniker";
|
|
MonikerRequest2.type = new messages_1.ProtocolRequestType(MonikerRequest2.method);
|
|
})(MonikerRequest = exports2.MonikerRequest || (exports2.MonikerRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/protocol.js
|
|
var require_protocol = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.DocumentLinkRequest = exports2.CodeLensRefreshRequest = exports2.CodeLensResolveRequest = exports2.CodeLensRequest = exports2.WorkspaceSymbolRequest = exports2.CodeActionResolveRequest = exports2.CodeActionRequest = exports2.DocumentSymbolRequest = exports2.DocumentHighlightRequest = exports2.ReferencesRequest = exports2.DefinitionRequest = exports2.SignatureHelpRequest = exports2.SignatureHelpTriggerKind = exports2.HoverRequest = exports2.CompletionResolveRequest = exports2.CompletionRequest = exports2.CompletionTriggerKind = exports2.PublishDiagnosticsNotification = exports2.WatchKind = exports2.FileChangeType = exports2.DidChangeWatchedFilesNotification = exports2.WillSaveTextDocumentWaitUntilRequest = exports2.WillSaveTextDocumentNotification = exports2.TextDocumentSaveReason = exports2.DidSaveTextDocumentNotification = exports2.DidCloseTextDocumentNotification = exports2.DidChangeTextDocumentNotification = exports2.TextDocumentContentChangeEvent = exports2.DidOpenTextDocumentNotification = exports2.TextDocumentSyncKind = exports2.TelemetryEventNotification = exports2.LogMessageNotification = exports2.ShowMessageRequest = exports2.ShowMessageNotification = exports2.MessageType = exports2.DidChangeConfigurationNotification = exports2.ExitNotification = exports2.ShutdownRequest = exports2.InitializedNotification = exports2.InitializeError = exports2.InitializeRequest = exports2.WorkDoneProgressOptions = exports2.TextDocumentRegistrationOptions = exports2.StaticRegistrationOptions = exports2.FailureHandlingKind = exports2.ResourceOperationKind = exports2.UnregistrationRequest = exports2.RegistrationRequest = exports2.DocumentSelector = exports2.DocumentFilter = void 0;
|
|
exports2.MonikerRequest = exports2.MonikerKind = exports2.UniquenessLevel = exports2.WillDeleteFilesRequest = exports2.DidDeleteFilesNotification = exports2.WillRenameFilesRequest = exports2.DidRenameFilesNotification = exports2.WillCreateFilesRequest = exports2.DidCreateFilesNotification = exports2.FileOperationPatternKind = exports2.LinkedEditingRangeRequest = exports2.ShowDocumentRequest = exports2.SemanticTokensRegistrationType = exports2.SemanticTokensRefreshRequest = exports2.SemanticTokensRangeRequest = exports2.SemanticTokensDeltaRequest = exports2.SemanticTokensRequest = exports2.TokenFormat = exports2.SemanticTokens = exports2.SemanticTokenModifiers = exports2.SemanticTokenTypes = exports2.CallHierarchyPrepareRequest = exports2.CallHierarchyOutgoingCallsRequest = exports2.CallHierarchyIncomingCallsRequest = exports2.WorkDoneProgressCancelNotification = exports2.WorkDoneProgressCreateRequest = exports2.WorkDoneProgress = exports2.SelectionRangeRequest = exports2.DeclarationRequest = exports2.FoldingRangeRequest = exports2.ColorPresentationRequest = exports2.DocumentColorRequest = exports2.ConfigurationRequest = exports2.DidChangeWorkspaceFoldersNotification = exports2.WorkspaceFoldersRequest = exports2.TypeDefinitionRequest = exports2.ImplementationRequest = exports2.ApplyWorkspaceEditRequest = exports2.ExecuteCommandRequest = exports2.PrepareRenameRequest = exports2.RenameRequest = exports2.PrepareSupportDefaultBehavior = exports2.DocumentOnTypeFormattingRequest = exports2.DocumentRangeFormattingRequest = exports2.DocumentFormattingRequest = exports2.DocumentLinkResolveRequest = void 0;
|
|
var Is = require_is2();
|
|
var messages_1 = require_messages2();
|
|
var protocol_implementation_1 = require_protocol_implementation();
|
|
Object.defineProperty(exports2, "ImplementationRequest", {enumerable: true, get: function() {
|
|
return protocol_implementation_1.ImplementationRequest;
|
|
}});
|
|
var protocol_typeDefinition_1 = require_protocol_typeDefinition();
|
|
Object.defineProperty(exports2, "TypeDefinitionRequest", {enumerable: true, get: function() {
|
|
return protocol_typeDefinition_1.TypeDefinitionRequest;
|
|
}});
|
|
var protocol_workspaceFolders_1 = require_protocol_workspaceFolders();
|
|
Object.defineProperty(exports2, "WorkspaceFoldersRequest", {enumerable: true, get: function() {
|
|
return protocol_workspaceFolders_1.WorkspaceFoldersRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "DidChangeWorkspaceFoldersNotification", {enumerable: true, get: function() {
|
|
return protocol_workspaceFolders_1.DidChangeWorkspaceFoldersNotification;
|
|
}});
|
|
var protocol_configuration_1 = require_protocol_configuration();
|
|
Object.defineProperty(exports2, "ConfigurationRequest", {enumerable: true, get: function() {
|
|
return protocol_configuration_1.ConfigurationRequest;
|
|
}});
|
|
var protocol_colorProvider_1 = require_protocol_colorProvider();
|
|
Object.defineProperty(exports2, "DocumentColorRequest", {enumerable: true, get: function() {
|
|
return protocol_colorProvider_1.DocumentColorRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "ColorPresentationRequest", {enumerable: true, get: function() {
|
|
return protocol_colorProvider_1.ColorPresentationRequest;
|
|
}});
|
|
var protocol_foldingRange_1 = require_protocol_foldingRange();
|
|
Object.defineProperty(exports2, "FoldingRangeRequest", {enumerable: true, get: function() {
|
|
return protocol_foldingRange_1.FoldingRangeRequest;
|
|
}});
|
|
var protocol_declaration_1 = require_protocol_declaration();
|
|
Object.defineProperty(exports2, "DeclarationRequest", {enumerable: true, get: function() {
|
|
return protocol_declaration_1.DeclarationRequest;
|
|
}});
|
|
var protocol_selectionRange_1 = require_protocol_selectionRange();
|
|
Object.defineProperty(exports2, "SelectionRangeRequest", {enumerable: true, get: function() {
|
|
return protocol_selectionRange_1.SelectionRangeRequest;
|
|
}});
|
|
var protocol_progress_1 = require_protocol_progress();
|
|
Object.defineProperty(exports2, "WorkDoneProgress", {enumerable: true, get: function() {
|
|
return protocol_progress_1.WorkDoneProgress;
|
|
}});
|
|
Object.defineProperty(exports2, "WorkDoneProgressCreateRequest", {enumerable: true, get: function() {
|
|
return protocol_progress_1.WorkDoneProgressCreateRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "WorkDoneProgressCancelNotification", {enumerable: true, get: function() {
|
|
return protocol_progress_1.WorkDoneProgressCancelNotification;
|
|
}});
|
|
var protocol_callHierarchy_1 = require_protocol_callHierarchy();
|
|
Object.defineProperty(exports2, "CallHierarchyIncomingCallsRequest", {enumerable: true, get: function() {
|
|
return protocol_callHierarchy_1.CallHierarchyIncomingCallsRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "CallHierarchyOutgoingCallsRequest", {enumerable: true, get: function() {
|
|
return protocol_callHierarchy_1.CallHierarchyOutgoingCallsRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "CallHierarchyPrepareRequest", {enumerable: true, get: function() {
|
|
return protocol_callHierarchy_1.CallHierarchyPrepareRequest;
|
|
}});
|
|
var protocol_semanticTokens_1 = require_protocol_semanticTokens();
|
|
Object.defineProperty(exports2, "SemanticTokenTypes", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokenTypes;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokenModifiers", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokenModifiers;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokens", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokens;
|
|
}});
|
|
Object.defineProperty(exports2, "TokenFormat", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.TokenFormat;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokensRequest", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokensRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokensDeltaRequest", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokensDeltaRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokensRangeRequest", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokensRangeRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokensRefreshRequest", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokensRefreshRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "SemanticTokensRegistrationType", {enumerable: true, get: function() {
|
|
return protocol_semanticTokens_1.SemanticTokensRegistrationType;
|
|
}});
|
|
var protocol_showDocument_1 = require_protocol_showDocument();
|
|
Object.defineProperty(exports2, "ShowDocumentRequest", {enumerable: true, get: function() {
|
|
return protocol_showDocument_1.ShowDocumentRequest;
|
|
}});
|
|
var protocol_linkedEditingRange_1 = require_protocol_linkedEditingRange();
|
|
Object.defineProperty(exports2, "LinkedEditingRangeRequest", {enumerable: true, get: function() {
|
|
return protocol_linkedEditingRange_1.LinkedEditingRangeRequest;
|
|
}});
|
|
var protocol_fileOperations_1 = require_protocol_fileOperations();
|
|
Object.defineProperty(exports2, "FileOperationPatternKind", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.FileOperationPatternKind;
|
|
}});
|
|
Object.defineProperty(exports2, "DidCreateFilesNotification", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.DidCreateFilesNotification;
|
|
}});
|
|
Object.defineProperty(exports2, "WillCreateFilesRequest", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.WillCreateFilesRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "DidRenameFilesNotification", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.DidRenameFilesNotification;
|
|
}});
|
|
Object.defineProperty(exports2, "WillRenameFilesRequest", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.WillRenameFilesRequest;
|
|
}});
|
|
Object.defineProperty(exports2, "DidDeleteFilesNotification", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.DidDeleteFilesNotification;
|
|
}});
|
|
Object.defineProperty(exports2, "WillDeleteFilesRequest", {enumerable: true, get: function() {
|
|
return protocol_fileOperations_1.WillDeleteFilesRequest;
|
|
}});
|
|
var protocol_moniker_1 = require_protocol_moniker();
|
|
Object.defineProperty(exports2, "UniquenessLevel", {enumerable: true, get: function() {
|
|
return protocol_moniker_1.UniquenessLevel;
|
|
}});
|
|
Object.defineProperty(exports2, "MonikerKind", {enumerable: true, get: function() {
|
|
return protocol_moniker_1.MonikerKind;
|
|
}});
|
|
Object.defineProperty(exports2, "MonikerRequest", {enumerable: true, get: function() {
|
|
return protocol_moniker_1.MonikerRequest;
|
|
}});
|
|
var DocumentFilter;
|
|
(function(DocumentFilter2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return Is.string(candidate.language) || Is.string(candidate.scheme) || Is.string(candidate.pattern);
|
|
}
|
|
DocumentFilter2.is = is2;
|
|
})(DocumentFilter = exports2.DocumentFilter || (exports2.DocumentFilter = {}));
|
|
var DocumentSelector2;
|
|
(function(DocumentSelector3) {
|
|
function is2(value) {
|
|
if (!Array.isArray(value)) {
|
|
return false;
|
|
}
|
|
for (let elem of value) {
|
|
if (!Is.string(elem) && !DocumentFilter.is(elem)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
DocumentSelector3.is = is2;
|
|
})(DocumentSelector2 = exports2.DocumentSelector || (exports2.DocumentSelector = {}));
|
|
var RegistrationRequest;
|
|
(function(RegistrationRequest2) {
|
|
RegistrationRequest2.type = new messages_1.ProtocolRequestType("client/registerCapability");
|
|
})(RegistrationRequest = exports2.RegistrationRequest || (exports2.RegistrationRequest = {}));
|
|
var UnregistrationRequest;
|
|
(function(UnregistrationRequest2) {
|
|
UnregistrationRequest2.type = new messages_1.ProtocolRequestType("client/unregisterCapability");
|
|
})(UnregistrationRequest = exports2.UnregistrationRequest || (exports2.UnregistrationRequest = {}));
|
|
var ResourceOperationKind;
|
|
(function(ResourceOperationKind2) {
|
|
ResourceOperationKind2.Create = "create";
|
|
ResourceOperationKind2.Rename = "rename";
|
|
ResourceOperationKind2.Delete = "delete";
|
|
})(ResourceOperationKind = exports2.ResourceOperationKind || (exports2.ResourceOperationKind = {}));
|
|
var FailureHandlingKind;
|
|
(function(FailureHandlingKind2) {
|
|
FailureHandlingKind2.Abort = "abort";
|
|
FailureHandlingKind2.Transactional = "transactional";
|
|
FailureHandlingKind2.TextOnlyTransactional = "textOnlyTransactional";
|
|
FailureHandlingKind2.Undo = "undo";
|
|
})(FailureHandlingKind = exports2.FailureHandlingKind || (exports2.FailureHandlingKind = {}));
|
|
var StaticRegistrationOptions;
|
|
(function(StaticRegistrationOptions2) {
|
|
function hasId(value) {
|
|
const candidate = value;
|
|
return candidate && Is.string(candidate.id) && candidate.id.length > 0;
|
|
}
|
|
StaticRegistrationOptions2.hasId = hasId;
|
|
})(StaticRegistrationOptions = exports2.StaticRegistrationOptions || (exports2.StaticRegistrationOptions = {}));
|
|
var TextDocumentRegistrationOptions;
|
|
(function(TextDocumentRegistrationOptions2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return candidate && (candidate.documentSelector === null || DocumentSelector2.is(candidate.documentSelector));
|
|
}
|
|
TextDocumentRegistrationOptions2.is = is2;
|
|
})(TextDocumentRegistrationOptions = exports2.TextDocumentRegistrationOptions || (exports2.TextDocumentRegistrationOptions = {}));
|
|
var WorkDoneProgressOptions;
|
|
(function(WorkDoneProgressOptions2) {
|
|
function is2(value) {
|
|
const candidate = value;
|
|
return Is.objectLiteral(candidate) && (candidate.workDoneProgress === void 0 || Is.boolean(candidate.workDoneProgress));
|
|
}
|
|
WorkDoneProgressOptions2.is = is2;
|
|
function hasWorkDoneProgress(value) {
|
|
const candidate = value;
|
|
return candidate && Is.boolean(candidate.workDoneProgress);
|
|
}
|
|
WorkDoneProgressOptions2.hasWorkDoneProgress = hasWorkDoneProgress;
|
|
})(WorkDoneProgressOptions = exports2.WorkDoneProgressOptions || (exports2.WorkDoneProgressOptions = {}));
|
|
var InitializeRequest;
|
|
(function(InitializeRequest2) {
|
|
InitializeRequest2.type = new messages_1.ProtocolRequestType("initialize");
|
|
})(InitializeRequest = exports2.InitializeRequest || (exports2.InitializeRequest = {}));
|
|
var InitializeError;
|
|
(function(InitializeError2) {
|
|
InitializeError2.unknownProtocolVersion = 1;
|
|
})(InitializeError = exports2.InitializeError || (exports2.InitializeError = {}));
|
|
var InitializedNotification;
|
|
(function(InitializedNotification2) {
|
|
InitializedNotification2.type = new messages_1.ProtocolNotificationType("initialized");
|
|
})(InitializedNotification = exports2.InitializedNotification || (exports2.InitializedNotification = {}));
|
|
var ShutdownRequest;
|
|
(function(ShutdownRequest2) {
|
|
ShutdownRequest2.type = new messages_1.ProtocolRequestType0("shutdown");
|
|
})(ShutdownRequest = exports2.ShutdownRequest || (exports2.ShutdownRequest = {}));
|
|
var ExitNotification;
|
|
(function(ExitNotification2) {
|
|
ExitNotification2.type = new messages_1.ProtocolNotificationType0("exit");
|
|
})(ExitNotification = exports2.ExitNotification || (exports2.ExitNotification = {}));
|
|
var DidChangeConfigurationNotification;
|
|
(function(DidChangeConfigurationNotification2) {
|
|
DidChangeConfigurationNotification2.type = new messages_1.ProtocolNotificationType("workspace/didChangeConfiguration");
|
|
})(DidChangeConfigurationNotification = exports2.DidChangeConfigurationNotification || (exports2.DidChangeConfigurationNotification = {}));
|
|
var MessageType;
|
|
(function(MessageType2) {
|
|
MessageType2.Error = 1;
|
|
MessageType2.Warning = 2;
|
|
MessageType2.Info = 3;
|
|
MessageType2.Log = 4;
|
|
})(MessageType = exports2.MessageType || (exports2.MessageType = {}));
|
|
var ShowMessageNotification;
|
|
(function(ShowMessageNotification2) {
|
|
ShowMessageNotification2.type = new messages_1.ProtocolNotificationType("window/showMessage");
|
|
})(ShowMessageNotification = exports2.ShowMessageNotification || (exports2.ShowMessageNotification = {}));
|
|
var ShowMessageRequest;
|
|
(function(ShowMessageRequest2) {
|
|
ShowMessageRequest2.type = new messages_1.ProtocolRequestType("window/showMessageRequest");
|
|
})(ShowMessageRequest = exports2.ShowMessageRequest || (exports2.ShowMessageRequest = {}));
|
|
var LogMessageNotification;
|
|
(function(LogMessageNotification2) {
|
|
LogMessageNotification2.type = new messages_1.ProtocolNotificationType("window/logMessage");
|
|
})(LogMessageNotification = exports2.LogMessageNotification || (exports2.LogMessageNotification = {}));
|
|
var TelemetryEventNotification;
|
|
(function(TelemetryEventNotification2) {
|
|
TelemetryEventNotification2.type = new messages_1.ProtocolNotificationType("telemetry/event");
|
|
})(TelemetryEventNotification = exports2.TelemetryEventNotification || (exports2.TelemetryEventNotification = {}));
|
|
var TextDocumentSyncKind;
|
|
(function(TextDocumentSyncKind2) {
|
|
TextDocumentSyncKind2.None = 0;
|
|
TextDocumentSyncKind2.Full = 1;
|
|
TextDocumentSyncKind2.Incremental = 2;
|
|
})(TextDocumentSyncKind = exports2.TextDocumentSyncKind || (exports2.TextDocumentSyncKind = {}));
|
|
var DidOpenTextDocumentNotification;
|
|
(function(DidOpenTextDocumentNotification2) {
|
|
DidOpenTextDocumentNotification2.method = "textDocument/didOpen";
|
|
DidOpenTextDocumentNotification2.type = new messages_1.ProtocolNotificationType(DidOpenTextDocumentNotification2.method);
|
|
})(DidOpenTextDocumentNotification = exports2.DidOpenTextDocumentNotification || (exports2.DidOpenTextDocumentNotification = {}));
|
|
var TextDocumentContentChangeEvent2;
|
|
(function(TextDocumentContentChangeEvent3) {
|
|
function isIncremental(event) {
|
|
let candidate = event;
|
|
return candidate !== void 0 && candidate !== null && typeof candidate.text === "string" && candidate.range !== void 0 && (candidate.rangeLength === void 0 || typeof candidate.rangeLength === "number");
|
|
}
|
|
TextDocumentContentChangeEvent3.isIncremental = isIncremental;
|
|
function isFull(event) {
|
|
let candidate = event;
|
|
return candidate !== void 0 && candidate !== null && typeof candidate.text === "string" && candidate.range === void 0 && candidate.rangeLength === void 0;
|
|
}
|
|
TextDocumentContentChangeEvent3.isFull = isFull;
|
|
})(TextDocumentContentChangeEvent2 = exports2.TextDocumentContentChangeEvent || (exports2.TextDocumentContentChangeEvent = {}));
|
|
var DidChangeTextDocumentNotification;
|
|
(function(DidChangeTextDocumentNotification2) {
|
|
DidChangeTextDocumentNotification2.method = "textDocument/didChange";
|
|
DidChangeTextDocumentNotification2.type = new messages_1.ProtocolNotificationType(DidChangeTextDocumentNotification2.method);
|
|
})(DidChangeTextDocumentNotification = exports2.DidChangeTextDocumentNotification || (exports2.DidChangeTextDocumentNotification = {}));
|
|
var DidCloseTextDocumentNotification;
|
|
(function(DidCloseTextDocumentNotification2) {
|
|
DidCloseTextDocumentNotification2.method = "textDocument/didClose";
|
|
DidCloseTextDocumentNotification2.type = new messages_1.ProtocolNotificationType(DidCloseTextDocumentNotification2.method);
|
|
})(DidCloseTextDocumentNotification = exports2.DidCloseTextDocumentNotification || (exports2.DidCloseTextDocumentNotification = {}));
|
|
var DidSaveTextDocumentNotification;
|
|
(function(DidSaveTextDocumentNotification2) {
|
|
DidSaveTextDocumentNotification2.method = "textDocument/didSave";
|
|
DidSaveTextDocumentNotification2.type = new messages_1.ProtocolNotificationType(DidSaveTextDocumentNotification2.method);
|
|
})(DidSaveTextDocumentNotification = exports2.DidSaveTextDocumentNotification || (exports2.DidSaveTextDocumentNotification = {}));
|
|
var TextDocumentSaveReason;
|
|
(function(TextDocumentSaveReason2) {
|
|
TextDocumentSaveReason2.Manual = 1;
|
|
TextDocumentSaveReason2.AfterDelay = 2;
|
|
TextDocumentSaveReason2.FocusOut = 3;
|
|
})(TextDocumentSaveReason = exports2.TextDocumentSaveReason || (exports2.TextDocumentSaveReason = {}));
|
|
var WillSaveTextDocumentNotification;
|
|
(function(WillSaveTextDocumentNotification2) {
|
|
WillSaveTextDocumentNotification2.method = "textDocument/willSave";
|
|
WillSaveTextDocumentNotification2.type = new messages_1.ProtocolNotificationType(WillSaveTextDocumentNotification2.method);
|
|
})(WillSaveTextDocumentNotification = exports2.WillSaveTextDocumentNotification || (exports2.WillSaveTextDocumentNotification = {}));
|
|
var WillSaveTextDocumentWaitUntilRequest;
|
|
(function(WillSaveTextDocumentWaitUntilRequest2) {
|
|
WillSaveTextDocumentWaitUntilRequest2.method = "textDocument/willSaveWaitUntil";
|
|
WillSaveTextDocumentWaitUntilRequest2.type = new messages_1.ProtocolRequestType(WillSaveTextDocumentWaitUntilRequest2.method);
|
|
})(WillSaveTextDocumentWaitUntilRequest = exports2.WillSaveTextDocumentWaitUntilRequest || (exports2.WillSaveTextDocumentWaitUntilRequest = {}));
|
|
var DidChangeWatchedFilesNotification;
|
|
(function(DidChangeWatchedFilesNotification2) {
|
|
DidChangeWatchedFilesNotification2.type = new messages_1.ProtocolNotificationType("workspace/didChangeWatchedFiles");
|
|
})(DidChangeWatchedFilesNotification = exports2.DidChangeWatchedFilesNotification || (exports2.DidChangeWatchedFilesNotification = {}));
|
|
var FileChangeType;
|
|
(function(FileChangeType2) {
|
|
FileChangeType2.Created = 1;
|
|
FileChangeType2.Changed = 2;
|
|
FileChangeType2.Deleted = 3;
|
|
})(FileChangeType = exports2.FileChangeType || (exports2.FileChangeType = {}));
|
|
var WatchKind;
|
|
(function(WatchKind2) {
|
|
WatchKind2.Create = 1;
|
|
WatchKind2.Change = 2;
|
|
WatchKind2.Delete = 4;
|
|
})(WatchKind = exports2.WatchKind || (exports2.WatchKind = {}));
|
|
var PublishDiagnosticsNotification;
|
|
(function(PublishDiagnosticsNotification2) {
|
|
PublishDiagnosticsNotification2.type = new messages_1.ProtocolNotificationType("textDocument/publishDiagnostics");
|
|
})(PublishDiagnosticsNotification = exports2.PublishDiagnosticsNotification || (exports2.PublishDiagnosticsNotification = {}));
|
|
var CompletionTriggerKind;
|
|
(function(CompletionTriggerKind2) {
|
|
CompletionTriggerKind2.Invoked = 1;
|
|
CompletionTriggerKind2.TriggerCharacter = 2;
|
|
CompletionTriggerKind2.TriggerForIncompleteCompletions = 3;
|
|
})(CompletionTriggerKind = exports2.CompletionTriggerKind || (exports2.CompletionTriggerKind = {}));
|
|
var CompletionRequest;
|
|
(function(CompletionRequest2) {
|
|
CompletionRequest2.method = "textDocument/completion";
|
|
CompletionRequest2.type = new messages_1.ProtocolRequestType(CompletionRequest2.method);
|
|
})(CompletionRequest = exports2.CompletionRequest || (exports2.CompletionRequest = {}));
|
|
var CompletionResolveRequest;
|
|
(function(CompletionResolveRequest2) {
|
|
CompletionResolveRequest2.method = "completionItem/resolve";
|
|
CompletionResolveRequest2.type = new messages_1.ProtocolRequestType(CompletionResolveRequest2.method);
|
|
})(CompletionResolveRequest = exports2.CompletionResolveRequest || (exports2.CompletionResolveRequest = {}));
|
|
var HoverRequest;
|
|
(function(HoverRequest2) {
|
|
HoverRequest2.method = "textDocument/hover";
|
|
HoverRequest2.type = new messages_1.ProtocolRequestType(HoverRequest2.method);
|
|
})(HoverRequest = exports2.HoverRequest || (exports2.HoverRequest = {}));
|
|
var SignatureHelpTriggerKind;
|
|
(function(SignatureHelpTriggerKind2) {
|
|
SignatureHelpTriggerKind2.Invoked = 1;
|
|
SignatureHelpTriggerKind2.TriggerCharacter = 2;
|
|
SignatureHelpTriggerKind2.ContentChange = 3;
|
|
})(SignatureHelpTriggerKind = exports2.SignatureHelpTriggerKind || (exports2.SignatureHelpTriggerKind = {}));
|
|
var SignatureHelpRequest;
|
|
(function(SignatureHelpRequest2) {
|
|
SignatureHelpRequest2.method = "textDocument/signatureHelp";
|
|
SignatureHelpRequest2.type = new messages_1.ProtocolRequestType(SignatureHelpRequest2.method);
|
|
})(SignatureHelpRequest = exports2.SignatureHelpRequest || (exports2.SignatureHelpRequest = {}));
|
|
var DefinitionRequest;
|
|
(function(DefinitionRequest2) {
|
|
DefinitionRequest2.method = "textDocument/definition";
|
|
DefinitionRequest2.type = new messages_1.ProtocolRequestType(DefinitionRequest2.method);
|
|
})(DefinitionRequest = exports2.DefinitionRequest || (exports2.DefinitionRequest = {}));
|
|
var ReferencesRequest;
|
|
(function(ReferencesRequest2) {
|
|
ReferencesRequest2.method = "textDocument/references";
|
|
ReferencesRequest2.type = new messages_1.ProtocolRequestType(ReferencesRequest2.method);
|
|
})(ReferencesRequest = exports2.ReferencesRequest || (exports2.ReferencesRequest = {}));
|
|
var DocumentHighlightRequest;
|
|
(function(DocumentHighlightRequest2) {
|
|
DocumentHighlightRequest2.method = "textDocument/documentHighlight";
|
|
DocumentHighlightRequest2.type = new messages_1.ProtocolRequestType(DocumentHighlightRequest2.method);
|
|
})(DocumentHighlightRequest = exports2.DocumentHighlightRequest || (exports2.DocumentHighlightRequest = {}));
|
|
var DocumentSymbolRequest;
|
|
(function(DocumentSymbolRequest2) {
|
|
DocumentSymbolRequest2.method = "textDocument/documentSymbol";
|
|
DocumentSymbolRequest2.type = new messages_1.ProtocolRequestType(DocumentSymbolRequest2.method);
|
|
})(DocumentSymbolRequest = exports2.DocumentSymbolRequest || (exports2.DocumentSymbolRequest = {}));
|
|
var CodeActionRequest;
|
|
(function(CodeActionRequest2) {
|
|
CodeActionRequest2.method = "textDocument/codeAction";
|
|
CodeActionRequest2.type = new messages_1.ProtocolRequestType(CodeActionRequest2.method);
|
|
})(CodeActionRequest = exports2.CodeActionRequest || (exports2.CodeActionRequest = {}));
|
|
var CodeActionResolveRequest;
|
|
(function(CodeActionResolveRequest2) {
|
|
CodeActionResolveRequest2.method = "codeAction/resolve";
|
|
CodeActionResolveRequest2.type = new messages_1.ProtocolRequestType(CodeActionResolveRequest2.method);
|
|
})(CodeActionResolveRequest = exports2.CodeActionResolveRequest || (exports2.CodeActionResolveRequest = {}));
|
|
var WorkspaceSymbolRequest;
|
|
(function(WorkspaceSymbolRequest2) {
|
|
WorkspaceSymbolRequest2.method = "workspace/symbol";
|
|
WorkspaceSymbolRequest2.type = new messages_1.ProtocolRequestType(WorkspaceSymbolRequest2.method);
|
|
})(WorkspaceSymbolRequest = exports2.WorkspaceSymbolRequest || (exports2.WorkspaceSymbolRequest = {}));
|
|
var CodeLensRequest;
|
|
(function(CodeLensRequest2) {
|
|
CodeLensRequest2.method = "textDocument/codeLens";
|
|
CodeLensRequest2.type = new messages_1.ProtocolRequestType(CodeLensRequest2.method);
|
|
})(CodeLensRequest = exports2.CodeLensRequest || (exports2.CodeLensRequest = {}));
|
|
var CodeLensResolveRequest;
|
|
(function(CodeLensResolveRequest2) {
|
|
CodeLensResolveRequest2.method = "codeLens/resolve";
|
|
CodeLensResolveRequest2.type = new messages_1.ProtocolRequestType(CodeLensResolveRequest2.method);
|
|
})(CodeLensResolveRequest = exports2.CodeLensResolveRequest || (exports2.CodeLensResolveRequest = {}));
|
|
var CodeLensRefreshRequest;
|
|
(function(CodeLensRefreshRequest2) {
|
|
CodeLensRefreshRequest2.method = `workspace/codeLens/refresh`;
|
|
CodeLensRefreshRequest2.type = new messages_1.ProtocolRequestType0(CodeLensRefreshRequest2.method);
|
|
})(CodeLensRefreshRequest = exports2.CodeLensRefreshRequest || (exports2.CodeLensRefreshRequest = {}));
|
|
var DocumentLinkRequest;
|
|
(function(DocumentLinkRequest2) {
|
|
DocumentLinkRequest2.method = "textDocument/documentLink";
|
|
DocumentLinkRequest2.type = new messages_1.ProtocolRequestType(DocumentLinkRequest2.method);
|
|
})(DocumentLinkRequest = exports2.DocumentLinkRequest || (exports2.DocumentLinkRequest = {}));
|
|
var DocumentLinkResolveRequest;
|
|
(function(DocumentLinkResolveRequest2) {
|
|
DocumentLinkResolveRequest2.method = "documentLink/resolve";
|
|
DocumentLinkResolveRequest2.type = new messages_1.ProtocolRequestType(DocumentLinkResolveRequest2.method);
|
|
})(DocumentLinkResolveRequest = exports2.DocumentLinkResolveRequest || (exports2.DocumentLinkResolveRequest = {}));
|
|
var DocumentFormattingRequest;
|
|
(function(DocumentFormattingRequest2) {
|
|
DocumentFormattingRequest2.method = "textDocument/formatting";
|
|
DocumentFormattingRequest2.type = new messages_1.ProtocolRequestType(DocumentFormattingRequest2.method);
|
|
})(DocumentFormattingRequest = exports2.DocumentFormattingRequest || (exports2.DocumentFormattingRequest = {}));
|
|
var DocumentRangeFormattingRequest;
|
|
(function(DocumentRangeFormattingRequest2) {
|
|
DocumentRangeFormattingRequest2.method = "textDocument/rangeFormatting";
|
|
DocumentRangeFormattingRequest2.type = new messages_1.ProtocolRequestType(DocumentRangeFormattingRequest2.method);
|
|
})(DocumentRangeFormattingRequest = exports2.DocumentRangeFormattingRequest || (exports2.DocumentRangeFormattingRequest = {}));
|
|
var DocumentOnTypeFormattingRequest;
|
|
(function(DocumentOnTypeFormattingRequest2) {
|
|
DocumentOnTypeFormattingRequest2.method = "textDocument/onTypeFormatting";
|
|
DocumentOnTypeFormattingRequest2.type = new messages_1.ProtocolRequestType(DocumentOnTypeFormattingRequest2.method);
|
|
})(DocumentOnTypeFormattingRequest = exports2.DocumentOnTypeFormattingRequest || (exports2.DocumentOnTypeFormattingRequest = {}));
|
|
var PrepareSupportDefaultBehavior;
|
|
(function(PrepareSupportDefaultBehavior2) {
|
|
PrepareSupportDefaultBehavior2.Identifier = 1;
|
|
})(PrepareSupportDefaultBehavior = exports2.PrepareSupportDefaultBehavior || (exports2.PrepareSupportDefaultBehavior = {}));
|
|
var RenameRequest;
|
|
(function(RenameRequest2) {
|
|
RenameRequest2.method = "textDocument/rename";
|
|
RenameRequest2.type = new messages_1.ProtocolRequestType(RenameRequest2.method);
|
|
})(RenameRequest = exports2.RenameRequest || (exports2.RenameRequest = {}));
|
|
var PrepareRenameRequest;
|
|
(function(PrepareRenameRequest2) {
|
|
PrepareRenameRequest2.method = "textDocument/prepareRename";
|
|
PrepareRenameRequest2.type = new messages_1.ProtocolRequestType(PrepareRenameRequest2.method);
|
|
})(PrepareRenameRequest = exports2.PrepareRenameRequest || (exports2.PrepareRenameRequest = {}));
|
|
var ExecuteCommandRequest;
|
|
(function(ExecuteCommandRequest2) {
|
|
ExecuteCommandRequest2.type = new messages_1.ProtocolRequestType("workspace/executeCommand");
|
|
})(ExecuteCommandRequest = exports2.ExecuteCommandRequest || (exports2.ExecuteCommandRequest = {}));
|
|
var ApplyWorkspaceEditRequest;
|
|
(function(ApplyWorkspaceEditRequest2) {
|
|
ApplyWorkspaceEditRequest2.type = new messages_1.ProtocolRequestType("workspace/applyEdit");
|
|
})(ApplyWorkspaceEditRequest = exports2.ApplyWorkspaceEditRequest || (exports2.ApplyWorkspaceEditRequest = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/connection.js
|
|
var require_connection2 = __commonJS((exports2) => {
|
|
"use strict";
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.createProtocolConnection = void 0;
|
|
var vscode_jsonrpc_1 = require_main();
|
|
function createProtocolConnection(input, output, logger, options) {
|
|
if (vscode_jsonrpc_1.ConnectionStrategy.is(options)) {
|
|
options = {connectionStrategy: options};
|
|
}
|
|
return vscode_jsonrpc_1.createMessageConnection(input, output, logger, options);
|
|
}
|
|
exports2.createProtocolConnection = createProtocolConnection;
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/common/api.js
|
|
var require_api2 = __commonJS((exports2) => {
|
|
"use strict";
|
|
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
Object.defineProperty(o, k2, {enumerable: true, get: function() {
|
|
return m[k];
|
|
}});
|
|
} : function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
o[k2] = m[k];
|
|
});
|
|
var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) {
|
|
for (var p in m)
|
|
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p))
|
|
__createBinding(exports3, m, p);
|
|
};
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.LSPErrorCodes = exports2.createProtocolConnection = void 0;
|
|
__exportStar2(require_main(), exports2);
|
|
__exportStar2(require_main2(), exports2);
|
|
__exportStar2(require_messages2(), exports2);
|
|
__exportStar2(require_protocol(), exports2);
|
|
var connection_1 = require_connection2();
|
|
Object.defineProperty(exports2, "createProtocolConnection", {enumerable: true, get: function() {
|
|
return connection_1.createProtocolConnection;
|
|
}});
|
|
var LSPErrorCodes;
|
|
(function(LSPErrorCodes2) {
|
|
LSPErrorCodes2.lspReservedErrorRangeStart = -32899;
|
|
LSPErrorCodes2.ContentModified = -32801;
|
|
LSPErrorCodes2.RequestCancelled = -32800;
|
|
LSPErrorCodes2.lspReservedErrorRangeEnd = -32800;
|
|
})(LSPErrorCodes = exports2.LSPErrorCodes || (exports2.LSPErrorCodes = {}));
|
|
});
|
|
|
|
// node_modules/vscode-languageserver-protocol/lib/node/main.js
|
|
var require_main3 = __commonJS((exports2) => {
|
|
"use strict";
|
|
var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
Object.defineProperty(o, k2, {enumerable: true, get: function() {
|
|
return m[k];
|
|
}});
|
|
} : function(o, m, k, k2) {
|
|
if (k2 === void 0)
|
|
k2 = k;
|
|
o[k2] = m[k];
|
|
});
|
|
var __exportStar2 = exports2 && exports2.__exportStar || function(m, exports3) {
|
|
for (var p in m)
|
|
if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p))
|
|
__createBinding(exports3, m, p);
|
|
};
|
|
Object.defineProperty(exports2, "__esModule", {value: true});
|
|
exports2.createProtocolConnection = void 0;
|
|
var node_1 = require_node();
|
|
__exportStar2(require_node(), exports2);
|
|
__exportStar2(require_api2(), exports2);
|
|
function createProtocolConnection(input, output, logger, options) {
|
|
return node_1.createMessageConnection(input, output, logger, options);
|
|
}
|
|
exports2.createProtocolConnection = createProtocolConnection;
|
|
});
|
|
|
|
// node_modules/semver/internal/constants.js
|
|
var require_constants = __commonJS((exports2, module2) => {
|
|
var SEMVER_SPEC_VERSION = "2.0.0";
|
|
var MAX_LENGTH = 256;
|
|
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
|
|
var MAX_SAFE_COMPONENT_LENGTH = 16;
|
|
module2.exports = {
|
|
SEMVER_SPEC_VERSION,
|
|
MAX_LENGTH,
|
|
MAX_SAFE_INTEGER,
|
|
MAX_SAFE_COMPONENT_LENGTH
|
|
};
|
|
});
|
|
|
|
// node_modules/semver/internal/debug.js
|
|
var require_debug = __commonJS((exports2, module2) => {
|
|
var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
|
|
};
|
|
module2.exports = debug;
|
|
});
|
|
|
|
// node_modules/semver/internal/re.js
|
|
var require_re = __commonJS((exports2, module2) => {
|
|
var {MAX_SAFE_COMPONENT_LENGTH} = require_constants();
|
|
var debug = require_debug();
|
|
exports2 = module2.exports = {};
|
|
var re = exports2.re = [];
|
|
var src = exports2.src = [];
|
|
var t = exports2.t = {};
|
|
var R = 0;
|
|
var createToken = (name, value, isGlobal) => {
|
|
const index = R++;
|
|
debug(index, value);
|
|
t[name] = index;
|
|
src[index] = value;
|
|
re[index] = new RegExp(value, isGlobal ? "g" : void 0);
|
|
};
|
|
createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
|
|
createToken("NUMERICIDENTIFIERLOOSE", "[0-9]+");
|
|
createToken("NONNUMERICIDENTIFIER", "\\d*[a-zA-Z-][a-zA-Z0-9-]*");
|
|
createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);
|
|
createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);
|
|
createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NUMERICIDENTIFIER]}|${src[t.NONNUMERICIDENTIFIER]})`);
|
|
createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NUMERICIDENTIFIERLOOSE]}|${src[t.NONNUMERICIDENTIFIER]})`);
|
|
createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
|
|
createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
|
|
createToken("BUILDIDENTIFIER", "[0-9A-Za-z-]+");
|
|
createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
|
|
createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
|
|
createToken("FULL", `^${src[t.FULLPLAIN]}$`);
|
|
createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
|
|
createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
|
|
createToken("GTLT", "((?:<|>)?=?)");
|
|
createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
|
|
createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
|
|
createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);
|
|
createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);
|
|
createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
|
|
createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COERCE", `${"(^|[^\\d])(\\d{1,"}${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:$|[^\\d])`);
|
|
createToken("COERCERTL", src[t.COERCE], true);
|
|
createToken("LONETILDE", "(?:~>?)");
|
|
createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
|
|
exports2.tildeTrimReplace = "$1~";
|
|
createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("LONECARET", "(?:\\^)");
|
|
createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
|
|
exports2.caretTrimReplace = "$1^";
|
|
createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
|
|
createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
|
|
createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
|
|
createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
|
|
createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
|
|
exports2.comparatorTrimReplace = "$1$2$3";
|
|
createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
|
|
createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
|
|
createToken("STAR", "(<|>)?=?\\s*\\*");
|
|
createToken("GTE0", "^\\s*>=\\s*0.0.0\\s*$");
|
|
createToken("GTE0PRE", "^\\s*>=\\s*0.0.0-0\\s*$");
|
|
});
|
|
|
|
// node_modules/semver/internal/identifiers.js
|
|
var require_identifiers = __commonJS((exports2, module2) => {
|
|
var numeric = /^[0-9]+$/;
|
|
var compareIdentifiers = (a, b) => {
|
|
const anum = numeric.test(a);
|
|
const bnum = numeric.test(b);
|
|
if (anum && bnum) {
|
|
a = +a;
|
|
b = +b;
|
|
}
|
|
return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
|
|
};
|
|
var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
|
|
module2.exports = {
|
|
compareIdentifiers,
|
|
rcompareIdentifiers
|
|
};
|
|
});
|
|
|
|
// node_modules/semver/classes/semver.js
|
|
var require_semver = __commonJS((exports2, module2) => {
|
|
var debug = require_debug();
|
|
var {MAX_LENGTH, MAX_SAFE_INTEGER} = require_constants();
|
|
var {re, t} = require_re();
|
|
var {compareIdentifiers} = require_identifiers();
|
|
var SemVer = class {
|
|
constructor(version, options) {
|
|
if (!options || typeof options !== "object") {
|
|
options = {
|
|
loose: !!options,
|
|
includePrerelease: false
|
|
};
|
|
}
|
|
if (version instanceof SemVer) {
|
|
if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) {
|
|
return version;
|
|
} else {
|
|
version = version.version;
|
|
}
|
|
} else if (typeof version !== "string") {
|
|
throw new TypeError(`Invalid Version: ${version}`);
|
|
}
|
|
if (version.length > MAX_LENGTH) {
|
|
throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
|
|
}
|
|
debug("SemVer", version, options);
|
|
this.options = options;
|
|
this.loose = !!options.loose;
|
|
this.includePrerelease = !!options.includePrerelease;
|
|
const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid Version: ${version}`);
|
|
}
|
|
this.raw = version;
|
|
this.major = +m[1];
|
|
this.minor = +m[2];
|
|
this.patch = +m[3];
|
|
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
|
|
throw new TypeError("Invalid major version");
|
|
}
|
|
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
|
|
throw new TypeError("Invalid minor version");
|
|
}
|
|
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
|
|
throw new TypeError("Invalid patch version");
|
|
}
|
|
if (!m[4]) {
|
|
this.prerelease = [];
|
|
} else {
|
|
this.prerelease = m[4].split(".").map((id) => {
|
|
if (/^[0-9]+$/.test(id)) {
|
|
const num = +id;
|
|
if (num >= 0 && num < MAX_SAFE_INTEGER) {
|
|
return num;
|
|
}
|
|
}
|
|
return id;
|
|
});
|
|
}
|
|
this.build = m[5] ? m[5].split(".") : [];
|
|
this.format();
|
|
}
|
|
format() {
|
|
this.version = `${this.major}.${this.minor}.${this.patch}`;
|
|
if (this.prerelease.length) {
|
|
this.version += `-${this.prerelease.join(".")}`;
|
|
}
|
|
return this.version;
|
|
}
|
|
toString() {
|
|
return this.version;
|
|
}
|
|
compare(other) {
|
|
debug("SemVer.compare", this.version, this.options, other);
|
|
if (!(other instanceof SemVer)) {
|
|
if (typeof other === "string" && other === this.version) {
|
|
return 0;
|
|
}
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (other.version === this.version) {
|
|
return 0;
|
|
}
|
|
return this.compareMain(other) || this.comparePre(other);
|
|
}
|
|
compareMain(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch);
|
|
}
|
|
comparePre(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
if (this.prerelease.length && !other.prerelease.length) {
|
|
return -1;
|
|
} else if (!this.prerelease.length && other.prerelease.length) {
|
|
return 1;
|
|
} else if (!this.prerelease.length && !other.prerelease.length) {
|
|
return 0;
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.prerelease[i];
|
|
const b = other.prerelease[i];
|
|
debug("prerelease compare", i, a, b);
|
|
if (a === void 0 && b === void 0) {
|
|
return 0;
|
|
} else if (b === void 0) {
|
|
return 1;
|
|
} else if (a === void 0) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
compareBuild(other) {
|
|
if (!(other instanceof SemVer)) {
|
|
other = new SemVer(other, this.options);
|
|
}
|
|
let i = 0;
|
|
do {
|
|
const a = this.build[i];
|
|
const b = other.build[i];
|
|
debug("prerelease compare", i, a, b);
|
|
if (a === void 0 && b === void 0) {
|
|
return 0;
|
|
} else if (b === void 0) {
|
|
return 1;
|
|
} else if (a === void 0) {
|
|
return -1;
|
|
} else if (a === b) {
|
|
continue;
|
|
} else {
|
|
return compareIdentifiers(a, b);
|
|
}
|
|
} while (++i);
|
|
}
|
|
inc(release, identifier) {
|
|
switch (release) {
|
|
case "premajor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor = 0;
|
|
this.major++;
|
|
this.inc("pre", identifier);
|
|
break;
|
|
case "preminor":
|
|
this.prerelease.length = 0;
|
|
this.patch = 0;
|
|
this.minor++;
|
|
this.inc("pre", identifier);
|
|
break;
|
|
case "prepatch":
|
|
this.prerelease.length = 0;
|
|
this.inc("patch", identifier);
|
|
this.inc("pre", identifier);
|
|
break;
|
|
case "prerelease":
|
|
if (this.prerelease.length === 0) {
|
|
this.inc("patch", identifier);
|
|
}
|
|
this.inc("pre", identifier);
|
|
break;
|
|
case "major":
|
|
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.major++;
|
|
}
|
|
this.minor = 0;
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "minor":
|
|
if (this.patch !== 0 || this.prerelease.length === 0) {
|
|
this.minor++;
|
|
}
|
|
this.patch = 0;
|
|
this.prerelease = [];
|
|
break;
|
|
case "patch":
|
|
if (this.prerelease.length === 0) {
|
|
this.patch++;
|
|
}
|
|
this.prerelease = [];
|
|
break;
|
|
case "pre":
|
|
if (this.prerelease.length === 0) {
|
|
this.prerelease = [0];
|
|
} else {
|
|
let i = this.prerelease.length;
|
|
while (--i >= 0) {
|
|
if (typeof this.prerelease[i] === "number") {
|
|
this.prerelease[i]++;
|
|
i = -2;
|
|
}
|
|
}
|
|
if (i === -1) {
|
|
this.prerelease.push(0);
|
|
}
|
|
}
|
|
if (identifier) {
|
|
if (this.prerelease[0] === identifier) {
|
|
if (isNaN(this.prerelease[1])) {
|
|
this.prerelease = [identifier, 0];
|
|
}
|
|
} else {
|
|
this.prerelease = [identifier, 0];
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
throw new Error(`invalid increment argument: ${release}`);
|
|
}
|
|
this.format();
|
|
this.raw = this.version;
|
|
return this;
|
|
}
|
|
};
|
|
module2.exports = SemVer;
|
|
});
|
|
|
|
// node_modules/semver/functions/parse.js
|
|
var require_parse = __commonJS((exports2, module2) => {
|
|
var {MAX_LENGTH} = require_constants();
|
|
var {re, t} = require_re();
|
|
var SemVer = require_semver();
|
|
var parse = (version, options) => {
|
|
if (!options || typeof options !== "object") {
|
|
options = {
|
|
loose: !!options,
|
|
includePrerelease: false
|
|
};
|
|
}
|
|
if (version instanceof SemVer) {
|
|
return version;
|
|
}
|
|
if (typeof version !== "string") {
|
|
return null;
|
|
}
|
|
if (version.length > MAX_LENGTH) {
|
|
return null;
|
|
}
|
|
const r = options.loose ? re[t.LOOSE] : re[t.FULL];
|
|
if (!r.test(version)) {
|
|
return null;
|
|
}
|
|
try {
|
|
return new SemVer(version, options);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module2.exports = parse;
|
|
});
|
|
|
|
// node_modules/semver/functions/valid.js
|
|
var require_valid = __commonJS((exports2, module2) => {
|
|
var parse = require_parse();
|
|
var valid2 = (version, options) => {
|
|
const v = parse(version, options);
|
|
return v ? v.version : null;
|
|
};
|
|
module2.exports = valid2;
|
|
});
|
|
|
|
// node_modules/semver/functions/clean.js
|
|
var require_clean = __commonJS((exports2, module2) => {
|
|
var parse = require_parse();
|
|
var clean = (version, options) => {
|
|
const s = parse(version.trim().replace(/^[=v]+/, ""), options);
|
|
return s ? s.version : null;
|
|
};
|
|
module2.exports = clean;
|
|
});
|
|
|
|
// node_modules/semver/functions/inc.js
|
|
var require_inc = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var inc = (version, release, options, identifier) => {
|
|
if (typeof options === "string") {
|
|
identifier = options;
|
|
options = void 0;
|
|
}
|
|
try {
|
|
return new SemVer(version, options).inc(release, identifier).version;
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module2.exports = inc;
|
|
});
|
|
|
|
// node_modules/semver/functions/compare.js
|
|
var require_compare = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
|
|
module2.exports = compare;
|
|
});
|
|
|
|
// node_modules/semver/functions/eq.js
|
|
var require_eq = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var eq = (a, b, loose) => compare(a, b, loose) === 0;
|
|
module2.exports = eq;
|
|
});
|
|
|
|
// node_modules/semver/functions/diff.js
|
|
var require_diff = __commonJS((exports2, module2) => {
|
|
var parse = require_parse();
|
|
var eq = require_eq();
|
|
var diff = (version1, version2) => {
|
|
if (eq(version1, version2)) {
|
|
return null;
|
|
} else {
|
|
const v1 = parse(version1);
|
|
const v2 = parse(version2);
|
|
const hasPre = v1.prerelease.length || v2.prerelease.length;
|
|
const prefix = hasPre ? "pre" : "";
|
|
const defaultResult = hasPre ? "prerelease" : "";
|
|
for (const key in v1) {
|
|
if (key === "major" || key === "minor" || key === "patch") {
|
|
if (v1[key] !== v2[key]) {
|
|
return prefix + key;
|
|
}
|
|
}
|
|
}
|
|
return defaultResult;
|
|
}
|
|
};
|
|
module2.exports = diff;
|
|
});
|
|
|
|
// node_modules/semver/functions/major.js
|
|
var require_major = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var major = (a, loose) => new SemVer(a, loose).major;
|
|
module2.exports = major;
|
|
});
|
|
|
|
// node_modules/semver/functions/minor.js
|
|
var require_minor = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var minor = (a, loose) => new SemVer(a, loose).minor;
|
|
module2.exports = minor;
|
|
});
|
|
|
|
// node_modules/semver/functions/patch.js
|
|
var require_patch = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var patch = (a, loose) => new SemVer(a, loose).patch;
|
|
module2.exports = patch;
|
|
});
|
|
|
|
// node_modules/semver/functions/prerelease.js
|
|
var require_prerelease = __commonJS((exports2, module2) => {
|
|
var parse = require_parse();
|
|
var prerelease = (version, options) => {
|
|
const parsed = parse(version, options);
|
|
return parsed && parsed.prerelease.length ? parsed.prerelease : null;
|
|
};
|
|
module2.exports = prerelease;
|
|
});
|
|
|
|
// node_modules/semver/functions/rcompare.js
|
|
var require_rcompare = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var rcompare = (a, b, loose) => compare(b, a, loose);
|
|
module2.exports = rcompare;
|
|
});
|
|
|
|
// node_modules/semver/functions/compare-loose.js
|
|
var require_compare_loose = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var compareLoose = (a, b) => compare(a, b, true);
|
|
module2.exports = compareLoose;
|
|
});
|
|
|
|
// node_modules/semver/functions/compare-build.js
|
|
var require_compare_build = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var compareBuild = (a, b, loose) => {
|
|
const versionA = new SemVer(a, loose);
|
|
const versionB = new SemVer(b, loose);
|
|
return versionA.compare(versionB) || versionA.compareBuild(versionB);
|
|
};
|
|
module2.exports = compareBuild;
|
|
});
|
|
|
|
// node_modules/semver/functions/sort.js
|
|
var require_sort = __commonJS((exports2, module2) => {
|
|
var compareBuild = require_compare_build();
|
|
var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
|
|
module2.exports = sort;
|
|
});
|
|
|
|
// node_modules/semver/functions/rsort.js
|
|
var require_rsort = __commonJS((exports2, module2) => {
|
|
var compareBuild = require_compare_build();
|
|
var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
|
|
module2.exports = rsort;
|
|
});
|
|
|
|
// node_modules/semver/functions/gt.js
|
|
var require_gt = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var gt = (a, b, loose) => compare(a, b, loose) > 0;
|
|
module2.exports = gt;
|
|
});
|
|
|
|
// node_modules/semver/functions/lt.js
|
|
var require_lt = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var lt = (a, b, loose) => compare(a, b, loose) < 0;
|
|
module2.exports = lt;
|
|
});
|
|
|
|
// node_modules/semver/functions/neq.js
|
|
var require_neq = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var neq = (a, b, loose) => compare(a, b, loose) !== 0;
|
|
module2.exports = neq;
|
|
});
|
|
|
|
// node_modules/semver/functions/gte.js
|
|
var require_gte = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var gte2 = (a, b, loose) => compare(a, b, loose) >= 0;
|
|
module2.exports = gte2;
|
|
});
|
|
|
|
// node_modules/semver/functions/lte.js
|
|
var require_lte = __commonJS((exports2, module2) => {
|
|
var compare = require_compare();
|
|
var lte = (a, b, loose) => compare(a, b, loose) <= 0;
|
|
module2.exports = lte;
|
|
});
|
|
|
|
// node_modules/semver/functions/cmp.js
|
|
var require_cmp = __commonJS((exports2, module2) => {
|
|
var eq = require_eq();
|
|
var neq = require_neq();
|
|
var gt = require_gt();
|
|
var gte2 = require_gte();
|
|
var lt = require_lt();
|
|
var lte = require_lte();
|
|
var cmp = (a, op, b, loose) => {
|
|
switch (op) {
|
|
case "===":
|
|
if (typeof a === "object")
|
|
a = a.version;
|
|
if (typeof b === "object")
|
|
b = b.version;
|
|
return a === b;
|
|
case "!==":
|
|
if (typeof a === "object")
|
|
a = a.version;
|
|
if (typeof b === "object")
|
|
b = b.version;
|
|
return a !== b;
|
|
case "":
|
|
case "=":
|
|
case "==":
|
|
return eq(a, b, loose);
|
|
case "!=":
|
|
return neq(a, b, loose);
|
|
case ">":
|
|
return gt(a, b, loose);
|
|
case ">=":
|
|
return gte2(a, b, loose);
|
|
case "<":
|
|
return lt(a, b, loose);
|
|
case "<=":
|
|
return lte(a, b, loose);
|
|
default:
|
|
throw new TypeError(`Invalid operator: ${op}`);
|
|
}
|
|
};
|
|
module2.exports = cmp;
|
|
});
|
|
|
|
// node_modules/semver/functions/coerce.js
|
|
var require_coerce = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var parse = require_parse();
|
|
var {re, t} = require_re();
|
|
var coerce = (version, options) => {
|
|
if (version instanceof SemVer) {
|
|
return version;
|
|
}
|
|
if (typeof version === "number") {
|
|
version = String(version);
|
|
}
|
|
if (typeof version !== "string") {
|
|
return null;
|
|
}
|
|
options = options || {};
|
|
let match = null;
|
|
if (!options.rtl) {
|
|
match = version.match(re[t.COERCE]);
|
|
} else {
|
|
let next;
|
|
while ((next = re[t.COERCERTL].exec(version)) && (!match || match.index + match[0].length !== version.length)) {
|
|
if (!match || next.index + next[0].length !== match.index + match[0].length) {
|
|
match = next;
|
|
}
|
|
re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length;
|
|
}
|
|
re[t.COERCERTL].lastIndex = -1;
|
|
}
|
|
if (match === null)
|
|
return null;
|
|
return parse(`${match[2]}.${match[3] || "0"}.${match[4] || "0"}`, options);
|
|
};
|
|
module2.exports = coerce;
|
|
});
|
|
|
|
// node_modules/semver/classes/range.js
|
|
var require_range = __commonJS((exports2, module2) => {
|
|
var Range17 = class {
|
|
constructor(range, options) {
|
|
if (!options || typeof options !== "object") {
|
|
options = {
|
|
loose: !!options,
|
|
includePrerelease: false
|
|
};
|
|
}
|
|
if (range instanceof Range17) {
|
|
if (range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease) {
|
|
return range;
|
|
} else {
|
|
return new Range17(range.raw, options);
|
|
}
|
|
}
|
|
if (range instanceof Comparator) {
|
|
this.raw = range.value;
|
|
this.set = [[range]];
|
|
this.format();
|
|
return this;
|
|
}
|
|
this.options = options;
|
|
this.loose = !!options.loose;
|
|
this.includePrerelease = !!options.includePrerelease;
|
|
this.raw = range;
|
|
this.set = range.split(/\s*\|\|\s*/).map((range2) => this.parseRange(range2.trim())).filter((c) => c.length);
|
|
if (!this.set.length) {
|
|
throw new TypeError(`Invalid SemVer Range: ${range}`);
|
|
}
|
|
this.format();
|
|
}
|
|
format() {
|
|
this.range = this.set.map((comps) => {
|
|
return comps.join(" ").trim();
|
|
}).join("||").trim();
|
|
return this.range;
|
|
}
|
|
toString() {
|
|
return this.range;
|
|
}
|
|
parseRange(range) {
|
|
const loose = this.options.loose;
|
|
range = range.trim();
|
|
const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
|
|
range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
|
|
debug("hyphen replace", range);
|
|
range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
|
|
debug("comparator trim", range, re[t.COMPARATORTRIM]);
|
|
range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
|
|
range = range.replace(re[t.CARETTRIM], caretTrimReplace);
|
|
range = range.split(/\s+/).join(" ");
|
|
const compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
|
|
return range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options)).filter(this.options.loose ? (comp) => !!comp.match(compRe) : () => true).map((comp) => new Comparator(comp, this.options));
|
|
}
|
|
intersects(range, options) {
|
|
if (!(range instanceof Range17)) {
|
|
throw new TypeError("a Range is required");
|
|
}
|
|
return this.set.some((thisComparators) => {
|
|
return isSatisfiable(thisComparators, options) && range.set.some((rangeComparators) => {
|
|
return isSatisfiable(rangeComparators, options) && thisComparators.every((thisComparator) => {
|
|
return rangeComparators.every((rangeComparator) => {
|
|
return thisComparator.intersects(rangeComparator, options);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
test(version) {
|
|
if (!version) {
|
|
return false;
|
|
}
|
|
if (typeof version === "string") {
|
|
try {
|
|
version = new SemVer(version, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let i = 0; i < this.set.length; i++) {
|
|
if (testSet(this.set[i], version, this.options)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
module2.exports = Range17;
|
|
var Comparator = require_comparator();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var {
|
|
re,
|
|
t,
|
|
comparatorTrimReplace,
|
|
tildeTrimReplace,
|
|
caretTrimReplace
|
|
} = require_re();
|
|
var isSatisfiable = (comparators, options) => {
|
|
let result = true;
|
|
const remainingComparators = comparators.slice();
|
|
let testComparator = remainingComparators.pop();
|
|
while (result && remainingComparators.length) {
|
|
result = remainingComparators.every((otherComparator) => {
|
|
return testComparator.intersects(otherComparator, options);
|
|
});
|
|
testComparator = remainingComparators.pop();
|
|
}
|
|
return result;
|
|
};
|
|
var parseComparator = (comp, options) => {
|
|
debug("comp", comp, options);
|
|
comp = replaceCarets(comp, options);
|
|
debug("caret", comp);
|
|
comp = replaceTildes(comp, options);
|
|
debug("tildes", comp);
|
|
comp = replaceXRanges(comp, options);
|
|
debug("xrange", comp);
|
|
comp = replaceStars(comp, options);
|
|
debug("stars", comp);
|
|
return comp;
|
|
};
|
|
var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
|
|
var replaceTildes = (comp, options) => comp.trim().split(/\s+/).map((comp2) => {
|
|
return replaceTilde(comp2, options);
|
|
}).join(" ");
|
|
var replaceTilde = (comp, options) => {
|
|
const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("tilde", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
|
|
} else if (pr) {
|
|
debug("replaceTilde pr", pr);
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("tilde return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceCarets = (comp, options) => comp.trim().split(/\s+/).map((comp2) => {
|
|
return replaceCaret(comp2, options);
|
|
}).join(" ");
|
|
var replaceCaret = (comp, options) => {
|
|
debug("caret", comp, options);
|
|
const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
|
|
const z = options.includePrerelease ? "-0" : "";
|
|
return comp.replace(r, (_, M, m, p, pr) => {
|
|
debug("caret", comp, _, M, m, p, pr);
|
|
let ret;
|
|
if (isX(M)) {
|
|
ret = "";
|
|
} else if (isX(m)) {
|
|
ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
|
|
} else if (isX(p)) {
|
|
if (M === "0") {
|
|
ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else if (pr) {
|
|
debug("replaceCaret pr", pr);
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
|
|
}
|
|
} else {
|
|
debug("no pr");
|
|
if (M === "0") {
|
|
if (m === "0") {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
|
|
} else {
|
|
ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
} else {
|
|
ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
|
|
}
|
|
}
|
|
debug("caret return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceXRanges = (comp, options) => {
|
|
debug("replaceXRanges", comp, options);
|
|
return comp.split(/\s+/).map((comp2) => {
|
|
return replaceXRange(comp2, options);
|
|
}).join(" ");
|
|
};
|
|
var replaceXRange = (comp, options) => {
|
|
comp = comp.trim();
|
|
const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
|
|
return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
|
|
debug("xRange", comp, ret, gtlt, M, m, p, pr);
|
|
const xM = isX(M);
|
|
const xm = xM || isX(m);
|
|
const xp = xm || isX(p);
|
|
const anyX = xp;
|
|
if (gtlt === "=" && anyX) {
|
|
gtlt = "";
|
|
}
|
|
pr = options.includePrerelease ? "-0" : "";
|
|
if (xM) {
|
|
if (gtlt === ">" || gtlt === "<") {
|
|
ret = "<0.0.0-0";
|
|
} else {
|
|
ret = "*";
|
|
}
|
|
} else if (gtlt && anyX) {
|
|
if (xm) {
|
|
m = 0;
|
|
}
|
|
p = 0;
|
|
if (gtlt === ">") {
|
|
gtlt = ">=";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
m = 0;
|
|
p = 0;
|
|
} else {
|
|
m = +m + 1;
|
|
p = 0;
|
|
}
|
|
} else if (gtlt === "<=") {
|
|
gtlt = "<";
|
|
if (xm) {
|
|
M = +M + 1;
|
|
} else {
|
|
m = +m + 1;
|
|
}
|
|
}
|
|
if (gtlt === "<")
|
|
pr = "-0";
|
|
ret = `${gtlt + M}.${m}.${p}${pr}`;
|
|
} else if (xm) {
|
|
ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
|
|
} else if (xp) {
|
|
ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
|
|
}
|
|
debug("xRange return", ret);
|
|
return ret;
|
|
});
|
|
};
|
|
var replaceStars = (comp, options) => {
|
|
debug("replaceStars", comp, options);
|
|
return comp.trim().replace(re[t.STAR], "");
|
|
};
|
|
var replaceGTE0 = (comp, options) => {
|
|
debug("replaceGTE0", comp, options);
|
|
return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], "");
|
|
};
|
|
var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr, tb) => {
|
|
if (isX(fM)) {
|
|
from = "";
|
|
} else if (isX(fm)) {
|
|
from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
|
|
} else if (isX(fp)) {
|
|
from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
|
|
} else if (fpr) {
|
|
from = `>=${from}`;
|
|
} else {
|
|
from = `>=${from}${incPr ? "-0" : ""}`;
|
|
}
|
|
if (isX(tM)) {
|
|
to = "";
|
|
} else if (isX(tm)) {
|
|
to = `<${+tM + 1}.0.0-0`;
|
|
} else if (isX(tp)) {
|
|
to = `<${tM}.${+tm + 1}.0-0`;
|
|
} else if (tpr) {
|
|
to = `<=${tM}.${tm}.${tp}-${tpr}`;
|
|
} else if (incPr) {
|
|
to = `<${tM}.${tm}.${+tp + 1}-0`;
|
|
} else {
|
|
to = `<=${to}`;
|
|
}
|
|
return `${from} ${to}`.trim();
|
|
};
|
|
var testSet = (set, version, options) => {
|
|
for (let i = 0; i < set.length; i++) {
|
|
if (!set[i].test(version)) {
|
|
return false;
|
|
}
|
|
}
|
|
if (version.prerelease.length && !options.includePrerelease) {
|
|
for (let i = 0; i < set.length; i++) {
|
|
debug(set[i].semver);
|
|
if (set[i].semver === Comparator.ANY) {
|
|
continue;
|
|
}
|
|
if (set[i].semver.prerelease.length > 0) {
|
|
const allowed = set[i].semver;
|
|
if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
});
|
|
|
|
// node_modules/semver/classes/comparator.js
|
|
var require_comparator = __commonJS((exports2, module2) => {
|
|
var ANY = Symbol("SemVer ANY");
|
|
var Comparator = class {
|
|
static get ANY() {
|
|
return ANY;
|
|
}
|
|
constructor(comp, options) {
|
|
if (!options || typeof options !== "object") {
|
|
options = {
|
|
loose: !!options,
|
|
includePrerelease: false
|
|
};
|
|
}
|
|
if (comp instanceof Comparator) {
|
|
if (comp.loose === !!options.loose) {
|
|
return comp;
|
|
} else {
|
|
comp = comp.value;
|
|
}
|
|
}
|
|
debug("comparator", comp, options);
|
|
this.options = options;
|
|
this.loose = !!options.loose;
|
|
this.parse(comp);
|
|
if (this.semver === ANY) {
|
|
this.value = "";
|
|
} else {
|
|
this.value = this.operator + this.semver.version;
|
|
}
|
|
debug("comp", this);
|
|
}
|
|
parse(comp) {
|
|
const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
|
|
const m = comp.match(r);
|
|
if (!m) {
|
|
throw new TypeError(`Invalid comparator: ${comp}`);
|
|
}
|
|
this.operator = m[1] !== void 0 ? m[1] : "";
|
|
if (this.operator === "=") {
|
|
this.operator = "";
|
|
}
|
|
if (!m[2]) {
|
|
this.semver = ANY;
|
|
} else {
|
|
this.semver = new SemVer(m[2], this.options.loose);
|
|
}
|
|
}
|
|
toString() {
|
|
return this.value;
|
|
}
|
|
test(version) {
|
|
debug("Comparator.test", version, this.options.loose);
|
|
if (this.semver === ANY || version === ANY) {
|
|
return true;
|
|
}
|
|
if (typeof version === "string") {
|
|
try {
|
|
version = new SemVer(version, this.options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
}
|
|
return cmp(version, this.operator, this.semver, this.options);
|
|
}
|
|
intersects(comp, options) {
|
|
if (!(comp instanceof Comparator)) {
|
|
throw new TypeError("a Comparator is required");
|
|
}
|
|
if (!options || typeof options !== "object") {
|
|
options = {
|
|
loose: !!options,
|
|
includePrerelease: false
|
|
};
|
|
}
|
|
if (this.operator === "") {
|
|
if (this.value === "") {
|
|
return true;
|
|
}
|
|
return new Range17(comp.value, options).test(this.value);
|
|
} else if (comp.operator === "") {
|
|
if (comp.value === "") {
|
|
return true;
|
|
}
|
|
return new Range17(this.value, options).test(comp.semver);
|
|
}
|
|
const sameDirectionIncreasing = (this.operator === ">=" || this.operator === ">") && (comp.operator === ">=" || comp.operator === ">");
|
|
const sameDirectionDecreasing = (this.operator === "<=" || this.operator === "<") && (comp.operator === "<=" || comp.operator === "<");
|
|
const sameSemVer = this.semver.version === comp.semver.version;
|
|
const differentDirectionsInclusive = (this.operator === ">=" || this.operator === "<=") && (comp.operator === ">=" || comp.operator === "<=");
|
|
const oppositeDirectionsLessThan = cmp(this.semver, "<", comp.semver, options) && (this.operator === ">=" || this.operator === ">") && (comp.operator === "<=" || comp.operator === "<");
|
|
const oppositeDirectionsGreaterThan = cmp(this.semver, ">", comp.semver, options) && (this.operator === "<=" || this.operator === "<") && (comp.operator === ">=" || comp.operator === ">");
|
|
return sameDirectionIncreasing || sameDirectionDecreasing || sameSemVer && differentDirectionsInclusive || oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
|
|
}
|
|
};
|
|
module2.exports = Comparator;
|
|
var {re, t} = require_re();
|
|
var cmp = require_cmp();
|
|
var debug = require_debug();
|
|
var SemVer = require_semver();
|
|
var Range17 = require_range();
|
|
});
|
|
|
|
// node_modules/semver/functions/satisfies.js
|
|
var require_satisfies = __commonJS((exports2, module2) => {
|
|
var Range17 = require_range();
|
|
var satisfies = (version, range, options) => {
|
|
try {
|
|
range = new Range17(range, options);
|
|
} catch (er) {
|
|
return false;
|
|
}
|
|
return range.test(version);
|
|
};
|
|
module2.exports = satisfies;
|
|
});
|
|
|
|
// node_modules/semver/ranges/to-comparators.js
|
|
var require_to_comparators = __commonJS((exports2, module2) => {
|
|
var Range17 = require_range();
|
|
var toComparators = (range, options) => new Range17(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
|
|
module2.exports = toComparators;
|
|
});
|
|
|
|
// node_modules/semver/ranges/max-satisfying.js
|
|
var require_max_satisfying = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var Range17 = require_range();
|
|
var maxSatisfying = (versions, range, options) => {
|
|
let max = null;
|
|
let maxSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range17(range, options);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!max || maxSV.compare(v) === -1) {
|
|
max = v;
|
|
maxSV = new SemVer(max, options);
|
|
}
|
|
}
|
|
});
|
|
return max;
|
|
};
|
|
module2.exports = maxSatisfying;
|
|
});
|
|
|
|
// node_modules/semver/ranges/min-satisfying.js
|
|
var require_min_satisfying = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var Range17 = require_range();
|
|
var minSatisfying = (versions, range, options) => {
|
|
let min = null;
|
|
let minSV = null;
|
|
let rangeObj = null;
|
|
try {
|
|
rangeObj = new Range17(range, options);
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
versions.forEach((v) => {
|
|
if (rangeObj.test(v)) {
|
|
if (!min || minSV.compare(v) === 1) {
|
|
min = v;
|
|
minSV = new SemVer(min, options);
|
|
}
|
|
}
|
|
});
|
|
return min;
|
|
};
|
|
module2.exports = minSatisfying;
|
|
});
|
|
|
|
// node_modules/semver/ranges/min-version.js
|
|
var require_min_version = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var Range17 = require_range();
|
|
var gt = require_gt();
|
|
var minVersion = (range, loose) => {
|
|
range = new Range17(range, loose);
|
|
let minver = new SemVer("0.0.0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = new SemVer("0.0.0-0");
|
|
if (range.test(minver)) {
|
|
return minver;
|
|
}
|
|
minver = null;
|
|
for (let i = 0; i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
comparators.forEach((comparator) => {
|
|
const compver = new SemVer(comparator.semver.version);
|
|
switch (comparator.operator) {
|
|
case ">":
|
|
if (compver.prerelease.length === 0) {
|
|
compver.patch++;
|
|
} else {
|
|
compver.prerelease.push(0);
|
|
}
|
|
compver.raw = compver.format();
|
|
case "":
|
|
case ">=":
|
|
if (!minver || gt(minver, compver)) {
|
|
minver = compver;
|
|
}
|
|
break;
|
|
case "<":
|
|
case "<=":
|
|
break;
|
|
default:
|
|
throw new Error(`Unexpected operation: ${comparator.operator}`);
|
|
}
|
|
});
|
|
}
|
|
if (minver && range.test(minver)) {
|
|
return minver;
|
|
}
|
|
return null;
|
|
};
|
|
module2.exports = minVersion;
|
|
});
|
|
|
|
// node_modules/semver/ranges/valid.js
|
|
var require_valid2 = __commonJS((exports2, module2) => {
|
|
var Range17 = require_range();
|
|
var validRange = (range, options) => {
|
|
try {
|
|
return new Range17(range, options).range || "*";
|
|
} catch (er) {
|
|
return null;
|
|
}
|
|
};
|
|
module2.exports = validRange;
|
|
});
|
|
|
|
// node_modules/semver/ranges/outside.js
|
|
var require_outside = __commonJS((exports2, module2) => {
|
|
var SemVer = require_semver();
|
|
var Comparator = require_comparator();
|
|
var {ANY} = Comparator;
|
|
var Range17 = require_range();
|
|
var satisfies = require_satisfies();
|
|
var gt = require_gt();
|
|
var lt = require_lt();
|
|
var lte = require_lte();
|
|
var gte2 = require_gte();
|
|
var outside = (version, range, hilo, options) => {
|
|
version = new SemVer(version, options);
|
|
range = new Range17(range, options);
|
|
let gtfn, ltefn, ltfn, comp, ecomp;
|
|
switch (hilo) {
|
|
case ">":
|
|
gtfn = gt;
|
|
ltefn = lte;
|
|
ltfn = lt;
|
|
comp = ">";
|
|
ecomp = ">=";
|
|
break;
|
|
case "<":
|
|
gtfn = lt;
|
|
ltefn = gte2;
|
|
ltfn = gt;
|
|
comp = "<";
|
|
ecomp = "<=";
|
|
break;
|
|
default:
|
|
throw new TypeError('Must provide a hilo val of "<" or ">"');
|
|
}
|
|
if (satisfies(version, range, options)) {
|
|
return false;
|
|
}
|
|
for (let i = 0; i < range.set.length; ++i) {
|
|
const comparators = range.set[i];
|
|
let high = null;
|
|
let low = null;
|
|
comparators.forEach((comparator) => {
|
|
if (comparator.semver === ANY) {
|
|
comparator = new Comparator(">=0.0.0");
|
|
}
|
|
high = high || comparator;
|
|
low = low || comparator;
|
|
if (gtfn(comparator.semver, high.semver, options)) {
|
|
high = comparator;
|
|
} else if (ltfn(comparator.semver, low.semver, options)) {
|
|
low = comparator;
|
|
}
|
|
});
|
|
if (high.operator === comp || high.operator === ecomp) {
|
|
return false;
|
|
}
|
|
if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) {
|
|
return false;
|
|
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
module2.exports = outside;
|
|
});
|
|
|
|
// node_modules/semver/ranges/gtr.js
|
|
var require_gtr = __commonJS((exports2, module2) => {
|
|
var outside = require_outside();
|
|
var gtr = (version, range, options) => outside(version, range, ">", options);
|
|
module2.exports = gtr;
|
|
});
|
|
|
|
// node_modules/semver/ranges/ltr.js
|
|
var require_ltr = __commonJS((exports2, module2) => {
|
|
var outside = require_outside();
|
|
var ltr = (version, range, options) => outside(version, range, "<", options);
|
|
module2.exports = ltr;
|
|
});
|
|
|
|
// node_modules/semver/ranges/intersects.js
|
|
var require_intersects = __commonJS((exports2, module2) => {
|
|
var Range17 = require_range();
|
|
var intersects = (r1, r2, options) => {
|
|
r1 = new Range17(r1, options);
|
|
r2 = new Range17(r2, options);
|
|
return r1.intersects(r2);
|
|
};
|
|
module2.exports = intersects;
|
|
});
|
|
|
|
// node_modules/semver/ranges/simplify.js
|
|
var require_simplify = __commonJS((exports2, module2) => {
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
module2.exports = (versions, range, options) => {
|
|
const set = [];
|
|
let min = null;
|
|
let prev = null;
|
|
const v = versions.sort((a, b) => compare(a, b, options));
|
|
for (const version of v) {
|
|
const included = satisfies(version, range, options);
|
|
if (included) {
|
|
prev = version;
|
|
if (!min)
|
|
min = version;
|
|
} else {
|
|
if (prev) {
|
|
set.push([min, prev]);
|
|
}
|
|
prev = null;
|
|
min = null;
|
|
}
|
|
}
|
|
if (min)
|
|
set.push([min, null]);
|
|
const ranges = [];
|
|
for (const [min2, max] of set) {
|
|
if (min2 === max)
|
|
ranges.push(min2);
|
|
else if (!max && min2 === v[0])
|
|
ranges.push("*");
|
|
else if (!max)
|
|
ranges.push(`>=${min2}`);
|
|
else if (min2 === v[0])
|
|
ranges.push(`<=${max}`);
|
|
else
|
|
ranges.push(`${min2} - ${max}`);
|
|
}
|
|
const simplified = ranges.join(" || ");
|
|
const original = typeof range.raw === "string" ? range.raw : String(range);
|
|
return simplified.length < original.length ? simplified : range;
|
|
};
|
|
});
|
|
|
|
// node_modules/semver/ranges/subset.js
|
|
var require_subset = __commonJS((exports2, module2) => {
|
|
var Range17 = require_range();
|
|
var {ANY} = require_comparator();
|
|
var satisfies = require_satisfies();
|
|
var compare = require_compare();
|
|
var subset = (sub, dom, options) => {
|
|
sub = new Range17(sub, options);
|
|
dom = new Range17(dom, options);
|
|
let sawNonNull = false;
|
|
OUTER:
|
|
for (const simpleSub of sub.set) {
|
|
for (const simpleDom of dom.set) {
|
|
const isSub = simpleSubset(simpleSub, simpleDom, options);
|
|
sawNonNull = sawNonNull || isSub !== null;
|
|
if (isSub)
|
|
continue OUTER;
|
|
}
|
|
if (sawNonNull)
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
var simpleSubset = (sub, dom, options) => {
|
|
if (sub.length === 1 && sub[0].semver === ANY)
|
|
return dom.length === 1 && dom[0].semver === ANY;
|
|
const eqSet = new Set();
|
|
let gt, lt;
|
|
for (const c of sub) {
|
|
if (c.operator === ">" || c.operator === ">=")
|
|
gt = higherGT(gt, c, options);
|
|
else if (c.operator === "<" || c.operator === "<=")
|
|
lt = lowerLT(lt, c, options);
|
|
else
|
|
eqSet.add(c.semver);
|
|
}
|
|
if (eqSet.size > 1)
|
|
return null;
|
|
let gtltComp;
|
|
if (gt && lt) {
|
|
gtltComp = compare(gt.semver, lt.semver, options);
|
|
if (gtltComp > 0)
|
|
return null;
|
|
else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<="))
|
|
return null;
|
|
}
|
|
for (const eq of eqSet) {
|
|
if (gt && !satisfies(eq, String(gt), options))
|
|
return null;
|
|
if (lt && !satisfies(eq, String(lt), options))
|
|
return null;
|
|
for (const c of dom) {
|
|
if (!satisfies(eq, String(c), options))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
let higher, lower;
|
|
let hasDomLT, hasDomGT;
|
|
for (const c of dom) {
|
|
hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
|
|
hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
|
|
if (gt) {
|
|
if (c.operator === ">" || c.operator === ">=") {
|
|
higher = higherGT(gt, c, options);
|
|
if (higher === c)
|
|
return false;
|
|
} else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options))
|
|
return false;
|
|
}
|
|
if (lt) {
|
|
if (c.operator === "<" || c.operator === "<=") {
|
|
lower = lowerLT(lt, c, options);
|
|
if (lower === c)
|
|
return false;
|
|
} else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options))
|
|
return false;
|
|
}
|
|
if (!c.operator && (lt || gt) && gtltComp !== 0)
|
|
return false;
|
|
}
|
|
if (gt && hasDomLT && !lt && gtltComp !== 0)
|
|
return false;
|
|
if (lt && hasDomGT && !gt && gtltComp !== 0)
|
|
return false;
|
|
return true;
|
|
};
|
|
var higherGT = (a, b, options) => {
|
|
if (!a)
|
|
return b;
|
|
const comp = compare(a.semver, b.semver, options);
|
|
return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
|
|
};
|
|
var lowerLT = (a, b, options) => {
|
|
if (!a)
|
|
return b;
|
|
const comp = compare(a.semver, b.semver, options);
|
|
return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
|
|
};
|
|
module2.exports = subset;
|
|
});
|
|
|
|
// node_modules/semver/index.js
|
|
var require_semver2 = __commonJS((exports2, module2) => {
|
|
var internalRe = require_re();
|
|
module2.exports = {
|
|
re: internalRe.re,
|
|
src: internalRe.src,
|
|
tokens: internalRe.t,
|
|
SEMVER_SPEC_VERSION: require_constants().SEMVER_SPEC_VERSION,
|
|
SemVer: require_semver(),
|
|
compareIdentifiers: require_identifiers().compareIdentifiers,
|
|
rcompareIdentifiers: require_identifiers().rcompareIdentifiers,
|
|
parse: require_parse(),
|
|
valid: require_valid(),
|
|
clean: require_clean(),
|
|
inc: require_inc(),
|
|
diff: require_diff(),
|
|
major: require_major(),
|
|
minor: require_minor(),
|
|
patch: require_patch(),
|
|
prerelease: require_prerelease(),
|
|
compare: require_compare(),
|
|
rcompare: require_rcompare(),
|
|
compareLoose: require_compare_loose(),
|
|
compareBuild: require_compare_build(),
|
|
sort: require_sort(),
|
|
rsort: require_rsort(),
|
|
gt: require_gt(),
|
|
lt: require_lt(),
|
|
eq: require_eq(),
|
|
neq: require_neq(),
|
|
gte: require_gte(),
|
|
lte: require_lte(),
|
|
cmp: require_cmp(),
|
|
coerce: require_coerce(),
|
|
Comparator: require_comparator(),
|
|
Range: require_range(),
|
|
satisfies: require_satisfies(),
|
|
toComparators: require_to_comparators(),
|
|
maxSatisfying: require_max_satisfying(),
|
|
minSatisfying: require_min_satisfying(),
|
|
minVersion: require_min_version(),
|
|
validRange: require_valid2(),
|
|
outside: require_outside(),
|
|
gtr: require_gtr(),
|
|
ltr: require_ltr(),
|
|
intersects: require_intersects(),
|
|
simplifyRange: require_simplify(),
|
|
subset: require_subset()
|
|
};
|
|
});
|
|
|
|
// node_modules/isexe/windows.js
|
|
var require_windows = __commonJS((exports2, module2) => {
|
|
module2.exports = isexe;
|
|
isexe.sync = sync;
|
|
var fs5 = require("fs");
|
|
function checkPathExt(path9, options) {
|
|
var pathext = options.pathExt !== void 0 ? options.pathExt : process.env.PATHEXT;
|
|
if (!pathext) {
|
|
return true;
|
|
}
|
|
pathext = pathext.split(";");
|
|
if (pathext.indexOf("") !== -1) {
|
|
return true;
|
|
}
|
|
for (var i = 0; i < pathext.length; i++) {
|
|
var p = pathext[i].toLowerCase();
|
|
if (p && path9.substr(-p.length).toLowerCase() === p) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkStat(stat, path9, options) {
|
|
if (!stat.isSymbolicLink() && !stat.isFile()) {
|
|
return false;
|
|
}
|
|
return checkPathExt(path9, options);
|
|
}
|
|
function isexe(path9, options, cb) {
|
|
fs5.stat(path9, function(er, stat) {
|
|
cb(er, er ? false : checkStat(stat, path9, options));
|
|
});
|
|
}
|
|
function sync(path9, options) {
|
|
return checkStat(fs5.statSync(path9), path9, options);
|
|
}
|
|
});
|
|
|
|
// node_modules/isexe/mode.js
|
|
var require_mode = __commonJS((exports2, module2) => {
|
|
module2.exports = isexe;
|
|
isexe.sync = sync;
|
|
var fs5 = require("fs");
|
|
function isexe(path9, options, cb) {
|
|
fs5.stat(path9, function(er, stat) {
|
|
cb(er, er ? false : checkStat(stat, options));
|
|
});
|
|
}
|
|
function sync(path9, options) {
|
|
return checkStat(fs5.statSync(path9), options);
|
|
}
|
|
function checkStat(stat, options) {
|
|
return stat.isFile() && checkMode(stat, options);
|
|
}
|
|
function checkMode(stat, options) {
|
|
var mod = stat.mode;
|
|
var uid = stat.uid;
|
|
var gid = stat.gid;
|
|
var myUid = options.uid !== void 0 ? options.uid : process.getuid && process.getuid();
|
|
var myGid = options.gid !== void 0 ? options.gid : process.getgid && process.getgid();
|
|
var u = parseInt("100", 8);
|
|
var g = parseInt("010", 8);
|
|
var o = parseInt("001", 8);
|
|
var ug = u | g;
|
|
var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0;
|
|
return ret;
|
|
}
|
|
});
|
|
|
|
// node_modules/isexe/index.js
|
|
var require_isexe = __commonJS((exports2, module2) => {
|
|
var fs5 = require("fs");
|
|
var core;
|
|
if (process.platform === "win32" || global.TESTING_WINDOWS) {
|
|
core = require_windows();
|
|
} else {
|
|
core = require_mode();
|
|
}
|
|
module2.exports = isexe;
|
|
isexe.sync = sync;
|
|
function isexe(path9, options, cb) {
|
|
if (typeof options === "function") {
|
|
cb = options;
|
|
options = {};
|
|
}
|
|
if (!cb) {
|
|
if (typeof Promise !== "function") {
|
|
throw new TypeError("callback not provided");
|
|
}
|
|
return new Promise(function(resolve, reject) {
|
|
isexe(path9, options || {}, function(er, is2) {
|
|
if (er) {
|
|
reject(er);
|
|
} else {
|
|
resolve(is2);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
core(path9, options || {}, function(er, is2) {
|
|
if (er) {
|
|
if (er.code === "EACCES" || options && options.ignoreErrors) {
|
|
er = null;
|
|
is2 = false;
|
|
}
|
|
}
|
|
cb(er, is2);
|
|
});
|
|
}
|
|
function sync(path9, options) {
|
|
try {
|
|
return core.sync(path9, options || {});
|
|
} catch (er) {
|
|
if (options && options.ignoreErrors || er.code === "EACCES") {
|
|
return false;
|
|
} else {
|
|
throw er;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// node_modules/which/which.js
|
|
var require_which = __commonJS((exports2, module2) => {
|
|
var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys";
|
|
var path9 = require("path");
|
|
var COLON = isWindows ? ";" : ":";
|
|
var isexe = require_isexe();
|
|
var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), {code: "ENOENT"});
|
|
var getPathInfo = (cmd, opt) => {
|
|
const colon = opt.colon || COLON;
|
|
const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [
|
|
...isWindows ? [process.cwd()] : [],
|
|
...(opt.path || process.env.PATH || "").split(colon)
|
|
];
|
|
const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : "";
|
|
const pathExt = isWindows ? pathExtExe.split(colon) : [""];
|
|
if (isWindows) {
|
|
if (cmd.indexOf(".") !== -1 && pathExt[0] !== "")
|
|
pathExt.unshift("");
|
|
}
|
|
return {
|
|
pathEnv,
|
|
pathExt,
|
|
pathExtExe
|
|
};
|
|
};
|
|
var which2 = (cmd, opt, cb) => {
|
|
if (typeof opt === "function") {
|
|
cb = opt;
|
|
opt = {};
|
|
}
|
|
if (!opt)
|
|
opt = {};
|
|
const {pathEnv, pathExt, pathExtExe} = getPathInfo(cmd, opt);
|
|
const found = [];
|
|
const step = (i) => new Promise((resolve, reject) => {
|
|
if (i === pathEnv.length)
|
|
return opt.all && found.length ? resolve(found) : reject(getNotFoundError(cmd));
|
|
const ppRaw = pathEnv[i];
|
|
const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
|
|
const pCmd = path9.join(pathPart, cmd);
|
|
const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
|
|
resolve(subStep(p, i, 0));
|
|
});
|
|
const subStep = (p, i, ii) => new Promise((resolve, reject) => {
|
|
if (ii === pathExt.length)
|
|
return resolve(step(i + 1));
|
|
const ext = pathExt[ii];
|
|
isexe(p + ext, {pathExt: pathExtExe}, (er, is2) => {
|
|
if (!er && is2) {
|
|
if (opt.all)
|
|
found.push(p + ext);
|
|
else
|
|
return resolve(p + ext);
|
|
}
|
|
return resolve(subStep(p, i, ii + 1));
|
|
});
|
|
});
|
|
return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
|
|
};
|
|
var whichSync = (cmd, opt) => {
|
|
opt = opt || {};
|
|
const {pathEnv, pathExt, pathExtExe} = getPathInfo(cmd, opt);
|
|
const found = [];
|
|
for (let i = 0; i < pathEnv.length; i++) {
|
|
const ppRaw = pathEnv[i];
|
|
const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
|
|
const pCmd = path9.join(pathPart, cmd);
|
|
const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
|
|
for (let j = 0; j < pathExt.length; j++) {
|
|
const cur = p + pathExt[j];
|
|
try {
|
|
const is2 = isexe.sync(cur, {pathExt: pathExtExe});
|
|
if (is2) {
|
|
if (opt.all)
|
|
found.push(cur);
|
|
else
|
|
return cur;
|
|
}
|
|
} catch (ex) {
|
|
}
|
|
}
|
|
}
|
|
if (opt.all && found.length)
|
|
return found;
|
|
if (opt.nothrow)
|
|
return null;
|
|
throw getNotFoundError(cmd);
|
|
};
|
|
module2.exports = which2;
|
|
which2.sync = whichSync;
|
|
});
|
|
|
|
// src/index.ts
|
|
__export(exports, {
|
|
activate: () => activate
|
|
});
|
|
var import_coc37 = __toModule(require("coc.nvim"));
|
|
|
|
// src/server/index.ts
|
|
var import_coc35 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol24 = __toModule(require_main3());
|
|
|
|
// src/server/typescriptServiceClientHost.ts
|
|
var import_coc34 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol23 = __toModule(require_main3());
|
|
|
|
// src/utils/arrays.ts
|
|
function equals(one, other, itemEquals = (a, b) => a === b) {
|
|
if (one.length !== other.length) {
|
|
return false;
|
|
}
|
|
for (let i = 0, len = one.length; i < len; i++) {
|
|
if (!itemEquals(one[i], other[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function flatten(arr) {
|
|
return [].concat.apply([], arr);
|
|
}
|
|
|
|
// src/server/features/fileConfigurationManager.ts
|
|
var import_coc = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol = __toModule(require_main3());
|
|
|
|
// src/server/utils/api.ts
|
|
var semver = __toModule(require_semver2());
|
|
var API2 = class {
|
|
constructor(versionString, version) {
|
|
this.versionString = versionString;
|
|
this.version = version;
|
|
}
|
|
static fromSimpleString(value) {
|
|
return new API2(value, value);
|
|
}
|
|
static fromVersionString(versionString) {
|
|
let version = semver.valid(versionString);
|
|
if (!version) {
|
|
return new API2("invalid version", "1.0.0");
|
|
}
|
|
const index = versionString.indexOf("-");
|
|
if (index >= 0) {
|
|
version = version.substr(0, index);
|
|
}
|
|
return new API2(versionString, version);
|
|
}
|
|
gte(other) {
|
|
return semver.gte(this.version, other.version);
|
|
}
|
|
lt(other) {
|
|
return !this.gte(other);
|
|
}
|
|
};
|
|
var API = API2;
|
|
API.defaultVersion = API2.fromSimpleString("1.0.0");
|
|
API.v203 = API2.fromSimpleString("2.0.3");
|
|
API.v206 = API2.fromSimpleString("2.0.6");
|
|
API.v208 = API2.fromSimpleString("2.0.8");
|
|
API.v213 = API2.fromSimpleString("2.1.3");
|
|
API.v220 = API2.fromSimpleString("2.2.0");
|
|
API.v222 = API2.fromSimpleString("2.2.2");
|
|
API.v230 = API2.fromSimpleString("2.3.0");
|
|
API.v234 = API2.fromSimpleString("2.3.4");
|
|
API.v240 = API2.fromSimpleString("2.4.0");
|
|
API.v250 = API2.fromSimpleString("2.5.0");
|
|
API.v260 = API2.fromSimpleString("2.6.0");
|
|
API.v270 = API2.fromSimpleString("2.7.0");
|
|
API.v280 = API2.fromSimpleString("2.8.0");
|
|
API.v290 = API2.fromSimpleString("2.9.0");
|
|
API.v291 = API2.fromSimpleString("2.9.1");
|
|
API.v292 = API2.fromSimpleString("2.9.2");
|
|
API.v300 = API2.fromSimpleString("3.0.0");
|
|
API.v310 = API2.fromSimpleString("3.1.0");
|
|
API.v314 = API2.fromSimpleString("3.1.4");
|
|
API.v320 = API2.fromSimpleString("3.2.0");
|
|
API.v330 = API2.fromSimpleString("3.3.0");
|
|
API.v333 = API2.fromSimpleString("3.3.3");
|
|
API.v340 = API2.fromSimpleString("3.4.0");
|
|
API.v345 = API2.fromSimpleString("3.4.5");
|
|
API.v350 = API2.fromSimpleString("3.5.0");
|
|
API.v380 = API2.fromSimpleString("3.8.0");
|
|
API.v381 = API2.fromSimpleString("3.8.1");
|
|
API.v390 = API2.fromSimpleString("3.9.0");
|
|
API.v400 = API2.fromSimpleString("4.0.0");
|
|
API.v401 = API2.fromSimpleString("4.0.1");
|
|
API.v420 = API2.fromSimpleString("4.2.0");
|
|
API.v430 = API2.fromSimpleString("4.3.0");
|
|
var api_default = API;
|
|
|
|
// src/server/features/fileConfigurationManager.ts
|
|
function objAreEqual(a, b) {
|
|
let keys = Object.keys(a);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
let key = keys[i];
|
|
if (a[key] !== b[key]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
var FileConfigurationManager = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
this.cachedMap = new Map();
|
|
this.disposables = [];
|
|
import_coc.workspace.onDidCloseTextDocument((textDocument) => {
|
|
this.cachedMap.delete(textDocument.uri);
|
|
}, void 0, this.disposables);
|
|
}
|
|
async ensureConfigurationOptions(document, insertSpaces, tabSize, token) {
|
|
const file2 = this.client.toPath(document.uri);
|
|
let options = {
|
|
tabSize,
|
|
insertSpaces
|
|
};
|
|
let cachedOption = this.cachedMap.get(document.uri);
|
|
const currentOptions = this.getFileOptions(options, document);
|
|
if (cachedOption && objAreEqual(cachedOption.formatOptions, currentOptions.formatOptions) && objAreEqual(cachedOption.preferences, currentOptions.preferences))
|
|
return;
|
|
this.cachedMap.set(document.uri, currentOptions);
|
|
const args = {
|
|
file: file2,
|
|
...currentOptions
|
|
};
|
|
await this.client.execute("configure", args, import_vscode_languageserver_protocol.CancellationToken.None);
|
|
try {
|
|
const response = await this.client.execute("configure", args, token);
|
|
if (response.type !== "response") {
|
|
this.cachedMap.delete(document.uri);
|
|
}
|
|
} catch (_e) {
|
|
this.cachedMap.delete(document.uri);
|
|
}
|
|
}
|
|
async ensureConfigurationForDocument(document, token) {
|
|
let opts = await import_coc.workspace.getFormatOptions(document.uri);
|
|
return this.ensureConfigurationOptions(document, opts.insertSpaces, opts.tabSize, token);
|
|
}
|
|
reset() {
|
|
this.cachedMap.clear();
|
|
}
|
|
getLanguageConfiguration(languageId) {
|
|
return import_coc.workspace.getConfiguration(languageId);
|
|
}
|
|
isTypeScriptDocument(languageId) {
|
|
return languageId.startsWith("typescript");
|
|
}
|
|
formatEnabled(document) {
|
|
let {languageId, uri} = document;
|
|
let language2 = languageId.startsWith("typescript") ? "typescript" : "javascript";
|
|
const config = import_coc.workspace.getConfiguration(`${language2}.format`, uri);
|
|
return config.get("enabled");
|
|
}
|
|
enableJavascript() {
|
|
const config = import_coc.workspace.getConfiguration("tsserver");
|
|
return !!config.get("enableJavascript");
|
|
}
|
|
getFileOptions(options, document) {
|
|
const lang = this.isTypeScriptDocument(document.languageId) ? "typescript" : "javascript";
|
|
return {
|
|
formatOptions: this.getFormatOptions(options, lang, document.uri),
|
|
preferences: this.getPreferences(lang, document.uri)
|
|
};
|
|
}
|
|
getFormatOptions(options, language2, uri) {
|
|
const config = import_coc.workspace.getConfiguration(`${language2}.format`, uri);
|
|
return {
|
|
tabSize: options.tabSize,
|
|
indentSize: options.tabSize,
|
|
convertTabsToSpaces: options.insertSpaces,
|
|
newLineCharacter: "\n",
|
|
insertSpaceAfterCommaDelimiter: config.get("insertSpaceAfterCommaDelimiter"),
|
|
insertSpaceAfterConstructor: config.get("insertSpaceAfterConstructor"),
|
|
insertSpaceAfterSemicolonInForStatements: config.get("insertSpaceAfterSemicolonInForStatements"),
|
|
insertSpaceBeforeAndAfterBinaryOperators: config.get("insertSpaceBeforeAndAfterBinaryOperators"),
|
|
insertSpaceAfterKeywordsInControlFlowStatements: config.get("insertSpaceAfterKeywordsInControlFlowStatements"),
|
|
insertSpaceAfterFunctionKeywordForAnonymousFunctions: config.get("insertSpaceAfterFunctionKeywordForAnonymousFunctions"),
|
|
insertSpaceBeforeFunctionParenthesis: config.get("insertSpaceBeforeFunctionParenthesis"),
|
|
insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: config.get("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"),
|
|
insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: config.get("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"),
|
|
insertSpaceAfterOpeningAndBeforeClosingEmptyBraces: config.get("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"),
|
|
insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: config.get("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"),
|
|
insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: config.get("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"),
|
|
insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: config.get("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"),
|
|
insertSpaceAfterTypeAssertion: config.get("insertSpaceAfterTypeAssertion"),
|
|
placeOpenBraceOnNewLineForFunctions: config.get("placeOpenBraceOnNewLineForFunctions"),
|
|
placeOpenBraceOnNewLineForControlBlocks: config.get("placeOpenBraceOnNewLineForControlBlocks"),
|
|
semicolons: config.get("semicolons", void 0)
|
|
};
|
|
}
|
|
getCompleteOptions(languageId) {
|
|
const lang = this.isTypeScriptDocument(languageId) ? "typescript" : "javascript";
|
|
const config = import_coc.workspace.getConfiguration(`${lang}.suggest`);
|
|
return {
|
|
enabled: config.get("enabled", true),
|
|
names: config.get("names", true),
|
|
paths: config.get("paths", true),
|
|
completeFunctionCalls: config.get("completeFunctionCalls", true),
|
|
autoImports: config.get("autoImports", true),
|
|
importStatementSuggestions: config.get("importStatements", true),
|
|
includeCompletionsForImportStatements: config.get("includeCompletionsForImportStatements", true),
|
|
includeCompletionsWithSnippetText: config.get("includeCompletionsWithSnippetText", true),
|
|
includeAutomaticOptionalChainCompletions: config.get("includeAutomaticOptionalChainCompletions", true)
|
|
};
|
|
}
|
|
getPreferences(language2, uri) {
|
|
if (this.client.apiVersion.lt(api_default.v290)) {
|
|
return {};
|
|
}
|
|
const config = import_coc.workspace.getConfiguration(`${language2}.preferences`, uri);
|
|
const preferences = {
|
|
quotePreference: this.getQuoteStyle(config),
|
|
importModuleSpecifierPreference: getImportModuleSpecifier(config),
|
|
importModuleSpecifierEnding: getImportModuleSpecifierEndingPreference(config),
|
|
allowTextChangesInNewFiles: uri.startsWith("file:"),
|
|
allowRenameOfImportPath: true,
|
|
providePrefixAndSuffixTextForRename: config.get("renameShorthandProperties", true) === false ? false : config.get("useAliasesForRenames", true),
|
|
includeCompletionsForImportStatements: this.getCompleteOptions(language2).includeCompletionsForImportStatements,
|
|
includeCompletionsWithSnippetText: this.getCompleteOptions(language2).includeCompletionsWithSnippetText
|
|
};
|
|
return preferences;
|
|
}
|
|
getQuoteStyle(config) {
|
|
let quoteStyle = config.get("quoteStyle", "auto");
|
|
if (this.client.apiVersion.gte(api_default.v333) || quoteStyle != "auto")
|
|
return quoteStyle;
|
|
return "single";
|
|
}
|
|
dispose() {
|
|
import_coc.disposeAll(this.disposables);
|
|
}
|
|
};
|
|
var fileConfigurationManager_default = FileConfigurationManager;
|
|
function getImportModuleSpecifier(config) {
|
|
let val = config.get("importModuleSpecifier");
|
|
switch (val) {
|
|
case "project-relative":
|
|
return "project-relative";
|
|
case "relative":
|
|
return "relative";
|
|
case "non-relative":
|
|
return "non-relative";
|
|
default:
|
|
return void 0;
|
|
}
|
|
}
|
|
function getImportModuleSpecifierEndingPreference(config) {
|
|
switch (config.get("importModuleSpecifierEnding")) {
|
|
case "minimal":
|
|
return "minimal";
|
|
case "index":
|
|
return "index";
|
|
case "js":
|
|
return "js";
|
|
default:
|
|
return "auto";
|
|
}
|
|
}
|
|
|
|
// src/server/features/watchBuild.ts
|
|
var import_coc2 = __toModule(require("coc.nvim"));
|
|
var import_path = __toModule(require("path"));
|
|
var import_vscode_languageserver_protocol2 = __toModule(require_main3());
|
|
var countRegex = /Found\s+(\d+)\s+error/;
|
|
var errorRegex = /^(.+)\((\d+),(\d+)\):\s(\w+)\sTS(\d+):\s*(.+)$/;
|
|
var TscStatus;
|
|
(function(TscStatus2) {
|
|
TscStatus2[TscStatus2["INIT"] = 0] = "INIT";
|
|
TscStatus2[TscStatus2["COMPILING"] = 1] = "COMPILING";
|
|
TscStatus2[TscStatus2["RUNNING"] = 2] = "RUNNING";
|
|
TscStatus2[TscStatus2["ERROR"] = 3] = "ERROR";
|
|
})(TscStatus || (TscStatus = {}));
|
|
var WatchProject2 = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
this.disposables = [];
|
|
this.statusItem = import_coc2.window.createStatusBarItem(1, {progress: true});
|
|
let task = this.task = import_coc2.workspace.createTask("TSC");
|
|
this.disposables.push(import_coc2.commands.registerCommand(WatchProject2.id, async () => {
|
|
let opts = this.options = await this.getOptions();
|
|
await this.start(opts);
|
|
}));
|
|
task.onExit((code) => {
|
|
if (code != 0) {
|
|
import_coc2.window.showMessage(`TSC exit with code ${code}`, "warning");
|
|
}
|
|
this.onStop();
|
|
});
|
|
task.onStdout((lines) => {
|
|
for (let line of lines) {
|
|
this.onLine(line);
|
|
}
|
|
});
|
|
task.onStderr((lines) => {
|
|
import_coc2.window.showMessage(`TSC error: ` + lines.join("\n"), "error");
|
|
});
|
|
this.disposables.push(import_vscode_languageserver_protocol2.Disposable.create(() => {
|
|
task.dispose();
|
|
}));
|
|
this.check().catch((_e) => {
|
|
});
|
|
}
|
|
async check() {
|
|
let running = await this.task.running;
|
|
if (running) {
|
|
this.options = await this.getOptions();
|
|
this.statusItem.isProgress = false;
|
|
this.statusItem.text = "?";
|
|
this.statusItem.show();
|
|
} else {
|
|
this.onStop();
|
|
}
|
|
}
|
|
async start(options) {
|
|
await this.task.start(options);
|
|
}
|
|
onStop() {
|
|
this.statusItem.hide();
|
|
}
|
|
onStart() {
|
|
this.statusItem.text = "compiling";
|
|
this.statusItem.isProgress = true;
|
|
this.statusItem.show();
|
|
import_coc2.workspace.nvim.call("setqflist", [[]], true);
|
|
}
|
|
onLine(line) {
|
|
if (countRegex.test(line)) {
|
|
let ms = line.match(countRegex);
|
|
this.statusItem.text = ms[1] == "0" ? "\u2713" : "\u2717";
|
|
this.statusItem.isProgress = false;
|
|
} else if (WatchProject2.startTexts.findIndex((s) => line.indexOf(s) !== -1) != -1) {
|
|
this.onStart();
|
|
} else {
|
|
let ms = line.match(errorRegex);
|
|
if (!ms)
|
|
return;
|
|
let fullpath = import_path.default.join(this.options.cwd, ms[1]);
|
|
let uri = import_coc2.Uri.file(fullpath).toString();
|
|
let doc = import_coc2.workspace.getDocument(uri);
|
|
let bufnr = doc ? doc.bufnr : null;
|
|
let item = {
|
|
filename: fullpath,
|
|
lnum: Number(ms[2]),
|
|
col: Number(ms[3]),
|
|
text: `[tsc ${ms[5]}] ${ms[6]}`,
|
|
type: /error/i.test(ms[4]) ? "E" : "W"
|
|
};
|
|
if (bufnr)
|
|
item.bufnr = bufnr;
|
|
import_coc2.workspace.nvim.call("setqflist", [[item], "a"]);
|
|
}
|
|
}
|
|
async getOptions() {
|
|
let {tscPath} = this.client;
|
|
if (!tscPath) {
|
|
import_coc2.window.showMessage(`Local & global tsc not found`, "error");
|
|
return;
|
|
}
|
|
const tsconfigPath = import_coc2.workspace.getConfiguration("tsserver").get("tsconfigPath", "tsconfig.json");
|
|
let find = await import_coc2.workspace.findUp([tsconfigPath]);
|
|
if (!find) {
|
|
import_coc2.window.showMessage(`${tsconfigPath} not found!`, "error");
|
|
return;
|
|
}
|
|
let root = import_path.default.dirname(find);
|
|
return {
|
|
cmd: tscPath,
|
|
args: ["-p", tsconfigPath, "--watch", "true", "--pretty", "false"],
|
|
cwd: root
|
|
};
|
|
}
|
|
dispose() {
|
|
import_coc2.disposeAll(this.disposables);
|
|
}
|
|
};
|
|
var WatchProject = WatchProject2;
|
|
WatchProject.id = "tsserver.watchBuild";
|
|
WatchProject.startTexts = ["Starting compilation in watch mode", "Starting incremental compilation"];
|
|
var watchBuild_default = WatchProject;
|
|
|
|
// src/server/features/workspaceSymbols.ts
|
|
var import_coc3 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol3 = __toModule(require_main3());
|
|
|
|
// src/server/protocol.const.ts
|
|
var Kind = class {
|
|
};
|
|
Kind.alias = "alias";
|
|
Kind.callSignature = "call";
|
|
Kind.class = "class";
|
|
Kind.const = "const";
|
|
Kind.constructorImplementation = "constructor";
|
|
Kind.constructSignature = "construct";
|
|
Kind.directory = "directory";
|
|
Kind.enum = "enum";
|
|
Kind.enumMember = "enum member";
|
|
Kind.externalModuleName = "external module name";
|
|
Kind.function = "function";
|
|
Kind.indexSignature = "index";
|
|
Kind.interface = "interface";
|
|
Kind.keyword = "keyword";
|
|
Kind.let = "let";
|
|
Kind.localFunction = "local function";
|
|
Kind.localVariable = "local var";
|
|
Kind.method = "method";
|
|
Kind.memberGetAccessor = "getter";
|
|
Kind.memberSetAccessor = "setter";
|
|
Kind.memberVariable = "property";
|
|
Kind.module = "module";
|
|
Kind.primitiveType = "primitive type";
|
|
Kind.script = "script";
|
|
Kind.type = "type";
|
|
Kind.variable = "var";
|
|
Kind.warning = "warning";
|
|
Kind.string = "string";
|
|
Kind.parameter = "parameter";
|
|
Kind.typeParameter = "type parameter";
|
|
var DiagnosticCategory = class {
|
|
};
|
|
DiagnosticCategory.error = "error";
|
|
DiagnosticCategory.warning = "warning";
|
|
DiagnosticCategory.suggestion = "suggestion";
|
|
var KindModifiers2 = class {
|
|
};
|
|
var KindModifiers = KindModifiers2;
|
|
KindModifiers.optional = "optional";
|
|
KindModifiers.deprecated = "deprecated";
|
|
KindModifiers.color = "color";
|
|
KindModifiers.dtsFile = ".d.ts";
|
|
KindModifiers.tsFile = ".ts";
|
|
KindModifiers.tsxFile = ".tsx";
|
|
KindModifiers.jsFile = ".js";
|
|
KindModifiers.jsxFile = ".jsx";
|
|
KindModifiers.jsonFile = ".json";
|
|
KindModifiers.fileExtensionKindModifiers = [
|
|
KindModifiers2.dtsFile,
|
|
KindModifiers2.tsFile,
|
|
KindModifiers2.tsxFile,
|
|
KindModifiers2.jsFile,
|
|
KindModifiers2.jsxFile,
|
|
KindModifiers2.jsonFile
|
|
];
|
|
var DisplayPartKind = class {
|
|
};
|
|
DisplayPartKind.functionName = "functionName";
|
|
DisplayPartKind.methodName = "methodName";
|
|
DisplayPartKind.parameterName = "parameterName";
|
|
DisplayPartKind.propertyName = "propertyName";
|
|
DisplayPartKind.punctuation = "punctuation";
|
|
DisplayPartKind.text = "text";
|
|
var EventName;
|
|
(function(EventName2) {
|
|
EventName2["syntaxDiag"] = "syntaxDiag";
|
|
EventName2["semanticDiag"] = "semanticDiag";
|
|
EventName2["suggestionDiag"] = "suggestionDiag";
|
|
EventName2["configFileDiag"] = "configFileDiag";
|
|
EventName2["telemetry"] = "telemetry";
|
|
EventName2["projectLanguageServiceState"] = "projectLanguageServiceState";
|
|
EventName2["projectsUpdatedInBackground"] = "projectsUpdatedInBackground";
|
|
EventName2["beginInstallTypes"] = "beginInstallTypes";
|
|
EventName2["endInstallTypes"] = "endInstallTypes";
|
|
EventName2["typesInstallerInitializationFailed"] = "typesInstallerInitializationFailed";
|
|
EventName2["surveyReady"] = "surveyReady";
|
|
EventName2["projectLoadingStart"] = "projectLoadingStart";
|
|
EventName2["projectLoadingFinish"] = "projectLoadingFinish";
|
|
})(EventName || (EventName = {}));
|
|
|
|
// src/server/utils/typeConverters.ts
|
|
var language = __toModule(require_main3());
|
|
var Range2;
|
|
(function(Range17) {
|
|
Range17.fromTextSpan = (span) => {
|
|
return {
|
|
start: {
|
|
line: span.start.line - 1,
|
|
character: span.start.offset - 1
|
|
},
|
|
end: {
|
|
line: span.end.line - 1,
|
|
character: span.end.offset - 1
|
|
}
|
|
};
|
|
};
|
|
Range17.fromLocations = (start, end) => language.Range.create(Math.max(0, start.line - 1), Math.max(start.offset - 1, 0), Math.max(0, end.line - 1), Math.max(0, end.offset - 1));
|
|
Range17.toFormattingRequestArgs = (file2, range) => ({
|
|
file: file2,
|
|
line: range.start.line + 1,
|
|
offset: range.start.character + 1,
|
|
endLine: range.end.line + 1,
|
|
endOffset: range.end.character + 1
|
|
});
|
|
Range17.toFileRangeRequestArgs = (file2, range) => ({
|
|
file: file2,
|
|
startLine: range.start.line + 1,
|
|
startOffset: range.start.character + 1,
|
|
endLine: range.end.line + 1,
|
|
endOffset: range.end.character + 1
|
|
});
|
|
})(Range2 || (Range2 = {}));
|
|
var Position;
|
|
(function(Position10) {
|
|
Position10.fromLocation = (tslocation) => {
|
|
return {
|
|
line: tslocation.line - 1,
|
|
character: tslocation.offset - 1
|
|
};
|
|
};
|
|
Position10.toLocation = (position) => ({
|
|
line: position.line + 1,
|
|
offset: position.character + 1
|
|
});
|
|
Position10.toFileLocationRequestArgs = (file2, position) => ({
|
|
file: file2,
|
|
line: position.line + 1,
|
|
offset: position.character + 1
|
|
});
|
|
})(Position || (Position = {}));
|
|
var Location2;
|
|
(function(Location4) {
|
|
Location4.fromTextSpan = (uri, tsTextSpan) => {
|
|
return {
|
|
uri,
|
|
range: Range2.fromTextSpan(tsTextSpan)
|
|
};
|
|
};
|
|
})(Location2 || (Location2 = {}));
|
|
var TextEdit;
|
|
(function(TextEdit6) {
|
|
TextEdit6.fromCodeEdit = (edit) => {
|
|
return {
|
|
range: Range2.fromTextSpan(edit),
|
|
newText: edit.newText
|
|
};
|
|
};
|
|
})(TextEdit || (TextEdit = {}));
|
|
var WorkspaceEdit;
|
|
(function(WorkspaceEdit6) {
|
|
function fromFileCodeEdits(client, edits) {
|
|
let changes = {};
|
|
for (const edit of edits) {
|
|
let uri = client.toResource(edit.fileName);
|
|
changes[uri] = edit.textChanges.map((change) => {
|
|
return TextEdit.fromCodeEdit(change);
|
|
});
|
|
}
|
|
return {changes};
|
|
}
|
|
WorkspaceEdit6.fromFileCodeEdits = fromFileCodeEdits;
|
|
})(WorkspaceEdit || (WorkspaceEdit = {}));
|
|
var SymbolKind2;
|
|
(function(SymbolKind5) {
|
|
function fromProtocolScriptElementKind(kind) {
|
|
switch (kind) {
|
|
case Kind.module:
|
|
return language.SymbolKind.Module;
|
|
case Kind.class:
|
|
return language.SymbolKind.Class;
|
|
case Kind.enum:
|
|
return language.SymbolKind.Enum;
|
|
case Kind.enumMember:
|
|
return language.SymbolKind.EnumMember;
|
|
case Kind.interface:
|
|
return language.SymbolKind.Interface;
|
|
case Kind.indexSignature:
|
|
return language.SymbolKind.Method;
|
|
case Kind.callSignature:
|
|
return language.SymbolKind.Method;
|
|
case Kind.method:
|
|
return language.SymbolKind.Method;
|
|
case Kind.memberVariable:
|
|
return language.SymbolKind.Property;
|
|
case Kind.memberGetAccessor:
|
|
return language.SymbolKind.Property;
|
|
case Kind.memberSetAccessor:
|
|
return language.SymbolKind.Property;
|
|
case Kind.variable:
|
|
return language.SymbolKind.Variable;
|
|
case Kind.let:
|
|
return language.SymbolKind.Variable;
|
|
case Kind.const:
|
|
return language.SymbolKind.Variable;
|
|
case Kind.localVariable:
|
|
return language.SymbolKind.Variable;
|
|
case Kind.alias:
|
|
return language.SymbolKind.Variable;
|
|
case Kind.function:
|
|
return language.SymbolKind.Function;
|
|
case Kind.localFunction:
|
|
return language.SymbolKind.Function;
|
|
case Kind.constructSignature:
|
|
return language.SymbolKind.Constructor;
|
|
case Kind.constructorImplementation:
|
|
return language.SymbolKind.Constructor;
|
|
case Kind.typeParameter:
|
|
return language.SymbolKind.TypeParameter;
|
|
case Kind.string:
|
|
return language.SymbolKind.String;
|
|
default:
|
|
return language.SymbolKind.Variable;
|
|
}
|
|
}
|
|
SymbolKind5.fromProtocolScriptElementKind = fromProtocolScriptElementKind;
|
|
})(SymbolKind2 || (SymbolKind2 = {}));
|
|
|
|
// src/server/features/workspaceSymbols.ts
|
|
function parseKindModifier(kindModifiers) {
|
|
return new Set(kindModifiers.split(/,|\s+/g));
|
|
}
|
|
function getSymbolKind(item) {
|
|
switch (item.kind) {
|
|
case "method":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Method;
|
|
case "enum":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Enum;
|
|
case "function":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Function;
|
|
case "class":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Class;
|
|
case "interface":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Interface;
|
|
case "var":
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Variable;
|
|
default:
|
|
return import_vscode_languageserver_protocol3.SymbolKind.Variable;
|
|
}
|
|
}
|
|
var TypeScriptWorkspaceSymbolProvider = class {
|
|
constructor(client, languageIds) {
|
|
this.client = client;
|
|
this.languageIds = languageIds;
|
|
}
|
|
async provideWorkspaceSymbols(search, token) {
|
|
let filepath;
|
|
if (this.searchAllOpenProjects) {
|
|
filepath = void 0;
|
|
} else {
|
|
let uri = this.getUri();
|
|
filepath = uri ? this.client.toPath(uri) : void 0;
|
|
if (!filepath && this.client.apiVersion.lt(api_default.v390)) {
|
|
return [];
|
|
}
|
|
}
|
|
const args = {
|
|
file: filepath,
|
|
searchValue: search,
|
|
maxResultCount: 256
|
|
};
|
|
const response = await this.client.execute("navto", args, token);
|
|
if (response.type !== "response" || response.body == null)
|
|
return [];
|
|
const result = [];
|
|
for (const item of response.body) {
|
|
if (!item.containerName && item.kind === "alias") {
|
|
continue;
|
|
}
|
|
const label = TypeScriptWorkspaceSymbolProvider.getLabel(item);
|
|
const range = {
|
|
start: Position.fromLocation(item.start),
|
|
end: Position.fromLocation(item.end)
|
|
};
|
|
const symbolInfo = import_vscode_languageserver_protocol3.SymbolInformation.create(label, getSymbolKind(item), range, this.client.toResource(item.file));
|
|
const kindModifiers = item.kindModifiers ? parseKindModifier(item.kindModifiers) : void 0;
|
|
if (kindModifiers == null ? void 0 : kindModifiers.has(KindModifiers.deprecated)) {
|
|
symbolInfo.tags = [import_vscode_languageserver_protocol3.SymbolTag.Deprecated];
|
|
}
|
|
result.push(symbolInfo);
|
|
}
|
|
return result;
|
|
}
|
|
static getLabel(item) {
|
|
let label = item.name;
|
|
if (item.kind === "method" || item.kind === "function") {
|
|
label += "()";
|
|
}
|
|
return label;
|
|
}
|
|
getUri() {
|
|
const documents = import_coc3.workspace.textDocuments;
|
|
for (const document of documents) {
|
|
if (this.languageIds.indexOf(document.languageId) >= 0) {
|
|
return document.uri;
|
|
}
|
|
}
|
|
return void 0;
|
|
}
|
|
get searchAllOpenProjects() {
|
|
return this.client.apiVersion.gte(api_default.v390) && import_coc3.workspace.getConfiguration("typescript").get("workspaceSymbols.scope", "allOpenProjects") === "allOpenProjects";
|
|
}
|
|
};
|
|
var workspaceSymbols_default = TypeScriptWorkspaceSymbolProvider;
|
|
|
|
// src/server/languageProvider.ts
|
|
var import_coc23 = __toModule(require("coc.nvim"));
|
|
var import_path5 = __toModule(require("path"));
|
|
var import_vscode_languageserver_protocol18 = __toModule(require_main3());
|
|
|
|
// src/server/features/baseCodeLensProvider.ts
|
|
var import_vscode_languageserver_protocol4 = __toModule(require_main3());
|
|
|
|
// src/server/utils/regexp.ts
|
|
function escapeRegExp(text) {
|
|
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
}
|
|
|
|
// src/server/features/baseCodeLensProvider.ts
|
|
var CachedNavTreeResponse = class {
|
|
constructor() {
|
|
this.version = -1;
|
|
this.document = "";
|
|
}
|
|
execute(document, f) {
|
|
if (this.matches(document)) {
|
|
return this.response;
|
|
}
|
|
return this.update(document, f());
|
|
}
|
|
matches(document) {
|
|
return this.version === document.version && this.document === document.uri.toString();
|
|
}
|
|
update(document, response) {
|
|
this.response = response;
|
|
this.version = document.version;
|
|
this.document = document.uri.toString();
|
|
return response;
|
|
}
|
|
};
|
|
var TypeScriptBaseCodeLensProvider = class {
|
|
constructor(client, cachedResponse) {
|
|
this.client = client;
|
|
this.cachedResponse = cachedResponse;
|
|
this.onDidChangeCodeLensesEmitter = new import_vscode_languageserver_protocol4.Emitter();
|
|
}
|
|
get onDidChangeCodeLenses() {
|
|
return this.onDidChangeCodeLensesEmitter.event;
|
|
}
|
|
async provideCodeLenses(document, token) {
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath) {
|
|
return [];
|
|
}
|
|
try {
|
|
const response = await this.cachedResponse.execute(document, () => this.client.execute("navtree", {file: filepath}, token));
|
|
if (!response) {
|
|
return [];
|
|
}
|
|
const tree = response.body;
|
|
const referenceableSpans = [];
|
|
if (tree && tree.childItems) {
|
|
tree.childItems.forEach((item) => this.walkNavTree(document, item, null, referenceableSpans));
|
|
}
|
|
return referenceableSpans.map((range) => {
|
|
return {
|
|
range,
|
|
data: {uri: document.uri}
|
|
};
|
|
});
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
walkNavTree(document, item, parent, results) {
|
|
if (!item) {
|
|
return;
|
|
}
|
|
const range = this.extractSymbol(document, item, parent);
|
|
if (range) {
|
|
results.push(range);
|
|
}
|
|
if (item.childItems) {
|
|
item.childItems.forEach((child) => this.walkNavTree(document, child, item, results));
|
|
}
|
|
}
|
|
getSymbolRange(document, item) {
|
|
if (!item) {
|
|
return null;
|
|
}
|
|
if (item.nameSpan) {
|
|
return Range2.fromTextSpan(item.nameSpan);
|
|
}
|
|
const span = item.spans && item.spans[0];
|
|
if (!span) {
|
|
return null;
|
|
}
|
|
const range = Range2.fromTextSpan(span);
|
|
const text = document.getText(range);
|
|
const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${escapeRegExp(item.text || "")}(\\b|\\W)`, "gm");
|
|
const match = identifierMatch.exec(text);
|
|
const prefixLength = match ? match.index + match[1].length : 0;
|
|
const startOffset = document.offsetAt(range.start) + prefixLength;
|
|
return {
|
|
start: document.positionAt(startOffset),
|
|
end: document.positionAt(startOffset + item.text.length)
|
|
};
|
|
}
|
|
};
|
|
|
|
// src/server/features/callHierarchy.ts
|
|
var import_coc4 = __toModule(require("coc.nvim"));
|
|
var import_path2 = __toModule(require("path"));
|
|
var import_vscode_languageserver_protocol5 = __toModule(require_main3());
|
|
var TypeScriptCallHierarchySupport = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async prepareCallHierarchy(document, position, token) {
|
|
const filepath = this.client.toOpenedFilePath(document.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
const response = await this.client.execute("prepareCallHierarchy", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
return Array.isArray(response.body) ? response.body.map(fromProtocolCallHierarchyItem) : fromProtocolCallHierarchyItem(response.body);
|
|
}
|
|
async provideCallHierarchyIncomingCalls(item, token) {
|
|
const filepath = this.client.toPath(item.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, item.selectionRange.start);
|
|
const response = await this.client.execute("provideCallHierarchyIncomingCalls", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
return response.body.map(fromProtocolCallHierarchyIncomingCall);
|
|
}
|
|
async provideCallHierarchyOutgoingCalls(item, token) {
|
|
const filepath = this.client.toPath(item.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, item.selectionRange.start);
|
|
const response = await this.client.execute("provideCallHierarchyOutgoingCalls", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
return response.body.map(fromProtocolCallHierarchyOutgoingCall);
|
|
}
|
|
};
|
|
TypeScriptCallHierarchySupport.minVersion = api_default.v380;
|
|
var callHierarchy_default = TypeScriptCallHierarchySupport;
|
|
function isSourceFileItem(item) {
|
|
return item.kind === Kind.script || item.kind === Kind.module && item.selectionSpan.start.line === 1 && item.selectionSpan.start.offset === 1;
|
|
}
|
|
function parseKindModifier2(kindModifiers) {
|
|
return new Set(kindModifiers.split(/,|\s+/g));
|
|
}
|
|
function fromProtocolCallHierarchyItem(item) {
|
|
var _a;
|
|
const useFileName = isSourceFileItem(item);
|
|
const name = useFileName ? import_path2.default.basename(item.file) : item.name;
|
|
const detail = useFileName ? import_path2.default.relative(import_coc4.workspace.cwd, import_path2.default.dirname(item.file)) : (_a = item.containerName) != null ? _a : "";
|
|
const result = {
|
|
name,
|
|
detail,
|
|
uri: import_coc4.Uri.file(item.file).toString(),
|
|
kind: SymbolKind2.fromProtocolScriptElementKind(item.kind),
|
|
range: Range2.fromTextSpan(item.span),
|
|
selectionRange: Range2.fromTextSpan(item.selectionSpan)
|
|
};
|
|
const kindModifiers = item.kindModifiers ? parseKindModifier2(item.kindModifiers) : void 0;
|
|
if (kindModifiers == null ? void 0 : kindModifiers.has(KindModifiers.deprecated)) {
|
|
result.tags = [import_vscode_languageserver_protocol5.SymbolTag.Deprecated];
|
|
}
|
|
return result;
|
|
}
|
|
function fromProtocolCallHierarchyIncomingCall(item) {
|
|
return {
|
|
from: fromProtocolCallHierarchyItem(item.from),
|
|
fromRanges: item.fromSpans.map(Range2.fromTextSpan)
|
|
};
|
|
}
|
|
function fromProtocolCallHierarchyOutgoingCall(item) {
|
|
return {
|
|
to: fromProtocolCallHierarchyItem(item.to),
|
|
fromRanges: item.fromSpans.map(Range2.fromTextSpan)
|
|
};
|
|
}
|
|
|
|
// src/server/features/completionItemProvider.ts
|
|
var import_coc8 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol9 = __toModule(require_main3());
|
|
|
|
// src/server/utils/codeAction.ts
|
|
var import_vscode_languageserver_protocol6 = __toModule(require_main3());
|
|
var import_coc5 = __toModule(require("coc.nvim"));
|
|
function getEditForCodeAction(client, action) {
|
|
return action.changes && action.changes.length ? WorkspaceEdit.fromFileCodeEdits(client, action.changes) : void 0;
|
|
}
|
|
async function applyCodeAction(client, action) {
|
|
const workspaceEdit = getEditForCodeAction(client, action);
|
|
if (workspaceEdit) {
|
|
if (!await import_coc5.workspace.applyEdit(workspaceEdit)) {
|
|
return false;
|
|
}
|
|
}
|
|
return applyCodeActionCommands(client, action);
|
|
}
|
|
async function applyCodeActionCommands(client, action) {
|
|
if (action.commands && action.commands.length) {
|
|
for (const command of action.commands) {
|
|
const response = await client.execute("applyCodeActionCommand", {command}, import_vscode_languageserver_protocol6.CancellationToken.None);
|
|
if (!response || response.type != "response" || !response.body) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// src/server/utils/completionItem.ts
|
|
var import_coc6 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol7 = __toModule(require_main3());
|
|
function convertCompletionEntry(tsEntry, uri, position, context) {
|
|
let label = tsEntry.name;
|
|
let sortText = tsEntry.sortText;
|
|
let preselect = false;
|
|
let detail;
|
|
if (tsEntry.isRecommended) {
|
|
preselect = true;
|
|
}
|
|
if (tsEntry.source && tsEntry.hasAction) {
|
|
sortText = "\uFFFF" + sortText;
|
|
} else {
|
|
sortText = tsEntry.sortText;
|
|
}
|
|
let kind = convertKind(tsEntry.kind);
|
|
let insertTextFormat = context.enableCallCompletions && (kind === import_coc6.CompletionItemKind.Function || kind === import_coc6.CompletionItemKind.Method) ? import_coc6.InsertTextFormat.Snippet : import_coc6.InsertTextFormat.PlainText;
|
|
let insertText = tsEntry.insertText;
|
|
let commitCharacters = getCommitCharacters(tsEntry, context);
|
|
let tags;
|
|
if (tsEntry.isImportStatementCompletion) {
|
|
insertText = label;
|
|
insertTextFormat = import_coc6.InsertTextFormat.Snippet;
|
|
}
|
|
let textEdit = null;
|
|
if (tsEntry.replacementSpan) {
|
|
let {start, end} = tsEntry.replacementSpan;
|
|
if (start.line == end.line) {
|
|
textEdit = {
|
|
range: import_coc6.Range.create(start.line - 1, start.offset - 1, end.line - 1, end.offset - 1),
|
|
newText: tsEntry.insertText || label
|
|
};
|
|
}
|
|
}
|
|
if (tsEntry.kindModifiers) {
|
|
const kindModifiers = new Set(tsEntry.kindModifiers.split(/,|\s+/g));
|
|
if (kindModifiers.has(KindModifiers.optional)) {
|
|
insertText = label;
|
|
label += "?";
|
|
}
|
|
if (kindModifiers.has(KindModifiers.deprecated)) {
|
|
tags = [import_vscode_languageserver_protocol7.CompletionItemTag.Deprecated];
|
|
}
|
|
if (kindModifiers.has(KindModifiers.color)) {
|
|
kind = import_coc6.CompletionItemKind.Color;
|
|
}
|
|
if (tsEntry.kind === Kind.script) {
|
|
for (const extModifier of KindModifiers.fileExtensionKindModifiers) {
|
|
if (kindModifiers.has(extModifier)) {
|
|
if (tsEntry.name.toLowerCase().endsWith(extModifier)) {
|
|
detail = tsEntry.name;
|
|
} else {
|
|
detail = tsEntry.name + extModifier;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
label,
|
|
insertText,
|
|
textEdit,
|
|
kind,
|
|
tags,
|
|
preselect,
|
|
insertTextFormat,
|
|
sortText,
|
|
commitCharacters,
|
|
detail,
|
|
data: {
|
|
uri,
|
|
position,
|
|
name: tsEntry.name,
|
|
data: tsEntry.data,
|
|
source: tsEntry.source || ""
|
|
}
|
|
};
|
|
}
|
|
function convertKind(kind) {
|
|
switch (kind) {
|
|
case Kind.primitiveType:
|
|
case Kind.keyword:
|
|
return import_coc6.CompletionItemKind.Keyword;
|
|
case Kind.const:
|
|
return import_coc6.CompletionItemKind.Constant;
|
|
case Kind.let:
|
|
case Kind.variable:
|
|
case Kind.localVariable:
|
|
case Kind.alias:
|
|
return import_coc6.CompletionItemKind.Variable;
|
|
case Kind.memberVariable:
|
|
case Kind.memberGetAccessor:
|
|
case Kind.memberSetAccessor:
|
|
return import_coc6.CompletionItemKind.Field;
|
|
case Kind.function:
|
|
return import_coc6.CompletionItemKind.Function;
|
|
case Kind.method:
|
|
case Kind.constructSignature:
|
|
case Kind.callSignature:
|
|
case Kind.indexSignature:
|
|
return import_coc6.CompletionItemKind.Method;
|
|
case Kind.enum:
|
|
return import_coc6.CompletionItemKind.Enum;
|
|
case Kind.module:
|
|
case Kind.externalModuleName:
|
|
return import_coc6.CompletionItemKind.Module;
|
|
case Kind.class:
|
|
case Kind.type:
|
|
return import_coc6.CompletionItemKind.Class;
|
|
case Kind.interface:
|
|
return import_coc6.CompletionItemKind.Interface;
|
|
case Kind.warning:
|
|
case Kind.script:
|
|
return import_coc6.CompletionItemKind.File;
|
|
case Kind.directory:
|
|
return import_coc6.CompletionItemKind.Folder;
|
|
}
|
|
return import_coc6.CompletionItemKind.Variable;
|
|
}
|
|
function getCommitCharacters(tsEntry, context) {
|
|
if (context.isNewIdentifierLocation || !context.isInValidCommitCharacterContext) {
|
|
return void 0;
|
|
}
|
|
const commitCharacters = [];
|
|
switch (tsEntry.kind) {
|
|
case Kind.memberGetAccessor:
|
|
case Kind.memberSetAccessor:
|
|
case Kind.constructSignature:
|
|
case Kind.callSignature:
|
|
case Kind.indexSignature:
|
|
case Kind.enum:
|
|
case Kind.interface:
|
|
commitCharacters.push(".", ";");
|
|
break;
|
|
case Kind.module:
|
|
case Kind.alias:
|
|
case Kind.const:
|
|
case Kind.let:
|
|
case Kind.variable:
|
|
case Kind.localVariable:
|
|
case Kind.memberVariable:
|
|
case Kind.class:
|
|
case Kind.function:
|
|
case Kind.method:
|
|
case Kind.keyword:
|
|
case Kind.parameter:
|
|
commitCharacters.push(".", ",", ";");
|
|
if (context.enableCallCompletions) {
|
|
commitCharacters.push("(");
|
|
}
|
|
break;
|
|
}
|
|
return commitCharacters.length === 0 ? void 0 : commitCharacters;
|
|
}
|
|
function getParameterListParts(displayParts) {
|
|
const parts = [];
|
|
let isInMethod = false;
|
|
let hasOptionalParameters = false;
|
|
let parenCount = 0;
|
|
let braceCount = 0;
|
|
outer:
|
|
for (let i = 0; i < displayParts.length; ++i) {
|
|
const part = displayParts[i];
|
|
switch (part.kind) {
|
|
case DisplayPartKind.methodName:
|
|
case DisplayPartKind.functionName:
|
|
case DisplayPartKind.text:
|
|
case DisplayPartKind.propertyName:
|
|
if (parenCount === 0 && braceCount === 0) {
|
|
isInMethod = true;
|
|
}
|
|
break;
|
|
case DisplayPartKind.parameterName:
|
|
if (parenCount === 1 && braceCount === 0 && isInMethod) {
|
|
const next = displayParts[i + 1];
|
|
const nameIsFollowedByOptionalIndicator = next && next.text === "?";
|
|
const nameIsThis = part.text === "this";
|
|
if (!nameIsFollowedByOptionalIndicator && !nameIsThis) {
|
|
parts.push(part);
|
|
}
|
|
hasOptionalParameters = hasOptionalParameters || nameIsFollowedByOptionalIndicator;
|
|
}
|
|
break;
|
|
case DisplayPartKind.punctuation:
|
|
if (part.text === "(") {
|
|
++parenCount;
|
|
} else if (part.text === ")") {
|
|
--parenCount;
|
|
if (parenCount <= 0 && isInMethod) {
|
|
break outer;
|
|
}
|
|
} else if (part.text === "..." && parenCount === 1) {
|
|
hasOptionalParameters = true;
|
|
break outer;
|
|
} else if (part.text === "{") {
|
|
++braceCount;
|
|
} else if (part.text === "}") {
|
|
--braceCount;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return {hasOptionalParameters, parts};
|
|
}
|
|
|
|
// src/server/utils/previewer.ts
|
|
var import_vscode_languageserver_protocol8 = __toModule(require_main3());
|
|
var import_coc7 = __toModule(require("coc.nvim"));
|
|
function toResource(filepath) {
|
|
return import_coc7.Uri.file(filepath);
|
|
}
|
|
function replaceLinks(text) {
|
|
return text.replace(/\{@(link|linkplain|linkcode) (https?:\/\/[^ |}]+?)(?:[| ]([^{}\n]+?))?\}/gi, (_, tag, link, text2) => {
|
|
switch (tag) {
|
|
case "linkcode":
|
|
return `[\`${text2 ? text2.trim() : link}\`](${link})`;
|
|
default:
|
|
return `[${text2 ? text2.trim() : link}](${link})`;
|
|
}
|
|
});
|
|
}
|
|
function processInlineTags(text) {
|
|
return replaceLinks(text);
|
|
}
|
|
function getTagBodyText(tag) {
|
|
if (!tag.text) {
|
|
return void 0;
|
|
}
|
|
function makeCodeblock(text2) {
|
|
if (text2.match(/^\s*[~`]{3}/g)) {
|
|
return text2;
|
|
}
|
|
return "```\n" + text2 + "\n```";
|
|
}
|
|
const text = convertLinkTags(tag.text);
|
|
switch (tag.name) {
|
|
case "example":
|
|
const captionTagMatches = text.match(/<caption>(.*?)<\/caption>\s*(\r\n|\n)/);
|
|
if (captionTagMatches && captionTagMatches.index === 0) {
|
|
return captionTagMatches[1] + "\n\n" + makeCodeblock(text.substr(captionTagMatches[0].length));
|
|
} else {
|
|
return makeCodeblock(text);
|
|
}
|
|
case "author":
|
|
const emailMatch = text.match(/(.+)\s<([-.\w]+@[-.\w]+)>/);
|
|
if (emailMatch === null) {
|
|
return text;
|
|
} else {
|
|
return `${emailMatch[1]} ${emailMatch[2]}`;
|
|
}
|
|
case "default":
|
|
return makeCodeblock(text);
|
|
}
|
|
return processInlineTags(text);
|
|
}
|
|
function getTagDocumentation(tag) {
|
|
switch (tag.name) {
|
|
case "augments":
|
|
case "extends":
|
|
case "param":
|
|
case "template":
|
|
const body = convertLinkTags(tag.text).split(/^(\S+)\s*-?\s*/);
|
|
if ((body == null ? void 0 : body.length) === 3) {
|
|
const param = body[1];
|
|
const doc = body[2];
|
|
const label2 = `*@${tag.name}* \`${param}\``;
|
|
if (!doc) {
|
|
return label2;
|
|
}
|
|
return label2 + (doc.match(/\r\n|\n/g) ? " \n" + processInlineTags(doc) : ` \u2014 ${processInlineTags(doc)}`);
|
|
}
|
|
}
|
|
const label = `*@${tag.name}*`;
|
|
const text = getTagBodyText(tag);
|
|
if (!text) {
|
|
return label;
|
|
}
|
|
return label + (text.match(/\r\n|\n/g) ? " \n" + text : ` \u2014 ${text}`);
|
|
}
|
|
function plain(parts) {
|
|
if (!parts || !parts.length)
|
|
return "";
|
|
return parts.map((part) => part.text).join("");
|
|
}
|
|
function tagsMarkdownPreview(tags) {
|
|
return (tags || []).map(getTagDocumentation).join(" \n\n");
|
|
}
|
|
function markdownDocumentation(documentation, tags) {
|
|
let out = plain(documentation);
|
|
const tagsPreview = tagsMarkdownPreview(tags);
|
|
if (tagsPreview) {
|
|
out = out + ("\n\n" + tagsPreview);
|
|
}
|
|
return {
|
|
kind: import_vscode_languageserver_protocol8.MarkupKind.Markdown,
|
|
value: out
|
|
};
|
|
}
|
|
function convertLinkTags(parts) {
|
|
var _a;
|
|
if (!parts) {
|
|
return "";
|
|
}
|
|
if (typeof parts === "string") {
|
|
return parts;
|
|
}
|
|
const out = [];
|
|
let currentLink;
|
|
for (const part of parts) {
|
|
switch (part.kind) {
|
|
case "link":
|
|
if (currentLink) {
|
|
const text = (_a = currentLink.text) != null ? _a : currentLink.name;
|
|
if (currentLink.target) {
|
|
const link = toResource(currentLink.target.file).with({
|
|
fragment: `L${currentLink.target.start.line},${currentLink.target.start.offset}`
|
|
});
|
|
out.push(`[${text}](${link.toString()})`);
|
|
} else {
|
|
if (text) {
|
|
if (/^https?:/.test(text)) {
|
|
const parts2 = text.split(" ");
|
|
if (parts2.length === 1) {
|
|
out.push(parts2[0]);
|
|
} else if (parts2.length > 1) {
|
|
out.push(`[${parts2.slice(1).join(" ")}](${parts2[0]})`);
|
|
}
|
|
} else {
|
|
out.push(text);
|
|
}
|
|
}
|
|
}
|
|
currentLink = void 0;
|
|
} else {
|
|
currentLink = {};
|
|
}
|
|
break;
|
|
case "linkName":
|
|
if (currentLink) {
|
|
currentLink.name = part.text;
|
|
currentLink.target = part.target;
|
|
}
|
|
break;
|
|
case "linkText":
|
|
if (currentLink) {
|
|
currentLink.text = part.text;
|
|
}
|
|
break;
|
|
default:
|
|
out.push(part.text);
|
|
break;
|
|
}
|
|
}
|
|
return processInlineTags(out.join(""));
|
|
}
|
|
|
|
// src/server/utils/SnippetString.ts
|
|
var SnippetString = class {
|
|
constructor(value) {
|
|
this._tabstop = 1;
|
|
this.value = value || "";
|
|
}
|
|
static isSnippetString(thing) {
|
|
if (thing instanceof SnippetString) {
|
|
return true;
|
|
}
|
|
if (!thing) {
|
|
return false;
|
|
}
|
|
return typeof thing.value === "string";
|
|
}
|
|
static _escape(value) {
|
|
return value.replace(/\$|}|\\/g, "\\$&");
|
|
}
|
|
appendText(str) {
|
|
this.value += SnippetString._escape(str);
|
|
return this;
|
|
}
|
|
appendTabstop(n = this._tabstop++) {
|
|
this.value += "$";
|
|
this.value += n;
|
|
return this;
|
|
}
|
|
appendPlaceholder(value, n = this._tabstop++) {
|
|
if (typeof value === "function") {
|
|
const nested = new SnippetString();
|
|
nested._tabstop = this._tabstop;
|
|
value(nested);
|
|
this._tabstop = nested._tabstop;
|
|
value = nested.value;
|
|
} else {
|
|
value = SnippetString._escape(value);
|
|
}
|
|
this.value += "${";
|
|
this.value += n;
|
|
this.value += ":";
|
|
this.value += value;
|
|
this.value += "}";
|
|
return this;
|
|
}
|
|
appendVariable(name, defaultValue) {
|
|
if (typeof defaultValue === "function") {
|
|
const nested = new SnippetString();
|
|
nested._tabstop = this._tabstop;
|
|
defaultValue(nested);
|
|
this._tabstop = nested._tabstop;
|
|
defaultValue = nested.value;
|
|
} else if (typeof defaultValue === "string") {
|
|
defaultValue = defaultValue.replace(/\$|}/g, "\\$&");
|
|
}
|
|
this.value += "${";
|
|
this.value += name;
|
|
if (defaultValue) {
|
|
this.value += ":";
|
|
this.value += defaultValue;
|
|
}
|
|
this.value += "}";
|
|
return this;
|
|
}
|
|
};
|
|
var SnippetString_default = SnippetString;
|
|
|
|
// src/server/features/completionItemProvider.ts
|
|
var ApplyCompletionCodeActionCommand2 = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
this.id = ApplyCompletionCodeActionCommand2.ID;
|
|
}
|
|
async execute(codeActions) {
|
|
if (codeActions.length === 0) {
|
|
return;
|
|
}
|
|
if (codeActions.length === 1) {
|
|
await applyCodeAction(this.client, codeActions[0]);
|
|
return;
|
|
}
|
|
const idx = await import_coc8.window.showQuickpick(codeActions.map((o) => o.description), "Select code action to apply");
|
|
if (idx < 0)
|
|
return;
|
|
const action = codeActions[idx];
|
|
await applyCodeAction(this.client, action);
|
|
return;
|
|
}
|
|
};
|
|
var ApplyCompletionCodeActionCommand = ApplyCompletionCodeActionCommand2;
|
|
ApplyCompletionCodeActionCommand.ID = "_typescript.applyCompletionCodeAction";
|
|
var TypeScriptCompletionItemProvider = class {
|
|
constructor(client, typingsStatus, fileConfigurationManager, languageId) {
|
|
this.client = client;
|
|
this.typingsStatus = typingsStatus;
|
|
this.fileConfigurationManager = fileConfigurationManager;
|
|
this.setCompleteOption(languageId);
|
|
import_coc8.commands.registerCommand(ApplyCompletionCodeActionCommand.ID, async (codeActions) => {
|
|
let cmd = new ApplyCompletionCodeActionCommand(this.client);
|
|
await cmd.execute(codeActions);
|
|
});
|
|
import_coc8.workspace.onDidChangeConfiguration((_e) => {
|
|
this.setCompleteOption(languageId);
|
|
});
|
|
}
|
|
setCompleteOption(languageId) {
|
|
this.completeOption = this.fileConfigurationManager.getCompleteOptions(languageId);
|
|
}
|
|
async provideCompletionItems(document, position, token, context) {
|
|
if (this.typingsStatus.isAcquiringTypings) {
|
|
return Promise.resolve({
|
|
isIncomplete: true,
|
|
items: [{
|
|
label: "Acquiring typings...",
|
|
detail: "Acquiring typings definitions for IntelliSense."
|
|
}]
|
|
});
|
|
}
|
|
let {uri} = document;
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2)
|
|
return null;
|
|
let preText = document.getText({
|
|
start: {line: position.line, character: 0},
|
|
end: position
|
|
});
|
|
let {triggerCharacter, option} = context;
|
|
if (!this.shouldTrigger(triggerCharacter, preText, option)) {
|
|
return null;
|
|
}
|
|
await this.client.interruptGetErr(() => this.fileConfigurationManager.ensureConfigurationForDocument(document, token));
|
|
const {completeOption} = this;
|
|
const args = {
|
|
...Position.toFileLocationRequestArgs(file2, position),
|
|
includeExternalModuleExports: completeOption.autoImports,
|
|
includeInsertTextCompletions: true,
|
|
triggerCharacter: this.getTsTriggerCharacter(context),
|
|
includeAutomaticOptionalChainCompletions: completeOption.includeAutomaticOptionalChainCompletions
|
|
};
|
|
let entries;
|
|
let dotAccessorContext;
|
|
let isNewIdentifierLocation = true;
|
|
let isMemberCompletion = false;
|
|
let isIncomplete = false;
|
|
const isInValidCommitCharacterContext = this.isInValidCommitCharacterContext(document, position);
|
|
if (this.client.apiVersion.gte(api_default.v300)) {
|
|
try {
|
|
const response = await this.client.interruptGetErr(() => this.client.execute("completionInfo", args, token));
|
|
if (response.type !== "response" || !response.body) {
|
|
return null;
|
|
}
|
|
isNewIdentifierLocation = response.body.isNewIdentifierLocation;
|
|
isMemberCompletion = response.body.isMemberCompletion;
|
|
if (isMemberCompletion) {
|
|
const dotMatch = preText.slice(0, position.character).match(/\??\.\s*$/) || void 0;
|
|
if (dotMatch) {
|
|
const range = import_vscode_languageserver_protocol9.Range.create({
|
|
line: position.line,
|
|
character: position.character - dotMatch.length
|
|
}, position);
|
|
const text = document.getText(range);
|
|
dotAccessorContext = {range, text};
|
|
}
|
|
}
|
|
isIncomplete = !!response.body.isIncomplete || response.metadata && response.metadata.isIncomplete;
|
|
entries = response.body.entries;
|
|
} catch (e) {
|
|
if (e.message == "No content available.") {
|
|
return null;
|
|
}
|
|
throw e;
|
|
}
|
|
} else {
|
|
const response = await this.client.interruptGetErr(() => this.client.execute("completions", args, token));
|
|
if (response.type !== "response" || !response.body) {
|
|
return null;
|
|
}
|
|
entries = response.body;
|
|
}
|
|
const completionItems = [];
|
|
for (const element of entries) {
|
|
if (shouldExcludeCompletionEntry(element, completeOption)) {
|
|
continue;
|
|
}
|
|
const item = convertCompletionEntry(element, uri, position, {
|
|
isNewIdentifierLocation,
|
|
isMemberCompletion,
|
|
enableCallCompletions: completeOption.completeFunctionCalls,
|
|
isInValidCommitCharacterContext,
|
|
dotAccessorContext
|
|
});
|
|
completionItems.push(item);
|
|
}
|
|
return {isIncomplete, items: completionItems};
|
|
}
|
|
getTsTriggerCharacter(context) {
|
|
switch (context.triggerCharacter) {
|
|
case "@":
|
|
return this.client.apiVersion.gte(api_default.v310) && this.client.apiVersion.lt(api_default.v320) ? void 0 : "@";
|
|
case "#":
|
|
return this.client.apiVersion.lt(api_default.v381) ? void 0 : "#";
|
|
case " ":
|
|
return this.client.apiVersion.gte(api_default.v430) ? " " : void 0;
|
|
case ".":
|
|
case '"':
|
|
case "'":
|
|
case "`":
|
|
case "/":
|
|
case "<":
|
|
return context.triggerCharacter;
|
|
}
|
|
return void 0;
|
|
}
|
|
async resolveCompletionItem(item, token) {
|
|
if (item == null)
|
|
return void 0;
|
|
let {uri, position, source, name, data} = item.data;
|
|
const filepath = this.client.toPath(uri);
|
|
if (!filepath)
|
|
return void 0;
|
|
let document = import_coc8.workspace.getDocument(uri);
|
|
if (!document)
|
|
return void 0;
|
|
const args = {
|
|
...Position.toFileLocationRequestArgs(filepath, position),
|
|
entryNames: [source ? {name, source, data} : name]
|
|
};
|
|
let response;
|
|
try {
|
|
response = await this.client.interruptGetErr(() => this.client.execute("completionEntryDetails", args, token));
|
|
} catch {
|
|
return item;
|
|
}
|
|
if (response.type !== "response" || !response.body || !response.body.length) {
|
|
return item;
|
|
}
|
|
const details = response.body;
|
|
if (!details || !details.length || !details[0]) {
|
|
return item;
|
|
}
|
|
const detail = details[0];
|
|
if (!item.detail && detail.displayParts.length) {
|
|
item.detail = plain(detail.displayParts);
|
|
}
|
|
item.documentation = this.getDocumentation(detail);
|
|
const {command, additionalTextEdits} = this.getCodeActions(detail, filepath);
|
|
if (command)
|
|
item.command = command;
|
|
item.additionalTextEdits = additionalTextEdits;
|
|
if (detail && item.insertTextFormat == import_vscode_languageserver_protocol9.InsertTextFormat.Snippet) {
|
|
const shouldCompleteFunction = await this.isValidFunctionCompletionContext(filepath, position, token);
|
|
if (shouldCompleteFunction) {
|
|
this.createSnippetOfFunctionCall(item, detail);
|
|
}
|
|
}
|
|
return item;
|
|
}
|
|
getCodeActions(detail, filepath) {
|
|
if (!detail.codeActions || !detail.codeActions.length) {
|
|
return {};
|
|
}
|
|
const additionalTextEdits = [];
|
|
let hasRemainingCommandsOrEdits = false;
|
|
for (const tsAction of detail.codeActions) {
|
|
if (tsAction.commands) {
|
|
hasRemainingCommandsOrEdits = true;
|
|
}
|
|
if (tsAction.changes) {
|
|
for (const change of tsAction.changes) {
|
|
if (change.fileName === filepath) {
|
|
additionalTextEdits.push(...change.textChanges.map(TextEdit.fromCodeEdit));
|
|
} else {
|
|
hasRemainingCommandsOrEdits = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
let command = null;
|
|
if (hasRemainingCommandsOrEdits) {
|
|
command = {
|
|
title: "",
|
|
command: ApplyCompletionCodeActionCommand.ID,
|
|
arguments: [
|
|
detail.codeActions.map((x) => ({
|
|
commands: x.commands,
|
|
description: x.description,
|
|
changes: x.changes.filter((x2) => x2.fileName !== filepath)
|
|
}))
|
|
]
|
|
};
|
|
}
|
|
return {
|
|
command,
|
|
additionalTextEdits: additionalTextEdits.length ? additionalTextEdits : void 0
|
|
};
|
|
}
|
|
shouldTrigger(triggerCharacter, pre, option) {
|
|
if (triggerCharacter && this.client.apiVersion.lt(api_default.v290)) {
|
|
if (triggerCharacter === "@") {
|
|
if (option.synname && /string/i.test(option.synname)) {
|
|
return true;
|
|
}
|
|
if (!pre.match(/^\s*\*[ ]?@/) && !pre.match(/\/\*\*+[ ]?@/)) {
|
|
return false;
|
|
}
|
|
} else if (triggerCharacter === "<") {
|
|
return false;
|
|
}
|
|
}
|
|
if (triggerCharacter === " ") {
|
|
if (!this.completeOption.importStatementSuggestions || !this.client.apiVersion.lt(api_default.v430)) {
|
|
return false;
|
|
}
|
|
return pre === "import ";
|
|
}
|
|
return true;
|
|
}
|
|
getDocumentation(detail) {
|
|
let documentation = "";
|
|
if (detail.source) {
|
|
const importPath = `'${plain(detail.source)}'`;
|
|
const autoImportLabel = `Auto import from ${importPath}`;
|
|
documentation += `${autoImportLabel}
|
|
`;
|
|
}
|
|
let parts = [
|
|
plain(detail.documentation),
|
|
tagsMarkdownPreview(detail.tags)
|
|
];
|
|
parts = parts.filter((s) => s && s.trim() != "");
|
|
documentation += parts.join("\n\n");
|
|
if (documentation.length) {
|
|
return {
|
|
kind: import_vscode_languageserver_protocol9.MarkupKind.Markdown,
|
|
value: documentation
|
|
};
|
|
}
|
|
return void 0;
|
|
}
|
|
createSnippetOfFunctionCall(item, detail) {
|
|
let {displayParts} = detail;
|
|
const parameterListParts = getParameterListParts(displayParts);
|
|
const snippet = new SnippetString_default();
|
|
snippet.appendText(`${item.insertText || item.label}(`);
|
|
appendJoinedPlaceholders(snippet, parameterListParts.parts, ", ");
|
|
if (parameterListParts.hasOptionalParameters) {
|
|
snippet.appendTabstop();
|
|
}
|
|
snippet.appendText(")");
|
|
snippet.appendTabstop(0);
|
|
item.insertText = snippet.value;
|
|
}
|
|
async isValidFunctionCompletionContext(filepath, position, token) {
|
|
try {
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
const response = await this.client.execute("quickinfo", args, token);
|
|
if (response.type !== "response") {
|
|
return true;
|
|
}
|
|
const {body} = response;
|
|
switch (body && body.kind) {
|
|
case "var":
|
|
case "let":
|
|
case "const":
|
|
case "alias":
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
} catch (e) {
|
|
return true;
|
|
}
|
|
}
|
|
isInValidCommitCharacterContext(document, position) {
|
|
if (this.client.apiVersion.lt(api_default.v320)) {
|
|
if (position.character > 1) {
|
|
const preText = document.getText(import_vscode_languageserver_protocol9.Range.create(position.line, 0, position.line, position.character));
|
|
return preText.match(/(\s|^)\.$/ig) === null;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
TypeScriptCompletionItemProvider.triggerCharacters = [".", '"', "'", "`", "/", "@", "<", "#", " "];
|
|
var completionItemProvider_default = TypeScriptCompletionItemProvider;
|
|
function shouldExcludeCompletionEntry(element, completionConfiguration) {
|
|
return !completionConfiguration.names && element.kind === Kind.warning || !completionConfiguration.paths && (element.kind === Kind.directory || element.kind === Kind.script || element.kind === Kind.externalModuleName) || !completionConfiguration.autoImports && element.hasAction;
|
|
}
|
|
function appendJoinedPlaceholders(snippet, parts, joiner) {
|
|
for (let i = 0; i < parts.length; ++i) {
|
|
const paramterPart = parts[i];
|
|
snippet.appendPlaceholder(paramterPart.text);
|
|
if (i !== parts.length - 1) {
|
|
snippet.appendText(joiner);
|
|
}
|
|
}
|
|
}
|
|
|
|
// src/server/features/definitionProvider.ts
|
|
var TypeScriptDefinitionProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async getSymbolLocations(definitionType, document, position, token) {
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
try {
|
|
const response = await this.client.execute(definitionType, args, token);
|
|
const locations = response.type == "response" && response.body || [];
|
|
return locations.map((location) => Location2.fromTextSpan(this.client.toResource(location.file), location));
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
async provideDefinition(document, position, token) {
|
|
if (this.client.apiVersion.gte(api_default.v270)) {
|
|
const filepath = this.client.toOpenedFilePath(document.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
const response = await this.client.execute("definitionAndBoundSpan", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
const span = response.body.textSpan ? Range2.fromTextSpan(response.body.textSpan) : void 0;
|
|
return response.body.definitions.map((location) => {
|
|
const target = Location2.fromTextSpan(this.client.toResource(location.file), location);
|
|
if (location.contextStart && location.contextEnd) {
|
|
return {
|
|
originSelectionRange: span,
|
|
targetRange: Range2.fromLocations(location.contextStart, location.contextEnd),
|
|
targetUri: target.uri,
|
|
targetSelectionRange: target.range
|
|
};
|
|
}
|
|
return {
|
|
originSelectionRange: span,
|
|
targetRange: target.range,
|
|
targetUri: target.uri,
|
|
targetSelectionRange: target.range
|
|
};
|
|
});
|
|
}
|
|
return await this.getSymbolLocations("definition", document, position, token);
|
|
}
|
|
provideTypeDefinition(document, position, token) {
|
|
return this.getSymbolLocations("typeDefinition", document, position, token);
|
|
}
|
|
provideImplementation(document, position, token) {
|
|
return this.getSymbolLocations("implementation", document, position, token);
|
|
}
|
|
};
|
|
var definitionProvider_default = TypeScriptDefinitionProvider;
|
|
|
|
// src/server/features/directiveCommentCompletions.ts
|
|
var import_coc9 = __toModule(require("coc.nvim"));
|
|
var import_coc10 = __toModule(require("coc.nvim"));
|
|
var tsDirectives = [
|
|
{
|
|
value: "@ts-check",
|
|
description: "Enables semantic checking in a JavaScript file. Must be at the top of a file."
|
|
},
|
|
{
|
|
value: "@ts-nocheck",
|
|
description: "Disables semantic checking in a JavaScript file. Must be at the top of a file."
|
|
},
|
|
{
|
|
value: "@ts-ignore",
|
|
description: "Suppresses @ts-check errors on the next line of a file."
|
|
}
|
|
];
|
|
var tsDirectives390 = [
|
|
...tsDirectives,
|
|
{
|
|
value: "@ts-expect-error",
|
|
description: "Suppresses @ts-check errors on the next line of a file, expecting at least one to exist."
|
|
}
|
|
];
|
|
var DirectiveCommentCompletionProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
provideCompletionItems(document, position, _token, context) {
|
|
if (context.triggerCharacter != "@") {
|
|
return [];
|
|
}
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2) {
|
|
return [];
|
|
}
|
|
const doc = import_coc10.workspace.getDocument(document.uri);
|
|
const line = doc.getline(position.line);
|
|
const prefix = line.slice(0, position.character);
|
|
const match = prefix.match(/^\s*\/\/+\s?(@[a-zA-Z\-]*)?$/);
|
|
if (match) {
|
|
const directives = this.client.apiVersion.gte(api_default.v390) ? tsDirectives390 : tsDirectives;
|
|
let items = directives.map((directive) => {
|
|
const item = {label: directive.value};
|
|
item.kind = import_coc9.CompletionItemKind.Snippet;
|
|
item.detail = directive.description;
|
|
item.textEdit = {
|
|
range: import_coc9.Range.create(position.line, Math.max(0, position.character - (match[1] ? match[1].length : 0)), position.line, position.character),
|
|
newText: directive.value
|
|
};
|
|
return item;
|
|
});
|
|
let res = {
|
|
isIncomplete: false,
|
|
items
|
|
};
|
|
res.startcol = doc.fixStartcol(position, ["@"]);
|
|
return res;
|
|
}
|
|
return [];
|
|
}
|
|
};
|
|
var directiveCommentCompletions_default = DirectiveCommentCompletionProvider;
|
|
|
|
// src/server/features/documentHighlight.ts
|
|
var import_vscode_languageserver_protocol10 = __toModule(require_main3());
|
|
var TypeScriptDocumentHighlightProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideDocumentHighlights(resource, position, token) {
|
|
const file2 = this.client.toPath(resource.uri);
|
|
if (!file2)
|
|
return [];
|
|
const args = {
|
|
...Position.toFileLocationRequestArgs(file2, position),
|
|
filesToSearch: [file2]
|
|
};
|
|
try {
|
|
const response = await this.client.execute("documentHighlights", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return [];
|
|
}
|
|
return flatten(response.body.filter((highlight) => highlight.file === file2).map(convertDocumentHighlight));
|
|
} catch (_e) {
|
|
return [];
|
|
}
|
|
}
|
|
};
|
|
var documentHighlight_default = TypeScriptDocumentHighlightProvider;
|
|
function convertDocumentHighlight(highlight) {
|
|
return highlight.highlightSpans.map((span) => {
|
|
return {
|
|
range: Range2.fromTextSpan(span),
|
|
kind: span.kind === "writtenReference" ? import_vscode_languageserver_protocol10.DocumentHighlightKind.Write : import_vscode_languageserver_protocol10.DocumentHighlightKind.Read
|
|
};
|
|
});
|
|
}
|
|
|
|
// src/server/features/documentSymbol.ts
|
|
var import_vscode_languageserver_protocol11 = __toModule(require_main3());
|
|
var getSymbolKind2 = (kind) => {
|
|
switch (kind) {
|
|
case Kind.module:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Module;
|
|
case Kind.class:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Class;
|
|
case Kind.enum:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Enum;
|
|
case Kind.interface:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Interface;
|
|
case Kind.method:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Method;
|
|
case Kind.memberVariable:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Property;
|
|
case Kind.memberGetAccessor:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Property;
|
|
case Kind.memberSetAccessor:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Property;
|
|
case Kind.variable:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Variable;
|
|
case Kind.const:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Variable;
|
|
case Kind.localVariable:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Variable;
|
|
case Kind.variable:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Variable;
|
|
case Kind.constructSignature:
|
|
case Kind.constructorImplementation:
|
|
case Kind.function:
|
|
case Kind.localFunction:
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Function;
|
|
}
|
|
return import_vscode_languageserver_protocol11.SymbolKind.Variable;
|
|
};
|
|
var TypeScriptDocumentSymbolProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideDocumentSymbols(resource, token) {
|
|
const filepath = this.client.toPath(resource.uri);
|
|
if (!filepath)
|
|
return [];
|
|
const args = {
|
|
file: filepath
|
|
};
|
|
try {
|
|
const response = await this.client.execute("navtree", args, token);
|
|
if (response.type == "response" && response.body) {
|
|
const tree = response.body;
|
|
if (tree.childItems) {
|
|
const result = new Array();
|
|
tree.childItems.forEach((item) => TypeScriptDocumentSymbolProvider.convertNavTree(result, item));
|
|
return result;
|
|
}
|
|
}
|
|
return [];
|
|
} catch (e) {
|
|
return [];
|
|
}
|
|
}
|
|
static convertNavTree(output, item) {
|
|
let shouldInclude = TypeScriptDocumentSymbolProvider.shouldInclueEntry(item);
|
|
const children = new Set(item.childItems || []);
|
|
for (const span of item.spans) {
|
|
const range = Range2.fromTextSpan(span);
|
|
const symbolInfo = TypeScriptDocumentSymbolProvider.convertSymbol(item, range);
|
|
if (children.size)
|
|
symbolInfo.children = [];
|
|
for (const child of children) {
|
|
if (child.spans.some((span2) => !!containsRange(range, Range2.fromTextSpan(span2)))) {
|
|
const includedChild = TypeScriptDocumentSymbolProvider.convertNavTree(symbolInfo.children, child);
|
|
shouldInclude = shouldInclude || includedChild;
|
|
children.delete(child);
|
|
}
|
|
}
|
|
if (shouldInclude) {
|
|
output.push(symbolInfo);
|
|
}
|
|
}
|
|
return shouldInclude;
|
|
}
|
|
static convertSymbol(item, range) {
|
|
const selectionRange = item.nameSpan ? Range2.fromTextSpan(item.nameSpan) : range;
|
|
let label = item.text;
|
|
switch (item.kind) {
|
|
case Kind.memberGetAccessor:
|
|
label = `(get) ${label}`;
|
|
break;
|
|
case Kind.memberSetAccessor:
|
|
label = `(set) ${label}`;
|
|
break;
|
|
}
|
|
const symbolInfo = import_vscode_languageserver_protocol11.DocumentSymbol.create(label, "", getSymbolKind2(item.kind), range, containsRange(range, selectionRange) ? selectionRange : range);
|
|
const kindModifiers = parseKindModifier3(item.kindModifiers);
|
|
if (kindModifiers.has(KindModifiers.deprecated)) {
|
|
symbolInfo.tags = [import_vscode_languageserver_protocol11.SymbolTag.Deprecated];
|
|
}
|
|
return symbolInfo;
|
|
}
|
|
static shouldInclueEntry(item) {
|
|
if (item.kind === Kind.alias) {
|
|
return false;
|
|
}
|
|
return !!(item.text && item.text !== "<function>" && item.text !== "<class>");
|
|
}
|
|
};
|
|
var documentSymbol_default = TypeScriptDocumentSymbolProvider;
|
|
function containsRange(range, otherRange) {
|
|
if (otherRange.start.line < range.start.line || otherRange.end.line < range.start.line) {
|
|
return false;
|
|
}
|
|
if (otherRange.start.line > range.end.line || otherRange.end.line > range.end.line) {
|
|
return false;
|
|
}
|
|
if (otherRange.start.line === range.start.line && otherRange.start.character < range.start.character) {
|
|
return false;
|
|
}
|
|
if (otherRange.end.line === range.end.line && otherRange.end.character > range.end.character) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function parseKindModifier3(kindModifiers) {
|
|
return new Set(kindModifiers.split(/,|\s+/g));
|
|
}
|
|
|
|
// src/server/features/folding.ts
|
|
var import_coc11 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_types = __toModule(require_main2());
|
|
var TypeScriptFoldingProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideFoldingRanges(document, _context, token) {
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2) {
|
|
return;
|
|
}
|
|
const args = {file: file2};
|
|
const res = await this.client.execute("getOutliningSpans", args, token);
|
|
if (res.type != "response") {
|
|
return;
|
|
}
|
|
const {body} = res;
|
|
if (!body) {
|
|
return;
|
|
}
|
|
return body.map((span) => this.convertOutliningSpan(span, document)).filter((foldingRange) => !!foldingRange);
|
|
}
|
|
convertOutliningSpan(span, document) {
|
|
const range = Range2.fromTextSpan(span.textSpan);
|
|
const kind = TypeScriptFoldingProvider.getFoldingRangeKind(span);
|
|
if (span.kind === "comment") {
|
|
let doc = import_coc11.workspace.getDocument(document.uri);
|
|
const line = doc.getline(range.start.line);
|
|
if (line.match(/\/\/\s*#endregion/gi)) {
|
|
return void 0;
|
|
}
|
|
}
|
|
let {start, end} = range;
|
|
return import_vscode_languageserver_types.FoldingRange.create(start.line, end.line, start.character, end.character, kind);
|
|
}
|
|
static getFoldingRangeKind(span) {
|
|
switch (span.kind) {
|
|
case "comment":
|
|
case "region":
|
|
case "imports":
|
|
case "code":
|
|
return span.kind;
|
|
default:
|
|
return void 0;
|
|
}
|
|
}
|
|
};
|
|
var folding_default = TypeScriptFoldingProvider;
|
|
|
|
// src/server/features/formatting.ts
|
|
var import_coc12 = __toModule(require("coc.nvim"));
|
|
var TypeScriptFormattingProvider = class {
|
|
constructor(client, formattingOptionsManager) {
|
|
this.client = client;
|
|
this.formattingOptionsManager = formattingOptionsManager;
|
|
}
|
|
enabled(document) {
|
|
return this.formattingOptionsManager.formatEnabled(document);
|
|
}
|
|
async doFormat(document, options, args, token) {
|
|
if (!this.enabled(document))
|
|
return [];
|
|
await this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize, token);
|
|
try {
|
|
const response = await this.client.execute("format", args, token);
|
|
if (response.type == "response" && response.body) {
|
|
let edits = response.body.map(TextEdit.fromCodeEdit);
|
|
return edits;
|
|
}
|
|
} catch {
|
|
}
|
|
return [];
|
|
}
|
|
async provideDocumentRangeFormattingEdits(document, range, options, token) {
|
|
if (!this.enabled(document))
|
|
return [];
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath)
|
|
return [];
|
|
const args = {
|
|
file: filepath,
|
|
line: range.start.line + 1,
|
|
offset: range.start.character + 1,
|
|
endLine: range.end.line + 1,
|
|
endOffset: range.end.character + 1
|
|
};
|
|
return this.doFormat(document, options, args, token);
|
|
}
|
|
async provideDocumentFormattingEdits(document, options, token) {
|
|
if (!this.enabled(document))
|
|
return [];
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath)
|
|
return [];
|
|
const args = {
|
|
file: filepath,
|
|
line: 1,
|
|
offset: 1,
|
|
endLine: document.lineCount + 1,
|
|
endOffset: 1
|
|
};
|
|
return this.doFormat(document, options, args, token);
|
|
}
|
|
async provideOnTypeFormattingEdits(document, position, ch, options, token) {
|
|
if (!this.enabled(document))
|
|
return [];
|
|
if (!this.client.configuration.formatOnType)
|
|
return [];
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2)
|
|
return [];
|
|
await this.formattingOptionsManager.ensureConfigurationOptions(document, options.insertSpaces, options.tabSize, token);
|
|
const doc = import_coc12.workspace.getDocument(document.uri);
|
|
const args = {
|
|
...Position.toFileLocationRequestArgs(file2, position),
|
|
key: ch
|
|
};
|
|
try {
|
|
const res = await this.client.execute("formatonkey", args, token);
|
|
if (res.type != "response") {
|
|
return [];
|
|
}
|
|
const {body} = res;
|
|
const edits = body;
|
|
const result = [];
|
|
if (!edits) {
|
|
return result;
|
|
}
|
|
for (const edit of edits) {
|
|
const textEdit = TextEdit.fromCodeEdit(edit);
|
|
const range = textEdit.range;
|
|
if (range.start.character === 0 && range.start.line === range.end.line && textEdit.newText === "") {
|
|
const lText = doc.getline(range.start.line);
|
|
if (lText.trim().length > 0 || lText.length > range.end.character) {
|
|
result.push(textEdit);
|
|
}
|
|
} else {
|
|
result.push(textEdit);
|
|
}
|
|
}
|
|
return result;
|
|
} catch {
|
|
}
|
|
return [];
|
|
}
|
|
};
|
|
var formatting_default = TypeScriptFormattingProvider;
|
|
|
|
// src/server/features/hover.ts
|
|
var TypeScriptHoverProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideHover(document, position, token) {
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
try {
|
|
const response = await this.client.interruptGetErr(() => this.client.execute("quickinfo", args, token));
|
|
if (response && response.type == "response" && response.body) {
|
|
const data = response.body;
|
|
return {
|
|
contents: TypeScriptHoverProvider.getContents(data),
|
|
range: Range2.fromTextSpan(data)
|
|
};
|
|
}
|
|
} catch (e) {
|
|
}
|
|
return void 0;
|
|
}
|
|
static getContents(data) {
|
|
const parts = [];
|
|
if (data.displayString) {
|
|
parts.push({language: "typescript", value: data.displayString});
|
|
}
|
|
const tags = tagsMarkdownPreview(data.tags);
|
|
parts.push(data.documentation + (tags ? "\n\n" + tags : ""));
|
|
return parts;
|
|
}
|
|
};
|
|
var hover_default = TypeScriptHoverProvider;
|
|
|
|
// src/server/features/implementationsCodeLens.ts
|
|
var TypeScriptImplementationsCodeLensProvider = class extends TypeScriptBaseCodeLensProvider {
|
|
async resolveCodeLens(codeLens, token) {
|
|
let {uri} = codeLens.data;
|
|
let filepath = this.client.toPath(uri);
|
|
const args = Position.toFileLocationRequestArgs(filepath, codeLens.range.start);
|
|
try {
|
|
const response = await this.client.execute("implementation", args, token, {lowPriority: true});
|
|
if (response && response.type == "response" && response.body) {
|
|
const locations = response.body.map((reference) => {
|
|
return {
|
|
uri: this.client.toResource(reference.file),
|
|
range: {
|
|
start: Position.fromLocation(reference.start),
|
|
end: {
|
|
line: reference.start.line,
|
|
character: 0
|
|
}
|
|
}
|
|
};
|
|
}).filter((location) => !(location.uri.toString() === uri && location.range.start.line === codeLens.range.start.line && location.range.start.character === codeLens.range.start.character));
|
|
codeLens.command = this.getCommand(locations, codeLens);
|
|
return codeLens;
|
|
}
|
|
} catch {
|
|
}
|
|
codeLens.command = {
|
|
title: "0 implementations",
|
|
command: ""
|
|
};
|
|
return codeLens;
|
|
}
|
|
getCommand(locations, codeLens) {
|
|
let {uri} = codeLens.data;
|
|
return {
|
|
title: this.getTitle(locations),
|
|
command: locations.length ? "editor.action.showReferences" : "",
|
|
arguments: [uri, codeLens.range.start, locations]
|
|
};
|
|
}
|
|
getTitle(locations) {
|
|
return locations.length === 1 ? "1 implementation" : `${locations.length} implementations`;
|
|
}
|
|
extractSymbol(document, item, _parent) {
|
|
switch (item.kind) {
|
|
case Kind.interface:
|
|
return super.getSymbolRange(document, item);
|
|
case Kind.class:
|
|
case Kind.method:
|
|
case Kind.memberVariable:
|
|
case Kind.memberGetAccessor:
|
|
case Kind.memberSetAccessor:
|
|
if (item.kindModifiers.match(/\babstract\b/g)) {
|
|
return super.getSymbolRange(document, item);
|
|
}
|
|
break;
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
var implementationsCodeLens_default = TypeScriptImplementationsCodeLensProvider;
|
|
|
|
// src/server/features/importFix.ts
|
|
var import_coc13 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol12 = __toModule(require_main3());
|
|
|
|
// src/server/utils/helper.ts
|
|
var nodeModules = [
|
|
"assert",
|
|
"cluster",
|
|
"crypto",
|
|
"dns",
|
|
"domain",
|
|
"events",
|
|
"fs",
|
|
"http",
|
|
"http2",
|
|
"https",
|
|
"inspector",
|
|
"net",
|
|
"os",
|
|
"path",
|
|
"punycode",
|
|
"querystring",
|
|
"readline",
|
|
"repl",
|
|
"stream",
|
|
"string_decoder",
|
|
"tls",
|
|
"tty",
|
|
"url",
|
|
"util",
|
|
"v8",
|
|
"vm",
|
|
"zlib",
|
|
"perf_hooks"
|
|
];
|
|
|
|
// src/server/features/importFix.ts
|
|
var ImportFixProvider = class {
|
|
constructor(bufferSyncSupport) {
|
|
this.bufferSyncSupport = bufferSyncSupport;
|
|
}
|
|
async provideCodeActions(document, _range, context, _token) {
|
|
if (this.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
|
|
return [];
|
|
}
|
|
let diagnostics = context.diagnostics.filter((d) => d.code == 2304);
|
|
if (!diagnostics.length)
|
|
return [];
|
|
let edits = [];
|
|
let names = [];
|
|
let doc = import_coc13.workspace.getDocument(document.uri);
|
|
let command;
|
|
for (const diagnostic of diagnostics) {
|
|
let {range} = diagnostic;
|
|
let line = doc.getline(range.start.line);
|
|
let name = line.slice(range.start.character, range.end.character);
|
|
if (names.indexOf(name) !== -1)
|
|
continue;
|
|
if (nodeModules.indexOf(name) !== -1) {
|
|
names.push(name);
|
|
edits.push({
|
|
range: import_vscode_languageserver_protocol12.Range.create(0, 0, 0, 0),
|
|
newText: `import ${name} from '${name}'
|
|
`
|
|
});
|
|
command = "tsserver.organizeImports";
|
|
}
|
|
}
|
|
let edit = {
|
|
changes: {
|
|
[document.uri]: edits
|
|
}
|
|
};
|
|
let cmd = null;
|
|
if (command)
|
|
cmd = {
|
|
title: `fix import`,
|
|
command: "tsserver.organizeImports"
|
|
};
|
|
return [{
|
|
title: `Add import ${names.join(", ")}`,
|
|
edit,
|
|
command: cmd
|
|
}];
|
|
}
|
|
};
|
|
var importFix_default = ImportFixProvider;
|
|
|
|
// src/server/features/moduleInstall.ts
|
|
var import_coc15 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol13 = __toModule(require_main3());
|
|
|
|
// src/server/utils/modules.ts
|
|
var import_child_process = __toModule(require("child_process"));
|
|
var import_coc14 = __toModule(require("coc.nvim"));
|
|
var import_fs = __toModule(require("fs"));
|
|
var import_path3 = __toModule(require("path"));
|
|
function runCommand(cmd, cwd, timeout) {
|
|
return new Promise((resolve, reject) => {
|
|
let timer;
|
|
if (timeout) {
|
|
timer = setTimeout(() => {
|
|
reject(new Error(`timeout after ${timeout}s`));
|
|
}, timeout * 1e3);
|
|
}
|
|
import_child_process.exec(cmd, {cwd}, (err, stdout) => {
|
|
if (timer)
|
|
clearTimeout(timer);
|
|
if (err) {
|
|
reject(new Error(`exited with ${err.code}`));
|
|
return;
|
|
}
|
|
resolve(stdout);
|
|
});
|
|
});
|
|
}
|
|
async function getManager() {
|
|
let res = await import_coc14.workspace.findUp(["yarn.lock", "package-lock.json"]);
|
|
if (!res)
|
|
return "yarn";
|
|
return res.endsWith("yarn.lock") ? "yarn" : "npm";
|
|
}
|
|
async function moduleExists(name) {
|
|
try {
|
|
let content = await runCommand(`npm info ${name} --json`, process.cwd());
|
|
if (!content)
|
|
return false;
|
|
let obj = JSON.parse(content);
|
|
if (obj.error != null)
|
|
return false;
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
function distinct(array, keyFn) {
|
|
if (!keyFn) {
|
|
return array.filter((element, position) => {
|
|
return array.indexOf(element) === position;
|
|
});
|
|
}
|
|
const seen = Object.create(null);
|
|
return array.filter((elem) => {
|
|
const key = keyFn(elem);
|
|
if (seen[key]) {
|
|
return false;
|
|
}
|
|
seen[key] = true;
|
|
return true;
|
|
});
|
|
}
|
|
async function installModules(uri, names) {
|
|
names = distinct(names);
|
|
let workspaceFolder = import_coc14.workspace.getWorkspaceFolder(uri);
|
|
let root = workspaceFolder ? import_coc14.Uri.parse(workspaceFolder.uri).fsPath : void 0;
|
|
if (!root || !import_fs.default.existsSync(import_path3.default.join(root, "package.json"))) {
|
|
import_coc14.window.showMessage(`package.json not found from workspaceFolder: ${root}`, "error");
|
|
return;
|
|
}
|
|
let arr = names.concat(names.map((s) => `@types/${s}`));
|
|
let statusItem = import_coc14.window.createStatusBarItem(99, {progress: true});
|
|
statusItem.text = `Checking module ${arr.join(" ")}`;
|
|
statusItem.show();
|
|
let exists = await Promise.all(arr.map((name) => {
|
|
return moduleExists(name).then((exists2) => {
|
|
return exists2 ? name : null;
|
|
});
|
|
}));
|
|
let manager = await getManager();
|
|
exists = exists.filter((s) => s != null);
|
|
if (!exists.length)
|
|
return;
|
|
let devs = exists.filter((s) => s.startsWith("@types"));
|
|
let deps = exists.filter((s) => devs.indexOf(s) == -1);
|
|
statusItem.text = `Installing ${exists.join(" ")}`;
|
|
try {
|
|
let cmd = manager == "npm" ? `npm i ${deps.join(" ")}` : `yarn add ${deps.join(" ")}`;
|
|
await runCommand(cmd, root);
|
|
cmd = manager == "npm" ? `npm i ${deps.join(" ")} --save-dev` : `yarn add ${deps.join(" ")} --save-dev`;
|
|
await runCommand(cmd, root);
|
|
} catch (e) {
|
|
statusItem.dispose();
|
|
import_coc14.window.showMessage(`Install error ${e.message}`, "error");
|
|
return;
|
|
}
|
|
statusItem.dispose();
|
|
import_coc14.window.showMessage(`Installed: ${exists.join(" ")}`, "more");
|
|
}
|
|
|
|
// src/server/features/moduleInstall.ts
|
|
var InstallModuleProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
import_coc15.commands.registerCommand("_tsserver.installModule", async (uri, name) => {
|
|
await installModules(uri, [name]);
|
|
});
|
|
}
|
|
async provideCodeActions(document, _range, context, _token) {
|
|
const uri = import_coc15.Uri.parse(document.uri);
|
|
if (uri.scheme != "file")
|
|
return null;
|
|
let {diagnostics} = context;
|
|
let diags = diagnostics.filter((s) => s.code == 2307);
|
|
let names = diags.map((o) => {
|
|
let ms = o.message.match(/module\s'(.+)'/);
|
|
return ms ? ms[1] : null;
|
|
});
|
|
names = names.filter((s) => s != null);
|
|
if (!names.length)
|
|
return null;
|
|
let actions = [];
|
|
for (let name of names) {
|
|
let title = `install ${name}`;
|
|
let command = {
|
|
title: `install ${name}`,
|
|
command: "_tsserver.installModule",
|
|
arguments: [document.uri, name]
|
|
};
|
|
let codeAction = import_vscode_languageserver_protocol13.CodeAction.create(title, command, import_vscode_languageserver_protocol13.CodeActionKind.QuickFix);
|
|
actions.push(codeAction);
|
|
}
|
|
return actions;
|
|
}
|
|
};
|
|
var moduleInstall_default = InstallModuleProvider;
|
|
|
|
// src/server/features/quickfix.ts
|
|
var import_coc17 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol14 = __toModule(require_main3());
|
|
|
|
// src/server/commands.ts
|
|
var import_coc16 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_types2 = __toModule(require_main2());
|
|
var ReloadProjectsCommand = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.reloadProjects";
|
|
}
|
|
async execute() {
|
|
let client = await this.service.getClientHost();
|
|
client.reloadProjects();
|
|
import_coc16.window.showMessage("projects reloaded");
|
|
}
|
|
};
|
|
var OpenTsServerLogCommand = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.openTsServerLog";
|
|
}
|
|
async execute() {
|
|
let client = await this.service.getClientHost();
|
|
client.serviceClient.openTsServerLogFile();
|
|
}
|
|
};
|
|
var TypeScriptGoToProjectConfigCommand = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.goToProjectConfig";
|
|
}
|
|
async execute() {
|
|
let client = await this.service.getClientHost();
|
|
let doc = await import_coc16.workspace.document;
|
|
let {languageId} = doc.textDocument;
|
|
if (client.serviceClient.modeIds.indexOf(languageId) == -1) {
|
|
throw new Error(`Could not determine TypeScript or JavaScript project. Unsupported file type: ${languageId}`);
|
|
return;
|
|
}
|
|
await goToProjectConfig(client, doc.uri);
|
|
}
|
|
};
|
|
async function goToProjectConfig(clientHost, uri) {
|
|
const client = clientHost.serviceClient;
|
|
const file2 = client.toPath(uri);
|
|
let res;
|
|
try {
|
|
res = await client.execute("projectInfo", {file: file2, needFileNameList: false}, import_coc16.CancellationToken.None);
|
|
} catch {
|
|
}
|
|
if (!res || !res.body) {
|
|
import_coc16.window.showMessage("Could not determine TypeScript or JavaScript project.", "warning");
|
|
return;
|
|
}
|
|
const {configFileName} = res.body;
|
|
if (configFileName && !isImplicitProjectConfigFile(configFileName)) {
|
|
await import_coc16.workspace.openResource(import_coc16.Uri.file(configFileName).toString());
|
|
return;
|
|
}
|
|
import_coc16.window.showMessage("Config file not found", "warning");
|
|
}
|
|
function isImplicitProjectConfigFile(configFileName) {
|
|
return configFileName.indexOf("/dev/null/") === 0;
|
|
}
|
|
var autoFixableDiagnosticCodes = new Set([
|
|
2420,
|
|
2552,
|
|
2304
|
|
]);
|
|
var AutoFixCommand = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.executeAutofix";
|
|
}
|
|
async execute() {
|
|
if (this.service.state != import_coc16.ServiceStat.Running) {
|
|
throw new Error("service not running");
|
|
return;
|
|
}
|
|
let client = await this.service.getClientHost();
|
|
let document = await import_coc16.workspace.document;
|
|
let handles = await client.handles(document.textDocument);
|
|
if (!handles) {
|
|
throw new Error(`Document ${document.uri} is not handled by tsserver.`);
|
|
return;
|
|
}
|
|
let file2 = client.serviceClient.toPath(document.uri);
|
|
let diagnostics = client.serviceClient.diagnosticsManager.getDiagnostics(document.uri);
|
|
let missingDiagnostics = diagnostics.filter((o) => o.code == 2307);
|
|
if (missingDiagnostics.length) {
|
|
let names2 = missingDiagnostics.map((o) => {
|
|
let ms = o.message.match(/module\s'(.+)'\./);
|
|
return ms ? ms[1] : null;
|
|
});
|
|
names2 = names2.filter((s) => s != null);
|
|
if (names2.length) {
|
|
installModules(document.uri, names2).catch((e) => {
|
|
console.error(e.message);
|
|
});
|
|
}
|
|
}
|
|
diagnostics = diagnostics.filter((x) => autoFixableDiagnosticCodes.has(x.code));
|
|
if (diagnostics.length == 0)
|
|
return;
|
|
diagnostics = diagnostics.reduce((arr, curr) => {
|
|
if (curr.code == 2304 && arr.findIndex((o) => o.message == curr.message) != -1)
|
|
return arr;
|
|
arr.push(curr);
|
|
return arr;
|
|
}, []);
|
|
let edits = [];
|
|
let command;
|
|
let names = [];
|
|
for (let diagnostic of diagnostics) {
|
|
const args = {
|
|
...Range2.toFileRangeRequestArgs(file2, diagnostic.range),
|
|
errorCodes: [+diagnostic.code]
|
|
};
|
|
const response = await client.serviceClient.execute("getCodeFixes", args, import_coc16.CancellationToken.None);
|
|
if (response.type !== "response" || !response.body || response.body.length < 1) {
|
|
if (diagnostic.code == 2304) {
|
|
let {range} = diagnostic;
|
|
let line = document.getline(range.start.line);
|
|
let name = line.slice(range.start.character, range.end.character);
|
|
if (nodeModules.indexOf(name) !== -1 && names.indexOf(name) == -1) {
|
|
names.push(name);
|
|
edits.push({
|
|
range: import_vscode_languageserver_types2.Range.create(0, 0, 0, 0),
|
|
newText: `import ${name} from '${name}'
|
|
`
|
|
});
|
|
command = "tsserver.organizeImports";
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
const fix = response.body[0];
|
|
for (let change of fix.changes) {
|
|
if (change.fileName != file2)
|
|
continue;
|
|
for (let ch of change.textChanges) {
|
|
edits.push({
|
|
range: Range2.fromTextSpan(ch),
|
|
newText: ch.newText
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (edits.length)
|
|
await document.applyEdits(edits);
|
|
if (command)
|
|
import_coc16.commands.executeCommand(command);
|
|
}
|
|
};
|
|
var ConfigurePluginCommand = class {
|
|
constructor(pluginManager) {
|
|
this.pluginManager = pluginManager;
|
|
this.id = "_typescript.configurePlugin";
|
|
}
|
|
execute(pluginId, configuration) {
|
|
this.pluginManager.setConfiguration(pluginId, configuration);
|
|
}
|
|
};
|
|
var FileReferencesCommand2 = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.findAllFileReferences";
|
|
}
|
|
async execute() {
|
|
const client = await this.service.getClientHost();
|
|
if (client.serviceClient.apiVersion.lt(FileReferencesCommand2.minVersion)) {
|
|
import_coc16.window.showMessage("Find file references failed. Requires TypeScript 4.2+.", "error");
|
|
return;
|
|
}
|
|
const doc = await import_coc16.workspace.document;
|
|
let {languageId} = doc.textDocument;
|
|
if (client.serviceClient.modeIds.indexOf(languageId) == -1)
|
|
return;
|
|
const openedFiledPath = client.serviceClient.toOpenedFilePath(doc.uri);
|
|
if (!openedFiledPath)
|
|
return;
|
|
const response = await client.serviceClient.execute("fileReferences", {file: openedFiledPath}, import_coc16.CancellationToken.None);
|
|
if (response.type !== "response" || !response.body)
|
|
return;
|
|
const locations = response.body.refs.map((r) => Location2.fromTextSpan(client.serviceClient.toResource(r.file), r));
|
|
await import_coc16.commands.executeCommand("editor.action.showReferences", doc.uri, import_vscode_languageserver_types2.Position.create(0, 0), locations);
|
|
}
|
|
};
|
|
var FileReferencesCommand = FileReferencesCommand2;
|
|
FileReferencesCommand.minVersion = api_default.v420;
|
|
function registCommand(cmd) {
|
|
let {id, execute} = cmd;
|
|
return import_coc16.commands.registerCommand(id, execute, cmd);
|
|
}
|
|
|
|
// src/server/features/quickfix.ts
|
|
var ApplyCodeActionCommand2 = class {
|
|
constructor(client, formattingConfigurationManager) {
|
|
this.client = client;
|
|
this.formattingConfigurationManager = formattingConfigurationManager;
|
|
this.id = ApplyCodeActionCommand2.ID;
|
|
}
|
|
async execute(action) {
|
|
return applyCodeActionCommands(this.client, action);
|
|
}
|
|
};
|
|
var ApplyCodeActionCommand = ApplyCodeActionCommand2;
|
|
ApplyCodeActionCommand.ID = "_typescript.applyCodeActionCommand";
|
|
var ApplyFixAllCodeAction2 = class {
|
|
constructor(client, formattingConfigurationManager) {
|
|
this.client = client;
|
|
this.formattingConfigurationManager = formattingConfigurationManager;
|
|
this.id = ApplyFixAllCodeAction2.ID;
|
|
}
|
|
async execute(document, file2, tsAction) {
|
|
if (!tsAction.fixId) {
|
|
return;
|
|
}
|
|
await this.formattingConfigurationManager.ensureConfigurationForDocument(document, import_vscode_languageserver_protocol14.CancellationToken.None);
|
|
const args = {
|
|
scope: {
|
|
type: "file",
|
|
args: {file: file2}
|
|
},
|
|
fixId: tsAction.fixId
|
|
};
|
|
try {
|
|
const res = await this.client.execute("getCombinedCodeFix", args, import_vscode_languageserver_protocol14.CancellationToken.None);
|
|
if (res.type != "response") {
|
|
return;
|
|
}
|
|
let {body} = res;
|
|
const edit = WorkspaceEdit.fromFileCodeEdits(this.client, body.changes);
|
|
await import_coc17.workspace.applyEdit(edit);
|
|
const token = import_vscode_languageserver_protocol14.CancellationToken.None;
|
|
const {commands: commands7} = body;
|
|
if (commands7 && commands7.length) {
|
|
for (const command of commands7) {
|
|
await this.client.execute("applyCodeActionCommand", {command}, token);
|
|
}
|
|
}
|
|
} catch {
|
|
}
|
|
}
|
|
};
|
|
var ApplyFixAllCodeAction = ApplyFixAllCodeAction2;
|
|
ApplyFixAllCodeAction.ID = "_typescript.applyFixAllCodeAction";
|
|
var DiagnosticsSet = class {
|
|
constructor(_values) {
|
|
this._values = _values;
|
|
}
|
|
static from(diagnostics) {
|
|
const values = new Map();
|
|
for (const diagnostic of diagnostics) {
|
|
values.set(DiagnosticsSet.key(diagnostic), diagnostic);
|
|
}
|
|
return new DiagnosticsSet(values);
|
|
}
|
|
static key(diagnostic) {
|
|
const {start, end} = diagnostic.range;
|
|
return `${diagnostic.code}-${start.line},${start.character}-${end.line},${end.character}`;
|
|
}
|
|
get values() {
|
|
return this._values.values();
|
|
}
|
|
};
|
|
var SupportedCodeActionProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async getFixableDiagnosticsForContext(context) {
|
|
const supportedActions = await this.supportedCodeActions;
|
|
const fixableDiagnostics = DiagnosticsSet.from(context.diagnostics.filter((diagnostic) => supportedActions.has(+diagnostic.code)));
|
|
return Array.from(fixableDiagnostics.values);
|
|
}
|
|
get supportedCodeActions() {
|
|
if (!this._supportedCodeActions) {
|
|
return new Promise((resolve, reject) => {
|
|
this.client.execute("getSupportedCodeFixes", null, import_vscode_languageserver_protocol14.CancellationToken.None).then((res) => {
|
|
if (res.type !== "response") {
|
|
resolve(new Set());
|
|
return;
|
|
}
|
|
let codes = res.body.map((code) => +code).filter((code) => !isNaN(code));
|
|
resolve(new Set(codes));
|
|
}, reject);
|
|
});
|
|
}
|
|
return Promise.resolve(this._supportedCodeActions);
|
|
}
|
|
};
|
|
var TypeScriptQuickFixProvider = class {
|
|
constructor(client, formattingConfigurationManager) {
|
|
this.client = client;
|
|
this.formattingConfigurationManager = formattingConfigurationManager;
|
|
registCommand(new ApplyCodeActionCommand(client, formattingConfigurationManager));
|
|
registCommand(new ApplyFixAllCodeAction(client, formattingConfigurationManager));
|
|
this.supportedCodeActionProvider = new SupportedCodeActionProvider(client);
|
|
}
|
|
async provideCodeActions(document, _range, context, token) {
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2) {
|
|
return [];
|
|
}
|
|
await this.formattingConfigurationManager.ensureConfigurationForDocument(document, token);
|
|
const fixableDiagnostics = await this.supportedCodeActionProvider.getFixableDiagnosticsForContext(context);
|
|
if (!fixableDiagnostics.length) {
|
|
return [];
|
|
}
|
|
if (this.client.bufferSyncSupport.hasPendingDiagnostics(document.uri)) {
|
|
return [];
|
|
}
|
|
const results = [];
|
|
for (const diagnostic of fixableDiagnostics) {
|
|
results.push(...await this.getFixesForDiagnostic(document, file2, diagnostic, token));
|
|
}
|
|
return results;
|
|
}
|
|
async getFixesForDiagnostic(document, file2, diagnostic, token) {
|
|
const args = {
|
|
...Range2.toFileRangeRequestArgs(file2, diagnostic.range),
|
|
errorCodes: [+diagnostic.code]
|
|
};
|
|
const codeFixesResponse = await this.client.execute("getCodeFixes", args, token);
|
|
if (codeFixesResponse.type != "response") {
|
|
return [];
|
|
}
|
|
if (codeFixesResponse.body) {
|
|
const results = [];
|
|
for (const tsCodeFix of codeFixesResponse.body) {
|
|
results.push(...await this.getAllFixesForTsCodeAction(document, file2, diagnostic, tsCodeFix));
|
|
}
|
|
return results;
|
|
}
|
|
return [];
|
|
}
|
|
async getAllFixesForTsCodeAction(document, file2, diagnostic, tsAction) {
|
|
const singleFix = this.getSingleFixForTsCodeAction(diagnostic, tsAction);
|
|
const fixAll = await this.getFixAllForTsCodeAction(document, file2, diagnostic, tsAction);
|
|
return fixAll ? [singleFix, fixAll] : [singleFix];
|
|
}
|
|
getSingleFixForTsCodeAction(diagnostic, tsAction) {
|
|
const codeAction = {
|
|
title: tsAction.description,
|
|
kind: import_vscode_languageserver_protocol14.CodeActionKind.QuickFix
|
|
};
|
|
codeAction.edit = getEditForCodeAction(this.client, tsAction);
|
|
codeAction.diagnostics = [diagnostic];
|
|
codeAction.isPreferred = true;
|
|
if (tsAction.commands) {
|
|
codeAction.command = {
|
|
command: ApplyCodeActionCommand.ID,
|
|
arguments: [tsAction],
|
|
title: tsAction.description
|
|
};
|
|
}
|
|
return codeAction;
|
|
}
|
|
async getFixAllForTsCodeAction(document, file2, diagnostic, tsAction) {
|
|
if (!tsAction.fixId || !this.client.apiVersion.gte(api_default.v270)) {
|
|
return void 0;
|
|
}
|
|
if (!this.client.diagnosticsManager.getDiagnostics(document.uri).some((x) => x.code === diagnostic.code && x !== diagnostic)) {
|
|
return;
|
|
}
|
|
const action = {
|
|
title: tsAction.fixAllDescription || "Fix all in file",
|
|
kind: import_vscode_languageserver_protocol14.CodeActionKind.QuickFix
|
|
};
|
|
action.diagnostics = [diagnostic];
|
|
action.command = {
|
|
command: ApplyFixAllCodeAction.ID,
|
|
arguments: [document, file2, tsAction],
|
|
title: ""
|
|
};
|
|
return action;
|
|
}
|
|
};
|
|
var quickfix_default = TypeScriptQuickFixProvider;
|
|
|
|
// src/server/features/refactor.ts
|
|
var import_coc18 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol15 = __toModule(require_main3());
|
|
var ApplyRefactoringCommand2 = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
this.id = ApplyRefactoringCommand2.ID;
|
|
}
|
|
async execute(document, file2, refactor, action, range) {
|
|
const args = {
|
|
...Range2.toFileRangeRequestArgs(file2, range),
|
|
refactor,
|
|
action
|
|
};
|
|
const response = await this.client.execute("getEditsForRefactor", args, import_vscode_languageserver_protocol15.CancellationToken.None);
|
|
const body = response && response.body;
|
|
if (!body || !body.edits.length) {
|
|
return false;
|
|
}
|
|
const workspaceEdit = await this.toWorkspaceEdit(body);
|
|
if (!await import_coc18.workspace.applyEdit(workspaceEdit)) {
|
|
return false;
|
|
}
|
|
const renameLocation = body.renameLocation;
|
|
if (renameLocation) {
|
|
import_coc18.commands.executeCommand("editor.action.rename", document.uri, Position.fromLocation(renameLocation));
|
|
}
|
|
return true;
|
|
}
|
|
async toWorkspaceEdit(body) {
|
|
for (const edit of body.edits) {
|
|
await import_coc18.workspace.createFile(edit.fileName, {ignoreIfExists: true});
|
|
}
|
|
let workspaceEdit = WorkspaceEdit.fromFileCodeEdits(this.client, body.edits);
|
|
return workspaceEdit;
|
|
}
|
|
};
|
|
var ApplyRefactoringCommand = ApplyRefactoringCommand2;
|
|
ApplyRefactoringCommand.ID = "_typescript.applyRefactoring";
|
|
var SelectRefactorCommand2 = class {
|
|
constructor(doRefactoring) {
|
|
this.doRefactoring = doRefactoring;
|
|
this.id = SelectRefactorCommand2.ID;
|
|
}
|
|
async execute(document, file2, info, range) {
|
|
let {actions} = info;
|
|
const idx = actions.length == 1 ? 0 : await import_coc18.window.showQuickpick(actions.map((action) => action.description || action.name));
|
|
if (idx == -1)
|
|
return false;
|
|
let label = info.actions[idx].name;
|
|
if (!label)
|
|
return false;
|
|
return this.doRefactoring.execute(document, file2, info.name, label, range);
|
|
}
|
|
};
|
|
var SelectRefactorCommand = SelectRefactorCommand2;
|
|
SelectRefactorCommand.ID = "_typescript.selectRefactoring";
|
|
var TypeScriptRefactorProvider2 = class {
|
|
constructor(client, formattingOptionsManager) {
|
|
this.client = client;
|
|
this.formattingOptionsManager = formattingOptionsManager;
|
|
const doRefactoringCommand = new ApplyRefactoringCommand(this.client);
|
|
registCommand(doRefactoringCommand);
|
|
registCommand(new SelectRefactorCommand(doRefactoringCommand));
|
|
}
|
|
async provideCodeActions(document, range, context, token) {
|
|
if (!this.shouldTrigger(context)) {
|
|
return void 0;
|
|
}
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2)
|
|
return void 0;
|
|
await this.formattingOptionsManager.ensureConfigurationForDocument(document, token);
|
|
const args = Range2.toFileRangeRequestArgs(file2, range);
|
|
let response;
|
|
try {
|
|
response = await this.client.interruptGetErr(() => {
|
|
return this.client.execute("getApplicableRefactors", args, token);
|
|
});
|
|
if (!response || !response.body) {
|
|
return void 0;
|
|
}
|
|
} catch {
|
|
return void 0;
|
|
}
|
|
return this.convertApplicableRefactors(response.body, document, file2, range, context.only && context.only.some((v) => v.includes(import_vscode_languageserver_protocol15.CodeActionKind.Refactor)));
|
|
}
|
|
convertApplicableRefactors(body, document, file2, rangeOrSelection, setPrefrred) {
|
|
const actions = [];
|
|
for (const info of body) {
|
|
if (info.notApplicableReason)
|
|
continue;
|
|
if (!info.inlineable) {
|
|
const codeAction = {
|
|
title: info.description,
|
|
kind: import_vscode_languageserver_protocol15.CodeActionKind.Refactor
|
|
};
|
|
codeAction.command = {
|
|
title: info.description,
|
|
command: SelectRefactorCommand.ID,
|
|
arguments: [document, file2, info, rangeOrSelection]
|
|
};
|
|
actions.push(codeAction);
|
|
} else {
|
|
for (const action of info.actions) {
|
|
let codeAction = this.refactorActionToCodeAction(action, document, file2, info, rangeOrSelection);
|
|
if (setPrefrred) {
|
|
codeAction.isPreferred = TypeScriptRefactorProvider2.isPreferred(action, info.actions);
|
|
}
|
|
actions.push(codeAction);
|
|
}
|
|
}
|
|
}
|
|
return actions;
|
|
}
|
|
refactorActionToCodeAction(action, document, file2, info, rangeOrSelection) {
|
|
const codeAction = {
|
|
title: action.description,
|
|
kind: TypeScriptRefactorProvider2.getKind(action)
|
|
};
|
|
codeAction.command = {
|
|
title: action.description,
|
|
command: ApplyRefactoringCommand.ID,
|
|
arguments: [document, file2, info.name, action.name, rangeOrSelection]
|
|
};
|
|
return codeAction;
|
|
}
|
|
shouldTrigger(context) {
|
|
if (context.only && context.only.every((o) => !o.includes(import_vscode_languageserver_protocol15.CodeActionKind.Refactor))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
static getKind(refactor) {
|
|
if (refactor.name.startsWith("function_")) {
|
|
return TypeScriptRefactorProvider2.extractFunctionKind;
|
|
} else if (refactor.name.startsWith("constant_")) {
|
|
return TypeScriptRefactorProvider2.extractConstantKind;
|
|
} else if (refactor.name.startsWith("Move")) {
|
|
return TypeScriptRefactorProvider2.moveKind;
|
|
}
|
|
return import_vscode_languageserver_protocol15.CodeActionKind.Refactor;
|
|
}
|
|
static isPreferred(action, allActions) {
|
|
let kind = TypeScriptRefactorProvider2.getKind(action);
|
|
if (TypeScriptRefactorProvider2.extractConstantKind == kind) {
|
|
const getScope = (name2) => {
|
|
var _a;
|
|
const scope2 = (_a = name2.match(/scope_(\d)/)) == null ? void 0 : _a[1];
|
|
return scope2 ? +scope2 : void 0;
|
|
};
|
|
const scope = getScope(action.name);
|
|
if (typeof scope !== "number") {
|
|
return false;
|
|
}
|
|
return allActions.filter((otherAtion) => otherAtion !== action && otherAtion.name.startsWith("constant_")).every((otherAction) => {
|
|
const otherScope = getScope(otherAction.name);
|
|
return typeof otherScope === "number" ? scope < otherScope : true;
|
|
});
|
|
}
|
|
let {name} = action;
|
|
if (name.startsWith("Extract to type alias") || name.startsWith("Extract to interface")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
var TypeScriptRefactorProvider = TypeScriptRefactorProvider2;
|
|
TypeScriptRefactorProvider.extractFunctionKind = import_vscode_languageserver_protocol15.CodeActionKind.RefactorExtract + ".function";
|
|
TypeScriptRefactorProvider.extractConstantKind = import_vscode_languageserver_protocol15.CodeActionKind.RefactorExtract + ".constant";
|
|
TypeScriptRefactorProvider.moveKind = import_vscode_languageserver_protocol15.CodeActionKind.Refactor + ".move";
|
|
TypeScriptRefactorProvider.metadata = {
|
|
providedCodeActionKinds: [import_vscode_languageserver_protocol15.CodeActionKind.Refactor]
|
|
};
|
|
var refactor_default = TypeScriptRefactorProvider;
|
|
|
|
// src/server/features/references.ts
|
|
var TypeScriptReferences = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideReferences(document, position, context, token) {
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath)
|
|
return [];
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
try {
|
|
const msg = await this.client.execute("references", args, token);
|
|
if (!msg || msg.type != "response" || !msg.body) {
|
|
return [];
|
|
}
|
|
const result = [];
|
|
for (const ref of msg.body.refs) {
|
|
if (!context.includeDeclaration && ref.isDefinition) {
|
|
continue;
|
|
}
|
|
const url = this.client.toResource(ref.file);
|
|
const location = Location2.fromTextSpan(url, ref);
|
|
result.push(location);
|
|
}
|
|
return result;
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
};
|
|
var references_default = TypeScriptReferences;
|
|
|
|
// src/server/features/referencesCodeLens.ts
|
|
var TypeScriptReferencesCodeLensProvider = class extends TypeScriptBaseCodeLensProvider {
|
|
resolveCodeLens(codeLens, token) {
|
|
let {uri} = codeLens.data;
|
|
let filepath = this.client.toPath(uri);
|
|
const args = Position.toFileLocationRequestArgs(filepath, codeLens.range.start);
|
|
return this.client.execute("references", args, token, {
|
|
lowPriority: true
|
|
}).then((response) => {
|
|
if (!response || response.type != "response" || !response.body) {
|
|
throw codeLens;
|
|
}
|
|
const locations = response.body.refs.map((reference) => Location2.fromTextSpan(this.client.toResource(reference.file), reference)).filter((location) => !(location.uri.toString() === uri && location.range.start.line === codeLens.range.start.line && location.range.start.character === codeLens.range.start.character));
|
|
codeLens.command = {
|
|
title: locations.length === 1 ? "1 reference" : `${locations.length} references`,
|
|
command: locations.length ? "editor.action.showReferences" : "",
|
|
arguments: [uri, codeLens.range.start, locations]
|
|
};
|
|
return codeLens;
|
|
}).catch(() => {
|
|
codeLens.command = {
|
|
title: "0 references",
|
|
command: ""
|
|
};
|
|
return codeLens;
|
|
});
|
|
}
|
|
extractSymbol(document, item, parent) {
|
|
if (parent && parent.kind === Kind.enum) {
|
|
return super.getSymbolRange(document, item);
|
|
}
|
|
switch (item.kind) {
|
|
case Kind.const:
|
|
case Kind.let:
|
|
case Kind.variable:
|
|
case Kind.function:
|
|
if (!item.kindModifiers.match(/\bexport\b/)) {
|
|
break;
|
|
}
|
|
case Kind.class:
|
|
if (item.text === "<class>") {
|
|
break;
|
|
}
|
|
case Kind.method:
|
|
case Kind.memberVariable:
|
|
case Kind.memberGetAccessor:
|
|
case Kind.memberSetAccessor:
|
|
case Kind.constructorImplementation:
|
|
case Kind.interface:
|
|
case Kind.type:
|
|
case Kind.enum:
|
|
return super.getSymbolRange(document, item);
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
var referencesCodeLens_default = TypeScriptReferencesCodeLensProvider;
|
|
|
|
// src/server/features/rename.ts
|
|
var import_coc19 = __toModule(require("coc.nvim"));
|
|
var import_path4 = __toModule(require("path"));
|
|
var TypeScriptRenameProvider = class {
|
|
constructor(client, fileConfigurationManager) {
|
|
this.client = client;
|
|
this.fileConfigurationManager = fileConfigurationManager;
|
|
}
|
|
async prepareRename(document, position, token) {
|
|
const response = await this.execRename(document, position, token);
|
|
if (!response || response.type !== "response" || !response.body) {
|
|
return null;
|
|
}
|
|
const renameInfo = response.body.info;
|
|
if (!renameInfo.canRename) {
|
|
return Promise.reject(new Error("Invalid location for rename."));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v310)) {
|
|
const triggerSpan = renameInfo.triggerSpan;
|
|
if (triggerSpan) {
|
|
const range = Range2.fromTextSpan(triggerSpan);
|
|
return range;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
async provideRenameEdits(document, position, newName, token) {
|
|
const response = await this.execRename(document, position, token);
|
|
if (!response || response.type !== "response" || !response.body) {
|
|
return null;
|
|
}
|
|
const renameInfo = response.body.info;
|
|
if (!renameInfo.canRename) {
|
|
return Promise.reject(new Error("Invalid location for rename."));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v310)) {
|
|
if (renameInfo.fileToRename) {
|
|
const edits = await this.renameFile(renameInfo.fileToRename, newName, token);
|
|
if (edits) {
|
|
return edits;
|
|
} else {
|
|
return Promise.reject(new Error("An error occurred while renaming file"));
|
|
}
|
|
}
|
|
}
|
|
return this.toWorkspaceEdit(response.body.locs, newName);
|
|
}
|
|
async execRename(document, position, token) {
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2)
|
|
return void 0;
|
|
const args = {
|
|
...Position.toFileLocationRequestArgs(file2, position),
|
|
findInStrings: false,
|
|
findInComments: false
|
|
};
|
|
await this.fileConfigurationManager.ensureConfigurationForDocument(document, token);
|
|
return this.client.interruptGetErr(() => {
|
|
return this.client.execute("rename", args, token);
|
|
});
|
|
}
|
|
toWorkspaceEdit(locations, newName) {
|
|
let changes = {};
|
|
for (const spanGroup of locations) {
|
|
const uri = this.client.toResource(spanGroup.file);
|
|
if (uri) {
|
|
changes[uri] = [];
|
|
for (const textSpan of spanGroup.locs) {
|
|
changes[uri].push({
|
|
range: Range2.fromTextSpan(textSpan),
|
|
newText: (textSpan.prefixText || "") + newName + (textSpan.suffixText || "")
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return {changes};
|
|
}
|
|
async renameFile(fileToRename, newName, token) {
|
|
if (!import_path4.default.extname(newName)) {
|
|
newName += import_path4.default.extname(fileToRename);
|
|
}
|
|
const dirname = import_path4.default.dirname(fileToRename);
|
|
const newFilePath = import_path4.default.join(dirname, newName);
|
|
const args = {
|
|
file: fileToRename,
|
|
oldFilePath: fileToRename,
|
|
newFilePath
|
|
};
|
|
const response = await this.client.execute("getEditsForFileRename", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
const edits = WorkspaceEdit.fromFileCodeEdits(this.client, response.body);
|
|
edits.documentChanges = edits.documentChanges || [];
|
|
edits.documentChanges.push({
|
|
kind: "rename",
|
|
oldUri: import_coc19.Uri.file(fileToRename).toString(),
|
|
newUri: import_coc19.Uri.file(newFilePath).toString(),
|
|
options: {
|
|
overwrite: false,
|
|
ignoreIfExists: true
|
|
}
|
|
});
|
|
return edits;
|
|
}
|
|
};
|
|
var rename_default = TypeScriptRenameProvider;
|
|
|
|
// src/server/features/signatureHelp.ts
|
|
var TypeScriptSignatureHelpProvider = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideSignatureHelp(document, position, token) {
|
|
const filepath = this.client.toPath(document.uri);
|
|
if (!filepath) {
|
|
return void 0;
|
|
}
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
let response;
|
|
try {
|
|
response = await this.client.interruptGetErr(() => this.client.execute("signatureHelp", args, token));
|
|
} catch (e) {
|
|
return void 0;
|
|
}
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
let info = response.body;
|
|
const result = {
|
|
activeSignature: info.selectedItemIndex,
|
|
activeParameter: this.getActiveParmeter(info),
|
|
signatures: info.items.map((signature) => {
|
|
return this.convertSignature(signature);
|
|
})
|
|
};
|
|
return result;
|
|
}
|
|
getActiveParmeter(info) {
|
|
const activeSignature = info.items[info.selectedItemIndex];
|
|
if (activeSignature && activeSignature.isVariadic) {
|
|
return Math.min(info.argumentIndex, activeSignature.parameters.length - 1);
|
|
}
|
|
return info.argumentIndex;
|
|
}
|
|
convertSignature(item) {
|
|
var _a;
|
|
let parameters = item.parameters.map((p) => {
|
|
return {
|
|
label: plain(p.displayParts),
|
|
documentation: markdownDocumentation(p.documentation, [])
|
|
};
|
|
});
|
|
let label = plain(item.prefixDisplayParts);
|
|
label += parameters.map((parameter) => parameter.label).join(plain(item.separatorDisplayParts));
|
|
label += plain(item.suffixDisplayParts);
|
|
return {
|
|
label,
|
|
documentation: markdownDocumentation(item.documentation, (_a = item.tags) == null ? void 0 : _a.filter((x) => x.name !== "param")),
|
|
parameters
|
|
};
|
|
}
|
|
};
|
|
TypeScriptSignatureHelpProvider.triggerCharacters = ["(", ",", "<"];
|
|
var signatureHelp_default = TypeScriptSignatureHelpProvider;
|
|
|
|
// src/server/features/smartSelect.ts
|
|
var SmartSelection = class {
|
|
constructor(client) {
|
|
this.client = client;
|
|
}
|
|
async provideSelectionRanges(document, positions, token) {
|
|
const file2 = this.client.toPath(document.uri);
|
|
if (!file2) {
|
|
return void 0;
|
|
}
|
|
const args = {
|
|
file: file2,
|
|
locations: positions.map(Position.toLocation)
|
|
};
|
|
const response = await this.client.execute("selectionRange", args, token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return void 0;
|
|
}
|
|
return response.body.map(SmartSelection.convertSelectionRange);
|
|
}
|
|
static convertSelectionRange(selectionRange) {
|
|
return {
|
|
range: Range2.fromTextSpan(selectionRange.textSpan),
|
|
parent: selectionRange.parent ? SmartSelection.convertSelectionRange(selectionRange.parent) : void 0
|
|
};
|
|
}
|
|
};
|
|
var smartSelect_default = SmartSelection;
|
|
|
|
// src/server/features/tagClosing.ts
|
|
var import_coc20 = __toModule(require("coc.nvim"));
|
|
var TagClosing2 = class {
|
|
constructor(client, descriptionLanguageId) {
|
|
this.client = client;
|
|
this.descriptionLanguageId = descriptionLanguageId;
|
|
this._disposables = [];
|
|
this._disposed = false;
|
|
this._timeout = void 0;
|
|
this._cancel = void 0;
|
|
import_coc20.events.on("InsertCharPre", (character) => {
|
|
this.lastInsert = character;
|
|
}, null, this._disposables);
|
|
import_coc20.events.on("TextChangedI", this.onChange, this, this._disposables);
|
|
import_coc20.events.on("TextChangedP", this.onChange, this, this._disposables);
|
|
}
|
|
async onChange(bufnr, change) {
|
|
let doc = import_coc20.workspace.getDocument(bufnr);
|
|
if (!doc || !doc.attached)
|
|
return;
|
|
let enabled = this.isEnabled(doc.filetype, doc.uri);
|
|
if (!enabled)
|
|
return;
|
|
let {pre, changedtick, lnum} = change;
|
|
if (!pre.endsWith("/") && !pre.endsWith(">"))
|
|
return;
|
|
if (!pre.endsWith(this.lastInsert))
|
|
return;
|
|
if (pre.length > 1 && pre[pre.length - 2] == ">")
|
|
return;
|
|
const filepath = this.client.toOpenedFilePath(doc.uri);
|
|
if (!filepath)
|
|
return;
|
|
if (this._timeout) {
|
|
clearTimeout(this._timeout);
|
|
}
|
|
if (this._cancel) {
|
|
this._cancel.cancel();
|
|
this._cancel.dispose();
|
|
this._cancel = void 0;
|
|
}
|
|
await doc.patchChange();
|
|
this._timeout = setTimeout(async () => {
|
|
this._timeout = void 0;
|
|
if (this._disposed)
|
|
return;
|
|
if (doc.changedtick > changedtick)
|
|
return;
|
|
const position = import_coc20.Position.create(lnum - 1, pre.length);
|
|
const args = Position.toFileLocationRequestArgs(filepath, position);
|
|
this._cancel = new import_coc20.CancellationTokenSource();
|
|
const response = await this.client.execute("jsxClosingTag", args, this._cancel.token);
|
|
if (response.type !== "response" || !response.body) {
|
|
return;
|
|
}
|
|
if (this._disposed)
|
|
return;
|
|
const insertion = response.body;
|
|
if (doc.changedtick === changedtick) {
|
|
import_coc20.snippetManager.insertSnippet(this.getTagSnippet(insertion).value, false, import_coc20.Range.create(position, position));
|
|
}
|
|
}, 50);
|
|
}
|
|
isEnabled(languageId, uri) {
|
|
const configLang = TagClosing2._configurationLanguages[languageId];
|
|
if (!configLang || configLang !== this.descriptionLanguageId) {
|
|
return false;
|
|
}
|
|
if (!import_coc20.workspace.getConfiguration(void 0, uri).get(`${configLang}.autoClosingTags`)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
dispose() {
|
|
this._disposed = true;
|
|
if (this._timeout) {
|
|
clearTimeout(this._timeout);
|
|
this._timeout = void 0;
|
|
}
|
|
if (this._cancel) {
|
|
this._cancel.cancel();
|
|
this._cancel.dispose();
|
|
this._cancel = void 0;
|
|
}
|
|
import_coc20.disposeAll(this._disposables);
|
|
this._disposables = [];
|
|
}
|
|
getTagSnippet(closingTag) {
|
|
const snippet = new SnippetString_default();
|
|
snippet.appendPlaceholder("", 0);
|
|
snippet.appendText(closingTag.newText);
|
|
return snippet;
|
|
}
|
|
};
|
|
var TagClosing = TagClosing2;
|
|
TagClosing.minVersion = api_default.v300;
|
|
TagClosing._configurationLanguages = {
|
|
javascriptreact: "javascript",
|
|
typescriptreact: "typescript"
|
|
};
|
|
var tagClosing_default = TagClosing;
|
|
|
|
// src/server/features/updatePathOnRename.ts
|
|
var import_coc21 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol16 = __toModule(require_main3());
|
|
|
|
// src/server/utils/mutex.ts
|
|
var Mutex = class {
|
|
constructor() {
|
|
this.tasks = [];
|
|
this.count = 1;
|
|
}
|
|
sched() {
|
|
if (this.count > 0 && this.tasks.length > 0) {
|
|
this.count--;
|
|
let next = this.tasks.shift();
|
|
next();
|
|
}
|
|
}
|
|
get busy() {
|
|
return this.count == 0;
|
|
}
|
|
acquire() {
|
|
return new Promise((res) => {
|
|
let task = () => {
|
|
let released = false;
|
|
res(() => {
|
|
if (!released) {
|
|
released = true;
|
|
this.count++;
|
|
this.sched();
|
|
}
|
|
});
|
|
};
|
|
this.tasks.push(task);
|
|
process.nextTick(this.sched.bind(this));
|
|
});
|
|
}
|
|
use(f) {
|
|
return this.acquire().then((release) => {
|
|
return f().then((res) => {
|
|
release();
|
|
return res;
|
|
}).catch((err) => {
|
|
release();
|
|
throw err;
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
// src/server/features/updatePathOnRename.ts
|
|
function wait(ms) {
|
|
return new Promise((resolve) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, ms);
|
|
});
|
|
}
|
|
var UpdateImportsOnFileRenameHandler = class {
|
|
constructor(client, fileConfigurationManager, languageId) {
|
|
this.client = client;
|
|
this.fileConfigurationManager = fileConfigurationManager;
|
|
this.disposables = [];
|
|
let glob = languageId == "typescript" ? "**/*.{ts,tsx}" : "**/*.{js,jsx}";
|
|
const watcher = import_coc21.workspace.createFileSystemWatcher(glob);
|
|
this.disposables.push(watcher);
|
|
let mutex = new Mutex();
|
|
watcher.onDidRename(async (e) => {
|
|
let release = await mutex.acquire();
|
|
try {
|
|
await this.doRename(e.oldUri, e.newUri);
|
|
release();
|
|
} catch (e2) {
|
|
this.client.logger.error("Error on rename:", e2);
|
|
release();
|
|
}
|
|
}, null, this.disposables);
|
|
}
|
|
dispose() {
|
|
import_coc21.disposeAll(this.disposables);
|
|
}
|
|
async doRename(oldResource, newResource) {
|
|
if (oldResource.scheme !== "file" || newResource.scheme !== "file") {
|
|
return;
|
|
}
|
|
const targetFile = newResource.fsPath;
|
|
const oldFile = oldResource.fsPath;
|
|
const newUri = newResource.toString();
|
|
let oldDocument = import_coc21.workspace.getDocument(oldResource.toString());
|
|
if (oldDocument) {
|
|
await import_coc21.workspace.nvim.command(`silent ${oldDocument.bufnr}bwipeout!`);
|
|
}
|
|
let document = import_coc21.workspace.getDocument(newUri);
|
|
if (document) {
|
|
await import_coc21.workspace.nvim.command(`silent ${document.bufnr}bwipeout!`);
|
|
await wait(30);
|
|
}
|
|
document = await import_coc21.workspace.loadFile(newUri);
|
|
if (!document)
|
|
return;
|
|
await wait(50);
|
|
const edits = await this.getEditsForFileRename(document.textDocument, oldFile, targetFile);
|
|
if (!edits)
|
|
return;
|
|
if (await this.promptUser(newResource)) {
|
|
await import_coc21.workspace.applyEdit(edits);
|
|
}
|
|
}
|
|
async promptUser(newResource) {
|
|
return await import_coc21.window.showPrompt(`Update imports for moved file: ${newResource.fsPath}?`);
|
|
}
|
|
async getEditsForFileRename(document, oldFile, newFile) {
|
|
await this.fileConfigurationManager.ensureConfigurationForDocument(document, import_vscode_languageserver_protocol16.CancellationToken.None);
|
|
const response = await this.client.interruptGetErr(() => {
|
|
const args = {
|
|
oldFilePath: oldFile,
|
|
newFilePath: newFile
|
|
};
|
|
return this.client.execute("getEditsForFileRename", args, import_vscode_languageserver_protocol16.CancellationToken.None);
|
|
});
|
|
if (!response || response.type != "response" || !response.body) {
|
|
return;
|
|
}
|
|
const edits = [];
|
|
for (const edit of response.body) {
|
|
if (edit.fileName.match(/[\/\\]node_modules[\/\\]/gi)) {
|
|
continue;
|
|
}
|
|
for (const change of edit.textChanges) {
|
|
if (change.newText.match(/\/node_modules\//gi)) {
|
|
continue;
|
|
}
|
|
}
|
|
edits.push(edit);
|
|
}
|
|
return WorkspaceEdit.fromFileCodeEdits(this.client, edits);
|
|
}
|
|
};
|
|
var updatePathOnRename_default = UpdateImportsOnFileRenameHandler;
|
|
|
|
// src/server/organizeImports.ts
|
|
var import_coc22 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol17 = __toModule(require_main3());
|
|
var OrganizeImportsCommand = class {
|
|
constructor(service) {
|
|
this.service = service;
|
|
this.id = "tsserver.organizeImports";
|
|
}
|
|
async _execute(client, document) {
|
|
let file2 = client.toPath(document.uri);
|
|
const args = {
|
|
scope: {
|
|
type: "file",
|
|
args: {
|
|
file: file2
|
|
}
|
|
}
|
|
};
|
|
const response = await client.interruptGetErr(() => client.execute("organizeImports", args, import_vscode_languageserver_protocol17.CancellationToken.None));
|
|
if (!response || response.type != "response" || !response.success) {
|
|
return;
|
|
}
|
|
const edit = WorkspaceEdit.fromFileCodeEdits(client, response.body);
|
|
let keys = Object.keys(edit.changes);
|
|
if (keys.length == 1) {
|
|
let doc = import_coc22.workspace.getDocument(keys[0]);
|
|
if (doc) {
|
|
await doc.applyEdits(edit.changes[keys[0]]);
|
|
return;
|
|
}
|
|
}
|
|
if (edit)
|
|
await import_coc22.workspace.applyEdit(edit);
|
|
}
|
|
async execute(document) {
|
|
let client = await this.service.getClientHost();
|
|
if (!document) {
|
|
let doc = await import_coc22.workspace.document;
|
|
if (!doc.attached) {
|
|
throw new Error(`Document not attached.`);
|
|
}
|
|
if (client.serviceClient.modeIds.indexOf(doc.filetype) == -1) {
|
|
throw new Error(`filetype "${doc.filetype}" not supported by tsserver.`);
|
|
}
|
|
document = doc.textDocument;
|
|
}
|
|
await this._execute(client.serviceClient, document);
|
|
}
|
|
};
|
|
var OrganizeImportsCodeActionProvider = class {
|
|
constructor(client, fileConfigManager) {
|
|
this.client = client;
|
|
this.fileConfigManager = fileConfigManager;
|
|
this.metadata = {
|
|
providedCodeActionKinds: [import_vscode_languageserver_protocol17.CodeActionKind.SourceOrganizeImports]
|
|
};
|
|
}
|
|
async provideCodeActions(document, _range, context, token) {
|
|
if (this.client.modeIds.indexOf(document.languageId) == -1)
|
|
return;
|
|
if (!context.only || !context.only.includes(import_vscode_languageserver_protocol17.CodeActionKind.SourceOrganizeImports)) {
|
|
return [];
|
|
}
|
|
await this.fileConfigManager.ensureConfigurationForDocument(document, token);
|
|
const action = import_vscode_languageserver_protocol17.CodeAction.create("Organize Imports", {
|
|
title: "",
|
|
command: "tsserver.organizeImports",
|
|
arguments: [document]
|
|
}, import_vscode_languageserver_protocol17.CodeActionKind.SourceOrganizeImports);
|
|
return [action];
|
|
}
|
|
};
|
|
|
|
// src/server/languageProvider.ts
|
|
var suggestionSetting = "suggestionActions.enabled";
|
|
var LanguageProvider = class {
|
|
constructor(client, fileConfigurationManager, description, typingsStatus) {
|
|
this.client = client;
|
|
this.fileConfigurationManager = fileConfigurationManager;
|
|
this.description = description;
|
|
this.disposables = [];
|
|
import_coc23.workspace.onDidChangeConfiguration(this.configurationChanged, this, this.disposables);
|
|
this.configurationChanged();
|
|
let initialized = false;
|
|
client.onTsServerStarted(async () => {
|
|
if (!initialized) {
|
|
initialized = true;
|
|
this.registerProviders(client, typingsStatus);
|
|
}
|
|
});
|
|
}
|
|
configurationChanged() {
|
|
const config = import_coc23.workspace.getConfiguration(this.id, null);
|
|
this.client.diagnosticsManager.setEnableSuggestions(this.id, config.get(suggestionSetting, true));
|
|
}
|
|
dispose() {
|
|
import_coc23.disposeAll(this.disposables);
|
|
}
|
|
_register(disposable) {
|
|
this.disposables.push(disposable);
|
|
}
|
|
registerProviders(client, typingsStatus) {
|
|
let languageIds = this.description.modeIds;
|
|
let clientId = `tsserver-${this.description.id}`;
|
|
this._register(import_coc23.languages.registerCompletionItemProvider(clientId, "TSC", languageIds, new completionItemProvider_default(client, typingsStatus, this.fileConfigurationManager, this.description.id), completionItemProvider_default.triggerCharacters));
|
|
if (this.client.apiVersion.gte(api_default.v230)) {
|
|
this._register(import_coc23.languages.registerCompletionItemProvider(`${this.description.id}-directive`, "TSC", languageIds, new directiveCommentCompletions_default(client), ["@"]));
|
|
}
|
|
let definitionProvider = new definitionProvider_default(client);
|
|
this._register(import_coc23.languages.registerDefinitionProvider(languageIds, definitionProvider));
|
|
this._register(import_coc23.languages.registerTypeDefinitionProvider(languageIds, definitionProvider));
|
|
this._register(import_coc23.languages.registerImplementationProvider(languageIds, definitionProvider));
|
|
this._register(import_coc23.languages.registerReferencesProvider(languageIds, new references_default(client)));
|
|
this._register(import_coc23.languages.registerHoverProvider(languageIds, new hover_default(client)));
|
|
this._register(import_coc23.languages.registerDocumentHighlightProvider(languageIds, new documentHighlight_default(this.client)));
|
|
this._register(import_coc23.languages.registerSignatureHelpProvider(languageIds, new signatureHelp_default(client), ["(", ",", "<", ")"]));
|
|
this._register(import_coc23.languages.registerDocumentSymbolProvider(languageIds, new documentSymbol_default(client)));
|
|
this._register(import_coc23.languages.registerRenameProvider(languageIds, new rename_default(client, this.fileConfigurationManager)));
|
|
let formatProvider = new formatting_default(client, this.fileConfigurationManager);
|
|
this._register(import_coc23.languages.registerDocumentFormatProvider(languageIds, formatProvider));
|
|
this._register(import_coc23.languages.registerDocumentRangeFormatProvider(languageIds, formatProvider));
|
|
this._register(import_coc23.languages.registerOnTypeFormattingEditProvider(languageIds, formatProvider, [";", "}", "\n", String.fromCharCode(27)]));
|
|
this._register(import_coc23.languages.registerCodeActionProvider(languageIds, new moduleInstall_default(client), "tsserver"));
|
|
if (typeof import_coc23.languages["registerCallHierarchyProvider"] === "function") {
|
|
this._register(import_coc23.languages.registerCallHierarchyProvider(languageIds, new callHierarchy_default(client)));
|
|
}
|
|
let {fileConfigurationManager} = this;
|
|
let conf = fileConfigurationManager.getLanguageConfiguration(this.id);
|
|
if (["javascript", "typescript"].includes(this.id)) {
|
|
if (this.client.apiVersion.gte(api_default.v290) && conf.get("updateImportsOnFileMove.enable")) {
|
|
this._register(new updatePathOnRename_default(client, this.fileConfigurationManager, this.id));
|
|
}
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v280)) {
|
|
this._register(import_coc23.languages.registerFoldingRangeProvider(languageIds, new folding_default(this.client)));
|
|
this._register(import_coc23.languages.registerCodeActionProvider(languageIds, new OrganizeImportsCodeActionProvider(this.client, this.fileConfigurationManager), "tsserver", [import_vscode_languageserver_protocol18.CodeActionKind.SourceOrganizeImports]));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v240)) {
|
|
this._register(import_coc23.languages.registerCodeActionProvider(languageIds, new refactor_default(client, this.fileConfigurationManager), "tsserver", [import_vscode_languageserver_protocol18.CodeActionKind.Refactor]));
|
|
}
|
|
this._register(import_coc23.languages.registerCodeActionProvider(languageIds, new quickfix_default(client, this.fileConfigurationManager), "tsserver", [import_vscode_languageserver_protocol18.CodeActionKind.QuickFix]));
|
|
this._register(import_coc23.languages.registerCodeActionProvider(languageIds, new importFix_default(this.client.bufferSyncSupport), "tsserver", [import_vscode_languageserver_protocol18.CodeActionKind.QuickFix]));
|
|
let cachedResponse = new CachedNavTreeResponse();
|
|
if (this.client.apiVersion.gte(api_default.v206) && conf.get("referencesCodeLens.enable")) {
|
|
this._register(import_coc23.languages.registerCodeLensProvider(languageIds, new referencesCodeLens_default(client, cachedResponse)));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v220) && conf.get("implementationsCodeLens.enable")) {
|
|
this._register(import_coc23.languages.registerCodeLensProvider(languageIds, new implementationsCodeLens_default(client, cachedResponse)));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v350)) {
|
|
this._register(import_coc23.languages.registerSelectionRangeProvider(languageIds, new smartSelect_default(this.client)));
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v300)) {
|
|
this._register(new tagClosing_default(this.client, this.description.id));
|
|
}
|
|
}
|
|
handles(resource, doc) {
|
|
if (doc && this.description.modeIds.indexOf(doc.languageId) >= 0) {
|
|
return true;
|
|
}
|
|
const base = import_path5.default.basename(import_coc23.Uri.parse(resource).fsPath);
|
|
return !!base && (!!this.description.configFilePattern && this.description.configFilePattern.test(base));
|
|
}
|
|
get id() {
|
|
return this.description.id;
|
|
}
|
|
get diagnosticSource() {
|
|
return this.description.diagnosticSource;
|
|
}
|
|
triggerAllDiagnostics() {
|
|
this.client.bufferSyncSupport.requestAllDiagnostics();
|
|
}
|
|
diagnosticsReceived(diagnosticsKind, file2, diagnostics) {
|
|
const config = import_coc23.workspace.getConfiguration(this.id, file2.toString());
|
|
const reportUnnecessary = config.get("showUnused", true);
|
|
const reportDeprecated = config.get("showDeprecated", true);
|
|
this.client.diagnosticsManager.diagnosticsReceived(diagnosticsKind, file2.toString(), diagnostics.filter((diag) => {
|
|
if (!reportUnnecessary) {
|
|
if (diag.reportUnnecessary && diag.severity === import_vscode_languageserver_protocol18.DiagnosticSeverity.Information) {
|
|
return false;
|
|
}
|
|
}
|
|
if (!reportDeprecated) {
|
|
if (diag.reportDeprecated && diag.severity === import_vscode_languageserver_protocol18.DiagnosticSeverity.Hint) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}));
|
|
}
|
|
};
|
|
var languageProvider_default = LanguageProvider;
|
|
|
|
// src/server/typescriptServiceClient.ts
|
|
var import_coc32 = __toModule(require("coc.nvim"));
|
|
var import_fs4 = __toModule(require("fs"));
|
|
var import_os2 = __toModule(require("os"));
|
|
var import_path8 = __toModule(require("path"));
|
|
var import_vscode_languageserver_protocol21 = __toModule(require_main3());
|
|
|
|
// src/utils/fileSchemess.ts
|
|
var file = "file";
|
|
var git = "git";
|
|
var vsls = "vsls";
|
|
var disabledSchemes = new Set([
|
|
git,
|
|
vsls
|
|
]);
|
|
|
|
// src/server/typescriptService.ts
|
|
var ServerResponse;
|
|
(function(ServerResponse2) {
|
|
class Cancelled {
|
|
constructor(reason) {
|
|
this.reason = reason;
|
|
this.type = "cancelled";
|
|
}
|
|
}
|
|
ServerResponse2.Cancelled = Cancelled;
|
|
ServerResponse2.NoContent = new class {
|
|
constructor() {
|
|
this.type = "noContent";
|
|
}
|
|
}();
|
|
})(ServerResponse || (ServerResponse = {}));
|
|
var ExectuionTarget;
|
|
(function(ExectuionTarget2) {
|
|
ExectuionTarget2[ExectuionTarget2["Semantic"] = 0] = "Semantic";
|
|
ExectuionTarget2[ExectuionTarget2["Syntax"] = 1] = "Syntax";
|
|
})(ExectuionTarget || (ExectuionTarget = {}));
|
|
|
|
// src/server/callbackMap.ts
|
|
var CallbackMap = class {
|
|
constructor() {
|
|
this._callbacks = new Map();
|
|
this._asyncCallbacks = new Map();
|
|
}
|
|
destroy(cause) {
|
|
const cancellation = new ServerResponse.Cancelled(cause);
|
|
for (const callback of this._callbacks.values()) {
|
|
callback.onSuccess(cancellation);
|
|
}
|
|
this._callbacks.clear();
|
|
for (const callback of this._asyncCallbacks.values()) {
|
|
callback.onSuccess(cancellation);
|
|
}
|
|
this._asyncCallbacks.clear();
|
|
}
|
|
add(seq, callback, isAsync) {
|
|
if (isAsync) {
|
|
this._asyncCallbacks.set(seq, callback);
|
|
} else {
|
|
this._callbacks.set(seq, callback);
|
|
}
|
|
}
|
|
fetch(seq) {
|
|
const callback = this._callbacks.get(seq) || this._asyncCallbacks.get(seq);
|
|
this.delete(seq);
|
|
return callback;
|
|
}
|
|
delete(seq) {
|
|
if (!this._callbacks.delete(seq)) {
|
|
this._asyncCallbacks.delete(seq);
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/server/features/bufferSyncSupport.ts
|
|
var import_coc25 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol19 = __toModule(require_main3());
|
|
|
|
// src/server/utils/async.ts
|
|
var Delayer = class {
|
|
constructor(defaultDelay) {
|
|
this.defaultDelay = defaultDelay;
|
|
this.timeout = null;
|
|
this.completionPromise = null;
|
|
this.onSuccess = null;
|
|
this.task = null;
|
|
}
|
|
trigger(task, delay = this.defaultDelay) {
|
|
this.task = task;
|
|
if (delay >= 0) {
|
|
this.cancelTimeout();
|
|
}
|
|
if (!this.completionPromise) {
|
|
this.completionPromise = new Promise((resolve) => {
|
|
this.onSuccess = resolve;
|
|
}).then(() => {
|
|
this.completionPromise = null;
|
|
this.onSuccess = null;
|
|
let result = this.task && this.task();
|
|
this.task = null;
|
|
return result;
|
|
});
|
|
}
|
|
if (delay >= 0 || this.timeout === null) {
|
|
this.timeout = setTimeout(() => {
|
|
this.timeout = null;
|
|
if (this.onSuccess) {
|
|
this.onSuccess(void 0);
|
|
}
|
|
}, delay >= 0 ? delay : this.defaultDelay);
|
|
}
|
|
return this.completionPromise;
|
|
}
|
|
cancelTimeout() {
|
|
if (this.timeout !== null) {
|
|
clearTimeout(this.timeout);
|
|
this.timeout = null;
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/server/utils/languageModeIds.ts
|
|
var typescript = "typescript";
|
|
var typescriptreact = "typescriptreact";
|
|
var typescripttsx = "typescript.tsx";
|
|
var typescriptjsx = "typescript.jsx";
|
|
var javascript = "javascript";
|
|
var javascriptreact = "javascriptreact";
|
|
var javascriptjsx = "javascript.jsx";
|
|
function mode2ScriptKind(mode) {
|
|
switch (mode) {
|
|
case typescript:
|
|
return "TS";
|
|
case typescripttsx:
|
|
return "TSX";
|
|
case typescriptjsx:
|
|
return "TSX";
|
|
case typescriptreact:
|
|
return "TSX";
|
|
case javascript:
|
|
return "JS";
|
|
case javascriptreact:
|
|
return "JSX";
|
|
}
|
|
return void 0;
|
|
}
|
|
|
|
// src/server/features/resourceMap.ts
|
|
var import_coc24 = __toModule(require("coc.nvim"));
|
|
function defaultPathNormalizer(resource) {
|
|
let u = import_coc24.Uri.parse(resource);
|
|
if (u.scheme === "file") {
|
|
return u.fsPath;
|
|
}
|
|
return resource.toString();
|
|
}
|
|
var ResourceMap = class {
|
|
constructor(_normalizePath = defaultPathNormalizer) {
|
|
this._normalizePath = _normalizePath;
|
|
this._map = new Map();
|
|
}
|
|
get size() {
|
|
return this._map.size;
|
|
}
|
|
get entries() {
|
|
return this._map.values();
|
|
}
|
|
has(uri) {
|
|
const file2 = this.toKey(uri);
|
|
return !!file2 && this._map.has(file2);
|
|
}
|
|
get(uri) {
|
|
const file2 = this.toKey(uri);
|
|
if (!file2)
|
|
return void 0;
|
|
let entry = this._map.get(file2);
|
|
return entry ? entry.value : void 0;
|
|
}
|
|
set(uri, value) {
|
|
const file2 = this.toKey(uri);
|
|
if (file2) {
|
|
this._map.set(file2, {uri, value});
|
|
}
|
|
}
|
|
delete(uri) {
|
|
const file2 = this.toKey(uri);
|
|
if (file2) {
|
|
this._map.delete(file2);
|
|
}
|
|
}
|
|
get values() {
|
|
return Array.from(this._map.values()).map((x) => x.value);
|
|
}
|
|
get uris() {
|
|
return Array.from(this._map.values()).map((x) => x.uri);
|
|
}
|
|
clear() {
|
|
this._map.clear();
|
|
}
|
|
toKey(uri) {
|
|
const key = this._normalizePath ? this._normalizePath(uri) : uri;
|
|
if (!key) {
|
|
return key;
|
|
}
|
|
return this.isCaseInsensitivePath(key) ? key.toLowerCase() : key;
|
|
}
|
|
isCaseInsensitivePath(path9) {
|
|
if (isWindowsPath(path9)) {
|
|
return true;
|
|
}
|
|
return path9[0] === "/" && this.onIsCaseInsenitiveFileSystem;
|
|
}
|
|
get onIsCaseInsenitiveFileSystem() {
|
|
if (process.platform === "win32") {
|
|
return true;
|
|
}
|
|
if (process.platform === "darwin") {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
function isWindowsPath(path9) {
|
|
return /^[a-zA-Z]:\\/.test(path9);
|
|
}
|
|
|
|
// src/server/features/bufferSyncSupport.ts
|
|
var BufferKind;
|
|
(function(BufferKind2) {
|
|
BufferKind2[BufferKind2["TypeScript"] = 1] = "TypeScript";
|
|
BufferKind2[BufferKind2["JavaScript"] = 2] = "JavaScript";
|
|
})(BufferKind || (BufferKind = {}));
|
|
var BufferState;
|
|
(function(BufferState2) {
|
|
BufferState2[BufferState2["Initial"] = 1] = "Initial";
|
|
BufferState2[BufferState2["Open"] = 2] = "Open";
|
|
BufferState2[BufferState2["Closed"] = 2] = "Closed";
|
|
})(BufferState || (BufferState = {}));
|
|
var BufferOperationType;
|
|
(function(BufferOperationType2) {
|
|
BufferOperationType2[BufferOperationType2["Close"] = 0] = "Close";
|
|
BufferOperationType2[BufferOperationType2["Open"] = 1] = "Open";
|
|
BufferOperationType2[BufferOperationType2["Change"] = 2] = "Change";
|
|
})(BufferOperationType || (BufferOperationType = {}));
|
|
var CloseOperation = class {
|
|
constructor(args) {
|
|
this.args = args;
|
|
this.type = 0;
|
|
}
|
|
};
|
|
var OpenOperation = class {
|
|
constructor(args) {
|
|
this.args = args;
|
|
this.type = 1;
|
|
}
|
|
};
|
|
var ChangeOperation = class {
|
|
constructor(args) {
|
|
this.args = args;
|
|
this.type = 2;
|
|
}
|
|
};
|
|
var SyncedBuffer = class {
|
|
constructor(document, filepath, client, synchronizer) {
|
|
this.document = document;
|
|
this.filepath = filepath;
|
|
this.client = client;
|
|
this.synchronizer = synchronizer;
|
|
this.state = 1;
|
|
}
|
|
open() {
|
|
const args = {
|
|
file: this.filepath,
|
|
fileContent: this.document.getText(),
|
|
projectRootPath: this.client.getProjectRootPath(this.document.uri)
|
|
};
|
|
const scriptKind = mode2ScriptKind(this.document.languageId);
|
|
if (scriptKind) {
|
|
args.scriptKindName = scriptKind;
|
|
}
|
|
if (this.client.apiVersion.gte(api_default.v240)) {
|
|
const tsPluginsForDocument = this.client.pluginManager.plugins.filter((x) => x.languages.indexOf(this.document.languageId) >= 0);
|
|
if (tsPluginsForDocument.length) {
|
|
args.plugins = tsPluginsForDocument.map((plugin) => plugin.name);
|
|
}
|
|
}
|
|
this.synchronizer.open(this.resource, args);
|
|
this.state = 2;
|
|
}
|
|
get resource() {
|
|
return this.document.uri;
|
|
}
|
|
get lineCount() {
|
|
return this.document.lineCount;
|
|
}
|
|
get kind() {
|
|
if (this.document.languageId.startsWith("javascript")) {
|
|
return 2;
|
|
}
|
|
return 1;
|
|
}
|
|
close() {
|
|
if (this.state !== 2) {
|
|
this.state = 2;
|
|
return false;
|
|
}
|
|
this.state = 2;
|
|
return this.synchronizer.close(this.resource, this.filepath);
|
|
}
|
|
onContentChanged(events3) {
|
|
if (this.state !== 2) {
|
|
console.error(`Unexpected buffer state: ${this.state}`);
|
|
}
|
|
this.synchronizer.change(this.resource, this.filepath, events3);
|
|
}
|
|
};
|
|
var SyncedBufferMap = class extends ResourceMap {
|
|
getForPath(filePath) {
|
|
return this.get(import_coc25.Uri.file(filePath).toString());
|
|
}
|
|
get allBuffers() {
|
|
return this.values;
|
|
}
|
|
};
|
|
var PendingDiagnostics = class extends ResourceMap {
|
|
getOrderedFileSet() {
|
|
const orderedResources = Array.from(this.entries).sort((a, b) => a.value - b.value).map((entry) => entry.uri);
|
|
const map = new ResourceMap(this._normalizePath);
|
|
for (const resource of orderedResources) {
|
|
map.set(resource, void 0);
|
|
}
|
|
return map;
|
|
}
|
|
};
|
|
var BufferSynchronizer = class {
|
|
constructor(client, pathNormalizer) {
|
|
this.client = client;
|
|
this._pending = new ResourceMap(pathNormalizer);
|
|
}
|
|
open(resource, args) {
|
|
if (this.supportsBatching) {
|
|
this.updatePending(resource, new OpenOperation(args));
|
|
} else {
|
|
this.client.executeWithoutWaitingForResponse("open", args);
|
|
}
|
|
}
|
|
close(resource, filepath) {
|
|
if (this.supportsBatching) {
|
|
return this.updatePending(resource, new CloseOperation(filepath));
|
|
} else {
|
|
const args = {file: filepath};
|
|
this.client.executeWithoutWaitingForResponse("close", args);
|
|
return true;
|
|
}
|
|
}
|
|
change(resource, filepath, events3) {
|
|
if (!events3.length) {
|
|
return;
|
|
}
|
|
if (this.supportsBatching) {
|
|
this.updatePending(resource, new ChangeOperation({
|
|
fileName: filepath,
|
|
textChanges: events3.map((change) => ({
|
|
newText: change.text,
|
|
start: Position.toLocation(change.range.start),
|
|
end: Position.toLocation(change.range.end)
|
|
})).reverse()
|
|
}));
|
|
} else {
|
|
for (const {range, text} of events3) {
|
|
const args = {
|
|
insertString: text,
|
|
...Range2.toFormattingRequestArgs(filepath, range)
|
|
};
|
|
this.client.executeWithoutWaitingForResponse("change", args);
|
|
}
|
|
}
|
|
}
|
|
reset() {
|
|
this._pending.clear();
|
|
}
|
|
beforeCommand(command) {
|
|
if (command === "updateOpen") {
|
|
return;
|
|
}
|
|
this.flush();
|
|
}
|
|
flush() {
|
|
if (!this.supportsBatching) {
|
|
this._pending.clear();
|
|
return;
|
|
}
|
|
if (this._pending.size > 0) {
|
|
const closedFiles = [];
|
|
const openFiles = [];
|
|
const changedFiles = [];
|
|
for (const change of this._pending.values) {
|
|
switch (change.type) {
|
|
case 2:
|
|
changedFiles.push(change.args);
|
|
break;
|
|
case 1:
|
|
openFiles.push(change.args);
|
|
break;
|
|
case 0:
|
|
closedFiles.push(change.args);
|
|
break;
|
|
}
|
|
}
|
|
this.client.execute("updateOpen", {changedFiles, closedFiles, openFiles}, import_vscode_languageserver_protocol19.CancellationToken.None, {nonRecoverable: true});
|
|
this._pending.clear();
|
|
}
|
|
}
|
|
get supportsBatching() {
|
|
return this.client.apiVersion.gte(api_default.v340);
|
|
}
|
|
updatePending(resource, op) {
|
|
switch (op.type) {
|
|
case 0:
|
|
const existing = this._pending.get(resource);
|
|
switch (existing == null ? void 0 : existing.type) {
|
|
case 1:
|
|
this._pending.delete(resource);
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
if (this._pending.has(resource)) {
|
|
this.flush();
|
|
}
|
|
this._pending.set(resource, op);
|
|
return true;
|
|
}
|
|
};
|
|
var GetErrRequest = class {
|
|
constructor(client, uris, _token, onDone) {
|
|
this.uris = uris;
|
|
this._token = _token;
|
|
this._done = false;
|
|
let files = uris.map((uri) => client.normalizePath(uri));
|
|
const args = {
|
|
delay: 0,
|
|
files
|
|
};
|
|
const done = () => {
|
|
if (this._done) {
|
|
return;
|
|
}
|
|
this._done = true;
|
|
onDone();
|
|
};
|
|
client.executeAsync("geterr", args, _token.token).then(done, done);
|
|
}
|
|
static executeGetErrRequest(client, uris, onDone) {
|
|
const token = new import_vscode_languageserver_protocol19.CancellationTokenSource();
|
|
return new GetErrRequest(client, uris, token, onDone);
|
|
}
|
|
cancel() {
|
|
if (!this._done) {
|
|
this._token.cancel();
|
|
}
|
|
this._token.dispose();
|
|
}
|
|
};
|
|
var BufferSyncSupport = class {
|
|
constructor(client, modeIds) {
|
|
this.disposables = [];
|
|
this._validateJavaScript = true;
|
|
this._validateTypeScript = true;
|
|
this.listening = false;
|
|
this._onDelete = new import_vscode_languageserver_protocol19.Emitter();
|
|
this.onDelete = this._onDelete.event;
|
|
this._onWillChange = new import_vscode_languageserver_protocol19.Emitter();
|
|
this.onWillChange = this._onWillChange.event;
|
|
this.client = client;
|
|
this.modeIds = new Set(modeIds);
|
|
this.diagnosticDelayer = new Delayer(300);
|
|
const pathNormalizer = (path9) => this.client.toPath(path9);
|
|
this.syncedBuffers = new SyncedBufferMap(pathNormalizer);
|
|
this.pendingDiagnostics = new PendingDiagnostics(pathNormalizer);
|
|
this.synchronizer = new BufferSynchronizer(client, pathNormalizer);
|
|
this.updateConfiguration();
|
|
import_coc25.workspace.onDidChangeConfiguration(this.updateConfiguration, this, this.disposables);
|
|
}
|
|
listen() {
|
|
if (this.listening) {
|
|
return;
|
|
}
|
|
this.listening = true;
|
|
import_coc25.workspace.onDidOpenTextDocument(this.openTextDocument, this, this.disposables);
|
|
import_coc25.workspace.onDidCloseTextDocument(this.onDidCloseTextDocument, this, this.disposables);
|
|
import_coc25.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, this.disposables);
|
|
import_coc25.workspace.textDocuments.forEach(this.openTextDocument, this);
|
|
}
|
|
handles(resource) {
|
|
return this.syncedBuffers.has(resource);
|
|
}
|
|
dispose() {
|
|
this.pendingDiagnostics.clear();
|
|
import_coc25.disposeAll(this.disposables);
|
|
this._onWillChange.dispose();
|
|
this._onDelete.dispose();
|
|
}
|
|
ensureHasBuffer(resource) {
|
|
if (this.syncedBuffers.has(resource)) {
|
|
return true;
|
|
}
|
|
const existingDocument = import_coc25.workspace.textDocuments.find((doc) => doc.uri.toString() === resource);
|
|
if (existingDocument) {
|
|
return this.openTextDocument(existingDocument);
|
|
}
|
|
return false;
|
|
}
|
|
toResource(filePath) {
|
|
const buffer = this.syncedBuffers.getForPath(filePath);
|
|
if (buffer)
|
|
return buffer.resource;
|
|
return import_coc25.Uri.file(filePath).toString();
|
|
}
|
|
reset() {
|
|
var _a;
|
|
(_a = this.pendingGetErr) == null ? void 0 : _a.cancel();
|
|
this.pendingDiagnostics.clear();
|
|
this.synchronizer.reset();
|
|
}
|
|
reinitialize() {
|
|
this.reset();
|
|
for (const buffer of this.syncedBuffers.allBuffers) {
|
|
buffer.open();
|
|
}
|
|
}
|
|
openTextDocument(document) {
|
|
if (!this.modeIds.has(document.languageId)) {
|
|
return false;
|
|
}
|
|
const resource = document.uri;
|
|
const filepath = this.client.normalizePath(import_coc25.Uri.parse(resource));
|
|
if (!filepath) {
|
|
return false;
|
|
}
|
|
if (this.syncedBuffers.has(resource)) {
|
|
return true;
|
|
}
|
|
const syncedBuffer = new SyncedBuffer(document, filepath, this.client, this.synchronizer);
|
|
this.syncedBuffers.set(resource, syncedBuffer);
|
|
syncedBuffer.open();
|
|
this.requestDiagnostic(syncedBuffer);
|
|
return true;
|
|
}
|
|
closeResource(resource) {
|
|
const syncedBuffer = this.syncedBuffers.get(resource);
|
|
if (!syncedBuffer) {
|
|
return;
|
|
}
|
|
this.pendingDiagnostics.delete(resource);
|
|
this.syncedBuffers.delete(resource);
|
|
const wasBufferOpen = syncedBuffer.close();
|
|
this._onDelete.fire(resource);
|
|
if (wasBufferOpen) {
|
|
this.requestAllDiagnostics();
|
|
}
|
|
}
|
|
onDidCloseTextDocument(document) {
|
|
this.closeResource(document.uri);
|
|
}
|
|
onDidChangeTextDocument(e) {
|
|
const syncedBuffer = this.syncedBuffers.get(e.textDocument.uri);
|
|
if (!syncedBuffer) {
|
|
return;
|
|
}
|
|
this._onWillChange.fire(syncedBuffer.resource);
|
|
syncedBuffer.onContentChanged(e.contentChanges);
|
|
const didTrigger = this.requestDiagnostic(syncedBuffer);
|
|
if (!didTrigger && this.pendingGetErr) {
|
|
this.pendingGetErr.cancel();
|
|
this.pendingGetErr = void 0;
|
|
this.triggerDiagnostics();
|
|
}
|
|
}
|
|
beforeCommand(command) {
|
|
this.synchronizer.beforeCommand(command);
|
|
}
|
|
interuptGetErr(f) {
|
|
if (!this.pendingGetErr) {
|
|
return f();
|
|
}
|
|
this.pendingGetErr.cancel();
|
|
this.pendingGetErr = void 0;
|
|
const result = f();
|
|
this.triggerDiagnostics();
|
|
return result;
|
|
}
|
|
getErr(resources) {
|
|
const handledResources = resources.filter((resource) => {
|
|
let syncedBuffer = this.syncedBuffers.get(resource.toString());
|
|
return syncedBuffer && this.shouldValidate(syncedBuffer);
|
|
});
|
|
if (!handledResources.length) {
|
|
return;
|
|
}
|
|
for (const resource of handledResources) {
|
|
this.pendingDiagnostics.set(resource.toString(), Date.now());
|
|
}
|
|
this.triggerDiagnostics();
|
|
}
|
|
triggerDiagnostics(delay = 200) {
|
|
this.diagnosticDelayer.trigger(() => {
|
|
this.sendPendingDiagnostics();
|
|
}, delay);
|
|
}
|
|
requestAllDiagnostics() {
|
|
for (const buffer of this.syncedBuffers.allBuffers) {
|
|
if (this.shouldValidate(buffer)) {
|
|
this.pendingDiagnostics.set(buffer.resource, Date.now());
|
|
}
|
|
}
|
|
this.triggerDiagnostics();
|
|
}
|
|
requestDiagnostic(buffer) {
|
|
if (!this.shouldValidate(buffer)) {
|
|
return false;
|
|
}
|
|
this.pendingDiagnostics.set(buffer.resource, Date.now());
|
|
const delay = Math.min(Math.max(Math.ceil(buffer.lineCount / 20), 300), 800);
|
|
this.triggerDiagnostics(delay);
|
|
return true;
|
|
}
|
|
hasPendingDiagnostics(uri) {
|
|
return this.pendingDiagnostics.has(uri);
|
|
}
|
|
sendPendingDiagnostics() {
|
|
const orderedFileSet = this.pendingDiagnostics.getOrderedFileSet();
|
|
if (this.pendingGetErr) {
|
|
this.pendingGetErr.cancel();
|
|
for (const uri of this.pendingGetErr.uris) {
|
|
let resource = uri.toString();
|
|
let syncedBuffer = this.syncedBuffers.get(resource);
|
|
if (syncedBuffer && this.shouldValidate(syncedBuffer)) {
|
|
orderedFileSet.set(resource, void 0);
|
|
} else {
|
|
orderedFileSet.delete(resource);
|
|
}
|
|
}
|
|
this.pendingGetErr = void 0;
|
|
}
|
|
for (const buffer of this.syncedBuffers.values) {
|
|
if (this.shouldValidate(buffer)) {
|
|
orderedFileSet.set(buffer.resource, void 0);
|
|
}
|
|
}
|
|
if (orderedFileSet.size) {
|
|
let uris = Array.from(orderedFileSet.uris).map((uri) => import_coc25.Uri.parse(uri));
|
|
const getErr = this.pendingGetErr = GetErrRequest.executeGetErrRequest(this.client, uris, () => {
|
|
if (this.pendingGetErr === getErr) {
|
|
this.pendingGetErr = void 0;
|
|
}
|
|
});
|
|
}
|
|
this.pendingDiagnostics.clear();
|
|
}
|
|
updateConfiguration() {
|
|
const jsConfig = import_coc25.workspace.getConfiguration("javascript", null);
|
|
const tsConfig = import_coc25.workspace.getConfiguration("typescript", null);
|
|
this._validateJavaScript = jsConfig.get("validate.enable", true);
|
|
this._validateTypeScript = tsConfig.get("validate.enable", true);
|
|
}
|
|
shouldValidate(buffer) {
|
|
switch (buffer.kind) {
|
|
case 2:
|
|
return this._validateJavaScript;
|
|
case 1:
|
|
default:
|
|
return this._validateTypeScript;
|
|
}
|
|
}
|
|
};
|
|
var bufferSyncSupport_default = BufferSyncSupport;
|
|
|
|
// src/server/features/diagnostics.ts
|
|
var import_coc26 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol20 = __toModule(require_main3());
|
|
var DiagnosticSet = class {
|
|
constructor() {
|
|
this._map = new ResourceMap();
|
|
}
|
|
set(uri, diagnostics) {
|
|
this._map.set(uri, diagnostics);
|
|
}
|
|
get(uri) {
|
|
return this._map.get(uri) || [];
|
|
}
|
|
clear() {
|
|
this._map = new ResourceMap();
|
|
}
|
|
};
|
|
var DiagnosticKind;
|
|
(function(DiagnosticKind2) {
|
|
DiagnosticKind2[DiagnosticKind2["Syntax"] = 0] = "Syntax";
|
|
DiagnosticKind2[DiagnosticKind2["Semantic"] = 1] = "Semantic";
|
|
DiagnosticKind2[DiagnosticKind2["Suggestion"] = 2] = "Suggestion";
|
|
})(DiagnosticKind || (DiagnosticKind = {}));
|
|
var allDiagnosticKinds = [
|
|
0,
|
|
1,
|
|
2
|
|
];
|
|
var DiagnosticsManager = class {
|
|
constructor() {
|
|
this._diagnostics = new Map();
|
|
this._pendingUpdates = new ResourceMap();
|
|
this._enableJavascriptSuggestions = true;
|
|
this._enableTypescriptSuggestions = true;
|
|
this.updateDelay = 200;
|
|
for (const kind of allDiagnosticKinds) {
|
|
this._diagnostics.set(kind, new DiagnosticSet());
|
|
}
|
|
this._currentDiagnostics = import_coc26.languages.createDiagnosticCollection("tsserver");
|
|
}
|
|
dispose() {
|
|
this._currentDiagnostics.dispose();
|
|
for (const value of this._pendingUpdates.values) {
|
|
clearTimeout(value);
|
|
}
|
|
this._pendingUpdates = new ResourceMap();
|
|
}
|
|
reInitialize() {
|
|
this._currentDiagnostics.clear();
|
|
for (const diagnosticSet of this._diagnostics.values()) {
|
|
diagnosticSet.clear();
|
|
}
|
|
}
|
|
setEnableSuggestions(languageId, value) {
|
|
let curr = languageId == "javascript" ? this._enableJavascriptSuggestions : this._enableTypescriptSuggestions;
|
|
if (curr == value) {
|
|
return;
|
|
}
|
|
if (languageId == "javascript") {
|
|
this._enableJavascriptSuggestions = value;
|
|
} else {
|
|
this._enableTypescriptSuggestions = value;
|
|
}
|
|
}
|
|
diagnosticsReceived(kind, uri, diagnostics) {
|
|
const collection = this._diagnostics.get(kind);
|
|
if (!collection)
|
|
return;
|
|
let doc = import_coc26.workspace.getDocument(uri);
|
|
if (doc)
|
|
uri = doc.uri;
|
|
if (diagnostics.length === 0) {
|
|
const existing = collection.get(uri);
|
|
if (existing.length === 0) {
|
|
return;
|
|
}
|
|
}
|
|
collection.set(uri, diagnostics);
|
|
this.scheduleDiagnosticsUpdate(uri);
|
|
}
|
|
configFileDiagnosticsReceived(uri, diagnostics) {
|
|
this._currentDiagnostics.set(uri, diagnostics);
|
|
}
|
|
delete(uri) {
|
|
this._currentDiagnostics.delete(uri);
|
|
}
|
|
getDiagnostics(uri) {
|
|
return this._currentDiagnostics.get(uri) || [];
|
|
return [];
|
|
}
|
|
scheduleDiagnosticsUpdate(uri) {
|
|
if (!this._pendingUpdates.has(uri)) {
|
|
this._pendingUpdates.set(uri, setTimeout(() => this.updateCurrentDiagnostics(uri), this.updateDelay));
|
|
}
|
|
}
|
|
updateCurrentDiagnostics(uri) {
|
|
if (this._pendingUpdates.has(uri)) {
|
|
clearTimeout(this._pendingUpdates.get(uri));
|
|
this._pendingUpdates.delete(uri);
|
|
}
|
|
const allDiagnostics = [
|
|
...this._diagnostics.get(0).get(uri),
|
|
...this._diagnostics.get(1).get(uri),
|
|
...this.getSuggestionDiagnostics(uri)
|
|
];
|
|
this._currentDiagnostics.set(uri, allDiagnostics);
|
|
}
|
|
getSuggestionDiagnostics(uri) {
|
|
const enabled = this.suggestionsEnabled(uri);
|
|
return this._diagnostics.get(2).get(uri).filter((x) => {
|
|
if (!enabled) {
|
|
return x.tags && (x.tags.includes(import_vscode_languageserver_protocol20.DiagnosticTag.Unnecessary) || x.tags.includes(import_vscode_languageserver_protocol20.DiagnosticTag.Deprecated));
|
|
}
|
|
return enabled;
|
|
});
|
|
}
|
|
suggestionsEnabled(uri) {
|
|
let doc = import_coc26.workspace.getDocument(uri);
|
|
if (!doc)
|
|
return false;
|
|
if (doc.filetype.startsWith("javascript")) {
|
|
return this._enableJavascriptSuggestions;
|
|
}
|
|
if (doc.filetype.startsWith("typescript")) {
|
|
return this._enableTypescriptSuggestions;
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
// src/server/requestQueue.ts
|
|
var RequestQueueingType;
|
|
(function(RequestQueueingType2) {
|
|
RequestQueueingType2[RequestQueueingType2["Normal"] = 1] = "Normal";
|
|
RequestQueueingType2[RequestQueueingType2["LowPriority"] = 2] = "LowPriority";
|
|
RequestQueueingType2[RequestQueueingType2["Fence"] = 3] = "Fence";
|
|
})(RequestQueueingType || (RequestQueueingType = {}));
|
|
var RequestQueue = class {
|
|
constructor() {
|
|
this.queue = [];
|
|
this.sequenceNumber = 0;
|
|
}
|
|
get length() {
|
|
return this.queue.length;
|
|
}
|
|
enqueue(item) {
|
|
if (item.queueingType === 1) {
|
|
let index = this.queue.length - 1;
|
|
while (index >= 0) {
|
|
if (this.queue[index].queueingType !== 2) {
|
|
break;
|
|
}
|
|
--index;
|
|
}
|
|
this.queue.splice(index + 1, 0, item);
|
|
} else {
|
|
this.queue.push(item);
|
|
}
|
|
}
|
|
dequeue() {
|
|
return this.queue.shift();
|
|
}
|
|
tryDeletePendingRequest(seq) {
|
|
for (let i = 0; i < this.queue.length; i++) {
|
|
if (this.queue[i].request.seq === seq) {
|
|
this.queue.splice(i, 1);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
createRequest(command, args) {
|
|
return {
|
|
seq: this.sequenceNumber++,
|
|
type: "request",
|
|
command,
|
|
arguments: args
|
|
};
|
|
}
|
|
};
|
|
|
|
// src/server/utils/configuration.ts
|
|
var import_coc27 = __toModule(require("coc.nvim"));
|
|
var import_which = __toModule(require_which());
|
|
var TsServerLogLevel;
|
|
(function(TsServerLogLevel2) {
|
|
TsServerLogLevel2[TsServerLogLevel2["Off"] = 0] = "Off";
|
|
TsServerLogLevel2[TsServerLogLevel2["Normal"] = 1] = "Normal";
|
|
TsServerLogLevel2[TsServerLogLevel2["Terse"] = 2] = "Terse";
|
|
TsServerLogLevel2[TsServerLogLevel2["Verbose"] = 3] = "Verbose";
|
|
})(TsServerLogLevel || (TsServerLogLevel = {}));
|
|
(function(TsServerLogLevel2) {
|
|
function fromString(value) {
|
|
switch (value && value.toLowerCase()) {
|
|
case "normal":
|
|
return TsServerLogLevel2.Normal;
|
|
case "terse":
|
|
return TsServerLogLevel2.Terse;
|
|
case "verbose":
|
|
return TsServerLogLevel2.Verbose;
|
|
case "off":
|
|
default:
|
|
return TsServerLogLevel2.Off;
|
|
}
|
|
}
|
|
TsServerLogLevel2.fromString = fromString;
|
|
function toString2(value) {
|
|
switch (value) {
|
|
case TsServerLogLevel2.Normal:
|
|
return "normal";
|
|
case TsServerLogLevel2.Terse:
|
|
return "terse";
|
|
case TsServerLogLevel2.Verbose:
|
|
return "verbose";
|
|
case TsServerLogLevel2.Off:
|
|
default:
|
|
return "off";
|
|
}
|
|
}
|
|
TsServerLogLevel2.toString = toString2;
|
|
})(TsServerLogLevel || (TsServerLogLevel = {}));
|
|
var TypeScriptServiceConfiguration = class {
|
|
constructor() {
|
|
this._configuration = import_coc27.workspace.getConfiguration("tsserver");
|
|
import_coc27.workspace.onDidChangeConfiguration(() => {
|
|
this._configuration = import_coc27.workspace.getConfiguration("tsserver");
|
|
});
|
|
}
|
|
get locale() {
|
|
return this._configuration.get("locale", null);
|
|
}
|
|
get globalTsdk() {
|
|
return this._configuration.get("tsdk", null);
|
|
}
|
|
get ignoreLocalTsserver() {
|
|
return this._configuration.get("ignoreLocalTsserver", false);
|
|
}
|
|
get tsServerLogLevel() {
|
|
return TsServerLogLevel.fromString(this._configuration.get("log", null));
|
|
}
|
|
get watchOptions() {
|
|
return this._configuration.get("watchOptions");
|
|
}
|
|
get typingsCacheLocation() {
|
|
return this._configuration.get("typingsCacheLocation", "");
|
|
}
|
|
get tsServerPluginPaths() {
|
|
return this._configuration.get("pluginPaths", []);
|
|
}
|
|
get checkJs() {
|
|
return this._configuration.get("implicitProjectConfig.checkJs", false);
|
|
}
|
|
get experimentalDecorators() {
|
|
return this._configuration.get("implicitProjectConfig.experimentalDecorators", false);
|
|
}
|
|
get disableAutomaticTypeAcquisition() {
|
|
return this._configuration.get("disableAutomaticTypeAcquisition", false);
|
|
}
|
|
get formatOnType() {
|
|
return this._configuration.get("formatOnType", false);
|
|
}
|
|
get maxTsServerMemory() {
|
|
return this._configuration.get("maxTsServerMemory", 0);
|
|
}
|
|
get debugPort() {
|
|
return this._configuration.get("debugPort", parseInt(process.env["TSS_DEBUG"], 10));
|
|
}
|
|
get npmLocation() {
|
|
let path9 = this._configuration.get("npm", "");
|
|
if (path9)
|
|
return import_coc27.workspace.expand(path9);
|
|
try {
|
|
path9 = import_which.default.sync("npm");
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
return path9;
|
|
}
|
|
static loadFromWorkspace() {
|
|
return new TypeScriptServiceConfiguration();
|
|
}
|
|
};
|
|
|
|
// src/server/utils/logger.ts
|
|
var import_coc28 = __toModule(require("coc.nvim"));
|
|
|
|
// src/server/utils/is.ts
|
|
var toString = Object.prototype.toString;
|
|
function boolean(value) {
|
|
return value === true || value === false;
|
|
}
|
|
function string(value) {
|
|
return toString.call(value) === "[object String]";
|
|
}
|
|
|
|
// src/server/utils/logger.ts
|
|
var Logger = class {
|
|
get output() {
|
|
if (this._channel) {
|
|
return this._channel;
|
|
}
|
|
this._channel = import_coc28.window.createOutputChannel("tsserver");
|
|
return this._channel;
|
|
}
|
|
dispose() {
|
|
if (this._channel) {
|
|
this._channel.dispose();
|
|
}
|
|
}
|
|
data2String(data) {
|
|
if (data instanceof Error) {
|
|
if (string(data.stack)) {
|
|
return data.stack;
|
|
}
|
|
return data.message;
|
|
}
|
|
if (boolean(data.success) && !data.success && string(data.message)) {
|
|
return data.message;
|
|
}
|
|
if (string(data)) {
|
|
return data;
|
|
}
|
|
return data.toString();
|
|
}
|
|
info(message, data) {
|
|
this.logLevel("Info", message, data);
|
|
}
|
|
warn(message, data) {
|
|
this.logLevel("Warn", message, data);
|
|
}
|
|
error(message, data) {
|
|
if (data && data.message === "No content available.") {
|
|
return;
|
|
}
|
|
this.logLevel("Error", message, data);
|
|
}
|
|
logLevel(level, message, data) {
|
|
this.output.appendLine(`[${level} - ${new Date().toLocaleTimeString()}] ${message}`);
|
|
if (data) {
|
|
this.output.appendLine(this.data2String(data));
|
|
}
|
|
}
|
|
};
|
|
var logger_default = Logger;
|
|
|
|
// src/server/utils/process.ts
|
|
var import_child_process2 = __toModule(require("child_process"));
|
|
var import_net = __toModule(require("net"));
|
|
var import_os = __toModule(require("os"));
|
|
var import_path6 = __toModule(require("path"));
|
|
var import_fs2 = __toModule(require("fs"));
|
|
function makeRandomHexString(length) {
|
|
let chars = ["0", "1", "2", "3", "4", "5", "6", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
|
|
let result = "";
|
|
for (let i = 0; i < length; i++) {
|
|
const idx = Math.floor(chars.length * Math.random());
|
|
result += chars[idx];
|
|
}
|
|
return result;
|
|
}
|
|
function getTempDirectory() {
|
|
let dir = import_path6.default.join(import_os.default.tmpdir(), `coc.nvim-${process.pid}`);
|
|
if (!import_fs2.default.existsSync(dir)) {
|
|
import_fs2.default.mkdirSync(dir);
|
|
}
|
|
return dir;
|
|
}
|
|
function generatePipeName() {
|
|
return getPipeName(makeRandomHexString(40));
|
|
}
|
|
function getPipeName(name) {
|
|
const fullName = "coc-tsc-" + name;
|
|
if (process.platform === "win32") {
|
|
return "\\\\.\\pipe\\" + fullName + "-sock";
|
|
}
|
|
const tmpdir = getTempDirectory();
|
|
return import_path6.default.join(tmpdir, fullName + ".sock");
|
|
}
|
|
function getTempFile(name) {
|
|
const fullName = "coc-nvim-" + name;
|
|
return import_path6.default.join(getTempDirectory(), fullName + ".sock");
|
|
}
|
|
function generatePatchedEnv(env, stdInPipeName, stdOutPipeName, stdErrPipeName) {
|
|
const newEnv = Object.assign({}, env);
|
|
newEnv["STDIN_PIPE_NAME"] = stdInPipeName;
|
|
newEnv["STDOUT_PIPE_NAME"] = stdOutPipeName;
|
|
newEnv["STDERR_PIPE_NAME"] = stdErrPipeName;
|
|
newEnv["TSS_LOG"] = `-level verbose -file ${import_path6.default.join(import_os.default.tmpdir(), "coc-nvim-tsc.log")}`;
|
|
newEnv["PATH"] = newEnv["PATH"] || process.env.PATH;
|
|
return newEnv;
|
|
}
|
|
function fork(modulePath, args, options, logger, callback) {
|
|
let callbackCalled = false;
|
|
const resolve = (result) => {
|
|
if (callbackCalled) {
|
|
return;
|
|
}
|
|
callbackCalled = true;
|
|
callback(null, result);
|
|
};
|
|
const reject = (err) => {
|
|
if (callbackCalled) {
|
|
return;
|
|
}
|
|
callbackCalled = true;
|
|
callback(err, null);
|
|
};
|
|
const stdInPipeName = generatePipeName();
|
|
const stdOutPipeName = generatePipeName();
|
|
const stdErrPipeName = generatePipeName();
|
|
const newEnv = generatePatchedEnv(process.env, stdInPipeName, stdOutPipeName, stdErrPipeName);
|
|
newEnv["NODE_PATH"] = import_path6.default.join(modulePath, "..", "..", "..");
|
|
let childProcess;
|
|
let stdErrServer = import_net.default.createServer((stdErrStream) => {
|
|
childProcess.stderr = stdErrStream;
|
|
});
|
|
stdErrServer.listen(stdErrPipeName);
|
|
let stdOutServer = import_net.default.createServer((stdOutStream) => {
|
|
stdOutStream.once("data", (_chunk) => {
|
|
childProcess.stdin = import_net.default.connect(stdInPipeName);
|
|
childProcess.stdout = stdOutStream;
|
|
resolve(childProcess);
|
|
});
|
|
});
|
|
stdOutServer.listen(stdOutPipeName);
|
|
let serverClosed = false;
|
|
const closeServer = () => {
|
|
if (serverClosed) {
|
|
return;
|
|
}
|
|
serverClosed = true;
|
|
stdOutServer.close();
|
|
stdErrServer.close();
|
|
};
|
|
logger.info("Forking TSServer", `PATH: ${newEnv["PATH"]} `);
|
|
const bootstrapperPath = import_path6.default.resolve(__dirname, "../bin/tsserverForkStart");
|
|
childProcess = import_child_process2.default.fork(bootstrapperPath, [modulePath].concat(args), {
|
|
silent: true,
|
|
env: newEnv,
|
|
execArgv: options.execArgv
|
|
});
|
|
childProcess.once("error", (err) => {
|
|
closeServer();
|
|
reject(err);
|
|
});
|
|
childProcess.once("exit", (err) => {
|
|
closeServer();
|
|
reject(err);
|
|
});
|
|
}
|
|
|
|
// src/server/utils/tracer.ts
|
|
var import_coc29 = __toModule(require("coc.nvim"));
|
|
var Trace;
|
|
(function(Trace2) {
|
|
Trace2[Trace2["Off"] = 0] = "Off";
|
|
Trace2[Trace2["Messages"] = 1] = "Messages";
|
|
Trace2[Trace2["Verbose"] = 2] = "Verbose";
|
|
})(Trace || (Trace = {}));
|
|
(function(Trace2) {
|
|
function fromString(value) {
|
|
value = value || "";
|
|
value = value.toLowerCase();
|
|
switch (value) {
|
|
case "off":
|
|
return Trace2.Off;
|
|
case "messages":
|
|
return Trace2.Messages;
|
|
case "verbose":
|
|
return Trace2.Verbose;
|
|
default:
|
|
return Trace2.Off;
|
|
}
|
|
}
|
|
Trace2.fromString = fromString;
|
|
})(Trace || (Trace = {}));
|
|
var Tracer = class {
|
|
constructor(logger) {
|
|
this.logger = logger;
|
|
this.trace = Tracer.readTrace();
|
|
}
|
|
static readTrace() {
|
|
let result = Trace.fromString(import_coc29.workspace.getConfiguration("tsserver").get("trace.server", "off"));
|
|
if (result === 0 && !!process.env.TSS_TRACE) {
|
|
result = 1;
|
|
}
|
|
return result;
|
|
}
|
|
traceRequest(request, responseExpected, queueLength) {
|
|
if (this.trace === 0)
|
|
return;
|
|
let data;
|
|
if (this.trace === 2 && request.arguments) {
|
|
data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`;
|
|
}
|
|
this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? "yes" : "no"}. Current queue length: ${queueLength}`, data);
|
|
}
|
|
traceResponse(response, startTime) {
|
|
if (this.trace === 0) {
|
|
return;
|
|
}
|
|
let data;
|
|
if (this.trace === 2 && response.body) {
|
|
data = `Result: ${JSON.stringify(response.body, null, 4)}`;
|
|
}
|
|
this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? ". Message: " + response.message : ""}`, data);
|
|
}
|
|
traceEvent(event) {
|
|
if (this.trace === 0) {
|
|
return;
|
|
}
|
|
let data;
|
|
if (this.trace === 2 && event.body) {
|
|
data = `Data: ${JSON.stringify(event.body, null, 4)}`;
|
|
}
|
|
this.logTrace(`Event received: ${event.event} (${event.seq}).`, data);
|
|
}
|
|
logTrace(message, data) {
|
|
if (this.trace !== 0) {
|
|
this.logger.logLevel("Trace", message, data);
|
|
}
|
|
}
|
|
traceRequestCompleted(command, request_seq, startTime) {
|
|
if (this.trace === 0) {
|
|
return;
|
|
}
|
|
this.logTrace(`Async response received: ${command} (${request_seq}). Request took ${Date.now() - startTime} ms.`);
|
|
}
|
|
};
|
|
var tracer_default = Tracer;
|
|
|
|
// src/server/utils/tsconfig.ts
|
|
function inferredProjectConfig(config) {
|
|
const base = {
|
|
module: "commonjs",
|
|
target: "es2016",
|
|
jsx: "preserve"
|
|
};
|
|
if (config.checkJs) {
|
|
base.checkJs = true;
|
|
}
|
|
if (config.experimentalDecorators) {
|
|
base.experimentalDecorators = true;
|
|
}
|
|
return base;
|
|
}
|
|
|
|
// src/server/utils/versionProvider.ts
|
|
var import_coc30 = __toModule(require("coc.nvim"));
|
|
var import_fs3 = __toModule(require("fs"));
|
|
var import_path7 = __toModule(require("path"));
|
|
var TypeScriptVersion = class {
|
|
constructor(path9, _pathLabel) {
|
|
this.path = path9;
|
|
this._pathLabel = _pathLabel;
|
|
this._api = null;
|
|
}
|
|
get tscPath() {
|
|
return import_path7.default.resolve(this.path, "../bin/tsc");
|
|
}
|
|
get tsServerPath() {
|
|
return import_path7.default.resolve(this.path, "tsserver.js");
|
|
}
|
|
get pathLabel() {
|
|
return typeof this._pathLabel === "undefined" ? this.path : this._pathLabel;
|
|
}
|
|
get isValid() {
|
|
return this.version != null;
|
|
}
|
|
get version() {
|
|
if (this._api)
|
|
return this._api;
|
|
let api = this._api = this.getTypeScriptVersion(this.tsServerPath);
|
|
return api;
|
|
}
|
|
get versionString() {
|
|
const version = this.version;
|
|
return version ? version.versionString : null;
|
|
}
|
|
getTypeScriptVersion(serverPath) {
|
|
if (!import_fs3.default.existsSync(serverPath)) {
|
|
return void 0;
|
|
}
|
|
const p = serverPath.split(import_path7.default.sep);
|
|
if (p.length <= 2) {
|
|
return void 0;
|
|
}
|
|
const p2 = p.slice(0, -2);
|
|
const modulePath = p2.join(import_path7.default.sep);
|
|
let fileName = import_path7.default.join(modulePath, "package.json");
|
|
if (!import_fs3.default.existsSync(fileName)) {
|
|
if (import_path7.default.basename(modulePath) === "built") {
|
|
fileName = import_path7.default.join(modulePath, "..", "package.json");
|
|
}
|
|
}
|
|
if (!import_fs3.default.existsSync(fileName)) {
|
|
return void 0;
|
|
}
|
|
const contents = import_fs3.default.readFileSync(fileName).toString();
|
|
let desc = null;
|
|
try {
|
|
desc = JSON.parse(contents);
|
|
} catch (err) {
|
|
return void 0;
|
|
}
|
|
if (!desc || !desc.version) {
|
|
return void 0;
|
|
}
|
|
return desc.version ? api_default.fromVersionString(desc.version) : void 0;
|
|
}
|
|
};
|
|
var MODULE_FOLDERS = ["node_modules/typescript/lib", ".vscode/pnpify/typescript/lib", ".yarn/sdks/typescript/lib"];
|
|
var TypeScriptVersionProvider = class {
|
|
constructor(configuration) {
|
|
this.configuration = configuration;
|
|
}
|
|
updateConfiguration(configuration) {
|
|
this.configuration = configuration;
|
|
}
|
|
getDefaultVersion() {
|
|
let {globalTsdk} = this.configuration;
|
|
if (globalTsdk)
|
|
return new TypeScriptVersion(globalTsdk);
|
|
return this.bundledVersion;
|
|
}
|
|
get globalVersion() {
|
|
let {globalTsdk} = this.configuration;
|
|
if (globalTsdk)
|
|
return new TypeScriptVersion(import_coc30.workspace.expand(globalTsdk));
|
|
return void 0;
|
|
}
|
|
getLocalVersion() {
|
|
let folders = import_coc30.workspace.workspaceFolders.map((f) => import_coc30.Uri.parse(f.uri).fsPath);
|
|
for (let p of folders) {
|
|
for (let folder of MODULE_FOLDERS) {
|
|
let libFolder = import_path7.default.join(p, folder);
|
|
if (import_fs3.default.existsSync(libFolder)) {
|
|
let version = new TypeScriptVersion(libFolder);
|
|
if (version.isValid)
|
|
return version;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
get bundledVersion() {
|
|
try {
|
|
const file2 = require.resolve("typescript");
|
|
const bundledVersion = new TypeScriptVersion(import_path7.default.dirname(file2), "");
|
|
return bundledVersion;
|
|
} catch (e) {
|
|
import_coc30.window.showMessage("Bundled typescript module not found", "error");
|
|
return null;
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/server/utils/versionStatus.ts
|
|
var import_coc31 = __toModule(require("coc.nvim"));
|
|
var VersionStatus = class {
|
|
constructor(_normalizePath, enableJavascript) {
|
|
this._normalizePath = _normalizePath;
|
|
this.enableJavascript = enableJavascript;
|
|
this._versionString = "";
|
|
this._versionBarEntry = import_coc31.window.createStatusBarItem(99);
|
|
this._onChangeEditorSub = import_coc31.events.on("BufEnter", this.onBufEnter, this);
|
|
this._versionBarEntry.show();
|
|
}
|
|
dispose() {
|
|
this._versionBarEntry.dispose();
|
|
this._onChangeEditorSub.dispose();
|
|
}
|
|
onDidChangeTypeScriptVersion(version) {
|
|
this._versionString = version.versionString;
|
|
}
|
|
set loading(isLoading) {
|
|
if (isLoading) {
|
|
this._versionBarEntry.text = `Initializing tsserver ${this._versionString}`;
|
|
} else {
|
|
this._versionBarEntry.text = `TSC ${this._versionString}`;
|
|
}
|
|
this._versionBarEntry.isProgress = isLoading;
|
|
}
|
|
checkFiletype(filetype) {
|
|
if (filetype.startsWith("javascript") && this.enableJavascript) {
|
|
return true;
|
|
}
|
|
return filetype.startsWith("typescript");
|
|
}
|
|
async onBufEnter(bufnr) {
|
|
let filetype = await import_coc31.workspace.nvim.call("getbufvar", [bufnr, "&filetype", ""]);
|
|
if (this.checkFiletype(filetype)) {
|
|
this._versionBarEntry.show();
|
|
} else {
|
|
this._versionBarEntry.hide();
|
|
}
|
|
}
|
|
};
|
|
var versionStatus_default = VersionStatus;
|
|
|
|
// src/server/utils/wireProtocol.ts
|
|
var DefaultSize = 8192;
|
|
var ContentLength = "Content-Length: ";
|
|
var ContentLengthSize = Buffer.byteLength(ContentLength, "utf8");
|
|
var Blank = Buffer.from(" ", "utf8")[0];
|
|
var BackslashR = Buffer.from("\r", "utf8")[0];
|
|
var BackslashN = Buffer.from("\n", "utf8")[0];
|
|
var ProtocolBuffer = class {
|
|
constructor() {
|
|
this.index = 0;
|
|
this.buffer = Buffer.allocUnsafe(DefaultSize);
|
|
}
|
|
append(data) {
|
|
let toAppend = null;
|
|
if (Buffer.isBuffer(data)) {
|
|
toAppend = data;
|
|
} else {
|
|
toAppend = Buffer.from(data, "utf8");
|
|
}
|
|
if (this.buffer.length - this.index >= toAppend.length) {
|
|
toAppend.copy(this.buffer, this.index, 0, toAppend.length);
|
|
} else {
|
|
let newSize = (Math.ceil((this.index + toAppend.length) / DefaultSize) + 1) * DefaultSize;
|
|
if (this.index === 0) {
|
|
this.buffer = Buffer.allocUnsafe(newSize);
|
|
toAppend.copy(this.buffer, 0, 0, toAppend.length);
|
|
} else {
|
|
this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
|
|
}
|
|
}
|
|
this.index += toAppend.length;
|
|
}
|
|
tryReadContentLength() {
|
|
let result = -1;
|
|
let current = 0;
|
|
while (current < this.index && (this.buffer[current] === Blank || this.buffer[current] === BackslashR || this.buffer[current] === BackslashN)) {
|
|
current++;
|
|
}
|
|
if (this.index < current + ContentLengthSize) {
|
|
return result;
|
|
}
|
|
current += ContentLengthSize;
|
|
let start = current;
|
|
while (current < this.index && this.buffer[current] !== BackslashR) {
|
|
current++;
|
|
}
|
|
if (current + 3 >= this.index || this.buffer[current + 1] !== BackslashN || this.buffer[current + 2] !== BackslashR || this.buffer[current + 3] !== BackslashN) {
|
|
return result;
|
|
}
|
|
let data = this.buffer.toString("utf8", start, current);
|
|
result = parseInt(data, 10);
|
|
this.buffer = this.buffer.slice(current + 4);
|
|
this.index = this.index - (current + 4);
|
|
return result;
|
|
}
|
|
tryReadContent(length) {
|
|
if (this.index < length) {
|
|
return null;
|
|
}
|
|
let result = this.buffer.toString("utf8", 0, length);
|
|
let sourceStart = length;
|
|
while (sourceStart < this.index && (this.buffer[sourceStart] === BackslashR || this.buffer[sourceStart] === BackslashN)) {
|
|
sourceStart++;
|
|
}
|
|
this.buffer.copy(this.buffer, 0, sourceStart);
|
|
this.index = this.index - sourceStart;
|
|
return result;
|
|
}
|
|
};
|
|
var Reader = class {
|
|
constructor(readable, callback, onError) {
|
|
this.readable = readable;
|
|
this.callback = callback;
|
|
this.onError = onError;
|
|
this.buffer = new ProtocolBuffer();
|
|
this.nextMessageLength = -1;
|
|
this.readable.on("data", (data) => {
|
|
this.onLengthData(data);
|
|
});
|
|
}
|
|
onLengthData(data) {
|
|
try {
|
|
this.buffer.append(data);
|
|
while (true) {
|
|
if (this.nextMessageLength === -1) {
|
|
this.nextMessageLength = this.buffer.tryReadContentLength();
|
|
if (this.nextMessageLength === -1) {
|
|
return;
|
|
}
|
|
}
|
|
const msg = this.buffer.tryReadContent(this.nextMessageLength);
|
|
if (msg === null) {
|
|
return;
|
|
}
|
|
this.nextMessageLength = -1;
|
|
const json = JSON.parse(msg);
|
|
this.callback(json);
|
|
}
|
|
} catch (e) {
|
|
this.onError(e);
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/server/typescriptServiceClient.ts
|
|
var ForkedTsServerProcess = class {
|
|
constructor(childProcess) {
|
|
this.childProcess = childProcess;
|
|
this.toCancelOnResourceChange = new Set();
|
|
}
|
|
onError(cb) {
|
|
this.childProcess.on("error", cb);
|
|
}
|
|
onExit(cb) {
|
|
this.childProcess.on("exit", cb);
|
|
}
|
|
write(serverRequest) {
|
|
this.childProcess.stdin.write(JSON.stringify(serverRequest) + "\r\n", "utf8");
|
|
}
|
|
createReader(callback, onError) {
|
|
new Reader(this.childProcess.stdout, callback, onError);
|
|
}
|
|
kill() {
|
|
this.childProcess.kill();
|
|
}
|
|
};
|
|
var TypeScriptServiceClient = class {
|
|
constructor(pluginManager, modeIds) {
|
|
this.pluginManager = pluginManager;
|
|
this.modeIds = modeIds;
|
|
this.state = import_coc32.ServiceStat.Initial;
|
|
this.logger = new logger_default();
|
|
this.tsServerLogFile = null;
|
|
this.cancellationPipeName = null;
|
|
this._callbacks = new CallbackMap();
|
|
this._requestQueue = new RequestQueue();
|
|
this._pendingResponses = new Set();
|
|
this._onTsServerStarted = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onProjectLanguageServiceStateChanged = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onDidBeginInstallTypings = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onDidEndInstallTypings = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onTypesInstallerInitializationFailed = new import_vscode_languageserver_protocol21.Emitter();
|
|
this.disposables = [];
|
|
this.isRestarting = false;
|
|
this._onDiagnosticsReceived = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onConfigDiagnosticsReceived = new import_vscode_languageserver_protocol21.Emitter();
|
|
this._onResendModelsRequested = new import_vscode_languageserver_protocol21.Emitter();
|
|
this.pathSeparator = import_path8.default.sep;
|
|
this.lastStart = Date.now();
|
|
this.servicePromise = null;
|
|
this.lastError = null;
|
|
this.numberRestarts = 0;
|
|
this.fileConfigurationManager = new fileConfigurationManager_default(this);
|
|
this._configuration = TypeScriptServiceConfiguration.loadFromWorkspace();
|
|
this.versionProvider = new TypeScriptVersionProvider(this._configuration);
|
|
this._apiVersion = api_default.defaultVersion;
|
|
this.tracer = new tracer_default(this.logger);
|
|
this.versionStatus = new versionStatus_default(this.normalizePath.bind(this), this.fileConfigurationManager.enableJavascript());
|
|
pluginManager.onDidUpdateConfig((update) => {
|
|
this.configurePlugin(update.pluginId, update.config);
|
|
}, null, this.disposables);
|
|
pluginManager.onDidChangePlugins(() => {
|
|
this.restartTsServer();
|
|
}, null, this.disposables);
|
|
this.bufferSyncSupport = new bufferSyncSupport_default(this, modeIds);
|
|
this.onTsServerStarted(() => {
|
|
this.bufferSyncSupport.listen();
|
|
});
|
|
this.diagnosticsManager = new DiagnosticsManager();
|
|
this.bufferSyncSupport.onDelete((resource) => {
|
|
this.cancelInflightRequestsForResource(resource);
|
|
this.diagnosticsManager.delete(resource);
|
|
}, null, this.disposables);
|
|
this.bufferSyncSupport.onWillChange((resource) => {
|
|
this.cancelInflightRequestsForResource(resource);
|
|
});
|
|
}
|
|
get onDiagnosticsReceived() {
|
|
return this._onDiagnosticsReceived.event;
|
|
}
|
|
get onConfigDiagnosticsReceived() {
|
|
return this._onConfigDiagnosticsReceived.event;
|
|
}
|
|
get onResendModelsRequested() {
|
|
return this._onResendModelsRequested.event;
|
|
}
|
|
get configuration() {
|
|
return this._configuration;
|
|
}
|
|
dispose() {
|
|
if (this.servicePromise) {
|
|
this.servicePromise.then((childProcess) => {
|
|
childProcess.kill();
|
|
}).then(void 0, () => void 0);
|
|
}
|
|
this.bufferSyncSupport.dispose();
|
|
this.logger.dispose();
|
|
this._onTsServerStarted.dispose();
|
|
this._onResendModelsRequested.dispose();
|
|
this.versionStatus.dispose();
|
|
}
|
|
info(message, data) {
|
|
this.logger.info(message, data);
|
|
}
|
|
error(message, data) {
|
|
this.logger.error(message, data);
|
|
}
|
|
restartTsServer() {
|
|
const start = () => {
|
|
this.servicePromise = this.startService(true);
|
|
return this.servicePromise;
|
|
};
|
|
if (this.servicePromise) {
|
|
return Promise.resolve(this.servicePromise.then((childProcess) => {
|
|
this.state = import_coc32.ServiceStat.Stopping;
|
|
this.info("Killing TS Server");
|
|
this.isRestarting = true;
|
|
childProcess.kill();
|
|
this.servicePromise = null;
|
|
}).then(start));
|
|
} else {
|
|
return Promise.resolve(start());
|
|
}
|
|
}
|
|
stop() {
|
|
if (!this.servicePromise)
|
|
return;
|
|
return new Promise((resolve, reject) => {
|
|
this.servicePromise.then((childProcess) => {
|
|
if (this.state == import_coc32.ServiceStat.Running) {
|
|
this.info("Killing TS Server");
|
|
childProcess.onExit(() => {
|
|
resolve();
|
|
});
|
|
childProcess.kill();
|
|
this.servicePromise = null;
|
|
} else {
|
|
resolve();
|
|
}
|
|
}, reject);
|
|
});
|
|
}
|
|
get onTsServerStarted() {
|
|
return this._onTsServerStarted.event;
|
|
}
|
|
get onProjectLanguageServiceStateChanged() {
|
|
return this._onProjectLanguageServiceStateChanged.event;
|
|
}
|
|
get onDidBeginInstallTypings() {
|
|
return this._onDidBeginInstallTypings.event;
|
|
}
|
|
get onDidEndInstallTypings() {
|
|
return this._onDidEndInstallTypings.event;
|
|
}
|
|
get onTypesInstallerInitializationFailed() {
|
|
return this._onTypesInstallerInitializationFailed.event;
|
|
}
|
|
get apiVersion() {
|
|
return this._apiVersion;
|
|
}
|
|
get tscPath() {
|
|
return this._tscPath;
|
|
}
|
|
service() {
|
|
if (this.servicePromise) {
|
|
return this.servicePromise;
|
|
}
|
|
if (this.lastError) {
|
|
return Promise.reject(this.lastError);
|
|
}
|
|
return this.startService().then(() => {
|
|
if (this.servicePromise) {
|
|
return this.servicePromise;
|
|
}
|
|
});
|
|
}
|
|
ensureServiceStarted() {
|
|
if (!this.servicePromise) {
|
|
this.startService().catch((err) => {
|
|
import_coc32.window.showMessage(`TSServer start failed: ${err.message}`, "error");
|
|
this.error(`Service start failed: ${err.stack}`);
|
|
});
|
|
}
|
|
}
|
|
async startService(resendModels = false) {
|
|
const {ignoreLocalTsserver} = this.configuration;
|
|
let currentVersion;
|
|
if (!ignoreLocalTsserver)
|
|
currentVersion = this.versionProvider.getLocalVersion();
|
|
if (!currentVersion || !import_fs4.default.existsSync(currentVersion.tsServerPath)) {
|
|
currentVersion = this.versionProvider.getDefaultVersion();
|
|
}
|
|
if (!currentVersion || !currentVersion.isValid) {
|
|
if (this.configuration.globalTsdk) {
|
|
import_coc32.window.showMessage(`Can not find typescript module, in 'tsserver.tsdk': ${this.configuration.globalTsdk}`, "error");
|
|
} else {
|
|
import_coc32.window.showMessage(`Can not find typescript module, run ':CocInstall coc-tsserver' to fix it!`, "error");
|
|
}
|
|
return;
|
|
}
|
|
this._apiVersion = currentVersion.version;
|
|
this._tscPath = currentVersion.tscPath;
|
|
this.versionStatus.onDidChangeTypeScriptVersion(currentVersion);
|
|
this.lastError = null;
|
|
const tsServerForkArgs = await this.getTsServerArgs(currentVersion);
|
|
const debugPort = this._configuration.debugPort;
|
|
const maxTsServerMemory = this._configuration.maxTsServerMemory;
|
|
const options = {
|
|
execArgv: [
|
|
...debugPort ? [`--inspect=${debugPort}`] : [],
|
|
...maxTsServerMemory ? [`--max-old-space-size=${maxTsServerMemory}`] : []
|
|
],
|
|
cwd: import_coc32.workspace.root
|
|
};
|
|
this.servicePromise = this.startProcess(currentVersion, tsServerForkArgs, options, resendModels);
|
|
return this.servicePromise;
|
|
}
|
|
startProcess(currentVersion, args, options, resendModels) {
|
|
this.state = import_coc32.ServiceStat.Starting;
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
fork(currentVersion.tsServerPath, args, options, this.logger, (err, childProcess) => {
|
|
if (err || !childProcess) {
|
|
this.state = import_coc32.ServiceStat.StartFailed;
|
|
this.lastError = err;
|
|
this.error("Starting TSServer failed with error.", err.stack);
|
|
return;
|
|
}
|
|
this.state = import_coc32.ServiceStat.Running;
|
|
this.info("Started TSServer", JSON.stringify(currentVersion, null, 2));
|
|
const handle = new ForkedTsServerProcess(childProcess);
|
|
this.tsServerProcess = handle;
|
|
this.lastStart = Date.now();
|
|
handle.onError((err2) => {
|
|
this.lastError = err2;
|
|
this.error("TSServer errored with error.", err2);
|
|
this.error(`TSServer log file: ${this.tsServerLogFile || ""}`);
|
|
import_coc32.window.showMessage(`TSServer errored with error. ${err2.message}`, "error");
|
|
this.serviceExited(false);
|
|
});
|
|
handle.onExit((code) => {
|
|
if (code == null) {
|
|
this.info("TSServer normal exit");
|
|
} else {
|
|
this.error(`TSServer exited with code: ${code}`);
|
|
}
|
|
this.info(`TSServer log file: ${this.tsServerLogFile || ""}`);
|
|
this.serviceExited(!this.isRestarting);
|
|
this.isRestarting = false;
|
|
});
|
|
handle.createReader((msg) => {
|
|
this.dispatchMessage(msg);
|
|
}, (error) => {
|
|
this.error("ReaderError", error);
|
|
});
|
|
resolve(handle);
|
|
this.serviceStarted(resendModels);
|
|
this._onTsServerStarted.fire(currentVersion.version);
|
|
});
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
});
|
|
}
|
|
async openTsServerLogFile() {
|
|
const isRoot = process.getuid && process.getuid() == 0;
|
|
let echoErr = (msg) => {
|
|
import_coc32.window.showMessage(msg, "error");
|
|
};
|
|
if (isRoot) {
|
|
echoErr("Log disabled for root user.");
|
|
return false;
|
|
}
|
|
if (!this.apiVersion.gte(api_default.v222)) {
|
|
echoErr("TS Server logging requires TS 2.2.2+");
|
|
return false;
|
|
}
|
|
if (this._configuration.tsServerLogLevel === TsServerLogLevel.Off) {
|
|
echoErr(`TS Server logging is off. Change 'tsserver.log' in 'coc-settings.json' to enable`);
|
|
return false;
|
|
}
|
|
if (!this.tsServerLogFile) {
|
|
echoErr("TS Server has not started logging.");
|
|
return false;
|
|
}
|
|
try {
|
|
await import_coc32.workspace.nvim.command(`edit ${this.tsServerLogFile}`);
|
|
return true;
|
|
} catch {
|
|
echoErr("Could not open TS Server log file");
|
|
return false;
|
|
}
|
|
}
|
|
serviceStarted(resendModels) {
|
|
this.bufferSyncSupport.reset();
|
|
const watchOptions = this.apiVersion.gte(api_default.v380) ? this.configuration.watchOptions : void 0;
|
|
const configureOptions = {
|
|
hostInfo: "coc-nvim",
|
|
preferences: {
|
|
providePrefixAndSuffixTextForRename: true,
|
|
allowRenameOfImportPath: true
|
|
},
|
|
watchOptions
|
|
};
|
|
this.executeWithoutWaitingForResponse("configure", configureOptions);
|
|
this.setCompilerOptionsForInferredProjects(this._configuration);
|
|
if (resendModels) {
|
|
this._onResendModelsRequested.fire(void 0);
|
|
this.fileConfigurationManager.reset();
|
|
this.diagnosticsManager.reInitialize();
|
|
this.bufferSyncSupport.reinitialize();
|
|
}
|
|
for (const [config, pluginName] of this.pluginManager.configurations()) {
|
|
this.configurePlugin(config, pluginName);
|
|
}
|
|
}
|
|
setCompilerOptionsForInferredProjects(configuration) {
|
|
if (!this.apiVersion.gte(api_default.v206))
|
|
return;
|
|
const args = {
|
|
options: this.getCompilerOptionsForInferredProjects(configuration)
|
|
};
|
|
this.executeWithoutWaitingForResponse("compilerOptionsForInferredProjects", args);
|
|
}
|
|
getCompilerOptionsForInferredProjects(configuration) {
|
|
return {
|
|
...inferredProjectConfig(configuration),
|
|
allowJs: true,
|
|
allowSyntheticDefaultImports: true,
|
|
allowNonTsExtensions: true
|
|
};
|
|
}
|
|
serviceExited(restart) {
|
|
this.state = import_coc32.ServiceStat.Stopped;
|
|
this.servicePromise = null;
|
|
this.tsServerLogFile = null;
|
|
this._callbacks.destroy("Service died.");
|
|
this._callbacks = new CallbackMap();
|
|
this._requestQueue = new RequestQueue();
|
|
this._pendingResponses = new Set();
|
|
if (restart) {
|
|
const diff = Date.now() - this.lastStart;
|
|
this.numberRestarts++;
|
|
let startService = true;
|
|
if (this.numberRestarts > 5) {
|
|
this.numberRestarts = 0;
|
|
if (diff < 10 * 1e3) {
|
|
this.lastStart = Date.now();
|
|
startService = false;
|
|
import_coc32.window.showMessage("The TypeScript language service died 5 times right after it got started.", "error");
|
|
} else if (diff < 60 * 1e3) {
|
|
this.lastStart = Date.now();
|
|
import_coc32.window.showMessage("The TypeScript language service died unexpectedly 5 times in the last 5 Minutes.", "error");
|
|
}
|
|
}
|
|
if (startService) {
|
|
this.startService(true);
|
|
}
|
|
}
|
|
}
|
|
toPath(uri) {
|
|
return this.normalizePath(import_coc32.Uri.parse(uri));
|
|
}
|
|
toOpenedFilePath(uri, options = {}) {
|
|
if (!this.bufferSyncSupport.ensureHasBuffer(uri)) {
|
|
if (!options.suppressAlertOnFailure) {
|
|
console.error(`Unexpected resource ${uri}`);
|
|
}
|
|
return void 0;
|
|
}
|
|
return this.toPath(uri);
|
|
}
|
|
toResource(filepath) {
|
|
if (this._apiVersion.gte(api_default.v213)) {
|
|
if (filepath.startsWith(this.inMemoryResourcePrefix + "untitled:")) {
|
|
let resource = import_coc32.Uri.parse(filepath);
|
|
if (this.inMemoryResourcePrefix) {
|
|
const dirName = import_path8.default.dirname(resource.path);
|
|
const fileName = import_path8.default.basename(resource.path);
|
|
if (fileName.startsWith(this.inMemoryResourcePrefix)) {
|
|
resource = resource.with({path: import_path8.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length))});
|
|
}
|
|
}
|
|
return resource.toString();
|
|
}
|
|
}
|
|
return import_coc32.Uri.file(filepath).toString();
|
|
}
|
|
normalizePath(resource) {
|
|
if (disabledSchemes.has(resource.scheme)) {
|
|
return void 0;
|
|
}
|
|
switch (resource.scheme) {
|
|
case file: {
|
|
let result = resource.fsPath;
|
|
if (!result)
|
|
return void 0;
|
|
result = import_path8.default.normalize(result);
|
|
return result.replace(new RegExp("\\" + this.pathSeparator, "g"), "/");
|
|
}
|
|
default: {
|
|
return this.inMemoryResourcePrefix + resource.toString(true);
|
|
}
|
|
}
|
|
}
|
|
getDocument(resource) {
|
|
if (resource.startsWith("untitled:")) {
|
|
let bufnr = parseInt(resource.split(":", 2)[1], 10);
|
|
return import_coc32.workspace.getDocument(bufnr);
|
|
}
|
|
return import_coc32.workspace.getDocument(resource);
|
|
}
|
|
get inMemoryResourcePrefix() {
|
|
return this._apiVersion.gte(api_default.v270) ? "^" : "";
|
|
}
|
|
asUrl(filepath) {
|
|
if (this._apiVersion.gte(api_default.v213)) {
|
|
if (filepath.startsWith(this.inMemoryResourcePrefix + "untitled:")) {
|
|
let resource = import_coc32.Uri.parse(filepath.slice(this.inMemoryResourcePrefix.length));
|
|
if (this.inMemoryResourcePrefix) {
|
|
const dirName = import_path8.default.dirname(resource.path);
|
|
const fileName = import_path8.default.basename(resource.path);
|
|
if (fileName.startsWith(this.inMemoryResourcePrefix)) {
|
|
resource = resource.with({
|
|
path: import_path8.default.posix.join(dirName, fileName.slice(this.inMemoryResourcePrefix.length))
|
|
});
|
|
}
|
|
}
|
|
return resource;
|
|
}
|
|
}
|
|
return import_coc32.Uri.file(filepath);
|
|
}
|
|
execute(command, args, token, config) {
|
|
var _a;
|
|
let execution;
|
|
if (config == null ? void 0 : config.cancelOnResourceChange) {
|
|
const source = new import_vscode_languageserver_protocol21.CancellationTokenSource();
|
|
token.onCancellationRequested(() => source.cancel());
|
|
const inFlight = {
|
|
resource: config.cancelOnResourceChange,
|
|
cancel: () => source.cancel()
|
|
};
|
|
(_a = this.tsServerProcess) == null ? void 0 : _a.toCancelOnResourceChange.add(inFlight);
|
|
execution = this.executeImpl(command, args, {
|
|
isAsync: false,
|
|
token: source.token,
|
|
expectsResult: true,
|
|
...config
|
|
}).finally(() => {
|
|
var _a2;
|
|
(_a2 = this.tsServerProcess) == null ? void 0 : _a2.toCancelOnResourceChange.delete(inFlight);
|
|
source.dispose();
|
|
});
|
|
} else {
|
|
execution = this.executeImpl(command, args, {
|
|
isAsync: false,
|
|
token,
|
|
expectsResult: true,
|
|
...config
|
|
});
|
|
}
|
|
if (config == null ? void 0 : config.nonRecoverable) {
|
|
execution.catch((err) => this.fatalError(command, err));
|
|
}
|
|
return execution;
|
|
}
|
|
fatalError(command, error) {
|
|
console.error(`A non-recoverable error occured while executing tsserver command: ${command}`);
|
|
if (this.state === import_coc32.ServiceStat.Running) {
|
|
this.info("Killing TS Server by fatal error:", error);
|
|
this.service().then((service) => {
|
|
service.kill();
|
|
});
|
|
}
|
|
}
|
|
executeAsync(command, args, token) {
|
|
return this.executeImpl(command, args, {
|
|
isAsync: true,
|
|
token,
|
|
expectsResult: true
|
|
});
|
|
}
|
|
executeWithoutWaitingForResponse(command, args) {
|
|
this.executeImpl(command, args, {
|
|
isAsync: false,
|
|
token: void 0,
|
|
expectsResult: false
|
|
});
|
|
}
|
|
executeImpl(command, args, executeInfo) {
|
|
if (this.servicePromise == null) {
|
|
return Promise.resolve(void 0);
|
|
}
|
|
this.bufferSyncSupport.beforeCommand(command);
|
|
const request = this._requestQueue.createRequest(command, args);
|
|
const requestInfo = {
|
|
request,
|
|
expectsResponse: executeInfo.expectsResult,
|
|
isAsync: executeInfo.isAsync,
|
|
queueingType: getQueueingType(command, executeInfo.lowPriority)
|
|
};
|
|
let result;
|
|
if (executeInfo.expectsResult) {
|
|
result = new Promise((resolve, reject) => {
|
|
this._callbacks.add(request.seq, {onSuccess: resolve, onError: reject, startTime: Date.now(), isAsync: executeInfo.isAsync}, executeInfo.isAsync);
|
|
if (executeInfo.token) {
|
|
executeInfo.token.onCancellationRequested(() => {
|
|
this.tryCancelRequest(request.seq, command);
|
|
});
|
|
}
|
|
}).catch((err) => {
|
|
throw err;
|
|
});
|
|
}
|
|
this._requestQueue.enqueue(requestInfo);
|
|
this.sendNextRequests();
|
|
return result;
|
|
}
|
|
sendNextRequests() {
|
|
while (this._pendingResponses.size === 0 && this._requestQueue.length > 0) {
|
|
const item = this._requestQueue.dequeue();
|
|
if (item) {
|
|
this.sendRequest(item);
|
|
}
|
|
}
|
|
}
|
|
sendRequest(requestItem) {
|
|
const serverRequest = requestItem.request;
|
|
this.tracer.traceRequest(serverRequest, requestItem.expectsResponse, this._requestQueue.length);
|
|
if (requestItem.expectsResponse && !requestItem.isAsync) {
|
|
this._pendingResponses.add(requestItem.request.seq);
|
|
}
|
|
this.service().then((childProcess) => {
|
|
try {
|
|
childProcess.write(serverRequest);
|
|
} catch (err) {
|
|
const callback = this.fetchCallback(serverRequest.seq);
|
|
if (callback) {
|
|
callback.onError(err);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
tryCancelRequest(seq, command) {
|
|
try {
|
|
if (this._requestQueue.tryDeletePendingRequest(seq)) {
|
|
this.tracer.logTrace(`TypeScript Server: canceled request with sequence number ${seq}`);
|
|
return true;
|
|
}
|
|
if (this.cancellationPipeName) {
|
|
this.tracer.logTrace(`TypeScript Server: trying to cancel ongoing request with sequence number ${seq}`);
|
|
try {
|
|
import_fs4.default.writeFileSync(this.cancellationPipeName + seq, "");
|
|
} catch {
|
|
}
|
|
return true;
|
|
}
|
|
this.tracer.logTrace(`TypeScript Server: tried to cancel request with sequence number ${seq}. But request got already delivered.`);
|
|
return false;
|
|
} finally {
|
|
const callback = this.fetchCallback(seq);
|
|
if (callback) {
|
|
callback.onSuccess(new ServerResponse.Cancelled(`Cancelled request ${seq} - ${command}`));
|
|
}
|
|
}
|
|
}
|
|
fetchCallback(seq) {
|
|
const callback = this._callbacks.fetch(seq);
|
|
if (!callback) {
|
|
return void 0;
|
|
}
|
|
this._pendingResponses.delete(seq);
|
|
return callback;
|
|
}
|
|
dispatchMessage(message) {
|
|
try {
|
|
switch (message.type) {
|
|
case "response":
|
|
this.dispatchResponse(message);
|
|
break;
|
|
case "event":
|
|
const event = message;
|
|
if (event.event === "requestCompleted") {
|
|
const seq = event.body.request_seq;
|
|
const p = this._callbacks.fetch(seq);
|
|
if (p) {
|
|
this.tracer.traceRequestCompleted("requestCompleted", seq, p.startTime);
|
|
p.onSuccess(void 0);
|
|
}
|
|
} else {
|
|
this.tracer.traceEvent(event);
|
|
this.dispatchEvent(event);
|
|
}
|
|
break;
|
|
default:
|
|
throw new Error(`Unknown message type ${message.type} received`);
|
|
}
|
|
} finally {
|
|
this.sendNextRequests();
|
|
}
|
|
}
|
|
dispatchResponse(response) {
|
|
const callback = this.fetchCallback(response.request_seq);
|
|
if (!callback) {
|
|
return;
|
|
}
|
|
this.tracer.traceResponse(response, callback.startTime);
|
|
if (response.success) {
|
|
callback.onSuccess(response);
|
|
} else if (response.message === "No content available.") {
|
|
callback.onSuccess(ServerResponse.NoContent);
|
|
} else {
|
|
callback.onError(new Error(response.message));
|
|
}
|
|
}
|
|
dispatchEvent(event) {
|
|
switch (event.event) {
|
|
case "syntaxDiag":
|
|
case "semanticDiag":
|
|
case "suggestionDiag":
|
|
const diagnosticEvent = event;
|
|
if (diagnosticEvent.body && diagnosticEvent.body.diagnostics) {
|
|
this._onDiagnosticsReceived.fire({
|
|
kind: getDiagnosticsKind(event),
|
|
resource: this.asUrl(diagnosticEvent.body.file),
|
|
diagnostics: diagnosticEvent.body.diagnostics
|
|
});
|
|
}
|
|
break;
|
|
case "configFileDiag":
|
|
this._onConfigDiagnosticsReceived.fire(event);
|
|
break;
|
|
case "projectLanguageServiceState":
|
|
if (event.body) {
|
|
this._onProjectLanguageServiceStateChanged.fire(event.body);
|
|
}
|
|
break;
|
|
case "beginInstallTypes":
|
|
if (event.body) {
|
|
this._onDidBeginInstallTypings.fire(event.body);
|
|
}
|
|
break;
|
|
case "endInstallTypes":
|
|
if (event.body) {
|
|
this._onDidEndInstallTypings.fire(event.body);
|
|
}
|
|
break;
|
|
case "projectsUpdatedInBackground":
|
|
const body = event.body;
|
|
const resources = body.openFiles.map(import_coc32.Uri.file);
|
|
this.bufferSyncSupport.getErr(resources);
|
|
break;
|
|
case "typesInstallerInitializationFailed":
|
|
if (event.body) {
|
|
this._onTypesInstallerInitializationFailed.fire(event.body);
|
|
}
|
|
break;
|
|
case "projectLoadingStart":
|
|
this.versionStatus.loading = true;
|
|
break;
|
|
case "projectLoadingFinish":
|
|
this.versionStatus.loading = false;
|
|
break;
|
|
}
|
|
}
|
|
async getTsServerArgs(currentVersion) {
|
|
const args = [];
|
|
args.push("--allowLocalPluginLoads");
|
|
if (this.apiVersion.gte(api_default.v250)) {
|
|
args.push("--useInferredProjectPerProjectRoot");
|
|
} else {
|
|
args.push("--useSingleInferredProject");
|
|
}
|
|
if (this.apiVersion.gte(api_default.v206) && this._configuration.disableAutomaticTypeAcquisition) {
|
|
args.push("--disableAutomaticTypingAcquisition");
|
|
}
|
|
if (this.apiVersion.gte(api_default.v222)) {
|
|
this.cancellationPipeName = getTempFile(`tscancellation-${makeRandomHexString(20)}`);
|
|
args.push("--cancellationPipeName", this.cancellationPipeName + "*");
|
|
}
|
|
if (this.apiVersion.gte(api_default.v222)) {
|
|
const isRoot = process.getuid && process.getuid() == 0;
|
|
if (this._configuration.tsServerLogLevel !== TsServerLogLevel.Off && !isRoot) {
|
|
const logDir = getTempDirectory();
|
|
if (logDir) {
|
|
this.tsServerLogFile = import_path8.default.join(logDir, `tsserver.log`);
|
|
this.info("TSServer log file :", this.tsServerLogFile);
|
|
} else {
|
|
this.tsServerLogFile = null;
|
|
this.error("Could not create TSServer log directory");
|
|
}
|
|
if (this.tsServerLogFile) {
|
|
args.push("--logVerbosity", TsServerLogLevel.toString(this._configuration.tsServerLogLevel));
|
|
args.push("--logFile", this.tsServerLogFile);
|
|
}
|
|
}
|
|
}
|
|
if (this.apiVersion.gte(api_default.v230)) {
|
|
const pluginNames = this.pluginManager.plugins.map((x) => x.name);
|
|
let pluginPaths = this._configuration.tsServerPluginPaths;
|
|
pluginPaths = pluginPaths.reduce((p, c) => {
|
|
if (import_path8.default.isAbsolute(c)) {
|
|
p.push(c);
|
|
} else {
|
|
let roots = import_coc32.workspace.workspaceFolders.map((o) => import_coc32.Uri.parse(o.uri).fsPath);
|
|
p.push(...roots.map((r) => import_path8.default.join(r, c)));
|
|
}
|
|
return p;
|
|
}, []);
|
|
if (pluginNames.length) {
|
|
const isUsingBundledTypeScriptVersion = currentVersion.path == this.versionProvider.bundledVersion.path;
|
|
args.push("--globalPlugins", pluginNames.join(","));
|
|
for (const plugin of this.pluginManager.plugins) {
|
|
if (isUsingBundledTypeScriptVersion || plugin.enableForWorkspaceTypeScriptVersions) {
|
|
pluginPaths.push(plugin.path);
|
|
}
|
|
}
|
|
}
|
|
if (pluginPaths.length) {
|
|
args.push("--pluginProbeLocations", pluginPaths.join(","));
|
|
}
|
|
}
|
|
if (this._configuration.locale) {
|
|
args.push("--locale", this._configuration.locale);
|
|
}
|
|
if (this._configuration.typingsCacheLocation) {
|
|
args.push("--globalTypingsCacheLocation", `"${this._configuration.typingsCacheLocation}"`);
|
|
}
|
|
if (this.apiVersion.gte(api_default.v234)) {
|
|
let {npmLocation} = this._configuration;
|
|
if (npmLocation) {
|
|
this.logger.info(`using npm from ${npmLocation}`);
|
|
args.push("--npmLocation", `"${npmLocation}"`);
|
|
}
|
|
}
|
|
if (this.apiVersion.gte(api_default.v291)) {
|
|
args.push("--noGetErrOnBackgroundUpdate");
|
|
}
|
|
if (this.apiVersion.gte(api_default.v345)) {
|
|
args.push("--validateDefaultNpmLocation");
|
|
}
|
|
return args;
|
|
}
|
|
getProjectRootPath(uri) {
|
|
let root = import_coc32.workspace.cwd;
|
|
let u = import_coc32.Uri.parse(uri);
|
|
if (u.scheme !== "file")
|
|
return void 0;
|
|
let folder = import_coc32.workspace.getWorkspaceFolder(uri);
|
|
if (folder) {
|
|
root = import_coc32.Uri.parse(folder.uri).fsPath;
|
|
} else {
|
|
let filepath = import_coc32.Uri.parse(uri).fsPath;
|
|
if (!filepath.startsWith(root)) {
|
|
root = import_path8.default.dirname(filepath);
|
|
}
|
|
}
|
|
if (root == import_os2.default.homedir())
|
|
return void 0;
|
|
return root;
|
|
}
|
|
configurePlugin(pluginName, configuration) {
|
|
if (this.apiVersion.gte(api_default.v314)) {
|
|
if (!this.servicePromise)
|
|
return;
|
|
this.servicePromise.then(() => {
|
|
this.executeWithoutWaitingForResponse("configurePlugin", {pluginName, configuration});
|
|
});
|
|
}
|
|
}
|
|
interruptGetErr(f) {
|
|
return this.bufferSyncSupport.interuptGetErr(f);
|
|
}
|
|
cancelInflightRequestsForResource(resource) {
|
|
if (this.state !== import_coc32.ServiceStat.Running || !this.tsServerProcess) {
|
|
return;
|
|
}
|
|
for (const request of this.tsServerProcess.toCancelOnResourceChange) {
|
|
if (request.resource.toString() === resource.toString()) {
|
|
request.cancel();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
var typescriptServiceClient_default = TypeScriptServiceClient;
|
|
function getDiagnosticsKind(event) {
|
|
switch (event.event) {
|
|
case "syntaxDiag":
|
|
return DiagnosticKind.Syntax;
|
|
case "semanticDiag":
|
|
return DiagnosticKind.Semantic;
|
|
case "suggestionDiag":
|
|
return DiagnosticKind.Suggestion;
|
|
}
|
|
throw new Error("Unknown dignostics kind");
|
|
}
|
|
var fenceCommands = new Set(["change", "close", "open"]);
|
|
function getQueueingType(command, lowPriority) {
|
|
if (fenceCommands.has(command)) {
|
|
return RequestQueueingType.Fence;
|
|
}
|
|
return lowPriority ? RequestQueueingType.LowPriority : RequestQueueingType.Normal;
|
|
}
|
|
|
|
// src/server/utils/languageDescription.ts
|
|
var DiagnosticLanguage;
|
|
(function(DiagnosticLanguage2) {
|
|
DiagnosticLanguage2[DiagnosticLanguage2["JavaScript"] = 0] = "JavaScript";
|
|
DiagnosticLanguage2[DiagnosticLanguage2["TypeScript"] = 1] = "TypeScript";
|
|
})(DiagnosticLanguage || (DiagnosticLanguage = {}));
|
|
var standardLanguageDescriptions = [
|
|
{
|
|
id: "typescript",
|
|
diagnosticSource: "ts",
|
|
diagnosticOwner: "typescript",
|
|
modeIds: [
|
|
typescript,
|
|
typescriptreact,
|
|
typescripttsx,
|
|
typescriptjsx
|
|
],
|
|
diagnosticLanguage: 1,
|
|
configFile: "tsconfig.json",
|
|
configFilePattern: /^tsconfig(\..*)?\.json$/gi
|
|
},
|
|
{
|
|
id: "javascript",
|
|
diagnosticSource: "ts",
|
|
diagnosticOwner: "typescript",
|
|
modeIds: [javascript, javascriptreact, javascriptjsx],
|
|
diagnosticLanguage: 0,
|
|
configFile: "jsconfig.json",
|
|
configFilePattern: /^jsconfig(\..*)?\.json$/gi
|
|
}
|
|
];
|
|
|
|
// src/server/utils/typingsStatus.ts
|
|
var import_coc33 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol22 = __toModule(require_main3());
|
|
var typingsInstallTimeout = 30 * 1e3;
|
|
var TypingsStatus = class {
|
|
constructor(client) {
|
|
this._acquiringTypings = Object.create({});
|
|
this._subscriptions = [];
|
|
this._client = client;
|
|
this._subscriptions.push(this._client.onDidBeginInstallTypings((event) => this.onBeginInstallTypings(event.eventId)));
|
|
this._subscriptions.push(this._client.onDidEndInstallTypings((event) => this.onEndInstallTypings(event.eventId)));
|
|
}
|
|
dispose() {
|
|
this._subscriptions.forEach((x) => x.dispose());
|
|
for (const eventId of Object.keys(this._acquiringTypings)) {
|
|
clearTimeout(this._acquiringTypings[eventId]);
|
|
}
|
|
}
|
|
get isAcquiringTypings() {
|
|
return Object.keys(this._acquiringTypings).length > 0;
|
|
}
|
|
onBeginInstallTypings(eventId) {
|
|
if (this._acquiringTypings[eventId]) {
|
|
return;
|
|
}
|
|
this._acquiringTypings[eventId] = setTimeout(() => {
|
|
this.onEndInstallTypings(eventId);
|
|
}, typingsInstallTimeout);
|
|
}
|
|
onEndInstallTypings(eventId) {
|
|
const timer = this._acquiringTypings[eventId];
|
|
if (timer) {
|
|
clearTimeout(timer);
|
|
}
|
|
delete this._acquiringTypings[eventId];
|
|
}
|
|
};
|
|
var typingsStatus_default = TypingsStatus;
|
|
var AtaProgressReporter = class {
|
|
constructor(client) {
|
|
this._promises = new Map();
|
|
this._invalid = false;
|
|
this.statusItem = import_coc33.window.createStatusBarItem(10, {progress: true});
|
|
const disposables = [];
|
|
disposables.push(client.onDidBeginInstallTypings((e) => this._onBegin(e.eventId)));
|
|
disposables.push(client.onDidEndInstallTypings((e) => this._onEndOrTimeout(e.eventId)));
|
|
disposables.push(client.onTypesInstallerInitializationFailed((_) => this.onTypesInstallerInitializationFailed()));
|
|
this._disposable = import_vscode_languageserver_protocol22.Disposable.create(() => {
|
|
disposables.forEach((disposable) => {
|
|
disposable.dispose();
|
|
});
|
|
});
|
|
}
|
|
dispose() {
|
|
this._disposable.dispose();
|
|
this._promises.forEach((value) => value());
|
|
}
|
|
_onBegin(eventId) {
|
|
const handle = setTimeout(() => this._onEndOrTimeout(eventId), typingsInstallTimeout);
|
|
new Promise((resolve) => {
|
|
this._promises.set(eventId, () => {
|
|
clearTimeout(handle);
|
|
resolve();
|
|
});
|
|
});
|
|
this.statusItem.text = "Fetching data for better TypeScript IntelliSense";
|
|
this.statusItem.show();
|
|
}
|
|
_onEndOrTimeout(eventId) {
|
|
this.statusItem.hide();
|
|
const resolve = this._promises.get(eventId);
|
|
if (resolve) {
|
|
this._promises.delete(eventId);
|
|
resolve();
|
|
}
|
|
}
|
|
onTypesInstallerInitializationFailed() {
|
|
this.statusItem.hide();
|
|
if (!this._invalid) {
|
|
import_coc33.window.showMessage("Could not install typings files for JavaScript language features. Please ensure that NPM is installed", "error");
|
|
}
|
|
this._invalid = true;
|
|
}
|
|
};
|
|
|
|
// src/server/typescriptServiceClientHost.ts
|
|
var styleCheckDiagnostics = [
|
|
6133,
|
|
6138,
|
|
7027,
|
|
7028,
|
|
7029,
|
|
7030
|
|
];
|
|
var TypeScriptServiceClientHost = class {
|
|
constructor(descriptions, pluginManager) {
|
|
this.languagePerId = new Map();
|
|
this.disposables = [];
|
|
this.reportStyleCheckAsWarnings = true;
|
|
let timer;
|
|
const handleProjectChange = () => {
|
|
if (timer)
|
|
clearTimeout(timer);
|
|
timer = setTimeout(() => {
|
|
this.triggerAllDiagnostics();
|
|
}, 1500);
|
|
};
|
|
const configFileWatcher = import_coc34.workspace.createFileSystemWatcher("**/[tj]sconfig.json");
|
|
this.disposables.push(configFileWatcher);
|
|
configFileWatcher.onDidCreate(this.reloadProjects, this, this.disposables);
|
|
configFileWatcher.onDidDelete(this.reloadProjects, this, this.disposables);
|
|
configFileWatcher.onDidChange(handleProjectChange, this, this.disposables);
|
|
const packageFileWatcher = import_coc34.workspace.createFileSystemWatcher("**/package.json");
|
|
packageFileWatcher.onDidCreate(this.reloadProjects, this, this.disposables);
|
|
packageFileWatcher.onDidChange(handleProjectChange, this, this.disposables);
|
|
const allModeIds = this.getAllModeIds(descriptions, pluginManager);
|
|
this.client = new typescriptServiceClient_default(pluginManager, allModeIds);
|
|
this.disposables.push(this.client);
|
|
this.client.onDiagnosticsReceived(({kind, resource, diagnostics}) => {
|
|
this.diagnosticsReceived(kind, resource, diagnostics).catch((e) => {
|
|
console.error(e);
|
|
});
|
|
}, null, this.disposables);
|
|
this.disposables.push(new watchBuild_default(this.client));
|
|
this.disposables.push(import_coc34.languages.registerWorkspaceSymbolProvider(new workspaceSymbols_default(this.client, allModeIds)));
|
|
this.client.onConfigDiagnosticsReceived((diag) => {
|
|
let {body} = diag;
|
|
if (body) {
|
|
let {configFile, diagnostics} = body;
|
|
let uri = import_coc34.Uri.file(configFile);
|
|
if (diagnostics.length == 0) {
|
|
this.client.diagnosticsManager.configFileDiagnosticsReceived(uri.toString(), []);
|
|
} else {
|
|
let diagnosticList = diagnostics.map((o) => {
|
|
let {text, code, category, start, end} = o;
|
|
let range;
|
|
if (!start || !end) {
|
|
range = import_vscode_languageserver_protocol23.Range.create(import_vscode_languageserver_protocol23.Position.create(0, 0), import_vscode_languageserver_protocol23.Position.create(0, 1));
|
|
} else {
|
|
range = import_vscode_languageserver_protocol23.Range.create(start.line - 1, start.offset - 1, end.line - 1, end.offset - 1);
|
|
}
|
|
let severity = category == "error" ? import_vscode_languageserver_protocol23.DiagnosticSeverity.Error : import_vscode_languageserver_protocol23.DiagnosticSeverity.Warning;
|
|
return import_vscode_languageserver_protocol23.Diagnostic.create(range, text, severity, code);
|
|
});
|
|
this.client.diagnosticsManager.configFileDiagnosticsReceived(uri.toString(), diagnosticList);
|
|
}
|
|
}
|
|
}, null, this.disposables);
|
|
this.typingsStatus = new typingsStatus_default(this.client);
|
|
this.ataProgressReporter = new AtaProgressReporter(this.client);
|
|
this.fileConfigurationManager = new fileConfigurationManager_default(this.client);
|
|
for (const description of descriptions) {
|
|
const manager = new languageProvider_default(this.client, this.fileConfigurationManager, description, this.typingsStatus);
|
|
this.languagePerId.set(description.id, manager);
|
|
}
|
|
const languageIds = new Set();
|
|
for (const plugin of pluginManager.plugins) {
|
|
if (plugin.configNamespace && plugin.languages.length) {
|
|
this.registerExtensionLanguageProvider({
|
|
id: plugin.configNamespace,
|
|
modeIds: Array.from(plugin.languages),
|
|
diagnosticSource: "ts-plugin",
|
|
diagnosticLanguage: DiagnosticLanguage.TypeScript,
|
|
diagnosticOwner: "typescript",
|
|
isExternal: true
|
|
});
|
|
} else {
|
|
for (const language2 of plugin.languages) {
|
|
languageIds.add(language2);
|
|
}
|
|
}
|
|
}
|
|
if (languageIds.size) {
|
|
this.registerExtensionLanguageProvider({
|
|
id: "typescript-plugins",
|
|
modeIds: Array.from(languageIds.values()),
|
|
diagnosticSource: "ts-plugin",
|
|
diagnosticLanguage: DiagnosticLanguage.TypeScript,
|
|
diagnosticOwner: "typescript",
|
|
isExternal: true
|
|
});
|
|
}
|
|
this.client.ensureServiceStarted();
|
|
this.client.onTsServerStarted(() => {
|
|
this.triggerAllDiagnostics();
|
|
});
|
|
import_coc34.workspace.onDidChangeConfiguration(this.configurationChanged, this, this.disposables);
|
|
this.configurationChanged();
|
|
}
|
|
registerExtensionLanguageProvider(description) {
|
|
const manager = new languageProvider_default(this.client, this.fileConfigurationManager, description, this.typingsStatus);
|
|
this.languagePerId.set(description.id, manager);
|
|
}
|
|
dispose() {
|
|
import_coc34.disposeAll(this.disposables);
|
|
for (let language2 of this.languagePerId.values()) {
|
|
language2.dispose();
|
|
}
|
|
this.languagePerId.clear();
|
|
this.fileConfigurationManager.dispose();
|
|
this.typingsStatus.dispose();
|
|
this.ataProgressReporter.dispose();
|
|
}
|
|
reset() {
|
|
this.fileConfigurationManager.reset();
|
|
}
|
|
get serviceClient() {
|
|
return this.client;
|
|
}
|
|
reloadProjects() {
|
|
this.client.diagnosticsManager.reInitialize();
|
|
this.client.execute("reloadProjects", null, import_vscode_languageserver_protocol23.CancellationToken.None);
|
|
this.triggerAllDiagnostics();
|
|
}
|
|
getProvider(languageId) {
|
|
return this.languagePerId.get(languageId);
|
|
}
|
|
configurationChanged() {
|
|
const config = import_coc34.workspace.getConfiguration("tsserver");
|
|
this.reportStyleCheckAsWarnings = config.get("reportStyleChecksAsWarnings", true);
|
|
}
|
|
async findLanguage(uri) {
|
|
try {
|
|
let doc = this.client.getDocument(uri);
|
|
if (!doc)
|
|
return void 0;
|
|
let languages4 = Array.from(this.languagePerId.values());
|
|
return languages4.find((language2) => language2.handles(uri, doc.textDocument));
|
|
} catch {
|
|
return void 0;
|
|
}
|
|
}
|
|
async handles(doc) {
|
|
let languages4 = Array.from(this.languagePerId.values());
|
|
let idx = languages4.findIndex((language2) => language2.handles(doc.uri, doc));
|
|
if (idx != -1)
|
|
return true;
|
|
return this.client.bufferSyncSupport.handles(doc.uri);
|
|
}
|
|
triggerAllDiagnostics() {
|
|
for (const language2 of this.languagePerId.values()) {
|
|
language2.triggerAllDiagnostics();
|
|
}
|
|
}
|
|
async diagnosticsReceived(kind, resource, diagnostics) {
|
|
const language2 = await this.findLanguage(resource.toString());
|
|
if (language2) {
|
|
language2.diagnosticsReceived(kind, resource, this.createMarkerDatas(diagnostics));
|
|
}
|
|
}
|
|
createMarkerDatas(diagnostics) {
|
|
return diagnostics.map((tsDiag) => this.tsDiagnosticToLspDiagnostic(tsDiag));
|
|
}
|
|
tsDiagnosticToLspDiagnostic(diagnostic) {
|
|
const {start, end, text} = diagnostic;
|
|
const range = {
|
|
start: Position.fromLocation(start),
|
|
end: Position.fromLocation(end)
|
|
};
|
|
let relatedInformation;
|
|
if (diagnostic.relatedInformation) {
|
|
relatedInformation = diagnostic.relatedInformation.map((o) => {
|
|
let {span, message} = o;
|
|
return {
|
|
location: Location2.fromTextSpan(this.client.toResource(span.file), span),
|
|
message
|
|
};
|
|
});
|
|
}
|
|
let tags = [];
|
|
if (diagnostic.reportsUnnecessary) {
|
|
tags.push(import_vscode_languageserver_protocol23.DiagnosticTag.Unnecessary);
|
|
}
|
|
if (diagnostic.reportsDeprecated) {
|
|
tags.push(import_vscode_languageserver_protocol23.DiagnosticTag.Deprecated);
|
|
}
|
|
tags = tags.length ? tags : void 0;
|
|
return {
|
|
range,
|
|
tags,
|
|
message: text,
|
|
code: diagnostic.code ? diagnostic.code : null,
|
|
severity: this.getDiagnosticSeverity(diagnostic),
|
|
reportDeprecated: diagnostic.reportsDeprecated,
|
|
reportUnnecessary: diagnostic.reportsUnnecessary,
|
|
source: diagnostic.source || "tsserver",
|
|
relatedInformation
|
|
};
|
|
}
|
|
getDiagnosticSeverity(diagnostic) {
|
|
if (this.reportStyleCheckAsWarnings && this.isStyleCheckDiagnostic(diagnostic.code) && diagnostic.category === DiagnosticCategory.error) {
|
|
return import_vscode_languageserver_protocol23.DiagnosticSeverity.Warning;
|
|
}
|
|
switch (diagnostic.category) {
|
|
case DiagnosticCategory.error:
|
|
return import_vscode_languageserver_protocol23.DiagnosticSeverity.Error;
|
|
case DiagnosticCategory.warning:
|
|
return import_vscode_languageserver_protocol23.DiagnosticSeverity.Warning;
|
|
case DiagnosticCategory.suggestion:
|
|
return import_vscode_languageserver_protocol23.DiagnosticSeverity.Information;
|
|
default:
|
|
return import_vscode_languageserver_protocol23.DiagnosticSeverity.Error;
|
|
}
|
|
}
|
|
isStyleCheckDiagnostic(code) {
|
|
return code ? styleCheckDiagnostics.indexOf(code) !== -1 : false;
|
|
}
|
|
getAllModeIds(descriptions, pluginManager) {
|
|
const allModeIds = flatten([
|
|
...descriptions.map((x) => x.modeIds),
|
|
...pluginManager.plugins.map((x) => x.languages)
|
|
]);
|
|
return allModeIds;
|
|
}
|
|
};
|
|
var typescriptServiceClientHost_default = TypeScriptServiceClientHost;
|
|
|
|
// src/server/index.ts
|
|
var TsserverService = class {
|
|
constructor(pluginManager) {
|
|
this.pluginManager = pluginManager;
|
|
this.id = "tsserver";
|
|
this.name = "tsserver";
|
|
this.state = import_coc35.ServiceStat.Initial;
|
|
this._onDidServiceReady = new import_vscode_languageserver_protocol24.Emitter();
|
|
this.onServiceReady = this._onDidServiceReady.event;
|
|
this.disposables = [];
|
|
this.descriptions = [];
|
|
const config = import_coc35.workspace.getConfiguration("tsserver");
|
|
const enableJavascript = !!config.get("enableJavascript");
|
|
this.enable = config.get("enable");
|
|
this.descriptions = standardLanguageDescriptions.filter((o) => {
|
|
return enableJavascript ? true : o.id != "javascript";
|
|
});
|
|
this.selector = this.descriptions.reduce((arr, c) => {
|
|
return arr.concat(c.modeIds);
|
|
}, []);
|
|
}
|
|
get config() {
|
|
return import_coc35.workspace.getConfiguration("tsserver");
|
|
}
|
|
getClientHost() {
|
|
if (this.state == import_coc35.ServiceStat.Running)
|
|
return Promise.resolve(this.clientHost);
|
|
this.start();
|
|
return new Promise((resolve, reject) => {
|
|
let timer = setTimeout(() => {
|
|
reject(new Error(`Server not started after 5s`));
|
|
}, 5e3);
|
|
let disposable = this.onServiceReady(() => {
|
|
clearTimeout(timer);
|
|
disposable.dispose();
|
|
resolve(this.clientHost);
|
|
});
|
|
});
|
|
}
|
|
start() {
|
|
if (this.clientHost)
|
|
return;
|
|
this.state = import_coc35.ServiceStat.Starting;
|
|
this.clientHost = new typescriptServiceClientHost_default(this.descriptions, this.pluginManager);
|
|
this.disposables.push(this.clientHost);
|
|
let client = this.clientHost.serviceClient;
|
|
return new Promise((resolve) => {
|
|
let started = false;
|
|
client.onTsServerStarted(() => {
|
|
Object.defineProperty(this, "state", {
|
|
get: () => {
|
|
return this.clientHost.serviceClient.state;
|
|
}
|
|
});
|
|
this._onDidServiceReady.fire(void 0);
|
|
if (!started) {
|
|
started = true;
|
|
resolve();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
dispose() {
|
|
import_coc35.disposeAll(this.disposables);
|
|
}
|
|
async restart() {
|
|
if (!this.clientHost)
|
|
return;
|
|
let client = this.clientHost.serviceClient;
|
|
await client.restartTsServer();
|
|
}
|
|
async stop() {
|
|
if (!this.clientHost)
|
|
return;
|
|
this.clientHost.reset();
|
|
let client = this.clientHost.serviceClient;
|
|
await client.stop();
|
|
return;
|
|
}
|
|
};
|
|
var server_default = TsserverService;
|
|
|
|
// src/utils/plugins.ts
|
|
var import_coc36 = __toModule(require("coc.nvim"));
|
|
var import_vscode_languageserver_protocol25 = __toModule(require_main3());
|
|
var TypeScriptServerPlugin;
|
|
(function(TypeScriptServerPlugin2) {
|
|
function equals2(a, b) {
|
|
return a.path === b.path && a.name === b.name && a.enableForWorkspaceTypeScriptVersions === b.enableForWorkspaceTypeScriptVersions && equals(a.languages, b.languages);
|
|
}
|
|
TypeScriptServerPlugin2.equals = equals2;
|
|
})(TypeScriptServerPlugin || (TypeScriptServerPlugin = {}));
|
|
var PluginManager = class {
|
|
constructor() {
|
|
this._pluginConfigurations = new Map();
|
|
this._disposables = [];
|
|
this._onDidUpdatePlugins = this._register(new import_vscode_languageserver_protocol25.Emitter());
|
|
this.onDidChangePlugins = this._onDidUpdatePlugins.event;
|
|
this._onDidUpdateConfig = this._register(new import_vscode_languageserver_protocol25.Emitter());
|
|
this.onDidUpdateConfig = this._onDidUpdateConfig.event;
|
|
let loadPlugins = () => {
|
|
if (!this._plugins) {
|
|
return;
|
|
}
|
|
const newPlugins = this.readPlugins();
|
|
if (!equals(flatten(Array.from(this._plugins.values())), flatten(Array.from(newPlugins.values())), TypeScriptServerPlugin.equals)) {
|
|
this._plugins = newPlugins;
|
|
this._onDidUpdatePlugins.fire(this);
|
|
}
|
|
};
|
|
import_coc36.extensions.onDidActiveExtension(loadPlugins, void 0, this._disposables);
|
|
import_coc36.extensions.onDidUnloadExtension(loadPlugins, void 0, this._disposables);
|
|
}
|
|
dispose() {
|
|
import_coc36.disposeAll(this._disposables);
|
|
}
|
|
get plugins() {
|
|
if (!this._plugins) {
|
|
this._plugins = this.readPlugins();
|
|
}
|
|
return flatten(Array.from(this._plugins.values()));
|
|
}
|
|
_register(value) {
|
|
this._disposables.push(value);
|
|
return value;
|
|
}
|
|
setConfiguration(pluginId, config) {
|
|
this._pluginConfigurations.set(pluginId, config);
|
|
this._onDidUpdateConfig.fire({pluginId, config});
|
|
}
|
|
configurations() {
|
|
return this._pluginConfigurations.entries();
|
|
}
|
|
readPlugins() {
|
|
const pluginMap = new Map();
|
|
for (const extension of import_coc36.extensions.all) {
|
|
const pack = extension.packageJSON;
|
|
if (pack.contributes && Array.isArray(pack.contributes.typescriptServerPlugins)) {
|
|
const plugins = [];
|
|
for (const plugin of pack.contributes.typescriptServerPlugins) {
|
|
plugins.push({
|
|
name: plugin.name,
|
|
enableForWorkspaceTypeScriptVersions: !!plugin.enableForWorkspaceTypeScriptVersions,
|
|
path: extension.extensionPath,
|
|
languages: Array.isArray(plugin.languages) ? plugin.languages : []
|
|
});
|
|
}
|
|
if (plugins.length) {
|
|
pluginMap.set(extension.id, plugins);
|
|
}
|
|
}
|
|
}
|
|
return pluginMap;
|
|
}
|
|
};
|
|
|
|
// src/index.ts
|
|
async function activate(context) {
|
|
let {subscriptions, logger} = context;
|
|
const config = import_coc37.workspace.getConfiguration().get("tsserver", {});
|
|
if (!config.enable)
|
|
return;
|
|
const pluginManager = new PluginManager();
|
|
const service = new server_default(pluginManager);
|
|
function registCommand2(cmd) {
|
|
let {id, execute} = cmd;
|
|
subscriptions.push(import_coc37.commands.registerCommand(id, execute, cmd));
|
|
}
|
|
registCommand2(new ConfigurePluginCommand(pluginManager));
|
|
registCommand2(new AutoFixCommand(service));
|
|
registCommand2(new ReloadProjectsCommand(service));
|
|
registCommand2(new FileReferencesCommand(service));
|
|
registCommand2(new OpenTsServerLogCommand(service));
|
|
registCommand2(new TypeScriptGoToProjectConfigCommand(service));
|
|
registCommand2(new OrganizeImportsCommand(service));
|
|
registCommand2({
|
|
id: "tsserver.restart",
|
|
execute: () => {
|
|
service.stop().then(() => {
|
|
setTimeout(() => {
|
|
service.restart();
|
|
}, 100);
|
|
});
|
|
}
|
|
});
|
|
service.start().then(() => {
|
|
subscriptions.push(import_coc37.services.regist(service));
|
|
}, (e) => {
|
|
logger.error(`Error on service start:`, e);
|
|
});
|
|
return {
|
|
configurePlugin: (pluginId, configuration) => {
|
|
pluginManager.setConfiguration(pluginId, configuration);
|
|
}
|
|
};
|
|
}
|
|
//# sourceMappingURL=index.js.map
|