From 96a7521a2e0b88d71dfaeaa06410ec678f73b911 Mon Sep 17 00:00:00 2001 From: Colin Grant Date: Thu, 7 Oct 2021 00:10:28 +0200 Subject: [PATCH] Update JSONRPC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates to latest version of vscode-languageserver-protocol Removes vscode-monaco-jsonrpc dependency Replaces references to vscode-languageserver-types with references to vscode-languageserver-protocol Refactors existing code to match new interfaces Co-authored-by: Paul Maréchal --- .../src/browser/callhierarchy-service.ts | 2 +- .../callhierarchy-tree-model.ts | 2 +- .../callhierarchy-tree-widget.tsx | 2 +- .../src/browser/callhierarchy.ts | 2 +- .../src/browser/current-editor-access.ts | 2 +- packages/callhierarchy/src/browser/utils.ts | 2 +- packages/core/README.md | 4 +- packages/core/package.json | 8 +- .../shared/vscode-languageserver-types.d.ts | 1 - .../shared/vscode-languageserver-types.js | 1 - packages/core/shared/vscode-ws-jsonrpc.d.ts | 1 - packages/core/shared/vscode-ws-jsonrpc.js | 1 - .../src/browser/progress-status-bar-item.ts | 2 +- packages/core/src/common/cancellation.ts | 9 ++ packages/core/src/common/logger-protocol.ts | 21 +++ packages/core/src/common/lsp-types.ts | 2 +- .../messaging/abstract-connection-provider.ts | 6 +- packages/core/src/common/messaging/channel.ts | 72 ++++++++++ .../messaging/connection-error-handler.ts | 2 +- packages/core/src/common/messaging/handler.ts | 2 +- packages/core/src/common/messaging/index.ts | 2 + .../src/common/messaging/json-rpc-service.ts | 36 +++++ .../common/messaging/proxy-factory.spec.ts | 24 ++-- .../src/common/messaging/proxy-factory.ts | 94 +++++++------ .../src/common/messaging/rpc-message-relay.ts | 57 ++++++++ .../common/messaging/web-socket-channel.ts | 32 +++-- packages/core/src/common/severity.ts | 2 +- packages/core/src/common/types.ts | 2 + .../electron-messaging-contribution.ts | 8 +- .../messaging/electron-messaging-service.ts | 2 +- .../core/src/node/messaging/ipc-bootstrap.ts | 5 +- .../node/messaging/ipc-connection-provider.ts | 20 ++- .../core/src/node/messaging/ipc-protocol.ts | 2 +- packages/core/src/node/messaging/logger.ts | 22 +-- .../node/messaging/messaging-contribution.ts | 18 +-- .../src/node/messaging/messaging-service.ts | 16 ++- .../src/browser/debug-session-connection.ts | 8 +- .../src/browser/debug-session-contribution.ts | 14 +- .../debug/src/node/debug-adapter-session.ts | 8 +- packages/editor/src/browser/editor.ts | 35 +++-- .../src/common/remote-file-system-provider.ts | 3 +- packages/markers/src/browser/marker-tree.ts | 2 +- .../problem-composite-tree-node.spec.ts | 3 +- .../problem/problem-composite-tree-node.ts | 2 +- .../src/browser/problem/problem-decorator.ts | 2 +- .../browser/problem/problem-manager.spec.ts | 2 +- .../src/browser/problem/problem-manager.ts | 2 +- .../problem/problem-tabbar-decorator.ts | 2 +- .../problem/problem-tree-model.spec.ts | 2 +- .../src/browser/problem/problem-tree-model.ts | 2 +- .../src/browser/problem/problem-utils.ts | 2 +- .../src/browser/problem/problem-widget.tsx | 2 +- packages/markers/src/common/problem-marker.ts | 2 +- packages/monaco/src/browser/monaco-command.ts | 16 +-- .../browser/monaco-diagnostic-collection.ts | 2 +- .../monaco/src/browser/monaco-editor-model.ts | 3 +- packages/monaco/src/browser/monaco-editor.ts | 2 +- .../monaco/src/browser/monaco-languages.ts | 3 +- .../browser/monaco-to-protocol-converter.ts | 2 +- .../browser/protocol-to-monaco-converter.ts | 2 +- .../src/browser/workspace-symbol-command.ts | 3 +- .../src/browser/outline-view-widget.tsx | 2 +- packages/plugin-ext/src/common/connection.ts | 37 +++-- .../plugin-ext/src/common/plugin-api-rpc.ts | 2 +- .../src/common/plugin-message-reader.ts | 96 ++++++------- .../src/common/plugin-message-writer.ts | 43 ++---- .../plugin-ext/src/common/plugin-message.ts | 28 ++++ .../src/hosted/browser/hosted-plugin.ts | 8 +- .../src/hosted/node/hosted-plugin-process.ts | 2 - .../callhierarchy-type-converters.ts | 128 +++++++++--------- .../src/main/browser/custom-editors/glob.ts | 3 + .../src/main/browser/debug/debug-main.ts | 4 +- .../debug/plugin-debug-session-factory.ts | 10 +- .../src/main/browser/documents-main.ts | 14 +- .../src/main/browser/languages-main.ts | 34 +++-- .../src/main/browser/quick-open-main.ts | 8 +- .../src/main/common/plugin-paths-protocol.ts | 6 +- .../main/node/paths/plugin-paths-service.ts | 2 +- .../src/main/node/plugin-server-handler.ts | 15 +- .../main/node/plugins-key-value-storage.ts | 4 +- .../src/plugin/authentication-ext.ts | 26 +++- .../plugin-ext/src/plugin/command-registry.ts | 3 +- .../src/plugin/known-commands.spec.ts | 2 +- .../plugin-ext/src/plugin/known-commands.ts | 14 +- packages/plugin-ext/src/plugin/languages.ts | 12 +- .../src/plugin/languages/workspace-symbol.ts | 2 +- .../plugin-ext/src/plugin/node/debug/debug.ts | 4 +- .../debug/plugin-debug-adapter-session.ts | 4 +- .../plugin-ext/src/plugin/plugin-context.ts | 21 +-- .../plugin-ext/src/plugin/tree/tree-views.ts | 2 +- .../plugin-ext/src/plugin/type-converters.ts | 14 +- packages/plugin-ext/src/plugin/types-impl.ts | 4 +- packages/plugin-ext/src/plugin/workspace.ts | 4 +- packages/plugin-ext/tsconfig.json | 3 +- .../browser/plugin-metrics-languages-main.ts | 57 ++++---- .../src/browser/preview-contribution.ts | 2 +- .../preview/src/browser/preview-widget.ts | 2 +- ...arch-in-workspace-frontend-contribution.ts | 2 +- packages/task/src/browser/task-service.ts | 12 +- .../src/common/problem-matcher-protocol.ts | 2 +- .../src/node/task-abstract-line-matcher.ts | 2 +- .../src/node/task-problem-collector.spec.ts | 2 +- .../src/browser/terminal-widget-impl.ts | 2 +- .../tree/typehierarchy-tree-widget.tsx | 2 +- .../src/browser/typehierarchy-provider.ts | 3 +- yarn.lock | 36 ++--- 106 files changed, 746 insertions(+), 551 deletions(-) delete mode 100644 packages/core/shared/vscode-languageserver-types.d.ts delete mode 100644 packages/core/shared/vscode-languageserver-types.js delete mode 100644 packages/core/shared/vscode-ws-jsonrpc.d.ts delete mode 100644 packages/core/shared/vscode-ws-jsonrpc.js create mode 100644 packages/core/src/common/messaging/channel.ts create mode 100644 packages/core/src/common/messaging/json-rpc-service.ts create mode 100644 packages/core/src/common/messaging/rpc-message-relay.ts create mode 100644 packages/plugin-ext/src/common/plugin-message.ts diff --git a/packages/callhierarchy/src/browser/callhierarchy-service.ts b/packages/callhierarchy/src/browser/callhierarchy-service.ts index 9f58452ba1346..4f9b9b4f17b5a 100644 --- a/packages/callhierarchy/src/browser/callhierarchy-service.ts +++ b/packages/callhierarchy/src/browser/callhierarchy-service.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { injectable, inject, named, postConstruct } from '@theia/core/shared/inversify'; -import { Position, DocumentUri } from '@theia/core/shared/vscode-languageserver-types'; +import { Position, DocumentUri } from '@theia/core/shared/vscode-languageserver-protocol'; import { Definition, Caller, Callee } from './callhierarchy'; import { ContributionProvider, Disposable } from '@theia/core/lib/common'; import { LanguageSelector, score } from '../common/language-selector'; diff --git a/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-model.ts b/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-model.ts index 24ca06b7d64f9..30713a5ebe5a3 100644 --- a/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-model.ts +++ b/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-model.ts @@ -18,7 +18,7 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { CompositeTreeNode, TreeModelImpl, TreeNode } from '@theia/core/lib/browser'; import { CallHierarchyTree, DefinitionNode } from './callhierarchy-tree'; import { CallHierarchyServiceProvider } from '../callhierarchy-service'; -import { Position } from '@theia/core/shared/vscode-languageserver-types'; +import { Position } from '@theia/core/shared/vscode-languageserver-protocol'; import URI from '@theia/core/lib/common/uri'; import { CancellationTokenSource } from '@theia/core/lib/common/cancellation'; diff --git a/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-widget.tsx b/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-widget.tsx index f0c98d97f4883..0cc7c68df811f 100644 --- a/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-widget.tsx +++ b/packages/callhierarchy/src/browser/callhierarchy-tree/callhierarchy-tree-widget.tsx @@ -24,7 +24,7 @@ import { DefinitionNode, CallerNode } from './callhierarchy-tree'; import { CallHierarchyTreeModel } from './callhierarchy-tree-model'; import { CALLHIERARCHY_ID, Definition, Caller } from '../callhierarchy'; import URI from '@theia/core/lib/common/uri'; -import { Location, Range, SymbolKind, DocumentUri, SymbolTag } from '@theia/core/shared/vscode-languageserver-types'; +import { Location, Range, SymbolKind, DocumentUri, SymbolTag } from '@theia/core/shared/vscode-languageserver-protocol'; import { EditorManager } from '@theia/editor/lib/browser'; import * as React from '@theia/core/shared/react'; diff --git a/packages/callhierarchy/src/browser/callhierarchy.ts b/packages/callhierarchy/src/browser/callhierarchy.ts index 5d6b335b4f55f..d6d30062694b9 100644 --- a/packages/callhierarchy/src/browser/callhierarchy.ts +++ b/packages/callhierarchy/src/browser/callhierarchy.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Range, SymbolKind, Location, SymbolTag } from '@theia/core/shared/vscode-languageserver-types'; +import { Range, SymbolKind, Location, SymbolTag } from '@theia/core/shared/vscode-languageserver-protocol'; export const CALLHIERARCHY_ID = 'callhierarchy'; diff --git a/packages/callhierarchy/src/browser/current-editor-access.ts b/packages/callhierarchy/src/browser/current-editor-access.ts index b66a8e4c8ea11..26a711cc0770a 100644 --- a/packages/callhierarchy/src/browser/current-editor-access.ts +++ b/packages/callhierarchy/src/browser/current-editor-access.ts @@ -16,7 +16,7 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { EditorManager, TextEditor } from '@theia/editor/lib/browser'; -import { Location } from '@theia/core/shared/vscode-languageserver-types'; +import { Location } from '@theia/core/shared/vscode-languageserver-protocol'; /** * @deprecated since 1.15.0. Import from `@theia/editor` instead. diff --git a/packages/callhierarchy/src/browser/utils.ts b/packages/callhierarchy/src/browser/utils.ts index b7bde221bb7b0..7a23e19e99170 100644 --- a/packages/callhierarchy/src/browser/utils.ts +++ b/packages/callhierarchy/src/browser/utils.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Location, Range, Position } from '@theia/core/shared/vscode-languageserver-types'; +import { Location, Range, Position } from '@theia/core/shared/vscode-languageserver-protocol'; /** * Test if `otherRange` is in `range`. If the ranges are equal, will return true. diff --git a/packages/core/README.md b/packages/core/README.md index 98bce045ba75a..1f0571c11c0c0 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -93,10 +93,8 @@ export class SomeClass { - [`react@^16.8.0`](https://www.npmjs.com/package/react) - [`react-dom@^16.8.0`](https://www.npmjs.com/package/react-dom) - [`react-virtualized@^9.20.0`](https://www.npmjs.com/package/react-virtualized) - - [`vscode-languageserver-protocol@~3.15.3`](https://www.npmjs.com/package/vscode-languageserver-protocol) - - [`vscode-languageserver-types@^3.15.1`](https://www.npmjs.com/package/vscode-languageserver-types) + - [`vscode-languageserver-protocol@^3.16.0`](https://www.npmjs.com/package/vscode-languageserver-protocol) - [`vscode-uri@^2.1.1`](https://www.npmjs.com/package/vscode-uri) - - [`vscode-ws-jsonrpc@^0.2.0`](https://www.npmjs.com/package/vscode-ws-jsonrpc) - [`ws@^7.1.2`](https://www.npmjs.com/package/ws) - [`yargs@^15.3.1`](https://www.npmjs.com/package/yargs) diff --git a/packages/core/package.json b/packages/core/package.json index 9935c94446ce8..017819ccbc15b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -62,10 +62,8 @@ "route-parser": "^0.0.5", "safer-buffer": "^2.1.2", "uuid": "^8.3.2", - "vscode-languageserver-protocol": "~3.15.3", - "vscode-languageserver-types": "^3.15.1", + "vscode-languageserver-protocol": "^3.16.0", "vscode-uri": "^2.1.1", - "vscode-ws-jsonrpc": "^0.2.0", "ws": "^7.1.2", "yargs": "^15.3.1" }, @@ -101,9 +99,7 @@ "react-dom", "react-virtualized", "vscode-languageserver-protocol", - "vscode-languageserver-types", - "vscode-uri", - "vscode-ws-jsonrpc" + "vscode-uri" ], "export =": [ "dompurify as DOMPurify", diff --git a/packages/core/shared/vscode-languageserver-types.d.ts b/packages/core/shared/vscode-languageserver-types.d.ts deleted file mode 100644 index 70f5f9dc1d06d..0000000000000 --- a/packages/core/shared/vscode-languageserver-types.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from 'vscode-languageserver-types'; diff --git a/packages/core/shared/vscode-languageserver-types.js b/packages/core/shared/vscode-languageserver-types.js deleted file mode 100644 index ab714fcdb9c99..0000000000000 --- a/packages/core/shared/vscode-languageserver-types.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('vscode-languageserver-types'); diff --git a/packages/core/shared/vscode-ws-jsonrpc.d.ts b/packages/core/shared/vscode-ws-jsonrpc.d.ts deleted file mode 100644 index b11ff897103ed..0000000000000 --- a/packages/core/shared/vscode-ws-jsonrpc.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from 'vscode-ws-jsonrpc'; diff --git a/packages/core/shared/vscode-ws-jsonrpc.js b/packages/core/shared/vscode-ws-jsonrpc.js deleted file mode 100644 index 3aed560b82d62..0000000000000 --- a/packages/core/shared/vscode-ws-jsonrpc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('vscode-ws-jsonrpc'); diff --git a/packages/core/src/browser/progress-status-bar-item.ts b/packages/core/src/browser/progress-status-bar-item.ts index 3393178cdbcab..a675c5746c24f 100644 --- a/packages/core/src/browser/progress-status-bar-item.ts +++ b/packages/core/src/browser/progress-status-bar-item.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { injectable, inject } from 'inversify'; -import { CancellationToken } from 'vscode-ws-jsonrpc'; +import { CancellationToken } from '../common/cancellation'; import { ProgressClient, ProgressMessage, ProgressUpdate } from '../common'; import { StatusBar, StatusBarAlignment } from './status-bar'; import { Deferred } from '../common/promise-util'; diff --git a/packages/core/src/common/cancellation.ts b/packages/core/src/common/cancellation.ts index a0af2f373e0ce..dcf6e9d202112 100644 --- a/packages/core/src/common/cancellation.ts +++ b/packages/core/src/common/cancellation.ts @@ -46,6 +46,15 @@ export namespace CancellationToken { isCancellationRequested: true, onCancellationRequested: shortcutEvent }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + export function Is(what: any): what is CancellationToken { + return typeof what === 'object' + // eslint-disable-next-line no-null/no-null + && what !== null + && typeof what.onCancellationRequested === 'function' + && typeof what.isCancellationRequested === 'boolean'; + } } export class CancellationError extends Error { diff --git a/packages/core/src/common/logger-protocol.ts b/packages/core/src/common/logger-protocol.ts index e4ce879a3b494..4a080357f485e 100644 --- a/packages/core/src/common/logger-protocol.ts +++ b/packages/core/src/common/logger-protocol.ts @@ -15,6 +15,7 @@ ********************************************************************************/ import { injectable } from 'inversify'; +import { Logger } from 'vscode-languageserver-protocol'; import { JsonRpcServer } from './messaging/proxy-factory'; export const ILoggerServer = Symbol('ILoggerServer'); @@ -86,6 +87,26 @@ export namespace LogLevel { } } +export class ConsoleLogger implements Logger { + + error(message: string): void { + console.log(message); + } + + warn(message: string): void { + console.log(message); + } + + info(message: string): void { + console.log(message); + } + + log(message: string): void { + console.log(message); + } + +} + /* eslint-disable @typescript-eslint/no-explicit-any */ export namespace ConsoleLogger { type Console = (message?: any, ...optionalParams: any[]) => void; diff --git a/packages/core/src/common/lsp-types.ts b/packages/core/src/common/lsp-types.ts index 6188cd8d040b9..eeec8d31c64ee 100644 --- a/packages/core/src/common/lsp-types.ts +++ b/packages/core/src/common/lsp-types.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Range } from 'vscode-languageserver-types'; +import { Range } from 'vscode-languageserver-protocol'; export interface TextDocumentContentChangeDelta { readonly range: Range; diff --git a/packages/core/src/common/messaging/abstract-connection-provider.ts b/packages/core/src/common/messaging/abstract-connection-provider.ts index 555d5bb0b3009..976f95b424c67 100644 --- a/packages/core/src/common/messaging/abstract-connection-provider.ts +++ b/packages/core/src/common/messaging/abstract-connection-provider.ts @@ -15,11 +15,13 @@ ********************************************************************************/ import { injectable, interfaces } from 'inversify'; -import { ConsoleLogger, createWebSocketConnection, Logger } from 'vscode-ws-jsonrpc'; +import { Logger } from 'vscode-languageserver-protocol'; import { Emitter, Event } from '../event'; +import { ConsoleLogger } from '../logger-protocol'; import { ConnectionHandler } from './handler'; import { JsonRpcProxy, JsonRpcProxyFactory } from './proxy-factory'; import { WebSocketChannel } from './web-socket-channel'; +import { Channel } from './channel'; /** * Factor common logic according to `ElectronIpcConnectionProvider` and @@ -80,7 +82,7 @@ export abstract class AbstractConnectionProvider */ listen(handler: ConnectionHandler, options?: AbstractOptions): void { this.openChannel(handler.path, channel => { - const connection = createWebSocketConnection(channel, this.createLogger()); + const connection = Channel.createMessageConnection(channel, this.createLogger()); connection.onDispose(() => channel.close()); handler.onConnection(connection); }, options); diff --git a/packages/core/src/common/messaging/channel.ts b/packages/core/src/common/messaging/channel.ts new file mode 100644 index 0000000000000..91559065d241d --- /dev/null +++ b/packages/core/src/common/messaging/channel.ts @@ -0,0 +1,72 @@ +/******************************************************************************** + * Copyright (C) 2021 Ericsson and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +import * as rpc from 'vscode-languageserver-protocol'; +import { RpcMessageRelay } from './rpc-message-relay'; +import { Disposable } from '../disposable'; + +/** + * A `Channel` represents a bidirectional logical connection to a remote. + */ +export interface Channel extends Disposable { + send(content: T): void; + onMessage(cb: (data: T) => void): void; + onError(cb: (reason: any) => void): void; + onClose(cb: (code: number, reason: string) => void): void; +} + +export namespace Channel { + + export class MessageReader extends rpc.AbstractMessageReader implements rpc.MessageReader { + constructor(protected channel: Channel) { + super(); + channel.onError(error => this.fireError(error)); + channel.onClose(() => this.fireClose()); + } + listen(callback: rpc.DataCallback): rpc.Disposable { + this.channel.onMessage(data => callback(JSON.parse(data))); + return rpc.Disposable.create(() => { + throw new Error('not supported'); + }); + } + } + + export class MessageWriter extends rpc.AbstractMessageWriter implements rpc.MessageWriter { + constructor(protected channel: Channel) { + super(); + channel.onError(error => this.fireError(error)); + channel.onClose(() => this.fireClose()); + } + async write(message: rpc.Message): Promise { + this.channel.send(JSON.stringify(message)); + } + end(): void { } + } + + export function createMessageConnection(channel: Channel, logger?: rpc.Logger, options?: rpc.ConnectionOptions): rpc.MessageConnection { + const reader = new MessageReader(channel); + const writer = new MessageWriter(channel); + return rpc.createMessageConnection(reader, writer, logger, options); + } + + export function createRpcMessageRelay(channel: Channel, onDispose: () => void = () => { }): RpcMessageRelay { + const reader = new MessageReader(channel); + const writer = new MessageWriter(channel); + return RpcMessageRelay.create(reader, writer, onDispose); + } +} diff --git a/packages/core/src/common/messaging/connection-error-handler.ts b/packages/core/src/common/messaging/connection-error-handler.ts index 8497124cff65a..31c95228b4098 100644 --- a/packages/core/src/common/messaging/connection-error-handler.ts +++ b/packages/core/src/common/messaging/connection-error-handler.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Message } from 'vscode-ws-jsonrpc'; +import { Message } from 'vscode-languageserver-protocol'; import { ILogger } from '../../common'; export interface ResolvedConnectionErrorHandlerOptions { diff --git a/packages/core/src/common/messaging/handler.ts b/packages/core/src/common/messaging/handler.ts index fac67342ae6f5..30b88dc2c28c6 100644 --- a/packages/core/src/common/messaging/handler.ts +++ b/packages/core/src/common/messaging/handler.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { MessageConnection } from 'vscode-ws-jsonrpc'; +import { MessageConnection } from 'vscode-languageserver-protocol'; export const ConnectionHandler = Symbol('ConnectionHandler'); diff --git a/packages/core/src/common/messaging/index.ts b/packages/core/src/common/messaging/index.ts index 9b2471be3bae8..868040f59a216 100644 --- a/packages/core/src/common/messaging/index.ts +++ b/packages/core/src/common/messaging/index.ts @@ -17,3 +17,5 @@ export * from './handler'; export * from './proxy-factory'; export * from './connection-error-handler'; +export * from './rpc-message-relay'; +export * from './channel'; diff --git a/packages/core/src/common/messaging/json-rpc-service.ts b/packages/core/src/common/messaging/json-rpc-service.ts new file mode 100644 index 0000000000000..b6fee38246f3b --- /dev/null +++ b/packages/core/src/common/messaging/json-rpc-service.ts @@ -0,0 +1,36 @@ +/******************************************************************************** + * Copyright (C) 2021 Ericsson and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +import { MaybePromise, Unpromise } from '../types'; + +export type UndefinedOrNull = T extends object + ? { [K in keyof T]: UndefinedOrNull } + : T extends undefined ? undefined | null : T; + +export interface JsonRpcMethods { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [method: string]: (...args: any[]) => MaybePromise +} + +/** + * Use this type to wrap your JSON-RPC service APIs to ensure you only use types that can be serialized through JSON-RPC. + * + * It replaces any occurence of `undefined` in the signature with `undefined | null` because when passing `undefined` it + * becomes `null` when serialized in JSON. The implementations must be able to handle both cases. + */ +export type JsonRpcService = { + [K in keyof T]: (...args: UndefinedOrNull>) => Promise>>> +}; diff --git a/packages/core/src/common/messaging/proxy-factory.spec.ts b/packages/core/src/common/messaging/proxy-factory.spec.ts index 8f4d8c7efcaeb..f24ae4b5d2df7 100644 --- a/packages/core/src/common/messaging/proxy-factory.spec.ts +++ b/packages/core/src/common/messaging/proxy-factory.spec.ts @@ -17,7 +17,7 @@ import * as chai from 'chai'; import { ConsoleLogger } from '../../node/messaging/logger'; import { JsonRpcProxyFactory, JsonRpcProxy } from './proxy-factory'; -import { createMessageConnection } from 'vscode-jsonrpc/lib/main'; +import { createMessageConnection } from 'vscode-languageserver-protocol/node'; import * as stream from 'stream'; const expect = chai.expect; @@ -55,22 +55,16 @@ class TestClient { describe('Proxy-Factory', () => { - it('Should correctly send notifications and requests.', done => { + it('Should correctly send notifications', async () => { const it = getSetup(); it.clientProxy.notifyThat('hello'); - function check(): void { - if (it.client.notifications.length === 0) { - console.log('waiting another 50 ms'); - setTimeout(check, 50); - } else { - expect(it.client.notifications[0]).eq('hello'); - it.serverProxy.doStuff('foo').then(result => { - expect(result).to.be.eq('done: foo'); - done(); - }); - } - } - check(); + await new Promise(resolve => setTimeout(resolve, 50)); + expect(it.client.notifications[0]).eq('hello'); + }); + it('Should correctly handle requests', async () => { + const it = getSetup(); + const result = await it.serverProxy.doStuff('foo'); + expect(result).to.be.eq('done: foo'); }); it('Rejected Promise should result in rejected Promise.', done => { const it = getSetup(); diff --git a/packages/core/src/common/messaging/proxy-factory.ts b/packages/core/src/common/messaging/proxy-factory.ts index ef5dca7d91475..34f253f9dd571 100644 --- a/packages/core/src/common/messaging/proxy-factory.ts +++ b/packages/core/src/common/messaging/proxy-factory.ts @@ -16,7 +16,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { MessageConnection, ResponseError } from 'vscode-ws-jsonrpc'; +import { MessageConnection, ResponseError, ParameterStructures, CancellationToken } from 'vscode-languageserver-protocol'; import { ApplicationError } from '../application-error'; import { Event, Emitter } from '../event'; import { Disposable } from '../disposable'; @@ -114,14 +114,8 @@ export class JsonRpcProxyFactory implements ProxyHandler { } protected waitForConnection(): void { - this.connectionPromise = new Promise(resolve => - this.connectionPromiseResolve = resolve - ); - this.connectionPromise.then(connection => { - connection.onClose(() => - this.onDidCloseConnectionEmitter.fire(undefined) - ); - this.onDidOpenConnectionEmitter.fire(undefined); + this.connectionPromise = new Promise(resolve => { + this.connectionPromiseResolve = resolve; }); } @@ -132,10 +126,33 @@ export class JsonRpcProxyFactory implements ProxyHandler { * response. */ listen(connection: MessageConnection): void { - connection.onRequest((prop, ...args) => this.onRequest(prop, ...args)); - connection.onNotification((prop, ...args) => this.onNotification(prop, ...args)); + // When a method is called without arguments then `params` is `undefined`. + // `token` seems to always be set by `vscode-jsonrpc` on the receiving side. + connection.onRequest((method: string, params: object | unknown[] | undefined, token: CancellationToken) => { + if (params === undefined) { + return this.onRequest(method, token); + } + if (!Array.isArray(params)) { + throw new Error('Unexpected JSON-RPC params format'); + } + return this.onRequest(method, ...params, token); + }); + connection.onNotification((method: string, params: object | unknown[] | undefined) => { + if (params === undefined) { + return this.onNotification(method); + } + if (!Array.isArray(params)) { + throw new Error('Unexpected JSON-RPC params format'); + } + return this.onNotification(method, ...params); + }); connection.onDispose(() => this.waitForConnection()); + connection.onClose(() => { + this.waitForConnection(); + this.onDidCloseConnectionEmitter.fire(); + }); connection.listen(); + this.onDidOpenConnectionEmitter.fire(); this.connectionPromiseResolve(connection); } @@ -151,10 +168,10 @@ export class JsonRpcProxyFactory implements ProxyHandler { * * @returns A promise of the method call completion. */ - protected async onRequest(method: string, ...args: any[]): Promise { + protected async onRequest(method: string, ...params: any[]): Promise { try { if (this.target) { - return await this.target[method](...args); + return await this.target[method](...params); } else { throw new Error(`no target was set to handle ${method}`); } @@ -176,9 +193,9 @@ export class JsonRpcProxyFactory implements ProxyHandler { * Same as [[onRequest]], but called on incoming notifications rather than * methods calls. */ - protected onNotification(method: string, ...args: any[]): void { + protected onNotification(method: string, ...params: any[]): void { if (this.target) { - this.target[method](...args); + this.target[method](...params); } } @@ -212,46 +229,39 @@ export class JsonRpcProxyFactory implements ProxyHandler { * `fooProxy.bar()` will call the `bar` method on the remote Foo object. * * @param target - unused. - * @param p - The property accessed on the Proxy object. + * @param property - The property accessed on the Proxy object. * @param receiver - unused. * @returns A callable that executes the JSON-RPC call. */ - get(target: T, p: PropertyKey, receiver: any): any { - if (p === 'setClient') { + get(target: T, property: PropertyKey, receiver: any): any { + if (property === 'setClient') { return (client: any) => { this.target = client; }; } - if (p === 'getClient') { + if (property === 'getClient') { return () => this.target; } - if (p === 'onDidOpenConnection') { + if (property === 'onDidOpenConnection') { return this.onDidOpenConnectionEmitter.event; } - if (p === 'onDidCloseConnection') { + if (property === 'onDidCloseConnection') { return this.onDidCloseConnectionEmitter.event; } - const isNotify = this.isNotification(p); - return (...args: any[]) => { - const method = p.toString(); + const isNotify = this.isNotification(property); + return async (...args: any[]) => { + const method = property.toString(); const capturedError = new Error(`Request '${method}' failed`); - return this.connectionPromise.then(connection => - new Promise((resolve, reject) => { - try { - if (isNotify) { - connection.sendNotification(method, ...args); - resolve(undefined); - } else { - const resultPromise = connection.sendRequest(method, ...args) as Promise; - resultPromise - .catch((err: any) => reject(this.deserializeError(capturedError, err))) - .then((result: any) => resolve(result)); - } - } catch (err) { - reject(err); - } - }) - ); + const connection = await this.connectionPromise; + if (isNotify) { + connection.sendNotification(method, ParameterStructures.byPosition, ...args); + } else { + try { + return await connection.sendRequest(method, ParameterStructures.byPosition, ...args); + } catch (error) { + throw this.deserializeError(capturedError, error); + } + } }; } @@ -276,6 +286,7 @@ export class JsonRpcProxyFactory implements ProxyHandler { } return e; } + protected deserializeError(capturedError: Error, e: any): any { if (e instanceof ResponseError) { const capturedStack = capturedError.stack || ''; @@ -291,5 +302,4 @@ export class JsonRpcProxyFactory implements ProxyHandler { } return e; } - } diff --git a/packages/core/src/common/messaging/rpc-message-relay.ts b/packages/core/src/common/messaging/rpc-message-relay.ts new file mode 100644 index 0000000000000..cb1cf1ae65fd2 --- /dev/null +++ b/packages/core/src/common/messaging/rpc-message-relay.ts @@ -0,0 +1,57 @@ +/******************************************************************************** + * Copyright (C) 2021 Ericsson and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +import { MessageReader, MessageWriter, Message } from 'vscode-languageserver-protocol'; +import { Disposable, DisposableCollection } from '../../common'; + +/** + * Abstraction that can be used to route JSON-RPC messages around. + * + * This is close to `vscode_jsonrpc.MessageConnection` but without all the JSON-RPC + * specific methods such as `sendRequest`, `sendNotification`, etc. + */ +export interface RpcMessageRelay extends Disposable { + readonly reader: MessageReader; + readonly writer: MessageWriter; + forward(to: RpcMessageRelay, map?: (message: Message) => Message): void; + onClose(callback: () => void): Disposable; +} + +export namespace RpcMessageRelay { + export function create(reader: MessageReader, writer: MessageWriter, onDispose: () => void): RpcMessageRelay { + const disposeOnClose = new DisposableCollection(); + reader.onClose(() => disposeOnClose.dispose()); + writer.onClose(() => disposeOnClose.dispose()); + return { + reader, + writer, + forward(to: RpcMessageRelay, map?: (message: Message) => Message): void { + reader.listen(data => { + if (map) { + data = map(data); + } + to.writer.write(data); + }); + }, + onClose(callback: () => void): Disposable { + return disposeOnClose.push(Disposable.create(callback)); + }, + dispose(): void { + onDispose(); + } + }; + } +} diff --git a/packages/core/src/common/messaging/web-socket-channel.ts b/packages/core/src/common/messaging/web-socket-channel.ts index 37fb9127d0d12..4b69f93cc5b53 100644 --- a/packages/core/src/common/messaging/web-socket-channel.ts +++ b/packages/core/src/common/messaging/web-socket-channel.ts @@ -16,16 +16,21 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { IWebSocket } from 'vscode-ws-jsonrpc/lib/socket/socket'; import { Disposable, DisposableCollection } from '../disposable'; import { Emitter } from '../event'; +import { Channel } from './channel'; -export class WebSocketChannel implements IWebSocket { +export class WebSocketChannel implements Channel { static wsPath = '/services'; + fireError: (reason: any) => void = () => { }; + protected readonly closeEmitter = new Emitter<[number, string]>(); protected readonly toDispose = new DisposableCollection(this.closeEmitter); + protected fireOpen: () => void = () => { }; + protected fireMessage: (data: any) => void = () => { }; + protected closing = false; constructor( readonly id: number, @@ -36,12 +41,6 @@ export class WebSocketChannel implements IWebSocket { this.toDispose.dispose(); } - protected checkNotDisposed(): void { - if (this.toDispose.disposed) { - throw new Error('The channel has been disposed.'); - } - } - handleMessage(message: WebSocketChannel.Message): void { if (message.kind === 'ready') { this.fireOpen(); @@ -107,28 +106,29 @@ export class WebSocketChannel implements IWebSocket { this.fireClose(code, reason); } - protected fireOpen: () => void = () => { }; onOpen(cb: () => void): void { this.checkNotDisposed(); this.fireOpen = cb; this.toDispose.push(Disposable.create(() => this.fireOpen = () => { })); } - protected fireMessage: (data: any) => void = () => { }; onMessage(cb: (data: any) => void): void { this.checkNotDisposed(); this.fireMessage = cb; this.toDispose.push(Disposable.create(() => this.fireMessage = () => { })); } - fireError: (reason: any) => void = () => { }; onError(cb: (reason: any) => void): void { this.checkNotDisposed(); this.fireError = cb; this.toDispose.push(Disposable.create(() => this.fireError = () => { })); } - protected closing = false; + onClose(cb: (code: number, reason: string) => void): Disposable { + this.checkNotDisposed(); + return this.closeEmitter.event(([code, reason]) => cb(code, reason)); + } + protected fireClose(code: number, reason: string): void { if (this.closing) { return; @@ -141,9 +141,11 @@ export class WebSocketChannel implements IWebSocket { } this.dispose(); } - onClose(cb: (code: number, reason: string) => void): Disposable { - this.checkNotDisposed(); - return this.closeEmitter.event(([code, reason]) => cb(code, reason)); + + protected checkNotDisposed(): void { + if (this.toDispose.disposed) { + throw new Error('The channel has been disposed.'); + } } } diff --git a/packages/core/src/common/severity.ts b/packages/core/src/common/severity.ts index c93bd20ad35e2..109ffb63365b5 100644 --- a/packages/core/src/common/severity.ts +++ b/packages/core/src/common/severity.ts @@ -19,7 +19,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { DiagnosticSeverity } from 'vscode-languageserver-types'; +import { DiagnosticSeverity } from 'vscode-languageserver-protocol'; export enum Severity { Ignore = 0, diff --git a/packages/core/src/common/types.ts b/packages/core/src/common/types.ts index 7e4feeb87b636..78634e284080e 100644 --- a/packages/core/src/common/types.ts +++ b/packages/core/src/common/types.ts @@ -26,6 +26,8 @@ export type RecursivePartial = { }; export type MaybeArray = T | T[]; export type MaybePromise = T | PromiseLike; +/** Extract `T` from `PromiseLike`. */ +export type Unpromise = T extends PromiseLike ? U : T; export interface Prioritizeable { readonly priority: number; diff --git a/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts b/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts index 83d96347bde9a..344be8012d724 100644 --- a/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts +++ b/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts @@ -16,8 +16,7 @@ import { IpcMainEvent, ipcMain, WebContents } from '../../../shared/electron'; import { inject, injectable, named, postConstruct } from 'inversify'; -import { MessageConnection } from 'vscode-ws-jsonrpc'; -import { createWebSocketConnection } from 'vscode-ws-jsonrpc/lib/socket/connection'; +import { MessageConnection } from 'vscode-languageserver-protocol'; import { ContributionProvider } from '../../common/contribution-provider'; import { WebSocketChannel } from '../../common/messaging/web-socket-channel'; import { MessagingContribution } from '../../node/messaging/messaging-contribution'; @@ -25,6 +24,7 @@ import { ConsoleLogger } from '../../node/messaging/logger'; import { ElectronConnectionHandler, THEIA_ELECTRON_IPC_CHANNEL_NAME } from '../../electron-common/messaging/electron-connection-handler'; import { ElectronMainApplicationContribution } from '../electron-main-application'; import { ElectronMessagingService } from './electron-messaging-service'; +import { Channel } from '../../common/messaging'; /** * This component replicates the role filled by `MessagingContribution` but for Electron. @@ -59,7 +59,7 @@ export class ElectronMessagingContribution implements ElectronMainApplicationCon } for (const connectionHandler of this.connectionHandlers.getContributions()) { this.channelHandlers.push(connectionHandler.path, (params, channel) => { - const connection = createWebSocketConnection(channel, new ConsoleLogger()); + const connection = Channel.createMessageConnection(channel, new ConsoleLogger()); connectionHandler.onConnection(connection); }); } @@ -67,7 +67,7 @@ export class ElectronMessagingContribution implements ElectronMainApplicationCon listen(spec: string, callback: (params: ElectronMessagingService.PathParams, connection: MessageConnection) => void): void { this.ipcChannel(spec, (params, channel) => { - const connection = createWebSocketConnection(channel, new ConsoleLogger()); + const connection = Channel.createMessageConnection(channel, new ConsoleLogger()); callback(params, connection); }); } diff --git a/packages/core/src/electron-main/messaging/electron-messaging-service.ts b/packages/core/src/electron-main/messaging/electron-messaging-service.ts index 41fe58b843f69..07dca774c806d 100644 --- a/packages/core/src/electron-main/messaging/electron-messaging-service.ts +++ b/packages/core/src/electron-main/messaging/electron-messaging-service.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import type { MessageConnection } from 'vscode-jsonrpc'; +import type { MessageConnection } from 'vscode-languageserver-protocol'; import type { WebSocketChannel } from '../../common/messaging/web-socket-channel'; export interface ElectronMessagingService { diff --git a/packages/core/src/node/messaging/ipc-bootstrap.ts b/packages/core/src/node/messaging/ipc-bootstrap.ts index 9c3906f9befda..431456cf74cbb 100644 --- a/packages/core/src/node/messaging/ipc-bootstrap.ts +++ b/packages/core/src/node/messaging/ipc-bootstrap.ts @@ -16,9 +16,10 @@ import 'reflect-metadata'; import { dynamicRequire } from '../dynamic-require'; -import { ConsoleLogger } from 'vscode-ws-jsonrpc/lib/logger'; -import { createMessageConnection, IPCMessageReader, IPCMessageWriter, Trace } from 'vscode-ws-jsonrpc'; +import { createMessageConnection, Trace } from 'vscode-languageserver-protocol'; +import { IPCMessageReader, IPCMessageWriter } from 'vscode-languageserver-protocol/node'; import { checkParentAlive, IPCEntryPoint } from './ipc-protocol'; +import { ConsoleLogger } from './logger'; checkParentAlive(); diff --git a/packages/core/src/node/messaging/ipc-connection-provider.ts b/packages/core/src/node/messaging/ipc-connection-provider.ts index 35e1ead239e44..637178d4b9cd4 100644 --- a/packages/core/src/node/messaging/ipc-connection-provider.ts +++ b/packages/core/src/node/messaging/ipc-connection-provider.ts @@ -17,7 +17,8 @@ import * as cp from 'child_process'; import * as path from 'path'; import { injectable, inject } from 'inversify'; -import { Trace, IPCMessageReader, IPCMessageWriter, createMessageConnection, MessageConnection, Message } from 'vscode-ws-jsonrpc'; +import { IPCMessageReader, IPCMessageWriter } from 'vscode-languageserver-protocol/node'; +import { Trace, createMessageConnection, MessageConnection, Message, Tracer } from 'vscode-languageserver-protocol'; import { ILogger, ConnectionErrorHandler, DisposableCollection, Disposable } from '../../common'; import { createIpcEnv } from './ipc-protocol'; @@ -83,10 +84,19 @@ export class IPCConnectionProvider { info: (message: string) => this.logger.info(`[${options.serverName}: ${childProcess.pid}] ${message}`), log: (message: string) => this.logger.info(`[${options.serverName}: ${childProcess.pid}] ${message}`) }); - const traceVerbosity = this.logger.isDebug() ? Trace.Verbose : Trace.Off; - connection.trace(traceVerbosity, { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - log: (message: any, data?: string) => this.logger.debug(`[${options.serverName}: ${childProcess.pid}] ${message}` + (typeof data === 'string' ? ' ' + data : '')) + const prefix = `[${options.serverName}: ${childProcess.pid}]`; + const tracer: Tracer = { + log: (message: unknown, data?: string) => { + this.logger.debug(typeof data === 'string' + ? `${prefix} ${message} ${data}` + : `${prefix} ${message}`); + } + }; + connection.trace(Trace.Verbose, tracer); + this.logger.isDebug().then(isDebug => { + if (!isDebug) { + connection.trace(Trace.Off, tracer); + } }); return connection; } diff --git a/packages/core/src/node/messaging/ipc-protocol.ts b/packages/core/src/node/messaging/ipc-protocol.ts index f0017cd89f8d4..2c6368091a145 100644 --- a/packages/core/src/node/messaging/ipc-protocol.ts +++ b/packages/core/src/node/messaging/ipc-protocol.ts @@ -15,7 +15,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { MessageConnection } from 'vscode-ws-jsonrpc'; +import { MessageConnection } from 'vscode-languageserver-protocol'; const THEIA_PARENT_PID = 'THEIA_PARENT_PID'; const THEIA_ENTRY_POINT = 'THEIA_ENTRY_POINT'; diff --git a/packages/core/src/node/messaging/logger.ts b/packages/core/src/node/messaging/logger.ts index 998a2fe0ae253..c5cea0dbf4973 100644 --- a/packages/core/src/node/messaging/logger.ts +++ b/packages/core/src/node/messaging/logger.ts @@ -14,24 +14,4 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Logger } from 'vscode-ws-jsonrpc'; - -export class ConsoleLogger implements Logger { - - error(message: string): void { - console.log(message); - } - - warn(message: string): void { - console.log(message); - } - - info(message: string): void { - console.log(message); - } - - log(message: string): void { - console.log(message); - } - -} +export { ConsoleLogger } from '../../common/logger-protocol'; diff --git a/packages/core/src/node/messaging/messaging-contribution.ts b/packages/core/src/node/messaging/messaging-contribution.ts index 4182244c8f46f..87551916d93bf 100644 --- a/packages/core/src/node/messaging/messaging-contribution.ts +++ b/packages/core/src/node/messaging/messaging-contribution.ts @@ -20,10 +20,9 @@ import * as net from 'net'; import * as http from 'http'; import * as https from 'https'; import { injectable, inject, named, postConstruct, interfaces, Container } from 'inversify'; -import { MessageConnection } from 'vscode-ws-jsonrpc'; -import { createWebSocketConnection } from 'vscode-ws-jsonrpc/lib/socket/connection'; -import { IConnection } from 'vscode-ws-jsonrpc/lib/server/connection'; -import * as launch from 'vscode-ws-jsonrpc/lib/server/launch'; +import { MessageConnection } from 'vscode-languageserver-protocol'; +import { RpcMessageRelay } from '../../common/messaging'; +import { Channel } from '../../common/messaging/channel'; import { ContributionProvider, ConnectionHandler, bindContributionProvider } from '../../common'; import { WebSocketChannel } from '../../common/messaging/web-socket-channel'; import { BackendApplicationContribution } from '../backend-application'; @@ -75,15 +74,16 @@ export class MessagingContribution implements BackendApplicationContribution, Me listen(spec: string, callback: (params: MessagingService.PathParams, connection: MessageConnection) => void): void { this.wsChannel(spec, (params, channel) => { - const connection = createWebSocketConnection(channel, new ConsoleLogger()); + const connection = Channel.createMessageConnection(channel, new ConsoleLogger()); callback(params, connection); }); } - forward(spec: string, callback: (params: MessagingService.PathParams, connection: IConnection) => void): void { + forward(spec: string, callback: (params: MessagingService.PathParams, connection: RpcMessageRelay) => void): void { this.wsChannel(spec, (params, channel) => { - const connection = launch.createWebSocketConnection(channel); - callback(params, WebSocketChannelConnection.create(connection, channel)); + const rpcMessageRelay = Channel.createRpcMessageRelay(channel, () => channel.close()); + const webSocketChannelConnection = WebSocketChannelConnection.create(rpcMessageRelay, channel); + callback(params, webSocketChannelConnection); }); } @@ -252,7 +252,7 @@ export class MessagingContribution implements BackendApplicationContribution, Me const connectionHandlers = connectionContainer.getNamed>(ContributionProvider, ConnectionHandler); for (const connectionHandler of connectionHandlers.getContributions(true)) { connectionChannelHandlers.push(connectionHandler.path, (_, channel) => { - const connection = createWebSocketConnection(channel, new ConsoleLogger()); + const connection = Channel.createMessageConnection(channel, new ConsoleLogger()); connectionHandler.onConnection(connection); }); } diff --git a/packages/core/src/node/messaging/messaging-service.ts b/packages/core/src/node/messaging/messaging-service.ts index 693166483cfb1..a2759b7547889 100644 --- a/packages/core/src/node/messaging/messaging-service.ts +++ b/packages/core/src/node/messaging/messaging-service.ts @@ -15,8 +15,8 @@ ********************************************************************************/ import * as ws from 'ws'; -import { MessageConnection } from 'vscode-ws-jsonrpc'; -import { IConnection } from 'vscode-ws-jsonrpc/lib/server/connection'; +import { MessageConnection } from 'vscode-languageserver-protocol'; +import { RpcMessageRelay } from '../../common/messaging'; import { WebSocketChannel } from '../../common/messaging/web-socket-channel'; export interface MessagingService { @@ -29,7 +29,7 @@ export interface MessagingService { * Accept a raw JSON-RPC connection on the given path. * A path supports the route syntax: https://github.com/rcs/route-parser#what-can-i-use-in-my-routes. */ - forward(path: string, callback: (params: MessagingService.PathParams, connection: IConnection) => void): void; + forward(path: string, callback: (params: MessagingService.PathParams, connection: RpcMessageRelay) => void): void; /** * Accept a web socket channel on the given path. * A path supports the route syntax: https://github.com/rcs/route-parser#what-can-i-use-in-my-routes. @@ -57,15 +57,17 @@ export namespace MessagingService { } } -export interface WebSocketChannelConnection extends IConnection { +export interface WebSocketChannelConnection extends RpcMessageRelay { channel: WebSocketChannel; } export namespace WebSocketChannelConnection { - export function is(connection: IConnection): connection is WebSocketChannelConnection { + export function is(connection: RpcMessageRelay): connection is WebSocketChannelConnection { return (connection as WebSocketChannelConnection).channel instanceof WebSocketChannel; } - - export function create(connection: IConnection, channel: WebSocketChannel): WebSocketChannelConnection { + /** + * Mutate `connection` to become a `WebSocketChannelConnection`. + */ + export function create(connection: RpcMessageRelay, channel: WebSocketChannel): WebSocketChannelConnection { const result = connection as WebSocketChannelConnection; result.channel = channel; return result; diff --git a/packages/debug/src/browser/debug-session-connection.ts b/packages/debug/src/browser/debug-session-connection.ts index fd8a109436208..d25d47e2d8789 100644 --- a/packages/debug/src/browser/debug-session-connection.ts +++ b/packages/debug/src/browser/debug-session-connection.ts @@ -17,10 +17,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { DebugProtocol } from 'vscode-debugprotocol'; +import { Channel } from '@theia/core/lib/common/messaging'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { Event, Emitter, DisposableCollection, Disposable, MaybePromise } from '@theia/core'; import { OutputChannel } from '@theia/output/lib/browser/output-channel'; -import { IWebSocket } from '@theia/core/shared/vscode-ws-jsonrpc'; export interface DebugExitEvent { code?: number @@ -116,7 +116,7 @@ export class DebugSessionConnection implements Disposable { private sequence = 1; protected readonly pendingRequests = new Map void>(); - protected readonly connection: Promise; + protected readonly connection: Promise>; protected readonly requestHandlers = new Map(); @@ -131,7 +131,7 @@ export class DebugSessionConnection implements Disposable { constructor( readonly sessionId: string, - protected readonly connectionFactory: (sessionId: string) => Promise, + protected readonly connectionFactory: (sessionId: string) => Promise>, protected readonly traceOutputChannel: OutputChannel | undefined ) { this.connection = this.createConnection(); @@ -150,7 +150,7 @@ export class DebugSessionConnection implements Disposable { this.toDispose.dispose(); } - protected async createConnection(): Promise { + protected async createConnection(): Promise> { if (this.disposed) { throw new Error('Connection has been already disposed.'); } else { diff --git a/packages/debug/src/browser/debug-session-contribution.ts b/packages/debug/src/browser/debug-session-contribution.ts index 87685405dcbbb..1e6a8d324dbe0 100644 --- a/packages/debug/src/browser/debug-session-contribution.ts +++ b/packages/debug/src/browser/debug-session-contribution.ts @@ -16,6 +16,7 @@ import { injectable, inject, named, postConstruct } from '@theia/core/shared/inversify'; import { MessageClient } from '@theia/core/lib/common'; +import { Channel } from '@theia/core/lib/common/messaging'; import { LabelProvider } from '@theia/core/lib/browser'; import { EditorManager } from '@theia/editor/lib/browser'; import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service'; @@ -26,7 +27,6 @@ import { DebugSessionOptions } from './debug-session-options'; import { OutputChannelManager, OutputChannel } from '@theia/output/lib/browser/output-channel'; import { DebugPreferences } from './debug-preferences'; import { DebugSessionConnection } from './debug-session-connection'; -import { IWebSocket } from '@theia/core/shared/vscode-ws-jsonrpc'; import { DebugAdapterPath } from '../common/debug-service'; import { ContributionProvider } from '@theia/core/lib/common/contribution-provider'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; @@ -119,12 +119,11 @@ export class DefaultDebugSessionFactory implements DebugSessionFactory { get(sessionId: string, options: DebugSessionOptions, parentSession?: DebugSession): DebugSession { const connection = new DebugSessionConnection( sessionId, - () => new Promise(resolve => - this.connectionProvider.openChannel(`${DebugAdapterPath}/${sessionId}`, channel => { - resolve(channel); - }, { reconnecting: false }) + () => new Promise>( + resolve => this.connectionProvider.openChannel(`${DebugAdapterPath}/${sessionId}`, resolve, { reconnecting: false }) ), - this.getTraceOutputChannel()); + this.getTraceOutputChannel() + ); return new DebugSession( sessionId, options, @@ -136,7 +135,8 @@ export class DefaultDebugSessionFactory implements DebugSessionFactory { this.labelProvider, this.messages, this.fileService, - this.debugContributionProvider); + this.debugContributionProvider + ); } protected getTraceOutputChannel(): OutputChannel | undefined { diff --git a/packages/debug/src/node/debug-adapter-session.ts b/packages/debug/src/node/debug-adapter-session.ts index 9247061b79e3a..96760eeb5ebe2 100644 --- a/packages/debug/src/node/debug-adapter-session.ts +++ b/packages/debug/src/node/debug-adapter-session.ts @@ -26,7 +26,7 @@ import { DebugAdapterSession } from './debug-model'; import { DebugProtocol } from 'vscode-debugprotocol'; -import { IWebSocket } from '@theia/core/shared/vscode-ws-jsonrpc'; +import { Channel } from '@theia/core/lib/common/messaging'; import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable'; /** @@ -35,7 +35,7 @@ import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposa export class DebugAdapterSessionImpl implements DebugAdapterSession { private readonly toDispose = new DisposableCollection(); - private channel: IWebSocket | undefined; + private channel?: Channel; constructor( readonly id: string, @@ -53,12 +53,12 @@ export class DebugAdapterSessionImpl implements DebugAdapterSession { } - async start(channel: IWebSocket): Promise { + async start(channel: Channel): Promise { if (this.channel) { throw new Error('The session has already been started, id: ' + this.id); } this.channel = channel; - this.channel.onMessage((message: string) => this.write(message)); + this.channel.onMessage(message => this.write(message)); this.channel.onClose(() => this.channel = undefined); } diff --git a/packages/editor/src/browser/editor.ts b/packages/editor/src/browser/editor.ts index 3cd5e7b47213b..780fa05ebd376 100644 --- a/packages/editor/src/browser/editor.ts +++ b/packages/editor/src/browser/editor.ts @@ -14,16 +14,13 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Position, Range, Location } from '@theia/core/shared/vscode-languageserver-types'; -import * as lsp from '@theia/core/shared/vscode-languageserver-types'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import URI from '@theia/core/lib/common/uri'; import { Event, Disposable, TextDocumentContentChangeDelta, Reference } from '@theia/core/lib/common'; import { Saveable, Navigatable, Widget } from '@theia/core/lib/browser'; import { EditorDecoration } from './decorations'; -export { - Position, Range, Location -}; +export { Position, Range, Location } from '@theia/core/shared/vscode-languageserver-protocol'; export const TextEditorProvider = Symbol('TextEditorProvider'); export type TextEditorProvider = (uri: URI) => Promise; @@ -120,7 +117,7 @@ export interface MouseTarget { /** * The 'approximate' editor position */ - readonly position?: Position; + readonly position?: lsp.Position; /** * Desired mouse column (e.g. when position.column gets clamped to text length -- clicking after text on a line). */ @@ -128,7 +125,7 @@ export interface MouseTarget { /** * The 'approximate' editor range */ - readonly range?: Range; + readonly range?: lsp.Range; /** * Some extra detail. */ @@ -191,7 +188,7 @@ export interface FindMatch { /** * The range for the given match. */ - readonly range: Range; + readonly range: lsp.Range; } export interface TextEditor extends Disposable, TextEditorSelection, Navigatable { @@ -201,11 +198,11 @@ export interface TextEditor extends Disposable, TextEditorSelection, Navigatable readonly document: TextEditorDocument; readonly onDocumentContentChanged: Event; - cursor: Position; - readonly onCursorPositionChanged: Event; + cursor: lsp.Position; + readonly onCursorPositionChanged: Event; - selection: Range; - readonly onSelectionChanged: Event; + selection: lsp.Range; + readonly onSelectionChanged: Event; /** * The text editor should be revealed, @@ -219,10 +216,10 @@ export interface TextEditor extends Disposable, TextEditorSelection, Navigatable readonly onMouseDown: Event; readonly onScrollChanged: Event; - getVisibleRanges(): Range[]; + getVisibleRanges(): lsp.Range[]; - revealPosition(position: Position, options?: RevealPositionOptions): void; - revealRange(range: Range, options?: RevealRangeOptions): void; + revealPosition(position: lsp.Position, options?: RevealPositionOptions): void; + revealRange(range: lsp.Range, options?: RevealRangeOptions): void; /** * Rerender the editor. @@ -249,7 +246,7 @@ export interface TextEditor extends Disposable, TextEditorSelection, Navigatable */ getLinesDecorations(startLineNumber: number, endLineNumber: number): EditorDecoration[]; - getVisibleColumn(position: Position): number; + getVisibleColumn(position: lsp.Position): number; /** * Replaces the text of source given in ReplaceTextParams. @@ -290,8 +287,8 @@ export interface Dimension { export interface TextEditorSelection { uri: URI - cursor?: Position - selection?: Range + cursor?: lsp.Position + selection?: lsp.Range } export interface RevealPositionOptions { @@ -323,7 +320,7 @@ export interface ReplaceOperation { /** * the position that shall be replaced */ - range: Range; + range: lsp.Range; /** * the text to replace with */ diff --git a/packages/filesystem/src/common/remote-file-system-provider.ts b/packages/filesystem/src/common/remote-file-system-provider.ts index f1d9391e9031f..391fb87f20d7d 100644 --- a/packages/filesystem/src/common/remote-file-system-provider.ts +++ b/packages/filesystem/src/common/remote-file-system-provider.ts @@ -229,8 +229,7 @@ export class RemoteFileSystemProvider implements Required, D readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents { const capturedError = new Error(); - // eslint-disable-next-line @typescript-eslint/no-shadow - const stream = newWriteableStream(data => BinaryBuffer.concat(data.map(data => BinaryBuffer.wrap(data))).buffer); + const stream = newWriteableStream(data => BinaryBuffer.concat(data.map(datum => BinaryBuffer.wrap(datum))).buffer); this.server.readFileStream(resource.toString(), opts, token).then(streamHandle => { if (token.isCancellationRequested) { stream.end(cancelled()); diff --git a/packages/markers/src/browser/marker-tree.ts b/packages/markers/src/browser/marker-tree.ts index bc5137a177a59..a3bb58e7754d2 100644 --- a/packages/markers/src/browser/marker-tree.ts +++ b/packages/markers/src/browser/marker-tree.ts @@ -21,7 +21,7 @@ import { Marker } from '../common/marker'; import { UriSelection } from '@theia/core/lib/common/selection'; import URI from '@theia/core/lib/common/uri'; import { ProblemSelection } from './problem/problem-selection'; -import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; export const MarkerOptions = Symbol('MarkerOptions'); export interface MarkerOptions { diff --git a/packages/markers/src/browser/problem/problem-composite-tree-node.spec.ts b/packages/markers/src/browser/problem/problem-composite-tree-node.spec.ts index a33063b379959..c532e4574f5bd 100644 --- a/packages/markers/src/browser/problem/problem-composite-tree-node.spec.ts +++ b/packages/markers/src/browser/problem/problem-composite-tree-node.spec.ts @@ -20,7 +20,7 @@ let disableJSDOM = enableJSDOM(); import URI from '@theia/core/lib/common/uri'; import { expect } from 'chai'; import { Container } from '@theia/core/shared/inversify'; -import { Diagnostic, Range, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, Range, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import { Event } from '@theia/core/lib/common/event'; import { MarkerManager } from '../marker-manager'; import { MarkerInfoNode, MarkerNode, MarkerOptions, MarkerRootNode } from '../marker-tree'; @@ -249,4 +249,3 @@ function getRootNode(id: string): MarkerRootNode { parent: undefined }; } - diff --git a/packages/markers/src/browser/problem/problem-composite-tree-node.ts b/packages/markers/src/browser/problem/problem-composite-tree-node.ts index 90d5a90e37935..e761c6224bebe 100644 --- a/packages/markers/src/browser/problem/problem-composite-tree-node.ts +++ b/packages/markers/src/browser/problem/problem-composite-tree-node.ts @@ -18,7 +18,7 @@ import { CompositeTreeNode } from '@theia/core/lib/browser/tree/tree'; import { MarkerInfoNode } from '../marker-tree'; import URI from '@theia/core/lib/common/uri'; import { Marker } from '../../common/marker'; -import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import { ProblemUtils } from './problem-utils'; export namespace ProblemCompositeTreeNode { diff --git a/packages/markers/src/browser/problem/problem-decorator.ts b/packages/markers/src/browser/problem/problem-decorator.ts index 5501c10f3cc8b..462dd6c6df79f 100644 --- a/packages/markers/src/browser/problem/problem-decorator.ts +++ b/packages/markers/src/browser/problem/problem-decorator.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; -import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import URI from '@theia/core/lib/common/uri'; import { notEmpty } from '@theia/core/lib/common/objects'; import { Event, Emitter } from '@theia/core/lib/common/event'; diff --git a/packages/markers/src/browser/problem/problem-manager.spec.ts b/packages/markers/src/browser/problem/problem-manager.spec.ts index 7edd55f8b6754..77eb95da437dd 100644 --- a/packages/markers/src/browser/problem/problem-manager.spec.ts +++ b/packages/markers/src/browser/problem/problem-manager.spec.ts @@ -25,7 +25,7 @@ import { Container } from '@theia/core/shared/inversify'; import { ProblemManager } from './problem-manager'; import { Event } from '@theia/core/lib/common/event'; import { ILogger } from '@theia/core/lib/common/logger'; -import { DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-types'; +import { DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { MockLogger } from '@theia/core/lib/common/test/mock-logger'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { LocalStorageService, StorageService } from '@theia/core/lib/browser/storage-service'; diff --git a/packages/markers/src/browser/problem/problem-manager.ts b/packages/markers/src/browser/problem/problem-manager.ts index 89a1a98e145c5..4968f7e41e870 100644 --- a/packages/markers/src/browser/problem/problem-manager.ts +++ b/packages/markers/src/browser/problem/problem-manager.ts @@ -17,7 +17,7 @@ import { injectable } from '@theia/core/shared/inversify'; import { MarkerManager } from '../marker-manager'; import { PROBLEM_KIND } from '../../common/problem-marker'; -import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; export interface ProblemStat { errors: number; diff --git a/packages/markers/src/browser/problem/problem-tabbar-decorator.ts b/packages/markers/src/browser/problem/problem-tabbar-decorator.ts index cc59201e24046..56e8a34ad24f0 100644 --- a/packages/markers/src/browser/problem/problem-tabbar-decorator.ts +++ b/packages/markers/src/browser/problem/problem-tabbar-decorator.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; -import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { Title, Widget } from '@theia/core/shared/@phosphor/widgets'; import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration'; diff --git a/packages/markers/src/browser/problem/problem-tree-model.spec.ts b/packages/markers/src/browser/problem/problem-tree-model.spec.ts index 94501b050cdcd..cb1571fddd64c 100644 --- a/packages/markers/src/browser/problem/problem-tree-model.spec.ts +++ b/packages/markers/src/browser/problem/problem-tree-model.spec.ts @@ -20,7 +20,7 @@ let disableJSDOM = enableJSDOM(); import URI from '@theia/core/lib/common/uri'; import { expect } from 'chai'; import { Container } from '@theia/core/shared/inversify'; -import { Diagnostic, Range, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, Range, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import { Event } from '@theia/core/lib/common/event'; import { Marker } from '../../common/marker'; import { MarkerManager } from '../marker-manager'; diff --git a/packages/markers/src/browser/problem/problem-tree-model.ts b/packages/markers/src/browser/problem/problem-tree-model.ts index 4bf70d0278889..1eba0e7baa4d6 100644 --- a/packages/markers/src/browser/problem/problem-tree-model.ts +++ b/packages/markers/src/browser/problem/problem-tree-model.ts @@ -22,7 +22,7 @@ import { MarkerTreeModel } from '../marker-tree-model'; import { injectable, inject } from '@theia/core/shared/inversify'; import { OpenerOptions, TreeNode } from '@theia/core/lib/browser'; import { Marker } from '../../common/marker'; -import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; import { ProblemUtils } from './problem-utils'; @injectable() diff --git a/packages/markers/src/browser/problem/problem-utils.ts b/packages/markers/src/browser/problem/problem-utils.ts index 9c4e045c7b78b..0575a65756a47 100644 --- a/packages/markers/src/browser/problem/problem-utils.ts +++ b/packages/markers/src/browser/problem/problem-utils.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { Marker } from '../../common/marker'; -import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; export namespace ProblemUtils { diff --git a/packages/markers/src/browser/problem/problem-widget.tsx b/packages/markers/src/browser/problem/problem-widget.tsx index ff49aa6d7cd75..c0119e607c37f 100644 --- a/packages/markers/src/browser/problem/problem-widget.tsx +++ b/packages/markers/src/browser/problem/problem-widget.tsx @@ -23,7 +23,7 @@ import { TreeWidget, TreeProps, ContextMenuRenderer, TreeNode, NodeProps, TreeModel, ApplicationShell, Navigatable, ExpandableTreeNode, SelectableTreeNode, TREE_NODE_INFO_CLASS, codicon } from '@theia/core/lib/browser'; -import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import * as React from '@theia/core/shared/react'; import { ProblemPreferences } from './problem-preferences'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; diff --git a/packages/markers/src/common/problem-marker.ts b/packages/markers/src/common/problem-marker.ts index a3de30205c57a..fe710b397ccea 100644 --- a/packages/markers/src/common/problem-marker.ts +++ b/packages/markers/src/common/problem-marker.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { Marker } from './marker'; -import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; export const PROBLEM_KIND = 'problem'; diff --git a/packages/monaco/src/browser/monaco-command.ts b/packages/monaco/src/browser/monaco-command.ts index bfb63e75da258..bd68f3490247f 100644 --- a/packages/monaco/src/browser/monaco-command.ts +++ b/packages/monaco/src/browser/monaco-command.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { injectable, inject, optional } from '@theia/core/shared/inversify'; -import { Position, Location } from '@theia/core/shared/vscode-languageserver-types'; +import { Position, Location } from '@theia/core/shared/vscode-languageserver-protocol'; import { CommandContribution, CommandRegistry, CommandHandler } from '@theia/core/lib/common/command'; import { CommonCommands, QuickInputService, ApplicationShell } from '@theia/core/lib/browser'; import { EditorCommands, EditorManager, EditorWidget } from '@theia/editor/lib/browser'; @@ -230,10 +230,10 @@ export class MonacoEditorCommandHandlers implements CommandContribution { protected configureEol(editor: MonacoEditor): void { const items = ['LF', 'CRLF'].map(lineEnding => - ({ - label: lineEnding, - execute: () => this.setEol(editor, lineEnding) - }) + ({ + label: lineEnding, + execute: () => this.setEol(editor, lineEnding) + }) ); this.quickInputService?.showQuickPick(items, { placeholder: nls.localizeByDefault('Select End of Line Sequence') }); } @@ -259,16 +259,14 @@ export class MonacoEditorCommandHandlers implements CommandContribution { if (model) { const { tabSize } = model.getOptions(); const sizes = Array.from(Array(8), (_, x) => x + 1); - const tabSizeOptions = sizes.map(size => - ({ + const tabSizeOptions = sizes.map(size => ({ label: size === tabSize ? size + ' ' + nls.localizeByDefault('Configured Tab Size') : size.toString(), // eslint-disable-next-line @typescript-eslint/no-explicit-any execute: () => model.updateOptions({ tabSize: size || tabSize, insertSpaces: useSpaces }) - }) - ); + })); this.quickInputService?.showQuickPick(tabSizeOptions, { placeholder: nls.localizeByDefault('Select Tab Size for Current File') }); } } diff --git a/packages/monaco/src/browser/monaco-diagnostic-collection.ts b/packages/monaco/src/browser/monaco-diagnostic-collection.ts index 357fb66e2e57c..f8b946f195eab 100644 --- a/packages/monaco/src/browser/monaco-diagnostic-collection.ts +++ b/packages/monaco/src/browser/monaco-diagnostic-collection.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable'; import { ProtocolToMonacoConverter } from './protocol-to-monaco-converter'; import IModel = monaco.editor.IModel; diff --git a/packages/monaco/src/browser/monaco-editor-model.ts b/packages/monaco/src/browser/monaco-editor-model.ts index c3a2e58ebbcfe..0d8e72a6e4cdc 100644 --- a/packages/monaco/src/browser/monaco-editor-model.ts +++ b/packages/monaco/src/browser/monaco-editor-model.ts @@ -14,8 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Position, Range } from '@theia/core/shared/vscode-languageserver-types'; -import { TextDocumentSaveReason, TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol'; +import { Position, Range, TextDocumentSaveReason, TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol'; import { TextEditorDocument, EncodingMode, FindMatchesOptions, FindMatch, EditorPreferences, DEFAULT_WORD_SEPARATORS } from '@theia/editor/lib/browser'; import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; diff --git a/packages/monaco/src/browser/monaco-editor.ts b/packages/monaco/src/browser/monaco-editor.ts index 0499900857db8..3b270bb1af966 100644 --- a/packages/monaco/src/browser/monaco-editor.ts +++ b/packages/monaco/src/browser/monaco-editor.ts @@ -39,7 +39,7 @@ import { import { MonacoEditorModel } from './monaco-editor-model'; import { MonacoToProtocolConverter } from './monaco-to-protocol-converter'; import { ProtocolToMonacoConverter } from './protocol-to-monaco-converter'; -import { TextEdit } from '@theia/core/shared/vscode-languageserver-types'; +import { TextEdit } from '@theia/core/shared/vscode-languageserver-protocol'; import { UTF8 } from '@theia/core/lib/common/encodings'; import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions; diff --git a/packages/monaco/src/browser/monaco-languages.ts b/packages/monaco/src/browser/monaco-languages.ts index 4e7e55d8d9838..afd90e9d6fa46 100644 --- a/packages/monaco/src/browser/monaco-languages.ts +++ b/packages/monaco/src/browser/monaco-languages.ts @@ -14,14 +14,13 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Diagnostic, SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, SymbolInformation, WorkspaceSymbolParams } from '@theia/core/shared/vscode-languageserver-protocol'; import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; import { ProblemManager } from '@theia/markers/lib/browser/problem/problem-manager'; import URI from '@theia/core/lib/common/uri'; import { MaybePromise, Mutable } from '@theia/core/lib/common/types'; import { Disposable } from '@theia/core/lib/common/disposable'; import { CancellationToken } from '@theia/core/lib/common/cancellation'; -import { WorkspaceSymbolParams } from '@theia/core/shared/vscode-languageserver-protocol'; import { Language, LanguageService } from '@theia/core/lib/browser/language-service'; import { MonacoDiagnosticCollection } from './monaco-diagnostic-collection'; import { ProtocolToMonacoConverter } from './protocol-to-monaco-converter'; diff --git a/packages/monaco/src/browser/monaco-to-protocol-converter.ts b/packages/monaco/src/browser/monaco-to-protocol-converter.ts index 90be67b218581..06f1a3918a9c0 100644 --- a/packages/monaco/src/browser/monaco-to-protocol-converter.ts +++ b/packages/monaco/src/browser/monaco-to-protocol-converter.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { injectable } from '@theia/core/shared/inversify'; -import { Position, Range } from '@theia/core/shared/vscode-languageserver-types'; +import { Position, Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { RecursivePartial } from '@theia/core/lib/common/types'; export interface MonacoRangeReplace { diff --git a/packages/monaco/src/browser/protocol-to-monaco-converter.ts b/packages/monaco/src/browser/protocol-to-monaco-converter.ts index 447c694cae1eb..ab230526e94ad 100644 --- a/packages/monaco/src/browser/protocol-to-monaco-converter.ts +++ b/packages/monaco/src/browser/protocol-to-monaco-converter.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { injectable } from '@theia/core/shared/inversify'; -import { Position, Range, Location, TextEdit, Diagnostic, DiagnosticRelatedInformation } from '@theia/core/shared/vscode-languageserver-types'; +import { Position, Range, Location, TextEdit, Diagnostic, DiagnosticRelatedInformation } from '@theia/core/shared/vscode-languageserver-protocol'; import { RecursivePartial } from '@theia/core/lib/common/types'; @injectable() diff --git a/packages/monaco/src/browser/workspace-symbol-command.ts b/packages/monaco/src/browser/workspace-symbol-command.ts index 579139883bb1e..4e374020929ba 100644 --- a/packages/monaco/src/browser/workspace-symbol-command.ts +++ b/packages/monaco/src/browser/workspace-symbol-command.ts @@ -22,8 +22,7 @@ import { CommandRegistry, CommandHandler, Command, SelectionService, CancellationToken, CommandContribution, MenuContribution, MenuModelRegistry, nls } from '@theia/core/lib/common'; -import { Range, Position, SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; -import { WorkspaceSymbolParams } from '@theia/core/shared/vscode-languageserver-protocol'; +import { Range, Position, SymbolInformation, WorkspaceSymbolParams } from '@theia/core/shared/vscode-languageserver-protocol'; import { MonacoLanguages, WorkspaceSymbolProvider } from './monaco-languages'; import URI from '@theia/core/lib/common/uri'; import { EditorMainMenu } from '@theia/editor/lib/browser'; diff --git a/packages/outline-view/src/browser/outline-view-widget.tsx b/packages/outline-view/src/browser/outline-view-widget.tsx index 07eaaa35b6ddb..b0d7fe09733d7 100644 --- a/packages/outline-view/src/browser/outline-view-widget.tsx +++ b/packages/outline-view/src/browser/outline-view-widget.tsx @@ -31,7 +31,7 @@ import { OutlineViewTreeModel } from './outline-view-tree-model'; import { Message } from '@theia/core/shared/@phosphor/messaging'; import { Emitter, Mutable, UriSelection } from '@theia/core'; import * as React from '@theia/core/shared/react'; -import { Range } from '@theia/core/shared/vscode-languageserver-types'; +import { Range } from '@theia/core/shared/vscode-languageserver-protocol'; import URI from '@theia/core/lib/common/uri'; import { nls } from '@theia/core/lib/common/nls'; diff --git a/packages/plugin-ext/src/common/connection.ts b/packages/plugin-ext/src/common/connection.ts index e1b8731d7d2be..be7b815dafbaa 100644 --- a/packages/plugin-ext/src/common/connection.ts +++ b/packages/plugin-ext/src/common/connection.ts @@ -13,10 +13,13 @@ * * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ + +import type { Channel } from '@theia/core/lib/common/messaging'; +import type { Message, MessageReader, MessageWriter } from '@theia/core/shared/vscode-languageserver-protocol'; import { Disposable } from './disposable-util'; import { PluginMessageReader } from './plugin-message-reader'; import { PluginMessageWriter } from './plugin-message-writer'; -import { IWebSocket, MessageReader, MessageWriter, Message } from '@theia/core/shared/vscode-ws-jsonrpc'; +import { PluginMessage } from './plugin-message'; /** * The interface for describing the connection between plugins and main side. @@ -52,23 +55,28 @@ export class PluginConnection implements Connection { } /** - * [IWebSocket](#IWebSocket) implementation over RPC. + * Wrapper around a [PluginConnection](#PluginConnection) to match the [Channel](#Channel) interface. */ -export class PluginWebSocketChannel implements IWebSocket { - constructor(protected readonly connection: PluginConnection) { } +export class PluginChannel implements Channel { + + constructor( + protected readonly connection: PluginConnection + ) { } send(content: string): void { - this.connection.writer.write(content); + // vscode-jsonrpc's MessageReader/Writer expect to send JSON-RPC messages. + // Use a bogus jsonrpc version and pass along the `content` to send. + // `content` here is opaque: it could be any string. + const message: PluginMessage = { jsonrpc: '0.0', content }; + this.connection.writer.write(message); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onMessage(cb: (data: any) => void): void { - this.connection.reader.listen(cb); + onMessage(cb: (data: string) => void): void { + this.connection.reader.listen((message: PluginMessage) => cb(message.content)); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onError(cb: (reason: any) => void): void { - this.connection.reader.onError(e => cb(e)); + onError(cb: (reason: unknown) => void): void { + this.connection.reader.onError(cb); } onClose(cb: (code: number, reason: string) => void): void { @@ -79,3 +87,10 @@ export class PluginWebSocketChannel implements IWebSocket { this.connection.dispose(); } } + +/** + * Use `PluginChannel` instead. + * + * @deprecated since 1.19.0 + */ +export const PluginWebSocketChannel = PluginChannel; diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index 97c4439ba1249..4952e55edd151 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -79,7 +79,7 @@ import { KeysToAnyValues, KeysToKeysToAnyValue } from './types'; import { CancellationToken, Progress, ProgressOptions } from '@theia/plugin'; import { DebuggerDescription } from '@theia/debug/lib/common/debug-service'; import { DebugProtocol } from 'vscode-debugprotocol'; -import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; +import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-protocol'; import { ArgumentProcessor } from '../plugin/command-registry'; import * as files from '@theia/filesystem/lib/common/files'; import { BinaryBuffer } from '@theia/core/lib/common/buffer'; diff --git a/packages/plugin-ext/src/common/plugin-message-reader.ts b/packages/plugin-ext/src/common/plugin-message-reader.ts index 6f6be7fe880f2..defa61899578f 100644 --- a/packages/plugin-ext/src/common/plugin-message-reader.ts +++ b/packages/plugin-ext/src/common/plugin-message-reader.ts @@ -14,87 +14,62 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { DataCallback, Emitter, Event, PartialMessageInfo } from '@theia/core/shared/vscode-ws-jsonrpc'; - -export abstract class AbstractMessageReader { - protected errorEmitter = new Emitter(); - protected closeEmitter = new Emitter(); - protected partialMessageEmitter = new Emitter(); - dispose(): void { - this.errorEmitter.dispose(); - this.closeEmitter.dispose(); - } - get onError(): Event { - return this.errorEmitter.event; - } - fireError(error: Error): void { - this.errorEmitter.fire(this.asError(error)); - } - get onClose(): Event { - return this.closeEmitter.event; - } - fireClose(): void { - this.closeEmitter.fire(undefined); - } - get onPartialMessage(): Event { - return this.partialMessageEmitter.event; - } - firePartialMessage(info: PartialMessageInfo): void { - this.partialMessageEmitter.fire(info); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - asError(error: any): Error { - if (error instanceof Error) { - return error; - } else { - return new Error(`Reader received error. Reason: ${typeof error.message === 'string' ? error.message : 'unknown'}`); - } - } -} +import { AbstractMessageReader, Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; +import { PluginMessage } from './plugin-message'; /** - * Support for reading string message through RPC protocol. + * Support for reading string messages through RPC protocol. + * + * Buffers events until a listener is registered. */ export class PluginMessageReader extends AbstractMessageReader { + protected state: 'initial' | 'listening' | 'closed' = 'initial'; - protected callback: DataCallback | undefined; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - protected readonly events: { message?: any, error?: any }[] = []; - constructor() { - super(); - } + protected callback?: (message: PluginMessage) => void; + + /** + * Buffered events until `.listen` is called. Becomes `undefined` after. + */ + protected bufferedEvents?: { message?: string, error?: unknown }[] = []; - listen(callback: DataCallback): void { + listen(callback: (message: PluginMessage) => void): Disposable { if (this.state === 'initial') { this.state = 'listening'; this.callback = callback; - while (this.events.length !== 0) { - const event = this.events.pop()!; - if (event.message) { - this.readMessage(event.message); - } else if (event.error) { - this.fireError(event.error); + for (const { message, error } of this.bufferedEvents!) { + if (!this.callback) { + break; // We got disposed. + } else if (message) { + this.emitMessage(message); + } else if (error) { + this.fireError(error); } else { this.fireClose(); } } + this.bufferedEvents = undefined; + return { dispose: () => this.callback = undefined }; } + return { dispose: () => { } }; } + /** + * Notify the listener (`this.callback`) that a new message was received. + * + * If a listener isn't registered yet we will queue the messages (FIFO). + */ readMessage(message: string): void { if (this.state === 'initial') { - this.events.splice(0, 0, { message }); + this.bufferedEvents!.push({ message }); } else if (this.state === 'listening') { - const data = JSON.parse(message); - this.callback!(data); + this.emitMessage(message); } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - fireError(error: any): void { + fireError(error: unknown): void { if (this.state === 'initial') { - this.events.splice(0, 0, { error }); + this.bufferedEvents!.push({ error }); } else if (this.state === 'listening') { super.fireError(error); } @@ -102,10 +77,15 @@ export class PluginMessageReader extends AbstractMessageReader { fireClose(): void { if (this.state === 'initial') { - this.events.splice(0, 0, {}); + this.bufferedEvents!.push({}); } else if (this.state === 'listening') { super.fireClose(); } this.state = 'closed'; } + + protected emitMessage(message: string): void { + const data = JSON.parse(message); + this.callback!(data); + } } diff --git a/packages/plugin-ext/src/common/plugin-message-writer.ts b/packages/plugin-ext/src/common/plugin-message-writer.ts index 35ea668361e20..b562bfbf392b4 100644 --- a/packages/plugin-ext/src/common/plugin-message-writer.ts +++ b/packages/plugin-ext/src/common/plugin-message-writer.ts @@ -14,52 +14,25 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Message, MessageWriter, Emitter, Event } from '@theia/core/shared/vscode-ws-jsonrpc'; +import { AbstractMessageWriter, Message, MessageWriter } from '@theia/core/shared/vscode-languageserver-protocol'; import { ConnectionMain, ConnectionExt } from './plugin-api-rpc'; -export abstract class AbstractMessageWriter { - protected errorEmitter = new Emitter<[Error, Message | undefined, number | undefined]>(); - protected closeEmitter = new Emitter(); - dispose(): void { - this.errorEmitter.dispose(); - this.closeEmitter.dispose(); - } - get onError(): Event<[Error, Message | undefined, number | undefined]> { - return this.errorEmitter.event; - } - fireError(error: Error, message: Message | undefined, count: number | undefined): void { - this.errorEmitter.fire([this.asError(error), message, count]); - } - get onClose(): Event { - return this.closeEmitter.event; - } - fireClose(): void { - this.closeEmitter.fire(undefined); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - asError(error: any): Error { - if (error instanceof Error) { - return error; - } else { - return new Error(`Writer received error. Reason: ${typeof error.message === 'string' ? error.message : 'unknown'}`); - } - } -} - /** * Support for writing string message through RPC protocol. */ export class PluginMessageWriter extends AbstractMessageWriter implements MessageWriter { + constructor( protected readonly id: string, - protected readonly proxy: ConnectionMain | ConnectionExt) { + protected readonly proxy: ConnectionMain | ConnectionExt + ) { super(); } - write(message: string): void; - write(message: Message): void; - write(arg: string | Message): void { - const content = JSON.stringify(arg); + async write(message: Message): Promise { + const content = JSON.stringify(message); this.proxy.$sendMessage(this.id, content); } + + end(): void { } } diff --git a/packages/plugin-ext/src/common/plugin-message.ts b/packages/plugin-ext/src/common/plugin-message.ts new file mode 100644 index 0000000000000..353b726065b51 --- /dev/null +++ b/packages/plugin-ext/src/common/plugin-message.ts @@ -0,0 +1,28 @@ +/******************************************************************************** + * Copyright (C) 2021 Ericsson and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +import { Message } from '@theia/core/shared/vscode-languageserver-protocol'; + +export interface PluginMessage extends Message { + /** + * Bogus JSON-RPC version because we don't actually implement JSON-RPC here. + */ + jsonrpc: '0.0' + /** + * Actual string payload being transmitted. + */ + content: string +} diff --git a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts index d0074cefebe0c..c36edcca01e1b 100644 --- a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts +++ b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts @@ -533,7 +533,13 @@ export class HostedPluginSupport { protected async getStoragePath(): Promise { const roots = await this.workspaceService.roots; - return this.pluginPathsService.getHostStoragePath(this.workspaceService.workspace?.resource.toString(), roots.map(root => root.resource.toString())); + const storagePath = await this.pluginPathsService.getHostStoragePath( + this.workspaceService.workspace?.resource.toString(), + roots.map(root => root.resource.toString()), + ); + if (storagePath) { + return storagePath; + } } protected async getHostGlobalStoragePath(): Promise { diff --git a/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts b/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts index 8aef156a150f7..c915334618734 100644 --- a/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts +++ b/packages/plugin-ext/src/hosted/node/hosted-plugin-process.ts @@ -81,12 +81,10 @@ export class HostedPluginProcess implements ServerPluginRunner { } - // eslint-disable-next-line @typescript-eslint/no-explicit-any public acceptMessage(pluginHostId: string, message: string): boolean { return pluginHostId === 'main'; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any public onMessage(pluginHostId: string, jsonMessage: string): void { if (this.childProcess) { this.childProcess.send(jsonMessage); diff --git a/packages/plugin-ext/src/main/browser/callhierarchy/callhierarchy-type-converters.ts b/packages/plugin-ext/src/main/browser/callhierarchy/callhierarchy-type-converters.ts index 718c7639acabb..e8025cf4fa595 100644 --- a/packages/plugin-ext/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +++ b/packages/plugin-ext/src/main/browser/callhierarchy/callhierarchy-type-converters.ts @@ -17,7 +17,7 @@ import { Definition as CallHierarchyDefinition, Caller as CallHierarchyCaller, Callee as CallHierarchyCallee } from '@theia/callhierarchy/lib/browser'; import * as model from '../../../common/plugin-api-rpc-model'; import * as rpc from '../../../common/plugin-api-rpc'; -import * as callhierarchy from '@theia/core/shared/vscode-languageserver-types'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import { URI } from '@theia/core/shared/vscode-uri'; import { UriComponents } from '../../../common/uri-components'; @@ -29,28 +29,28 @@ export function fromUriComponents(uri: UriComponents): string { return URI.revive(uri).toString(); } -export function fromLocation(location: callhierarchy.Location): model.Location { +export function fromLocation(location: lsp.Location): model.Location { return { uri: URI.parse(location.uri), range: fromRange(location.range) }; } -export function toLocation(uri: UriComponents, range: model.Range): callhierarchy.Location { +export function toLocation(uri: UriComponents, range: model.Range): lsp.Location { return { uri: URI.revive(uri).toString(), range: toRange(range) }; } -export function fromPosition(position: callhierarchy.Position): rpc.Position { +export function fromPosition(position: lsp.Position): rpc.Position { return { lineNumber: position.line, column: position.character }; } -export function fromRange(range: callhierarchy.Range): model.Range { +export function fromRange(range: lsp.Range): model.Range { const { start, end } = range; return { startLineNumber: start.line + 1, @@ -60,8 +60,8 @@ export function fromRange(range: callhierarchy.Range): model.Range { }; } -export function toRange(range: model.Range): callhierarchy.Range { - return callhierarchy.Range.create( +export function toRange(range: model.Range): lsp.Range { + return lsp.Range.create( range.startLineNumber - 1, range.startColumn - 1, range.endLineNumber - 1, @@ -72,67 +72,67 @@ export function toRange(range: model.Range): callhierarchy.Range { export namespace SymbolKindConverter { // tslint:disable-next-line:no-null-keyword const fromMapping: { [kind: number]: model.SymbolKind } = Object.create(null); - fromMapping[callhierarchy.SymbolKind.File] = model.SymbolKind.File; - fromMapping[callhierarchy.SymbolKind.Module] = model.SymbolKind.Module; - fromMapping[callhierarchy.SymbolKind.Namespace] = model.SymbolKind.Namespace; - fromMapping[callhierarchy.SymbolKind.Package] = model.SymbolKind.Package; - fromMapping[callhierarchy.SymbolKind.Class] = model.SymbolKind.Class; - fromMapping[callhierarchy.SymbolKind.Method] = model.SymbolKind.Method; - fromMapping[callhierarchy.SymbolKind.Property] = model.SymbolKind.Property; - fromMapping[callhierarchy.SymbolKind.Field] = model.SymbolKind.Field; - fromMapping[callhierarchy.SymbolKind.Constructor] = model.SymbolKind.Constructor; - fromMapping[callhierarchy.SymbolKind.Enum] = model.SymbolKind.Enum; - fromMapping[callhierarchy.SymbolKind.Interface] = model.SymbolKind.Interface; - fromMapping[callhierarchy.SymbolKind.Function] = model.SymbolKind.Function; - fromMapping[callhierarchy.SymbolKind.Variable] = model.SymbolKind.Variable; - fromMapping[callhierarchy.SymbolKind.Constant] = model.SymbolKind.Constant; - fromMapping[callhierarchy.SymbolKind.String] = model.SymbolKind.String; - fromMapping[callhierarchy.SymbolKind.Number] = model.SymbolKind.Number; - fromMapping[callhierarchy.SymbolKind.Boolean] = model.SymbolKind.Boolean; - fromMapping[callhierarchy.SymbolKind.Array] = model.SymbolKind.Array; - fromMapping[callhierarchy.SymbolKind.Object] = model.SymbolKind.Object; - fromMapping[callhierarchy.SymbolKind.Key] = model.SymbolKind.Key; - fromMapping[callhierarchy.SymbolKind.Null] = model.SymbolKind.Null; - fromMapping[callhierarchy.SymbolKind.EnumMember] = model.SymbolKind.EnumMember; - fromMapping[callhierarchy.SymbolKind.Struct] = model.SymbolKind.Struct; - fromMapping[callhierarchy.SymbolKind.Event] = model.SymbolKind.Event; - fromMapping[callhierarchy.SymbolKind.Operator] = model.SymbolKind.Operator; - fromMapping[callhierarchy.SymbolKind.TypeParameter] = model.SymbolKind.TypeParameter; - - export function fromSymbolKind(kind: callhierarchy.SymbolKind): model.SymbolKind { + fromMapping[lsp.SymbolKind.File] = model.SymbolKind.File; + fromMapping[lsp.SymbolKind.Module] = model.SymbolKind.Module; + fromMapping[lsp.SymbolKind.Namespace] = model.SymbolKind.Namespace; + fromMapping[lsp.SymbolKind.Package] = model.SymbolKind.Package; + fromMapping[lsp.SymbolKind.Class] = model.SymbolKind.Class; + fromMapping[lsp.SymbolKind.Method] = model.SymbolKind.Method; + fromMapping[lsp.SymbolKind.Property] = model.SymbolKind.Property; + fromMapping[lsp.SymbolKind.Field] = model.SymbolKind.Field; + fromMapping[lsp.SymbolKind.Constructor] = model.SymbolKind.Constructor; + fromMapping[lsp.SymbolKind.Enum] = model.SymbolKind.Enum; + fromMapping[lsp.SymbolKind.Interface] = model.SymbolKind.Interface; + fromMapping[lsp.SymbolKind.Function] = model.SymbolKind.Function; + fromMapping[lsp.SymbolKind.Variable] = model.SymbolKind.Variable; + fromMapping[lsp.SymbolKind.Constant] = model.SymbolKind.Constant; + fromMapping[lsp.SymbolKind.String] = model.SymbolKind.String; + fromMapping[lsp.SymbolKind.Number] = model.SymbolKind.Number; + fromMapping[lsp.SymbolKind.Boolean] = model.SymbolKind.Boolean; + fromMapping[lsp.SymbolKind.Array] = model.SymbolKind.Array; + fromMapping[lsp.SymbolKind.Object] = model.SymbolKind.Object; + fromMapping[lsp.SymbolKind.Key] = model.SymbolKind.Key; + fromMapping[lsp.SymbolKind.Null] = model.SymbolKind.Null; + fromMapping[lsp.SymbolKind.EnumMember] = model.SymbolKind.EnumMember; + fromMapping[lsp.SymbolKind.Struct] = model.SymbolKind.Struct; + fromMapping[lsp.SymbolKind.Event] = model.SymbolKind.Event; + fromMapping[lsp.SymbolKind.Operator] = model.SymbolKind.Operator; + fromMapping[lsp.SymbolKind.TypeParameter] = model.SymbolKind.TypeParameter; + + export function fromSymbolKind(kind: lsp.SymbolKind): model.SymbolKind { return fromMapping[kind] || model.SymbolKind.Property; } // tslint:disable-next-line:no-null-keyword - const toMapping: { [kind: number]: callhierarchy.SymbolKind } = Object.create(null); - toMapping[model.SymbolKind.File] = callhierarchy.SymbolKind.File; - toMapping[model.SymbolKind.Module] = callhierarchy.SymbolKind.Module; - toMapping[model.SymbolKind.Namespace] = callhierarchy.SymbolKind.Namespace; - toMapping[model.SymbolKind.Package] = callhierarchy.SymbolKind.Package; - toMapping[model.SymbolKind.Class] = callhierarchy.SymbolKind.Class; - toMapping[model.SymbolKind.Method] = callhierarchy.SymbolKind.Method; - toMapping[model.SymbolKind.Property] = callhierarchy.SymbolKind.Property; - toMapping[model.SymbolKind.Field] = callhierarchy.SymbolKind.Field; - toMapping[model.SymbolKind.Constructor] = callhierarchy.SymbolKind.Constructor; - toMapping[model.SymbolKind.Enum] = callhierarchy.SymbolKind.Enum; - toMapping[model.SymbolKind.Interface] = callhierarchy.SymbolKind.Interface; - toMapping[model.SymbolKind.Function] = callhierarchy.SymbolKind.Function; - toMapping[model.SymbolKind.Variable] = callhierarchy.SymbolKind.Variable; - toMapping[model.SymbolKind.Constant] = callhierarchy.SymbolKind.Constant; - toMapping[model.SymbolKind.String] = callhierarchy.SymbolKind.String; - toMapping[model.SymbolKind.Number] = callhierarchy.SymbolKind.Number; - toMapping[model.SymbolKind.Boolean] = callhierarchy.SymbolKind.Boolean; - toMapping[model.SymbolKind.Array] = callhierarchy.SymbolKind.Array; - toMapping[model.SymbolKind.Object] = callhierarchy.SymbolKind.Object; - toMapping[model.SymbolKind.Key] = callhierarchy.SymbolKind.Key; - toMapping[model.SymbolKind.Null] = callhierarchy.SymbolKind.Null; - toMapping[model.SymbolKind.EnumMember] = callhierarchy.SymbolKind.EnumMember; - toMapping[model.SymbolKind.Struct] = callhierarchy.SymbolKind.Struct; - toMapping[model.SymbolKind.Event] = callhierarchy.SymbolKind.Event; - toMapping[model.SymbolKind.Operator] = callhierarchy.SymbolKind.Operator; - toMapping[model.SymbolKind.TypeParameter] = callhierarchy.SymbolKind.TypeParameter; - - export function toSymbolKind(kind: model.SymbolKind): callhierarchy.SymbolKind { + const toMapping: { [kind: number]: lsp.SymbolKind } = Object.create(null); + toMapping[model.SymbolKind.File] = lsp.SymbolKind.File; + toMapping[model.SymbolKind.Module] = lsp.SymbolKind.Module; + toMapping[model.SymbolKind.Namespace] = lsp.SymbolKind.Namespace; + toMapping[model.SymbolKind.Package] = lsp.SymbolKind.Package; + toMapping[model.SymbolKind.Class] = lsp.SymbolKind.Class; + toMapping[model.SymbolKind.Method] = lsp.SymbolKind.Method; + toMapping[model.SymbolKind.Property] = lsp.SymbolKind.Property; + toMapping[model.SymbolKind.Field] = lsp.SymbolKind.Field; + toMapping[model.SymbolKind.Constructor] = lsp.SymbolKind.Constructor; + toMapping[model.SymbolKind.Enum] = lsp.SymbolKind.Enum; + toMapping[model.SymbolKind.Interface] = lsp.SymbolKind.Interface; + toMapping[model.SymbolKind.Function] = lsp.SymbolKind.Function; + toMapping[model.SymbolKind.Variable] = lsp.SymbolKind.Variable; + toMapping[model.SymbolKind.Constant] = lsp.SymbolKind.Constant; + toMapping[model.SymbolKind.String] = lsp.SymbolKind.String; + toMapping[model.SymbolKind.Number] = lsp.SymbolKind.Number; + toMapping[model.SymbolKind.Boolean] = lsp.SymbolKind.Boolean; + toMapping[model.SymbolKind.Array] = lsp.SymbolKind.Array; + toMapping[model.SymbolKind.Object] = lsp.SymbolKind.Object; + toMapping[model.SymbolKind.Key] = lsp.SymbolKind.Key; + toMapping[model.SymbolKind.Null] = lsp.SymbolKind.Null; + toMapping[model.SymbolKind.EnumMember] = lsp.SymbolKind.EnumMember; + toMapping[model.SymbolKind.Struct] = lsp.SymbolKind.Struct; + toMapping[model.SymbolKind.Event] = lsp.SymbolKind.Event; + toMapping[model.SymbolKind.Operator] = lsp.SymbolKind.Operator; + toMapping[model.SymbolKind.TypeParameter] = lsp.SymbolKind.TypeParameter; + + export function toSymbolKind(kind: model.SymbolKind): lsp.SymbolKind { return toMapping[kind] || model.SymbolKind.Property; } } diff --git a/packages/plugin-ext/src/main/browser/custom-editors/glob.ts b/packages/plugin-ext/src/main/browser/custom-editors/glob.ts index d915b91d76187..4392bff0cdcbc 100644 --- a/packages/plugin-ext/src/main/browser/custom-editors/glob.ts +++ b/packages/plugin-ext/src/main/browser/custom-editors/glob.ts @@ -589,6 +589,7 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse if (!parsedPatterns.some(parsedPattern => (parsedPattern).requiresSiblings!)) { if (n === 1) { + // @ts-expect-error TS2322 return parsedPatterns[0]; } @@ -619,6 +620,7 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse resultExpression.allPaths = allPaths; } + // @ts-expect-error TS2322 return resultExpression; } @@ -656,6 +658,7 @@ function parsedExpression(expression: IExpression, options: IGlobOptions): Parse resultExpression.allPaths = allPaths; } + // @ts-expect-error TS2322 return resultExpression; } diff --git a/packages/plugin-ext/src/main/browser/debug/debug-main.ts b/packages/plugin-ext/src/main/browser/debug/debug-main.ts index 041a1faa5405c..7c5bc136c9106 100644 --- a/packages/plugin-ext/src/main/browser/debug/debug-main.ts +++ b/packages/plugin-ext/src/main/browser/debug/debug-main.ts @@ -44,7 +44,7 @@ import { PluginDebugAdapterContribution } from './plugin-debug-adapter-contribut import { PluginDebugSessionContributionRegistrator, PluginDebugSessionContributionRegistry } from './plugin-debug-session-contribution-registry'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { PluginDebugSessionFactory } from './plugin-debug-session-factory'; -import { PluginWebSocketChannel } from '../../../common/connection'; +import { PluginChannel } from '../../../common/connection'; import { PluginDebugAdapterContributionRegistrator, PluginDebugService } from './plugin-debug-service'; import { HostedPluginSupport } from '../../../hosted/browser/hosted-plugin'; import { DebugFunctionBreakpoint } from '@theia/debug/lib/browser/model/debug-function-breakpoint'; @@ -149,7 +149,7 @@ export class DebugMainImpl implements DebugMain, Disposable { this.debugPreferences, async (sessionId: string) => { const connection = await this.connectionMain.ensureConnection(sessionId); - return new PluginWebSocketChannel(connection); + return new PluginChannel(connection); }, this.fileService, terminalOptionsExt, diff --git a/packages/plugin-ext/src/main/browser/debug/plugin-debug-session-factory.ts b/packages/plugin-ext/src/main/browser/debug/plugin-debug-session-factory.ts index 1b9ed9f1ba9d7..010ef569ea95f 100644 --- a/packages/plugin-ext/src/main/browser/debug/plugin-debug-session-factory.ts +++ b/packages/plugin-ext/src/main/browser/debug/plugin-debug-session-factory.ts @@ -25,7 +25,7 @@ import { DebugPreferences } from '@theia/debug/lib/browser/debug-preferences'; import { DebugSessionOptions } from '@theia/debug/lib/browser/debug-session-options'; import { DebugSession } from '@theia/debug/lib/browser/debug-session'; import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection'; -import { IWebSocket } from '@theia/core/shared/vscode-ws-jsonrpc'; +import { Channel } from '@theia/core/lib/common/messaging'; import { TerminalWidgetOptions, TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget'; import { TerminalOptionsExt } from '../../../common/plugin-api-rpc'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; @@ -57,7 +57,7 @@ export class PluginDebugSession extends DebugSession { /** * Session factory for a client debug session that communicates with debug adapter contributed as plugin. - * The main difference is to use a connection factory that creates [IWebSocket](#IWebSocket) over Rpc channel. + * The main difference is to use a connection factory that creates [Channel](#Channel) over Rpc channel. */ export class PluginDebugSessionFactory extends DefaultDebugSessionFactory { constructor( @@ -68,7 +68,7 @@ export class PluginDebugSessionFactory extends DefaultDebugSessionFactory { protected readonly messages: MessageClient, protected readonly outputChannelManager: OutputChannelManager, protected readonly debugPreferences: DebugPreferences, - protected readonly connectionFactory: (sessionId: string) => Promise, + protected readonly connectionFactory: (sessionId: string) => Promise>, protected readonly fileService: FileService, protected readonly terminalOptionsExt: TerminalOptionsExt | undefined, protected readonly debugContributionProvider: ContributionProvider @@ -80,8 +80,8 @@ export class PluginDebugSessionFactory extends DefaultDebugSessionFactory { const connection = new DebugSessionConnection( sessionId, this.connectionFactory, - this.getTraceOutputChannel()); - + this.getTraceOutputChannel() + ); return new PluginDebugSession( sessionId, options, diff --git a/packages/plugin-ext/src/main/browser/documents-main.ts b/packages/plugin-ext/src/main/browser/documents-main.ts index 23a2beb2242f1..6902b12c0def2 100644 --- a/packages/plugin-ext/src/main/browser/documents-main.ts +++ b/packages/plugin-ext/src/main/browser/documents-main.ts @@ -26,7 +26,7 @@ import URI from '@theia/core/lib/common/uri'; import { URI as CodeURI } from '@theia/core/shared/vscode-uri'; import { ApplicationShell, Saveable } from '@theia/core/lib/browser'; import { TextDocumentShowOptions } from '../../common/plugin-api-rpc-model'; -import { Range } from '@theia/core/shared/vscode-languageserver-types'; +import { Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { OpenerService } from '@theia/core/lib/browser/opener-service'; import { Reference } from '@theia/core/lib/common/reference'; import { dispose } from '../../common/disposable-util'; @@ -157,12 +157,12 @@ export class DocumentsMainImpl implements DocumentsMain, Disposable { eol: e.eol, versionId: e.versionId, changes: e.changes.map(c => - ({ - text: c.text, - range: c.range, - rangeLength: c.rangeLength, - rangeOffset: c.rangeOffset - })) + ({ + text: c.text, + range: c.range, + rangeLength: c.rangeLength, + rangeOffset: c.rangeOffset + })) }, model.dirty) ), Disposable.create(() => this.syncedModels.delete(key)) diff --git a/packages/plugin-ext/src/main/browser/languages-main.ts b/packages/plugin-ext/src/main/browser/languages-main.ts index bdfbd58d6906b..ae7ceef9d8e86 100644 --- a/packages/plugin-ext/src/main/browser/languages-main.ts +++ b/packages/plugin-ext/src/main/browser/languages-main.ts @@ -45,19 +45,17 @@ import CoreURI from '@theia/core/lib/common/uri'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { ProblemManager } from '@theia/markers/lib/browser'; -import * as vst from '@theia/core/shared/vscode-languageserver-types'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import * as theia from '@theia/plugin'; import { UriComponents } from '../../common/uri-components'; import { CancellationToken } from '@theia/core/lib/common'; import { LanguageSelector, RelativePattern } from '@theia/callhierarchy/lib/common/language-selector'; import { CallHierarchyService, CallHierarchyServiceProvider, Definition } from '@theia/callhierarchy/lib/browser'; import { toDefinition, toUriComponents, fromDefinition, fromPosition, toCaller, toCallee } from './callhierarchy/callhierarchy-type-converters'; -import { Position, DocumentUri } from '@theia/core/shared/vscode-languageserver-types'; import { ObjectIdentifier } from '../../common/object-identifier'; import { mixin } from '../../common/types'; import { relative } from '../../common/paths-util'; import { decodeSemanticTokensDto } from '../../common/semantic-tokens-dto'; -import { DiagnosticTag } from '@theia/core/shared/vscode-languageserver-protocol'; @injectable() export class LanguagesMainImpl implements LanguagesMain, Disposable { @@ -361,11 +359,11 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable { }; } - protected provideWorkspaceSymbols(handle: number, params: WorkspaceSymbolParams, token: monaco.CancellationToken): Thenable { + protected provideWorkspaceSymbols(handle: number, params: WorkspaceSymbolParams, token: monaco.CancellationToken): Thenable { return this.proxy.$provideWorkspaceSymbols(handle, params.query, token); } - protected resolveWorkspaceSymbol(handle: number, symbol: vst.SymbolInformation, token: monaco.CancellationToken): Thenable { + protected resolveWorkspaceSymbol(handle: number, symbol: lsp.SymbolInformation, token: monaco.CancellationToken): Thenable { return this.proxy.$resolveWorkspaceSymbol(handle, symbol, token); } @@ -772,7 +770,7 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable { protected createCallHierarchyService(handle: number, language: LanguageSelector): CallHierarchyService { return { selector: language, - getRootDefinition: (uri: DocumentUri, position: Position, cancellationToken: CancellationToken) => + getRootDefinition: (uri: lsp.DocumentUri, position: lsp.Position, cancellationToken: CancellationToken) => this.proxy.$provideRootDefinition(handle, toUriComponents(uri), fromPosition(position), cancellationToken) .then(def => Array.isArray(def) ? def.map(item => toDefinition(item)) : toDefinition(def)), getCallers: (definition: Definition, cancellationToken: CancellationToken) => this.proxy.$provideCallers(handle, fromDefinition(definition), cancellationToken) @@ -914,8 +912,8 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable { } -function reviveMarker(marker: MarkerData): vst.Diagnostic { - const monacoMarker: vst.Diagnostic = { +function reviveMarker(marker: MarkerData): lsp.Diagnostic { + const monacoMarker: lsp.Diagnostic = { code: marker.code, severity: reviveSeverity(marker.severity), range: reviveRange(marker.startLineNumber, marker.startColumn, marker.endLineNumber, marker.endColumn), @@ -935,16 +933,16 @@ function reviveMarker(marker: MarkerData): vst.Diagnostic { return monacoMarker; } -function reviveSeverity(severity: MarkerSeverity): vst.DiagnosticSeverity { +function reviveSeverity(severity: MarkerSeverity): lsp.DiagnosticSeverity { switch (severity) { - case MarkerSeverity.Error: return vst.DiagnosticSeverity.Error; - case MarkerSeverity.Warning: return vst.DiagnosticSeverity.Warning; - case MarkerSeverity.Info: return vst.DiagnosticSeverity.Information; - case MarkerSeverity.Hint: return vst.DiagnosticSeverity.Hint; + case MarkerSeverity.Error: return lsp.DiagnosticSeverity.Error; + case MarkerSeverity.Warning: return lsp.DiagnosticSeverity.Warning; + case MarkerSeverity.Info: return lsp.DiagnosticSeverity.Information; + case MarkerSeverity.Hint: return lsp.DiagnosticSeverity.Hint; } } -function reviveRange(startLine: number, startColumn: number, endLine: number, endColumn: number): vst.Range { +function reviveRange(startLine: number, startColumn: number, endLine: number, endColumn: number): lsp.Range { // note: language server range is 0-based, marker is 1-based, so need to deduct 1 here return { start: { @@ -958,7 +956,7 @@ function reviveRange(startLine: number, startColumn: number, endLine: number, en }; } -function reviveRelated(related: RelatedInformation): vst.DiagnosticRelatedInformation { +function reviveRelated(related: RelatedInformation): lsp.DiagnosticRelatedInformation { return { message: related.message, location: { @@ -968,10 +966,10 @@ function reviveRelated(related: RelatedInformation): vst.DiagnosticRelatedInform }; } -function reviveTag(tag: DiagnosticTag): vst.DiagnosticTag { +function reviveTag(tag: lsp.DiagnosticTag): lsp.DiagnosticTag { switch (tag) { - case 1: return DiagnosticTag.Unnecessary; - case 2: return DiagnosticTag.Deprecated; + case 1: return lsp.DiagnosticTag.Unnecessary; + case 2: return lsp.DiagnosticTag.Deprecated; } } diff --git a/packages/plugin-ext/src/main/browser/quick-open-main.ts b/packages/plugin-ext/src/main/browser/quick-open-main.ts index a31d26c46a0ba..1e842e2aecbd3 100644 --- a/packages/plugin-ext/src/main/browser/quick-open-main.ts +++ b/packages/plugin-ext/src/main/browser/quick-open-main.ts @@ -209,8 +209,8 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { quickPick.onDidChangeSelection((items: Array) => { this.proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle)); }); - quickPick.onDidTriggerButton((button: QuickInputButtonHandle) => { - this.proxy.$acceptOnDidTriggerButton(sessionId, button); + quickPick.onDidTriggerButton(button => { + this.proxy.$acceptOnDidTriggerButton(sessionId, button as QuickInputButtonHandle); }); quickPick.onDidChangeValue((value: string) => { this.proxy.$acceptDidChangeValue(sessionId, value); @@ -227,8 +227,8 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable { inputBox.onDidAccept(() => { this.proxy.$acceptOnDidAccept(sessionId); }); - inputBox.onDidTriggerButton((button: QuickInputButtonHandle) => { - this.proxy.$acceptOnDidTriggerButton(sessionId, button); + inputBox.onDidTriggerButton(button => { + this.proxy.$acceptOnDidTriggerButton(sessionId, button as QuickInputButtonHandle); }); inputBox.onDidChangeValue((value: string) => { this.proxy.$acceptDidChangeValue(sessionId, value); diff --git a/packages/plugin-ext/src/main/common/plugin-paths-protocol.ts b/packages/plugin-ext/src/main/common/plugin-paths-protocol.ts index 3363f89658752..a5a0d1915a501 100644 --- a/packages/plugin-ext/src/main/common/plugin-paths-protocol.ts +++ b/packages/plugin-ext/src/main/common/plugin-paths-protocol.ts @@ -14,13 +14,15 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ +import type { JsonRpcService } from '@theia/core/lib/common/messaging/json-rpc-service'; + export const pluginPathsServicePath = '/services/plugin-paths'; // Service to create plugin configuration folders for different purpose. export const PluginPathsService = Symbol('PluginPathsService'); -export interface PluginPathsService { +export type PluginPathsService = JsonRpcService<{ /** Returns hosted log path. Create directory by this path if it is not exist on the file system. */ getHostLogPath(): Promise; /** Returns storage path for given workspace */ getHostStoragePath(workspaceUri: string | undefined, rootUris: string[]): Promise; -} +}>; diff --git a/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts b/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts index e94b7065e2574..56c136b93421c 100644 --- a/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts +++ b/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts @@ -57,7 +57,7 @@ export class PluginPathsServiceImpl implements PluginPathsService { return pluginDirPath; } - async getHostStoragePath(workspaceUri: string | undefined, rootUris: string[]): Promise { + async getHostStoragePath(workspaceUri: string | null | undefined, rootUris: string[]): Promise { const parentStorageDir = await this.getWorkspaceStorageDirPath(); if (!parentStorageDir) { diff --git a/packages/plugin-ext/src/main/node/plugin-server-handler.ts b/packages/plugin-ext/src/main/node/plugin-server-handler.ts index c28a58f1b4a60..d0e0546dac9ac 100644 --- a/packages/plugin-ext/src/main/node/plugin-server-handler.ts +++ b/packages/plugin-ext/src/main/node/plugin-server-handler.ts @@ -42,16 +42,19 @@ export class PluginServerHandler implements PluginServer { return this.pluginDeployer.undeploy(pluginId); } - setStorageValue(key: string, value: KeysToAnyValues, kind: PluginStorageKind): Promise { - return this.pluginsKeyValueStorage.set(key, value, kind); + setStorageValue(key: string, value: KeysToAnyValues, kind: PluginStorageKind | CancellationToken): Promise { + return this.pluginsKeyValueStorage.set(key, value, this.ignoreCancellationToken(kind)); } - getStorageValue(key: string, kind: PluginStorageKind): Promise { - return this.pluginsKeyValueStorage.get(key, kind); + getStorageValue(key: string, kind: PluginStorageKind | CancellationToken): Promise { + return this.pluginsKeyValueStorage.get(key, this.ignoreCancellationToken(kind)); } - getAllStorageValues(kind: PluginStorageKind): Promise { - return this.pluginsKeyValueStorage.getAll(kind); + getAllStorageValues(kind: PluginStorageKind | CancellationToken): Promise { + return this.pluginsKeyValueStorage.getAll(this.ignoreCancellationToken(kind)); } + protected ignoreCancellationToken(what: T | CancellationToken): T | undefined { + return CancellationToken.Is(what) ? undefined : what; + } } diff --git a/packages/plugin-ext/src/main/node/plugins-key-value-storage.ts b/packages/plugin-ext/src/main/node/plugins-key-value-storage.ts index 4ab7c1ed44188..bef8c18bd0ab0 100644 --- a/packages/plugin-ext/src/main/node/plugins-key-value-storage.ts +++ b/packages/plugin-ext/src/main/node/plugins-key-value-storage.ts @@ -94,7 +94,9 @@ export class PluginsKeyValueStorage { return this.deferredGlobalDataPath.promise; } const storagePath = await this.pluginPathsService.getHostStoragePath(kind.workspace, kind.roots); - return storagePath ? path.join(storagePath, 'workspace-state.json') : undefined; + if (storagePath) { + return path.join(storagePath, 'workspace-state.json'); + } } private async readFromFile(pathToFile: string): Promise { diff --git a/packages/plugin-ext/src/plugin/authentication-ext.ts b/packages/plugin-ext/src/plugin/authentication-ext.ts index 82c07b50349e6..dd0cc2c0fe602 100644 --- a/packages/plugin-ext/src/plugin/authentication-ext.ts +++ b/packages/plugin-ext/src/plugin/authentication-ext.ts @@ -61,10 +61,26 @@ export class AuthenticationExtImpl implements AuthenticationExt { return Object.freeze(this._providers.slice()); } - async getSession(requestingExtension: InternalPlugin, providerId: string, scopes: string[], - options: theia.AuthenticationGetSessionOptions & { createIfNone: true }): Promise; - async getSession(requestingExtension: InternalPlugin, providerId: string, scopes: string[], - options: theia.AuthenticationGetSessionOptions = {}): Promise { + async getSession( + requestingExtension: InternalPlugin, + providerId: string, + scopes: string[], + options?: theia.AuthenticationGetSessionOptions & { createIfNone: true } + ): Promise; + + async getSession( + requestingExtension: InternalPlugin, + providerId: string, + scopes: string[], + options?: theia.AuthenticationGetSessionOptions + ): Promise; + + async getSession( + requestingExtension: InternalPlugin, + providerId: string, + scopes: string[], + options: theia.AuthenticationGetSessionOptions & { createIfNone?: boolean } = {} + ): Promise { const extensionName = requestingExtension.model.displayName || requestingExtension.model.name; const extensionId = requestingExtension.model.id.toLowerCase(); @@ -163,7 +179,7 @@ export class AuthenticationExtImpl implements AuthenticationExt { return Promise.resolve(); } - async $onDidChangeAuthenticationProviders(added: theia.AuthenticationProviderInformation[], removed: theia.AuthenticationProviderInformation[]): Promise { + async $onDidChangeAuthenticationProviders(added: theia.AuthenticationProviderInformation[], removed: theia.AuthenticationProviderInformation[]): Promise { added.forEach(id => { if (this._providers.indexOf(id) === -1) { this._providers.push(id); diff --git a/packages/plugin-ext/src/plugin/command-registry.ts b/packages/plugin-ext/src/plugin/command-registry.ts index 93d283a1762e8..d7315bc81ccbc 100644 --- a/packages/plugin-ext/src/plugin/command-registry.ts +++ b/packages/plugin-ext/src/plugin/command-registry.ts @@ -197,8 +197,7 @@ export class CommandsConverter { // we're deprecating Command.id, so it has to be optional. // Existing code will have compiled against a non - optional version of the field, so asserting it to exist is ok // eslint-disable-next-line @typescript-eslint/no-explicit-any - return KnownCommands.map((external.command || external.id)!, external.arguments, (mappedId: string, mappedArgs: any[]) => - ({ + return KnownCommands.map((external.command || external.id)!, external.arguments, (mappedId: string, mappedArgs?: any[]) => ({ id: mappedId, title: external.title || external.label || ' ', tooltip: external.tooltip, diff --git a/packages/plugin-ext/src/plugin/known-commands.spec.ts b/packages/plugin-ext/src/plugin/known-commands.spec.ts index dbc115a14a732..6df51f437ef7d 100644 --- a/packages/plugin-ext/src/plugin/known-commands.spec.ts +++ b/packages/plugin-ext/src/plugin/known-commands.spec.ts @@ -34,7 +34,7 @@ describe('Known Command Conversions', () => { // when // eslint-disable-next-line @typescript-eslint/no-explicit-any - KnownCommands.map(commandID, [uri, position], (mappedID: string, mappedArgs: any[]) => { + KnownCommands.map(commandID, [uri, position], (mappedID: string, mappedArgs: any[] = []) => { // then assert.strictEqual(commandID, mappedID); diff --git a/packages/plugin-ext/src/plugin/known-commands.ts b/packages/plugin-ext/src/plugin/known-commands.ts index eb6e3fdddb6d0..d9c6c03419246 100755 --- a/packages/plugin-ext/src/plugin/known-commands.ts +++ b/packages/plugin-ext/src/plugin/known-commands.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { Range as R, Position as P, Location as L } from '@theia/core/shared/vscode-languageserver-types'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import * as theia from '@theia/plugin'; import { cloneAndChange } from '../common/objects'; import { Position, Range, Location, CallHierarchyItem, URI, TextDocumentShowOptions } from './types-impl'; @@ -332,16 +332,16 @@ export namespace KnownCommands { }; } - function fromPositionToP(p: theia.Position): P { - return P.create(p.line, p.character); + function fromPositionToP(p: theia.Position): lsp.Position { + return lsp.Position.create(p.line, p.character); } - function fromRangeToR(r: theia.Range): R { - return R.create(fromPositionToP(r.start), fromPositionToP(r.end)); + function fromRangeToR(r: theia.Range): lsp.Range { + return lsp.Range.create(fromPositionToP(r.start), fromPositionToP(r.end)); } - function fromLocationToL(l: theia.Location): L { - return L.create(l.uri.toString(), fromRangeToR(l.range)); + function fromLocationToL(l: theia.Location): lsp.Location { + return lsp.Location.create(l.uri.toString(), fromRangeToR(l.range)); } // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/tslint/config diff --git a/packages/plugin-ext/src/plugin/languages.ts b/packages/plugin-ext/src/plugin/languages.ts index 034d589f04e36..14158f86a74ba 100644 --- a/packages/plugin-ext/src/plugin/languages.ts +++ b/packages/plugin-ext/src/plugin/languages.ts @@ -79,7 +79,7 @@ import { CodeLensAdapter } from './languages/lens'; import { OutlineAdapter } from './languages/outline'; import { ReferenceAdapter } from './languages/reference'; import { WorkspaceSymbolAdapter } from './languages/workspace-symbol'; -import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; +import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-protocol'; import { FoldingProviderAdapter } from './languages/folding'; import { SelectionRangeProviderAdapter } from './languages/selection-range'; import { ColorProviderAdapter } from './languages/color'; @@ -645,11 +645,11 @@ function serializeEnterRules(rules?: theia.OnEnterRule[]): SerializedOnEnterRule } return rules.map(r => - ({ - action: r.action, - beforeText: serializeRegExp(r.beforeText), - afterText: serializeRegExp(r.afterText) - } as SerializedOnEnterRule)); + ({ + action: r.action, + beforeText: serializeRegExp(r.beforeText), + afterText: serializeRegExp(r.afterText) + } as SerializedOnEnterRule)); } function serializeRegExp(regexp?: RegExp): SerializedRegExp | undefined { diff --git a/packages/plugin-ext/src/plugin/languages/workspace-symbol.ts b/packages/plugin-ext/src/plugin/languages/workspace-symbol.ts index e9f1338091249..7aa5626935c4c 100644 --- a/packages/plugin-ext/src/plugin/languages/workspace-symbol.ts +++ b/packages/plugin-ext/src/plugin/languages/workspace-symbol.ts @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 ********************************************************************************/ -import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; +import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-protocol'; import * as theia from '@theia/plugin'; import * as Converter from '../type-converters'; diff --git a/packages/plugin-ext/src/plugin/node/debug/debug.ts b/packages/plugin-ext/src/plugin/node/debug/debug.ts index a7d51c5a8cfce..1fe0b824d5ba3 100644 --- a/packages/plugin-ext/src/plugin/node/debug/debug.ts +++ b/packages/plugin-ext/src/plugin/node/debug/debug.ts @@ -21,7 +21,7 @@ import { Breakpoint } from '../../../common/plugin-api-rpc-model'; import { DebugConfigurationProviderTriggerKind, DebugExt, DebugMain, PLUGIN_RPC_CONTEXT as Ext, TerminalOptionsExt } from '../../../common/plugin-api-rpc'; import { PluginPackageDebuggersContribution } from '../../../common/plugin-protocol'; import { RPCProtocol } from '../../../common/rpc-protocol'; -import { PluginWebSocketChannel } from '../../../common/connection'; +import { PluginChannel } from '../../../common/connection'; import { CommandRegistryImpl } from '../../command-registry'; import { ConnectionExtImpl } from '../../connection-ext'; import { @@ -307,7 +307,7 @@ export class DebugExtImpl implements DebugExt { this.sessions.set(sessionId, debugAdapterSession); const connection = await this.connectionExt!.ensureConnection(sessionId); - debugAdapterSession.start(new PluginWebSocketChannel(connection)); + debugAdapterSession.start(new PluginChannel(connection)); return sessionId; } diff --git a/packages/plugin-ext/src/plugin/node/debug/plugin-debug-adapter-session.ts b/packages/plugin-ext/src/plugin/node/debug/plugin-debug-adapter-session.ts index e2d5bb4cb60cb..9bdfda2d33da5 100644 --- a/packages/plugin-ext/src/plugin/node/debug/plugin-debug-adapter-session.ts +++ b/packages/plugin-ext/src/plugin/node/debug/plugin-debug-adapter-session.ts @@ -16,8 +16,8 @@ import { DebugAdapterSessionImpl } from '@theia/debug/lib/node/debug-adapter-session'; import * as theia from '@theia/plugin'; -import { IWebSocket } from '@theia/core/shared/vscode-ws-jsonrpc'; import { CommunicationProvider, DebugAdapterSession } from '@theia/debug/lib/node/debug-model'; +import { Channel } from '@theia/core/lib/common/messaging'; /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -41,7 +41,7 @@ export class PluginDebugAdapterSession extends DebugAdapterSessionImpl implement this.configuration = theiaSession.configuration; } - async start(channel: IWebSocket): Promise { + async start(channel: Channel): Promise { if (this.tracker.onWillStartSession) { this.tracker.onWillStartSession(); } diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index 122a024feed66..1306a2a9bbe6c 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -20,7 +20,7 @@ import type * as theia from '@theia/plugin'; import { CommandRegistryImpl } from './command-registry'; import { Emitter } from '@theia/core/lib/common/event'; -import { CancellationError, CancellationToken, CancellationTokenSource } from '@theia/core/lib/common/cancellation'; +import { CancellationError, CancellationTokenSource } from '@theia/core/lib/common/cancellation'; import { QuickOpenExtImpl } from './quick-open'; import { MAIN_RPC_CONTEXT, @@ -229,8 +229,8 @@ export function createAPIFactory( get providers(): ReadonlyArray { return authenticationExt.providers; }, - getSession(providerId: string, scopes: string[], options: theia.AuthenticationGetSessionOptions) { - return authenticationExt.getSession(plugin, providerId, scopes, options as any); + getSession(providerId: string, scopes: string[], options: theia.AuthenticationGetSessionOptions = {}): Promise { + return authenticationExt.getSession(plugin, providerId, scopes, { ...options, createIfNone: true }); }, logout(providerId: string, sessionId: string): Thenable { return authenticationExt.logout(providerId, sessionId); @@ -530,13 +530,18 @@ export function createAPIFactory( const data = await documents.openDocument(uri); return data && data.document; }, - createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): theia.FileSystemWatcher => - extHostFileSystemEvent.createFileSystemWatcher(fromGlobPattern(pattern), ignoreCreate, ignoreChange, ignoreDelete), - findFiles(include: theia.GlobPattern, exclude?: theia.GlobPattern | null, maxResults?: number, token?: CancellationToken): PromiseLike { + createFileSystemWatcher(pattern, ignoreCreate, ignoreChange, ignoreDelete): theia.FileSystemWatcher { + return extHostFileSystemEvent.createFileSystemWatcher(fromGlobPattern(pattern), ignoreCreate, ignoreChange, ignoreDelete); + }, + findFiles(include: theia.GlobPattern, exclude?: theia.GlobPattern | null, maxResults?: number, token?: theia.CancellationToken): PromiseLike { return workspaceExt.findFiles(include, exclude, maxResults, token); }, - findTextInFiles(query: theia.TextSearchQuery, optionsOrCallback: theia.FindTextInFilesOptions | ((result: theia.TextSearchResult) => void), - callbackOrToken?: CancellationToken | ((result: theia.TextSearchResult) => void), token?: CancellationToken): Promise { + findTextInFiles( + query: theia.TextSearchQuery, + optionsOrCallback: theia.FindTextInFilesOptions | ((result: theia.TextSearchResult) => void), + callbackOrToken?: theia.CancellationToken | ((result: theia.TextSearchResult) => void), + token?: theia.CancellationToken + ): Promise { return workspaceExt.findTextInFiles(query, optionsOrCallback, callbackOrToken, token); }, saveAll(includeUntitled?: boolean): PromiseLike { diff --git a/packages/plugin-ext/src/plugin/tree/tree-views.ts b/packages/plugin-ext/src/plugin/tree/tree-views.ts index 6d7957d2fd3e4..3ce1e0afe972a 100644 --- a/packages/plugin-ext/src/plugin/tree/tree-views.ts +++ b/packages/plugin-ext/src/plugin/tree/tree-views.ts @@ -192,7 +192,7 @@ class TreeViewExtImpl implements Disposable { this.toDispose.push(Disposable.create(() => this.proxy.$unregisterTreeDataProvider(treeViewId))); if (treeDataProvider.onDidChangeTreeData) { - treeDataProvider.onDidChangeTreeData((e: T) => { + treeDataProvider.onDidChangeTreeData(() => { this.pendingRefresh = proxy.$refresh(treeViewId); }); } diff --git a/packages/plugin-ext/src/plugin/type-converters.ts b/packages/plugin-ext/src/plugin/type-converters.ts index b841294029302..58b9aec9b9545 100644 --- a/packages/plugin-ext/src/plugin/type-converters.ts +++ b/packages/plugin-ext/src/plugin/type-converters.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import * as theia from '@theia/plugin'; -import * as lstypes from '@theia/core/shared/vscode-languageserver-types'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import { URI } from './types-impl'; import * as rpc from '../common/plugin-api-rpc'; import { @@ -982,22 +982,22 @@ export function getShellExecutionOptions(options: theia.ShellExecutionOptions): return result; } -export function fromSymbolInformation(symbolInformation: theia.SymbolInformation): lstypes.SymbolInformation | undefined { +export function fromSymbolInformation(symbolInformation: theia.SymbolInformation): lsp.SymbolInformation | undefined { if (!symbolInformation) { return undefined; } if (symbolInformation.location && symbolInformation.location.range) { - const p1 = lstypes.Position.create(symbolInformation.location.range.start.line, symbolInformation.location.range.start.character); - const p2 = lstypes.Position.create(symbolInformation.location.range.end.line, symbolInformation.location.range.end.character); - return lstypes.SymbolInformation.create(symbolInformation.name, symbolInformation.kind++ as lstypes.SymbolKind, lstypes.Range.create(p1, p2), + const p1 = lsp.Position.create(symbolInformation.location.range.start.line, symbolInformation.location.range.start.character); + const p2 = lsp.Position.create(symbolInformation.location.range.end.line, symbolInformation.location.range.end.character); + return lsp.SymbolInformation.create(symbolInformation.name, symbolInformation.kind++ as lsp.SymbolKind, lsp.Range.create(p1, p2), symbolInformation.location.uri.toString(), symbolInformation.containerName); } return { name: symbolInformation.name, containerName: symbolInformation.containerName, - kind: symbolInformation.kind++ as lstypes.SymbolKind, + kind: symbolInformation.kind++ as lsp.SymbolKind, location: { uri: symbolInformation.location.uri.toString(), range: symbolInformation.location.range, @@ -1005,7 +1005,7 @@ export function fromSymbolInformation(symbolInformation: theia.SymbolInformation }; } -export function toSymbolInformation(symbolInformation: lstypes.SymbolInformation): theia.SymbolInformation | undefined { +export function toSymbolInformation(symbolInformation: lsp.SymbolInformation): theia.SymbolInformation | undefined { if (!symbolInformation) { return undefined; } diff --git a/packages/plugin-ext/src/plugin/types-impl.ts b/packages/plugin-ext/src/plugin/types-impl.ts index 698344a051ad0..adf6e3bcc15d8 100644 --- a/packages/plugin-ext/src/plugin/types-impl.ts +++ b/packages/plugin-ext/src/plugin/types-impl.ts @@ -1632,7 +1632,7 @@ export class ProgressOptions { /** * The location at which progress should show. */ - location: ProgressLocation; + location: ProgressLocation | { viewId: string }; /** * A human-readable string which will be used to describe the * operation. @@ -1645,7 +1645,7 @@ export class ProgressOptions { * button. */ cancellable?: boolean; - constructor(location: ProgressLocation, title?: string, cancellable?: boolean) { + constructor(location: ProgressLocation | { viewId: string }, title?: string, cancellable?: boolean) { this.location = location; } } diff --git a/packages/plugin-ext/src/plugin/workspace.ts b/packages/plugin-ext/src/plugin/workspace.ts index 73e7abda0b836..6950284834849 100644 --- a/packages/plugin-ext/src/plugin/workspace.ts +++ b/packages/plugin-ext/src/plugin/workspace.ts @@ -168,7 +168,7 @@ export class WorkspaceExtImpl implements WorkspaceExt { } findFiles(include: theia.GlobPattern, exclude?: theia.GlobPattern | null, maxResults?: number, - token: CancellationToken = CancellationToken.None): PromiseLike { + token: theia.CancellationToken = CancellationToken.None): PromiseLike { let includePattern: string; let includeFolderUri: string | undefined; if (include) { @@ -204,7 +204,7 @@ export class WorkspaceExtImpl implements WorkspaceExt { } findTextInFiles(query: theia.TextSearchQuery, optionsOrCallback: theia.FindTextInFilesOptions | ((result: theia.TextSearchResult) => void), - callbackOrToken?: CancellationToken | ((result: theia.TextSearchResult) => void), token?: CancellationToken): Promise { + callbackOrToken?: theia.CancellationToken | ((result: theia.TextSearchResult) => void), token?: theia.CancellationToken): Promise { let options: theia.FindTextInFilesOptions; let callback: (result: theia.TextSearchResult) => void; diff --git a/packages/plugin-ext/tsconfig.json b/packages/plugin-ext/tsconfig.json index 837a4e391453d..ce160c8d31d61 100644 --- a/packages/plugin-ext/tsconfig.json +++ b/packages/plugin-ext/tsconfig.json @@ -8,7 +8,8 @@ "es6", "dom", "webworker" - ] + ], + "strictFunctionTypes": true }, "include": [ "src" diff --git a/packages/plugin-metrics/src/browser/plugin-metrics-languages-main.ts b/packages/plugin-metrics/src/browser/plugin-metrics-languages-main.ts index 0a6f529d9af3d..26affd62c5306 100644 --- a/packages/plugin-metrics/src/browser/plugin-metrics-languages-main.ts +++ b/packages/plugin-metrics/src/browser/plugin-metrics-languages-main.ts @@ -17,9 +17,8 @@ import { Range, SerializedDocumentFilter, WorkspaceSymbolParams } from '@theia/plugin-ext/lib/common/plugin-api-rpc-model'; import { PluginMetricsResolver } from './plugin-metrics-resolver'; import { LanguagesMainImpl } from '@theia/plugin-ext/lib/main/browser/languages-main'; -import { SymbolInformation } from '@theia/core/shared/vscode-languageserver-types'; import { injectable, inject } from '@theia/core/shared/inversify'; -import * as vst from '@theia/core/shared/vscode-languageserver-protocol'; +import * as lsp from '@theia/core/shared/vscode-languageserver-protocol'; import { PluginInfo } from '@theia/plugin-ext/lib/common/plugin-api-rpc'; import * as theia from '@theia/plugin'; @@ -40,103 +39,103 @@ export class LanguagesMainPluginMetrics extends LanguagesMainImpl { protected provideCompletionItems(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, context: monaco.languages.CompletionContext, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.CompletionRequest.type.method, + lsp.CompletionRequest.type.method, super.provideCompletionItems(handle, model, position, context, token)); } protected resolveCompletionItem(handle: number, item: monaco.languages.CompletionItem, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.CompletionRequest.type.method, + lsp.CompletionRequest.type.method, super.resolveCompletionItem(handle, item, token)); } protected provideReferences(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, context: monaco.languages.ReferenceContext, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.ReferencesRequest.type.method, + lsp.ReferencesRequest.type.method, super.provideReferences(handle, model, position, context, token)); } protected provideImplementation(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.ImplementationRequest.type.method, + lsp.ImplementationRequest.type.method, super.provideImplementation(handle, model, position, token)); } protected provideTypeDefinition(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.TypeDefinitionRequest.type.method, + lsp.TypeDefinitionRequest.type.method, super.provideTypeDefinition(handle, model, position, token)); } protected provideHover(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.HoverRequest.type.method, + lsp.HoverRequest.type.method, super.provideHover(handle, model, position, token)); } protected provideDocumentHighlights(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentHighlightRequest.type.method, + lsp.DocumentHighlightRequest.type.method, super.provideDocumentHighlights(handle, model, position, token)); } - protected provideWorkspaceSymbols(handle: number, params: WorkspaceSymbolParams, token: monaco.CancellationToken): Thenable { + protected provideWorkspaceSymbols(handle: number, params: WorkspaceSymbolParams, token: monaco.CancellationToken): Thenable { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.WorkspaceSymbolRequest.type.method, + lsp.WorkspaceSymbolRequest.type.method, super.provideWorkspaceSymbols(handle, params, token)); } - protected resolveWorkspaceSymbol(handle: number, symbol: SymbolInformation, token: monaco.CancellationToken): Thenable { + protected resolveWorkspaceSymbol(handle: number, symbol: lsp.SymbolInformation, token: monaco.CancellationToken): Thenable { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.WorkspaceSymbolRequest.type.method, + lsp.WorkspaceSymbolRequest.type.method, super.resolveWorkspaceSymbol(handle, symbol, token)); } protected async provideLinks(handle: number, model: monaco.editor.ITextModel, token: monaco.CancellationToken): Promise> { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentLinkRequest.type.method, + lsp.DocumentLinkRequest.type.method, super.provideLinks(handle, model, token)); } protected async resolveLink(handle: number, link: monaco.languages.ILink, token: monaco.CancellationToken): Promise> { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentLinkRequest.type.method, + lsp.DocumentLinkRequest.type.method, super.resolveLink(handle, link, token)); } protected async provideCodeLenses(handle: number, model: monaco.editor.ITextModel, token: monaco.CancellationToken): Promise> { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.CodeLensRequest.type.method, + lsp.CodeLensRequest.type.method, super.provideCodeLenses(handle, model, token)); } protected resolveCodeLens(handle: number, model: monaco.editor.ITextModel, codeLens: monaco.languages.CodeLens, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.CodeLensResolveRequest.type.method, + lsp.CodeLensResolveRequest.type.method, super.resolveCodeLens(handle, model, codeLens, token)); } protected provideDocumentSymbols(handle: number, model: monaco.editor.ITextModel, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentSymbolRequest.type.method, + lsp.DocumentSymbolRequest.type.method, super.provideDocumentSymbols(handle, model, token)); } protected provideDefinition(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DefinitionRequest.type.method, + lsp.DefinitionRequest.type.method, super.provideDefinition(handle, model, position, token)); } @@ -144,49 +143,49 @@ export class LanguagesMainPluginMetrics extends LanguagesMainImpl { position: monaco.Position, token: monaco.CancellationToken, context: monaco.languages.SignatureHelpContext): Promise> { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.SignatureHelpRequest.type.method, + lsp.SignatureHelpRequest.type.method, super.provideSignatureHelp(handle, model, position, token, context)); } protected provideDocumentFormattingEdits(handle: number, model: monaco.editor.ITextModel, options: monaco.languages.FormattingOptions, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentFormattingRequest.type.method, + lsp.DocumentFormattingRequest.type.method, super.provideDocumentFormattingEdits(handle, model, options, token)); } protected provideDocumentRangeFormattingEdits(handle: number, model: monaco.editor.ITextModel, range: Range, options: monaco.languages.FormattingOptions, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentRangeFormattingRequest.type.method, + lsp.DocumentRangeFormattingRequest.type.method, super.provideDocumentRangeFormattingEdits(handle, model, range, options, token)); } protected provideOnTypeFormattingEdits(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, ch: string, options: monaco.languages.FormattingOptions, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentOnTypeFormattingRequest.type.method, + lsp.DocumentOnTypeFormattingRequest.type.method, super.provideOnTypeFormattingEdits(handle, model, position, ch, options, token)); } protected provideFoldingRanges(handle: number, model: monaco.editor.ITextModel, context: monaco.languages.FoldingContext, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.FoldingRangeRequest.type.method, + lsp.FoldingRangeRequest.type.method, super.provideFoldingRanges(handle, model, context, token)); } protected provideDocumentColors(handle: number, model: monaco.editor.ITextModel, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.DocumentColorRequest.type.method, + lsp.DocumentColorRequest.type.method, super.provideDocumentColors(handle, model, token)); } protected provideColorPresentations(handle: number, model: monaco.editor.ITextModel, colorInfo: monaco.languages.IColorInformation, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.ColorPresentationRequest.type.method, + lsp.ColorPresentationRequest.type.method, super.provideColorPresentations(handle, model, colorInfo, token)); } @@ -194,21 +193,21 @@ export class LanguagesMainPluginMetrics extends LanguagesMainImpl { rangeOrSelection: Range, context: monaco.languages.CodeActionContext, token: monaco.CancellationToken): Promise { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.CodeActionRequest.type.method, + lsp.CodeActionRequest.type.method, super.provideCodeActions(handle, model, rangeOrSelection, context, token)); } protected provideRenameEdits(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, newName: string, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.RenameRequest.type.method, + lsp.RenameRequest.type.method, super.provideRenameEdits(handle, model, position, newName, token)); } protected resolveRenameLocation(handle: number, model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): monaco.languages.ProviderResult { return this.pluginMetricsResolver.resolveRequest(this.handleToExtensionName(handle), - vst.RenameRequest.type.method, + lsp.RenameRequest.type.method, super.resolveRenameLocation(handle, model, position, token)); } diff --git a/packages/preview/src/browser/preview-contribution.ts b/packages/preview/src/browser/preview-contribution.ts index c00ae6fb45fec..2ffb5acea36f8 100644 --- a/packages/preview/src/browser/preview-contribution.ts +++ b/packages/preview/src/browser/preview-contribution.ts @@ -22,7 +22,7 @@ import { DisposableCollection, CommandContribution, CommandRegistry, Command, Me import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { MiniBrowserCommands } from '@theia/mini-browser/lib/browser/mini-browser-open-handler'; import URI from '@theia/core/lib/common/uri'; -import { Position } from '@theia/core/shared/vscode-languageserver-types'; +import { Position } from '@theia/core/shared/vscode-languageserver-protocol'; import { PreviewWidget } from './preview-widget'; import { PreviewHandlerProvider } from './preview-handler'; import { PreviewUri } from './preview-uri'; diff --git a/packages/preview/src/browser/preview-widget.ts b/packages/preview/src/browser/preview-widget.ts index 0edc8156a1735..f697799e6f37b 100644 --- a/packages/preview/src/browser/preview-widget.ts +++ b/packages/preview/src/browser/preview-widget.ts @@ -26,7 +26,7 @@ import { ThemeService } from '@theia/core/lib/browser/theming'; import { EditorPreferences } from '@theia/editor/lib/browser'; import { Disposable } from '@theia/core/lib/common/disposable'; import { MonacoWorkspace } from '@theia/monaco/lib/browser/monaco-workspace'; -import { Range, Location } from '@theia/core/shared/vscode-languageserver-types'; +import { Range, Location } from '@theia/core/shared/vscode-languageserver-protocol'; export const PREVIEW_WIDGET_CLASS = 'theia-preview-widget'; diff --git a/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts b/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts index ac7ba2a8100c6..9e68678d42581 100644 --- a/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts +++ b/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts @@ -26,7 +26,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser'; import { SearchInWorkspaceContextKeyService } from './search-in-workspace-context-key-service'; import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; -import { Range } from '@theia/core/shared/vscode-languageserver-types'; +import { Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { SEARCH_VIEW_CONTAINER_ID } from './search-in-workspace-factory'; diff --git a/packages/task/src/browser/task-service.ts b/packages/task/src/browser/task-service.ts index 4336a15e10ac2..9365ff85aed17 100644 --- a/packages/task/src/browser/task-service.ts +++ b/packages/task/src/browser/task-service.ts @@ -30,7 +30,7 @@ import { TerminalWidgetFactoryOptions } from '@theia/terminal/lib/browser/termin import { VariableResolverService } from '@theia/variable-resolver/lib/browser'; import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service'; import { inject, injectable, named, postConstruct } from '@theia/core/shared/inversify'; -import { DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-types'; +import { DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { ApplyToKind, BackgroundTaskEndedEvent, @@ -1028,11 +1028,11 @@ export class TaskService implements TaskConfigurationClient { const registeredProblemMatchers = this.problemMatcherRegistry.getAll(); items.push(...registeredProblemMatchers.map(matcher => - ({ - label: matcher.label, - value: { problemMatchers: [matcher] }, - description: matcher.name.startsWith('$') ? matcher.name : `$${matcher.name}` - }) + ({ + label: matcher.label, + value: { problemMatchers: [matcher] }, + description: matcher.name.startsWith('$') ? matcher.name : `$${matcher.name}` + }) )); return items; } diff --git a/packages/task/src/common/problem-matcher-protocol.ts b/packages/task/src/common/problem-matcher-protocol.ts index 284c98e778ce3..9fc75aa788b1b 100644 --- a/packages/task/src/common/problem-matcher-protocol.ts +++ b/packages/task/src/common/problem-matcher-protocol.ts @@ -22,7 +22,7 @@ *--------------------------------------------------------------------------------------------*/ import { Severity } from '@theia/core/lib/common/severity'; -import { Diagnostic } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; // TODO use URI from `@theia/core` instead import { URI } from '@theia/core/shared/vscode-uri'; import { ProblemPatternContribution, WatchingMatcherContribution } from './task-protocol'; diff --git a/packages/task/src/node/task-abstract-line-matcher.ts b/packages/task/src/node/task-abstract-line-matcher.ts index 1cba36c22defd..b7b3414213dda 100644 --- a/packages/task/src/node/task-abstract-line-matcher.ts +++ b/packages/task/src/node/task-abstract-line-matcher.ts @@ -20,7 +20,7 @@ *--------------------------------------------------------------------------------------------*/ import { isWindows } from '@theia/core/lib/common/os'; -import { Diagnostic, DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-types'; +import { Diagnostic, DiagnosticSeverity, Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { FileLocationKind, ProblemMatcher, ProblemPattern, ProblemMatch, ProblemMatchData, ProblemLocationKind diff --git a/packages/task/src/node/task-problem-collector.spec.ts b/packages/task/src/node/task-problem-collector.spec.ts index bf84b9b7b156e..ac4f340031de4 100644 --- a/packages/task/src/node/task-problem-collector.spec.ts +++ b/packages/task/src/node/task-problem-collector.spec.ts @@ -15,7 +15,7 @@ ********************************************************************************/ import { expect } from 'chai'; -import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-types'; +import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import { ProblemCollector } from './task-problem-collector'; import { ApplyToKind, FileLocationKind, ProblemLocationKind, ProblemMatch, ProblemMatchData, ProblemMatcher } from '../common/problem-matcher-protocol'; import { Severity } from '@theia/core/lib/common/severity'; diff --git a/packages/terminal/src/browser/terminal-widget-impl.ts b/packages/terminal/src/browser/terminal-widget-impl.ts index a5d5748b68646..131e05548a8c0 100644 --- a/packages/terminal/src/browser/terminal-widget-impl.ts +++ b/packages/terminal/src/browser/terminal-widget-impl.ts @@ -26,7 +26,7 @@ import { terminalsPath } from '../common/terminal-protocol'; import { IBaseTerminalServer, TerminalProcessInfo } from '../common/base-terminal-protocol'; import { TerminalWatcher } from '../common/terminal-watcher'; import { TerminalWidgetOptions, TerminalWidget, TerminalDimensions } from './base/terminal-widget'; -import { MessageConnection } from '@theia/core/shared/vscode-ws-jsonrpc'; +import { MessageConnection } from '@theia/core/shared/vscode-languageserver-protocol'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { TerminalPreferences, TerminalRendererType, isTerminalRendererType, DEFAULT_TERMINAL_RENDERER_TYPE, CursorStyle } from './terminal-preferences'; import { TerminalContribution } from './terminal-contribution'; diff --git a/packages/typehierarchy/src/browser/tree/typehierarchy-tree-widget.tsx b/packages/typehierarchy/src/browser/tree/typehierarchy-tree-widget.tsx index 7a83e882ed45a..3dd6bef08ca9b 100644 --- a/packages/typehierarchy/src/browser/tree/typehierarchy-tree-widget.tsx +++ b/packages/typehierarchy/src/browser/tree/typehierarchy-tree-widget.tsx @@ -18,7 +18,7 @@ import * as React from '@theia/core/shared/react'; import { inject, injectable } from '@theia/core/shared/inversify'; import { DockPanel } from '@theia/core/shared/@phosphor/widgets'; import URI from '@theia/core/lib/common/uri'; -import { SymbolKind, Range } from '@theia/core/shared/vscode-languageserver-types'; +import { SymbolKind, Range } from '@theia/core/shared/vscode-languageserver-protocol'; import { TreeNode } from '@theia/core/lib/browser/tree/tree'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { ContextMenuRenderer } from '@theia/core/lib/browser/context-menu-renderer'; diff --git a/packages/typehierarchy/src/browser/typehierarchy-provider.ts b/packages/typehierarchy/src/browser/typehierarchy-provider.ts index 215356a408e74..91128bb09ef2e 100644 --- a/packages/typehierarchy/src/browser/typehierarchy-provider.ts +++ b/packages/typehierarchy/src/browser/typehierarchy-provider.ts @@ -16,8 +16,7 @@ import { injectable } from '@theia/core/shared/inversify'; import { Disposable } from '@theia/core/lib/common/disposable'; -import { SymbolKind, Range } from '@theia/core/shared/vscode-languageserver-types'; -import { TextDocumentPositionParams } from '@theia/core/shared/vscode-languageserver-protocol'; +import { SymbolKind, Range, TextDocumentPositionParams } from '@theia/core/shared/vscode-languageserver-protocol'; @injectable() export class TypeHierarchyRegistry { diff --git a/yarn.lock b/yarn.lock index c030664b14a5d..7bd05c8fe214c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10667,32 +10667,27 @@ vscode-debugprotocol@^1.32.0: resolved "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.50.1.tgz#8aa7114ede9ded5ee49ba056593ad936116cfb42" integrity sha512-kIHIipklHnSjBm2KkRqTJLKL2FMZlJl0+/qpJt2y62YOamMNwcxNATnXXRgAwnzKKRMweqp93tJ83UTJ8+O7SQ== -vscode-jsonrpc@^5.0.0, vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" + integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== -vscode-languageserver-protocol@~3.15.3: - version "3.15.3" - resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" + integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "6.0.0" + vscode-languageserver-types "3.16.0" vscode-languageserver-textdocument@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.2.tgz#2f9f6bd5b5eb3d8e21424c0c367009216f016236" integrity sha512-T7uPC18+f8mYE4lbVZwb3OSmvwTZm3cuFhrdx9Bn2l11lmp3SvSuSVjy2JtvrghzjAo4G6Trqny2m9XGnFnWVA== -vscode-languageserver-types@3.15.1: - version "3.15.1" - resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== - -vscode-languageserver-types@^3.15.1: +vscode-languageserver-types@3.16.0: version "3.16.0" - resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== vscode-ripgrep@^1.2.4: @@ -10720,13 +10715,6 @@ vscode-uri@^2.1.1: resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== -vscode-ws-jsonrpc@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-0.2.0.tgz#5e9c26e10da54a1a235da7d59e74508bbcb8edd9" - integrity sha512-NE9HNRgPjCaPyTJvIudcpyIWPImxwRDtuTX16yks7SAiZgSXigxAiZOvSvVBGmD1G/OMfrFo6BblOtjVR9DdVA== - dependencies: - vscode-jsonrpc "^5.0.0" - w3c-hr-time@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"