Skip to content

Commit 78cc836

Browse files
committed
src/language: move legacy provider registration to a separate module
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]>
1 parent cff188b commit 78cc836

File tree

2 files changed

+70
-61
lines changed

2 files changed

+70
-61
lines changed

src/language/goLanguageServer.ts

Lines changed: 10 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,17 @@ import {
3535
} from 'vscode-languageclient';
3636
import { LanguageClient } from 'vscode-languageclient/node';
3737
import { getGoConfig, getGoplsConfig, extensionInfo } from '../config';
38-
import { GoCodeActionProvider } from './legacy/goCodeAction';
39-
import { GoDefinitionProvider } from './legacy/goDeclaration';
4038
import { toolExecutionEnvironment } from '../goEnv';
41-
import { GoHoverProvider } from './legacy/goExtraInfo';
4239
import { GoDocumentFormattingEditProvider, usingCustomFormatTool } from './legacy/goFormat';
43-
import { GoImplementationProvider } from './legacy/goImplementations';
4440
import { installTools, latestToolVersion, promptForMissingTool, promptForUpdatingTool } from '../goInstallTools';
45-
import { parseLiveFile } from './legacy/goLiveErrors';
4641
import {
4742
buildDiagnosticCollection,
4843
lintDiagnosticCollection,
4944
restartLanguageServer,
5045
vetDiagnosticCollection
5146
} from '../goMain';
52-
import { GO_MODE } from '../goMode';
53-
import { GoDocumentSymbolProvider } from './legacy/goOutline';
54-
import { GoReferenceProvider } from './legacy/goReferences';
55-
import { GoRenameProvider } from './legacy/goRename';
56-
import { GoSignatureHelpProvider } from './legacy/goSignature';
5747
import { outputChannel, updateLanguageServerIconGoStatusBar } from '../goStatus';
58-
import { GoCompletionItemProvider } from './legacy/goSuggest';
59-
import { GoWorkspaceSymbolProvider } from './legacy/goSymbol';
6048
import { getTool, Tool } from '../goTools';
61-
import { GoTypeDefinitionProvider } from './legacy/goTypeDefinition';
6249
import { getFromGlobalState, updateGlobalState, updateWorkspaceState } from '../stateUtils';
6350
import {
6451
getBinPath,
@@ -75,6 +62,7 @@ import { FoldingContext } from 'vscode';
7562
import { ProvideFoldingRangeSignature } from 'vscode-languageclient/lib/common/foldingRange';
7663
import { daysBetween, getStateConfig, maybePromptForGoplsSurvey, timeDay, timeMinute } from '../goSurvey';
7764
import { maybePromptForDeveloperSurvey } from '../goDeveloperSurvey';
65+
import { LegacyLanguageService } from './registerDefaultProviders';
7866

7967
interface LanguageServerConfig {
8068
serverName: string;
@@ -101,6 +89,7 @@ let languageServerDisposable: vscode.Disposable;
10189
export let latestConfig: LanguageServerConfig;
10290
export let serverOutputChannel: vscode.OutputChannel;
10391
export let languageServerIsRunning = false;
92+
10493
// serverInfo is the information from the server received during initialization.
10594
export let serverInfo: ServerInfo = undefined;
10695

@@ -111,6 +100,8 @@ interface ServerInfo {
111100
Commands?: string[];
112101
}
113102

103+
let legacyLanguageService: LegacyLanguageService = undefined;
104+
114105
const languageServerStartMutex = new Mutex();
115106

116107
let serverTraceChannel: vscode.OutputChannel;
@@ -149,9 +140,6 @@ class Restart {
149140
}
150141
}
151142

152-
// defaultLanguageProviders is the list of providers currently registered.
153-
let defaultLanguageProviders: vscode.Disposable[] = [];
154-
155143
// restartCommand is the command used by the user to restart the language
156144
// server.
157145
let restartCommand: vscode.Disposable;
@@ -216,8 +204,9 @@ export async function startLanguageServerWithFallback(ctx: vscode.ExtensionConte
216204
// If the server has been disabled, or failed to start,
217205
// fall back to the default providers, while making sure not to
218206
// re-register any providers.
219-
if (!started && defaultLanguageProviders.length === 0) {
220-
registerDefaultProviders(ctx);
207+
if (!started && !legacyLanguageService) {
208+
legacyLanguageService = new LegacyLanguageService(ctx);
209+
ctx.subscriptions.push(legacyLanguageService);
221210
}
222211
languageServerIsRunning = started;
223212
updateLanguageServerIconGoStatusBar(started, goConfig['useLanguageServer'] === true);
@@ -451,7 +440,9 @@ async function startLanguageServer(ctx: vscode.ExtensionContext, config: Languag
451440

452441
// Before starting the language server, make sure to deregister any
453442
// currently registered language providers.
454-
disposeDefaultProviders();
443+
444+
legacyLanguageService?.dispose();
445+
legacyLanguageService = undefined;
455446

456447
languageServerDisposable = languageClient.start();
457448
ctx.subscriptions.push(languageServerDisposable);
@@ -904,48 +895,6 @@ function createBenchmarkCodeLens(lens: vscode.CodeLens): vscode.CodeLens[] {
904895
];
905896
}
906897

907-
// registerUsualProviders registers the language feature providers if the language server is not enabled.
908-
function registerDefaultProviders(ctx: vscode.ExtensionContext) {
909-
const completionProvider = new GoCompletionItemProvider(ctx.globalState);
910-
defaultLanguageProviders.push(completionProvider);
911-
defaultLanguageProviders.push(
912-
vscode.languages.registerCompletionItemProvider(GO_MODE, completionProvider, '.', '"')
913-
);
914-
defaultLanguageProviders.push(vscode.languages.registerHoverProvider(GO_MODE, new GoHoverProvider()));
915-
defaultLanguageProviders.push(vscode.languages.registerDefinitionProvider(GO_MODE, new GoDefinitionProvider()));
916-
defaultLanguageProviders.push(vscode.languages.registerReferenceProvider(GO_MODE, new GoReferenceProvider()));
917-
defaultLanguageProviders.push(
918-
vscode.languages.registerDocumentSymbolProvider(GO_MODE, new GoDocumentSymbolProvider())
919-
);
920-
defaultLanguageProviders.push(vscode.languages.registerWorkspaceSymbolProvider(new GoWorkspaceSymbolProvider()));
921-
defaultLanguageProviders.push(
922-
vscode.languages.registerSignatureHelpProvider(GO_MODE, new GoSignatureHelpProvider(), '(', ',')
923-
);
924-
defaultLanguageProviders.push(
925-
vscode.languages.registerImplementationProvider(GO_MODE, new GoImplementationProvider())
926-
);
927-
defaultLanguageProviders.push(
928-
vscode.languages.registerDocumentFormattingEditProvider(GO_MODE, new GoDocumentFormattingEditProvider())
929-
);
930-
defaultLanguageProviders.push(
931-
vscode.languages.registerTypeDefinitionProvider(GO_MODE, new GoTypeDefinitionProvider())
932-
);
933-
defaultLanguageProviders.push(vscode.languages.registerRenameProvider(GO_MODE, new GoRenameProvider()));
934-
defaultLanguageProviders.push(vscode.workspace.onDidChangeTextDocument(parseLiveFile, null, ctx.subscriptions));
935-
defaultLanguageProviders.push(vscode.languages.registerCodeActionsProvider(GO_MODE, new GoCodeActionProvider()));
936-
937-
for (const provider of defaultLanguageProviders) {
938-
ctx.subscriptions.push(provider);
939-
}
940-
}
941-
942-
function disposeDefaultProviders() {
943-
for (const disposable of defaultLanguageProviders) {
944-
disposable.dispose();
945-
}
946-
defaultLanguageProviders = [];
947-
}
948-
949898
export async function watchLanguageServerConfiguration(e: vscode.ConfigurationChangeEvent) {
950899
if (!e.affectsConfiguration('go')) {
951900
return;
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
/*---------------------------------------------------------
3+
* Copyright (C) Microsoft Corporation. All rights reserved.
4+
* Modification copyright 2020 The Go Authors. All rights reserved.
5+
* Licensed under the MIT License. See LICENSE in the project root for license information.
6+
*--------------------------------------------------------*/
7+
'use strict';
8+
import vscode = require('vscode');
9+
import { GoCodeActionProvider } from './legacy/goCodeAction';
10+
import { GoDefinitionProvider } from './legacy/goDeclaration';
11+
import { GoHoverProvider } from './legacy/goExtraInfo';
12+
import { GoDocumentFormattingEditProvider } from './legacy/goFormat';
13+
import { GoImplementationProvider } from './legacy/goImplementations';
14+
import { parseLiveFile } from './legacy/goLiveErrors';
15+
import { GO_MODE } from '../goMode';
16+
import { GoDocumentSymbolProvider } from './legacy/goOutline';
17+
import { GoReferenceProvider } from './legacy/goReferences';
18+
import { GoRenameProvider } from './legacy/goRename';
19+
import { GoSignatureHelpProvider } from './legacy/goSignature';
20+
import { GoCompletionItemProvider } from './legacy/goSuggest';
21+
import { GoWorkspaceSymbolProvider } from './legacy/goSymbol';
22+
import { GoTypeDefinitionProvider } from './legacy/goTypeDefinition';
23+
24+
export class LegacyLanguageService implements vscode.Disposable {
25+
private _disposables: vscode.Disposable[] = [];
26+
27+
constructor(ctx: vscode.ExtensionContext) {
28+
const completionProvider = new GoCompletionItemProvider(ctx.globalState);
29+
this._disposables.push(completionProvider);
30+
this._disposables.push(vscode.languages.registerCompletionItemProvider(GO_MODE, completionProvider, '.', '"'));
31+
this._disposables.push(vscode.languages.registerHoverProvider(GO_MODE, new GoHoverProvider()));
32+
this._disposables.push(vscode.languages.registerDefinitionProvider(GO_MODE, new GoDefinitionProvider()));
33+
this._disposables.push(vscode.languages.registerReferenceProvider(GO_MODE, new GoReferenceProvider()));
34+
this._disposables.push(
35+
vscode.languages.registerDocumentSymbolProvider(GO_MODE, new GoDocumentSymbolProvider())
36+
);
37+
this._disposables.push(vscode.languages.registerWorkspaceSymbolProvider(new GoWorkspaceSymbolProvider()));
38+
this._disposables.push(
39+
vscode.languages.registerSignatureHelpProvider(GO_MODE, new GoSignatureHelpProvider(), '(', ',')
40+
);
41+
this._disposables.push(
42+
vscode.languages.registerImplementationProvider(GO_MODE, new GoImplementationProvider())
43+
);
44+
this._disposables.push(
45+
vscode.languages.registerDocumentFormattingEditProvider(GO_MODE, new GoDocumentFormattingEditProvider())
46+
);
47+
this._disposables.push(
48+
vscode.languages.registerTypeDefinitionProvider(GO_MODE, new GoTypeDefinitionProvider())
49+
);
50+
this._disposables.push(vscode.languages.registerRenameProvider(GO_MODE, new GoRenameProvider()));
51+
this._disposables.push(vscode.workspace.onDidChangeTextDocument(parseLiveFile, null, ctx.subscriptions));
52+
this._disposables.push(vscode.languages.registerCodeActionsProvider(GO_MODE, new GoCodeActionProvider()));
53+
}
54+
55+
dispose() {
56+
for (const d of this._disposables) {
57+
d.dispose();
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)