Skip to content

Commit

Permalink
feat: add restart language server command (denoland#385)
Browse files Browse the repository at this point in the history
Resolves denoland#372
  • Loading branch information
kitsonk authored Apr 7, 2021
1 parent bb4ef8b commit 76441b9
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 93 deletions.
68 changes: 52 additions & 16 deletions client/src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,28 @@
/** Contains handlers for commands that are enabled in Visual Studio Code for
* the extension. */

import { EXTENSION_NS } from "./constants";
import {
ENABLEMENT_FLAG,
EXTENSION_NS,
LANGUAGE_CLIENT_ID,
LANGUAGE_CLIENT_NAME,
} from "./constants";
import { pickInitWorkspace } from "./initialize_project";
import type { DenoExtensionContext } from "./interfaces";
import { cache as cacheReq } from "./lsp_extensions";
import { WelcomePanel } from "./welcome";

import * as vscode from "vscode";

import {
commands,
ExtensionContext,
ProgressLocation,
Uri,
ViewColumn,
window,
workspace,
} from "vscode";
import {
import { LanguageClient } from "vscode-languageclient/node";
import type {
DocumentUri,
LanguageClient,
Location,
Position,
} from "vscode-languageclient/node";
Expand All @@ -30,14 +33,14 @@ import {
export type Callback = (...args: any[]) => unknown;
export type Factory = (
context: ExtensionContext,
client: LanguageClient,
extensionContext: DenoExtensionContext,
) => Callback;

/** For the current document active in the editor tell the Deno LSP to cache
* the file and all of its dependencies in the local cache. */
export function cache(
_context: ExtensionContext,
client: LanguageClient,
extensionContext: DenoExtensionContext,
): Callback {
return (uris: DocumentUri[] = []) => {
const activeEditor = window.activeTextEditor;
Expand All @@ -48,7 +51,7 @@ export function cache(
location: ProgressLocation.Window,
title: "caching",
}, () => {
return client.sendRequest(
return extensionContext.client.sendRequest(
cacheReq,
{
referrer: { uri: activeEditor.document.uri.toString() },
Expand All @@ -63,7 +66,7 @@ export function cache(

export function initializeWorkspace(
_context: ExtensionContext,
_client: LanguageClient,
_extensionContext: DenoExtensionContext,
): Callback {
return async () => {
try {
Expand All @@ -81,16 +84,49 @@ export function initializeWorkspace(
};
}

/** Start (or restart) the Deno Language Server */
export function startLanguageServer(
context: ExtensionContext,
extensionContext: DenoExtensionContext,
): Callback {
return async () => {
const { statusBarItem } = extensionContext;
if (extensionContext.client) {
await extensionContext.client.stop();
statusBarItem.hide();
commands.executeCommand("setContext", ENABLEMENT_FLAG, false);
}
const client = extensionContext.client = new LanguageClient(
LANGUAGE_CLIENT_ID,
LANGUAGE_CLIENT_NAME,
extensionContext.serverOptions,
extensionContext.clientOptions,
);
context.subscriptions.push(client.start());
await client.onReady();
commands.executeCommand("setContext", ENABLEMENT_FLAG, true);
const serverVersion = extensionContext.serverVersion =
(client.initializeResult?.serverInfo?.version ?? "")
.split(
" ",
)[0];
statusBarItem.text = `Deno ${serverVersion}`;
statusBarItem.tooltip = client
.initializeResult?.serverInfo?.version;
statusBarItem.show();
};
}

export function showReferences(
_content: ExtensionContext,
client: LanguageClient,
extensionContext: DenoExtensionContext,
): Callback {
return (uri: string, position: Position, locations: Location[]) => {
commands.executeCommand(
"editor.action.showReferences",
Uri.parse(uri),
client.protocol2CodeConverter.asPosition(position),
locations.map(client.protocol2CodeConverter.asLocation),
extensionContext.client.protocol2CodeConverter.asPosition(position),
locations.map(extensionContext.client.protocol2CodeConverter.asLocation),
);
};
}
Expand All @@ -99,17 +135,17 @@ export function showReferences(
* Deno Language Server. */
export function status(
_context: ExtensionContext,
_client: LanguageClient,
_extensionContext: DenoExtensionContext,
): Callback {
return () => {
const uri = Uri.parse("deno:/status.md");
return vscode.commands.executeCommand("markdown.showPreviewToSide", uri);
return commands.executeCommand("markdown.showPreviewToSide", uri);
};
}

export function welcome(
context: ExtensionContext,
_client: LanguageClient,
_extensionContext: DenoExtensionContext,
): Callback {
return () => {
WelcomePanel.createOrShow(context.extensionUri);
Expand Down
3 changes: 3 additions & 0 deletions client/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.

export const ENABLEMENT_FLAG = "deno:lspReady";
export const EXTENSION_ID = "denoland.vscode-deno";
export const EXTENSION_NS = "deno";
export const EXTENSION_TS_PLUGIN = "typescript-deno-plugin";
export const LANGUAGE_CLIENT_ID = "deno-language-server";
export const LANGUAGE_CLIENT_NAME = "Deno Language Server";
export const TS_LANGUAGE_FEATURES_EXTENSION =
"vscode.typescript-language-features";
7 changes: 4 additions & 3 deletions client/src/content_provider.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.

import type { DenoExtensionContext } from "./interfaces";
import { virtualTextDocument } from "./lsp_extensions";

import type {
CancellationToken,
ProviderResult,
TextDocumentContentProvider,
Uri,
} from "vscode";
import type { LanguageClient } from "vscode-languageclient/node";

export const SCHEME = "deno";

export class DenoTextDocumentContentProvider
implements TextDocumentContentProvider {
constructor(private client: LanguageClient) {}
constructor(private extensionContext: DenoExtensionContext) {}

provideTextDocumentContent(
uri: Uri,
token: CancellationToken,
): ProviderResult<string> {
return this.client.sendRequest(
return this.extensionContext.client.sendRequest(
virtualTextDocument,
{ textDocument: { uri: uri.toString() } },
token,
Expand Down
Loading

0 comments on commit 76441b9

Please sign in to comment.