Skip to content

Commit

Permalink
src/language: move legacy provider registration to a separate module
Browse files Browse the repository at this point in the history
Change-Id: I7fd7d43cef26f508bbabef27ef0f32a87c907210
Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/387961
Trust: Hyang-Ah Hana Kim <[email protected]>
Run-TryBot: Hyang-Ah Hana Kim <[email protected]>
Reviewed-by: Jamal Carvalho <[email protected]>
TryBot-Result: kokoro <[email protected]>
  • Loading branch information
hyangah committed Mar 10, 2022
1 parent cff188b commit 78cc836
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 61 deletions.
71 changes: 10 additions & 61 deletions src/language/goLanguageServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,30 +35,17 @@ import {
} from 'vscode-languageclient';
import { LanguageClient } from 'vscode-languageclient/node';
import { getGoConfig, getGoplsConfig, extensionInfo } from '../config';
import { GoCodeActionProvider } from './legacy/goCodeAction';
import { GoDefinitionProvider } from './legacy/goDeclaration';
import { toolExecutionEnvironment } from '../goEnv';
import { GoHoverProvider } from './legacy/goExtraInfo';
import { GoDocumentFormattingEditProvider, usingCustomFormatTool } from './legacy/goFormat';
import { GoImplementationProvider } from './legacy/goImplementations';
import { installTools, latestToolVersion, promptForMissingTool, promptForUpdatingTool } from '../goInstallTools';
import { parseLiveFile } from './legacy/goLiveErrors';
import {
buildDiagnosticCollection,
lintDiagnosticCollection,
restartLanguageServer,
vetDiagnosticCollection
} from '../goMain';
import { GO_MODE } from '../goMode';
import { GoDocumentSymbolProvider } from './legacy/goOutline';
import { GoReferenceProvider } from './legacy/goReferences';
import { GoRenameProvider } from './legacy/goRename';
import { GoSignatureHelpProvider } from './legacy/goSignature';
import { outputChannel, updateLanguageServerIconGoStatusBar } from '../goStatus';
import { GoCompletionItemProvider } from './legacy/goSuggest';
import { GoWorkspaceSymbolProvider } from './legacy/goSymbol';
import { getTool, Tool } from '../goTools';
import { GoTypeDefinitionProvider } from './legacy/goTypeDefinition';
import { getFromGlobalState, updateGlobalState, updateWorkspaceState } from '../stateUtils';
import {
getBinPath,
Expand All @@ -75,6 +62,7 @@ import { FoldingContext } from 'vscode';
import { ProvideFoldingRangeSignature } from 'vscode-languageclient/lib/common/foldingRange';
import { daysBetween, getStateConfig, maybePromptForGoplsSurvey, timeDay, timeMinute } from '../goSurvey';
import { maybePromptForDeveloperSurvey } from '../goDeveloperSurvey';
import { LegacyLanguageService } from './registerDefaultProviders';

interface LanguageServerConfig {
serverName: string;
Expand All @@ -101,6 +89,7 @@ let languageServerDisposable: vscode.Disposable;
export let latestConfig: LanguageServerConfig;
export let serverOutputChannel: vscode.OutputChannel;
export let languageServerIsRunning = false;

// serverInfo is the information from the server received during initialization.
export let serverInfo: ServerInfo = undefined;

Expand All @@ -111,6 +100,8 @@ interface ServerInfo {
Commands?: string[];
}

let legacyLanguageService: LegacyLanguageService = undefined;

const languageServerStartMutex = new Mutex();

let serverTraceChannel: vscode.OutputChannel;
Expand Down Expand Up @@ -149,9 +140,6 @@ class Restart {
}
}

// defaultLanguageProviders is the list of providers currently registered.
let defaultLanguageProviders: vscode.Disposable[] = [];

// restartCommand is the command used by the user to restart the language
// server.
let restartCommand: vscode.Disposable;
Expand Down Expand Up @@ -216,8 +204,9 @@ export async function startLanguageServerWithFallback(ctx: vscode.ExtensionConte
// If the server has been disabled, or failed to start,
// fall back to the default providers, while making sure not to
// re-register any providers.
if (!started && defaultLanguageProviders.length === 0) {
registerDefaultProviders(ctx);
if (!started && !legacyLanguageService) {
legacyLanguageService = new LegacyLanguageService(ctx);
ctx.subscriptions.push(legacyLanguageService);
}
languageServerIsRunning = started;
updateLanguageServerIconGoStatusBar(started, goConfig['useLanguageServer'] === true);
Expand Down Expand Up @@ -451,7 +440,9 @@ async function startLanguageServer(ctx: vscode.ExtensionContext, config: Languag

// Before starting the language server, make sure to deregister any
// currently registered language providers.
disposeDefaultProviders();

legacyLanguageService?.dispose();
legacyLanguageService = undefined;

languageServerDisposable = languageClient.start();
ctx.subscriptions.push(languageServerDisposable);
Expand Down Expand Up @@ -904,48 +895,6 @@ function createBenchmarkCodeLens(lens: vscode.CodeLens): vscode.CodeLens[] {
];
}

// registerUsualProviders registers the language feature providers if the language server is not enabled.
function registerDefaultProviders(ctx: vscode.ExtensionContext) {
const completionProvider = new GoCompletionItemProvider(ctx.globalState);
defaultLanguageProviders.push(completionProvider);
defaultLanguageProviders.push(
vscode.languages.registerCompletionItemProvider(GO_MODE, completionProvider, '.', '"')
);
defaultLanguageProviders.push(vscode.languages.registerHoverProvider(GO_MODE, new GoHoverProvider()));
defaultLanguageProviders.push(vscode.languages.registerDefinitionProvider(GO_MODE, new GoDefinitionProvider()));
defaultLanguageProviders.push(vscode.languages.registerReferenceProvider(GO_MODE, new GoReferenceProvider()));
defaultLanguageProviders.push(
vscode.languages.registerDocumentSymbolProvider(GO_MODE, new GoDocumentSymbolProvider())
);
defaultLanguageProviders.push(vscode.languages.registerWorkspaceSymbolProvider(new GoWorkspaceSymbolProvider()));
defaultLanguageProviders.push(
vscode.languages.registerSignatureHelpProvider(GO_MODE, new GoSignatureHelpProvider(), '(', ',')
);
defaultLanguageProviders.push(
vscode.languages.registerImplementationProvider(GO_MODE, new GoImplementationProvider())
);
defaultLanguageProviders.push(
vscode.languages.registerDocumentFormattingEditProvider(GO_MODE, new GoDocumentFormattingEditProvider())
);
defaultLanguageProviders.push(
vscode.languages.registerTypeDefinitionProvider(GO_MODE, new GoTypeDefinitionProvider())
);
defaultLanguageProviders.push(vscode.languages.registerRenameProvider(GO_MODE, new GoRenameProvider()));
defaultLanguageProviders.push(vscode.workspace.onDidChangeTextDocument(parseLiveFile, null, ctx.subscriptions));
defaultLanguageProviders.push(vscode.languages.registerCodeActionsProvider(GO_MODE, new GoCodeActionProvider()));

for (const provider of defaultLanguageProviders) {
ctx.subscriptions.push(provider);
}
}

function disposeDefaultProviders() {
for (const disposable of defaultLanguageProviders) {
disposable.dispose();
}
defaultLanguageProviders = [];
}

export async function watchLanguageServerConfiguration(e: vscode.ConfigurationChangeEvent) {
if (!e.affectsConfiguration('go')) {
return;
Expand Down
60 changes: 60 additions & 0 deletions src/language/registerDefaultProviders.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
* Modification copyright 2020 The Go Authors. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
'use strict';
import vscode = require('vscode');
import { GoCodeActionProvider } from './legacy/goCodeAction';
import { GoDefinitionProvider } from './legacy/goDeclaration';
import { GoHoverProvider } from './legacy/goExtraInfo';
import { GoDocumentFormattingEditProvider } from './legacy/goFormat';
import { GoImplementationProvider } from './legacy/goImplementations';
import { parseLiveFile } from './legacy/goLiveErrors';
import { GO_MODE } from '../goMode';
import { GoDocumentSymbolProvider } from './legacy/goOutline';
import { GoReferenceProvider } from './legacy/goReferences';
import { GoRenameProvider } from './legacy/goRename';
import { GoSignatureHelpProvider } from './legacy/goSignature';
import { GoCompletionItemProvider } from './legacy/goSuggest';
import { GoWorkspaceSymbolProvider } from './legacy/goSymbol';
import { GoTypeDefinitionProvider } from './legacy/goTypeDefinition';

export class LegacyLanguageService implements vscode.Disposable {
private _disposables: vscode.Disposable[] = [];

constructor(ctx: vscode.ExtensionContext) {
const completionProvider = new GoCompletionItemProvider(ctx.globalState);
this._disposables.push(completionProvider);
this._disposables.push(vscode.languages.registerCompletionItemProvider(GO_MODE, completionProvider, '.', '"'));
this._disposables.push(vscode.languages.registerHoverProvider(GO_MODE, new GoHoverProvider()));
this._disposables.push(vscode.languages.registerDefinitionProvider(GO_MODE, new GoDefinitionProvider()));
this._disposables.push(vscode.languages.registerReferenceProvider(GO_MODE, new GoReferenceProvider()));
this._disposables.push(
vscode.languages.registerDocumentSymbolProvider(GO_MODE, new GoDocumentSymbolProvider())
);
this._disposables.push(vscode.languages.registerWorkspaceSymbolProvider(new GoWorkspaceSymbolProvider()));
this._disposables.push(
vscode.languages.registerSignatureHelpProvider(GO_MODE, new GoSignatureHelpProvider(), '(', ',')
);
this._disposables.push(
vscode.languages.registerImplementationProvider(GO_MODE, new GoImplementationProvider())
);
this._disposables.push(
vscode.languages.registerDocumentFormattingEditProvider(GO_MODE, new GoDocumentFormattingEditProvider())
);
this._disposables.push(
vscode.languages.registerTypeDefinitionProvider(GO_MODE, new GoTypeDefinitionProvider())
);
this._disposables.push(vscode.languages.registerRenameProvider(GO_MODE, new GoRenameProvider()));
this._disposables.push(vscode.workspace.onDidChangeTextDocument(parseLiveFile, null, ctx.subscriptions));
this._disposables.push(vscode.languages.registerCodeActionsProvider(GO_MODE, new GoCodeActionProvider()));
}

dispose() {
for (const d of this._disposables) {
d.dispose();
}
}
}

0 comments on commit 78cc836

Please sign in to comment.