Skip to content

Commit 57b714b

Browse files
author
Christoph Bergmeister
committed
Use base class LanguageClientConsumer
1 parent 95a7c29 commit 57b714b

13 files changed

+63
-51
lines changed

src/features/Console.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ICheckboxQuickPickItem, showCheckboxQuickPick } from "../controls/check
88
import { IFeature } from "../feature";
99
import { Logger } from "../logging";
1010
import Settings = require("../settings");
11+
import { LanguageClientConsumer } from "../languageClientConsumer";
1112

1213
export const EvaluateRequestType = new RequestType<IEvaluateRequestArguments, void, void, void>("evaluate");
1314
export const OutputNotificationType = new NotificationType<IOutputNotificationBody, void>("output");
@@ -197,19 +198,14 @@ function onInputEntered(responseText: string): IShowInputPromptResponseBody {
197198
}
198199
}
199200

200-
export class ConsoleFeature implements IFeature {
201+
export class ConsoleFeature extends LanguageClientConsumer implements IFeature {
201202
private commands: vscode.Disposable[];
202-
private languageClient: LanguageClient;
203203
private resolveStatusBarPromise: (value?: {} | PromiseLike<{}>) => void;
204204

205205
constructor(private log: Logger) {
206+
super();
206207
this.commands = [
207208
vscode.commands.registerCommand("PowerShell.RunSelection", async () => {
208-
if (this.languageClient === undefined) {
209-
this.log.writeAndShowError(`<${ConsoleFeature.name}>: ` +
210-
"Unable to instantiate; language client undefined.");
211-
return;
212-
}
213209

214210
if (vscode.window.activeTerminal &&
215211
vscode.window.activeTerminal.name !== "PowerShell Integrated Console") {
@@ -257,7 +253,6 @@ export class ConsoleFeature implements IFeature {
257253

258254
public setLanguageClient(languageClient: LanguageClient) {
259255
this.languageClient = languageClient;
260-
261256
this.languageClient.onRequest(
262257
ShowChoicePromptRequestType,
263258
(promptDetails) => showChoicePrompt(promptDetails, this.languageClient));

src/features/CustomViews.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import * as path from "path";
66
import * as vscode from "vscode";
77
import { LanguageClient, RequestType } from "vscode-languageclient";
88
import { IFeature } from "../feature";
9+
import { LanguageClientConsumer } from "../languageClientConsumer";
910

10-
export class CustomViewsFeature implements IFeature {
11+
export class CustomViewsFeature extends LanguageClientConsumer implements IFeature {
1112

1213
private commands: vscode.Disposable[] = [];
1314
private contentProvider: PowerShellContentProvider;
1415

1516
constructor() {
17+
super();
1618
this.contentProvider = new PowerShellContentProvider();
1719
this.commands.push(
1820
vscode.workspace.registerTextDocumentContentProvider(

src/features/DebugSession.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,21 @@ import Settings = require("../settings");
1414
import utils = require("../utils");
1515
import { NamedPipeDebugAdapter } from "../debugAdapter";
1616
import { Logger } from "../logging";
17+
import { LanguageClientConsumer } from "../languageClientConsumer";
1718

1819
export const StartDebuggerNotificationType =
1920
new NotificationType<void, void>("powerShell/startDebugger");
2021

21-
export class DebugSessionFeature implements IFeature, DebugConfigurationProvider, vscode.DebugAdapterDescriptorFactory {
22+
export class DebugSessionFeature extends LanguageClientConsumer
23+
implements IFeature, DebugConfigurationProvider, vscode.DebugAdapterDescriptorFactory {
2224

2325
private sessionCount: number = 1;
2426
private command: vscode.Disposable;
2527
private tempDebugProcess: PowerShellProcess;
2628
private tempSessionDetails: utils.IEditorServicesSessionDetails;
2729

2830
constructor(context: ExtensionContext, private sessionManager: SessionManager, private logger: Logger) {
31+
super();
2932
// Register a debug configuration provider
3033
context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("PowerShell", this));
3134
context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory("PowerShell", this))
@@ -386,14 +389,14 @@ interface IGetPSHostProcessesResponseBody {
386389
hostProcesses: IPSHostProcessInfo[];
387390
}
388391

389-
export class PickPSHostProcessFeature implements IFeature {
392+
export class PickPSHostProcessFeature extends LanguageClientConsumer implements IFeature {
390393

391394
private command: vscode.Disposable;
392-
private languageClient: LanguageClient;
393395
private waitingForClientToken: vscode.CancellationTokenSource;
394396
private getLanguageClientResolve: (value?: LanguageClient | Thenable<LanguageClient>) => void;
395397

396398
constructor() {
399+
super();
397400

398401
this.command =
399402
vscode.commands.registerCommand("PowerShell.PickPSHostProcess", () => {
@@ -517,14 +520,14 @@ interface IRunspace {
517520
export const GetRunspaceRequestType =
518521
new RequestType<any, IRunspace[], string, void>("powerShell/getRunspace");
519522

520-
export class PickRunspaceFeature implements IFeature {
523+
export class PickRunspaceFeature extends LanguageClientConsumer implements IFeature {
521524

522525
private command: vscode.Disposable;
523-
private languageClient: LanguageClient;
524526
private waitingForClientToken: vscode.CancellationTokenSource;
525527
private getLanguageClientResolve: (value?: LanguageClient | Thenable<LanguageClient>) => void;
526528

527529
constructor() {
530+
super();
528531
this.command =
529532
vscode.commands.registerCommand("PowerShell.PickRunspace", (processId) => {
530533
return this.getLanguageClient()

src/features/ExpandAlias.ts

+3-8
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,17 @@
55
import vscode = require("vscode");
66
import Window = vscode.window;
77
import { LanguageClient, NotificationType, RequestType } from "vscode-languageclient";
8-
import { IFeature } from "../feature";
98
import { Logger } from "../logging";
9+
import { LanguageClientConsumer } from "../languageClientConsumer";
1010

1111
export const ExpandAliasRequestType = new RequestType<any, any, void, void>("powerShell/expandAlias");
1212

13-
export class ExpandAliasFeature implements IFeature {
13+
export class ExpandAliasFeature extends LanguageClientConsumer {
1414
private command: vscode.Disposable;
15-
private languageClient: LanguageClient;
1615

1716
constructor(private log: Logger) {
17+
super();
1818
this.command = vscode.commands.registerCommand("PowerShell.ExpandAlias", () => {
19-
if (this.languageClient === undefined) {
20-
this.log.writeAndShowError(`<${ExpandAliasFeature.name}>: ` +
21-
"Unable to instantiate; language client undefined.");
22-
return;
23-
}
2419

2520
const editor = Window.activeTextEditor;
2621
const document = editor.document;

src/features/ExtensionCommands.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { LanguageClient, NotificationType, NotificationType0,
1111
import { IFeature } from "../feature";
1212
import { Logger } from "../logging";
1313
import Settings = require("../settings");
14+
import { LanguageClientConsumer } from "../languageClientConsumer";
1415

1516
export interface IExtensionCommand {
1617
name: string;
@@ -173,20 +174,15 @@ interface IInvokeRegisteredEditorCommandParameter {
173174
commandName: string;
174175
}
175176

176-
export class ExtensionCommandsFeature implements IFeature {
177+
export class ExtensionCommandsFeature extends LanguageClientConsumer implements IFeature {
177178

178179
private command: vscode.Disposable;
179180
private command2: vscode.Disposable;
180-
private languageClient: LanguageClient;
181181
private extensionCommands: IExtensionCommand[] = [];
182182

183183
constructor(private log: Logger) {
184+
super();
184185
this.command = vscode.commands.registerCommand("PowerShell.ShowAdditionalCommands", () => {
185-
if (this.languageClient === undefined) {
186-
this.log.writeAndShowError(`<${ExtensionCommandsFeature.name}>: ` +
187-
"Unable to instantiate; language client undefined.");
188-
return;
189-
}
190186

191187
const editor = vscode.window.activeTextEditor;
192188
let start = editor.selection.start;

src/features/FindModule.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@
33
*--------------------------------------------------------*/
44

55
import vscode = require("vscode");
6-
import { LanguageClient, NotificationType, RequestType } from "vscode-languageclient";
7-
import Window = vscode.window;
6+
import { LanguageClient, RequestType } from "vscode-languageclient";
87
import { IFeature } from "../feature";
98
import QuickPickItem = vscode.QuickPickItem;
9+
import { LanguageClientConsumer } from "../languageClientConsumer";
1010

1111
export const FindModuleRequestType =
1212
new RequestType<any, any, void, void>("powerShell/findModule");
1313

1414
export const InstallModuleRequestType =
1515
new RequestType<string, void, void, void>("powerShell/installModule");
1616

17-
export class FindModuleFeature implements IFeature {
17+
export class FindModuleFeature extends LanguageClientConsumer implements IFeature {
1818

1919
private command: vscode.Disposable;
20-
private languageClient: LanguageClient;
2120
private cancelFindToken: vscode.CancellationTokenSource;
2221

2322
constructor() {
23+
super();
2424
this.command = vscode.commands.registerCommand("PowerShell.PowerShellFindModule", () => {
2525
// It takes a while to get the list of PowerShell modules, display some UI to let user know
2626
this.cancelFindToken = new vscode.CancellationTokenSource();

src/features/GetCommands.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as vscode from "vscode";
55
import { LanguageClient, RequestType0 } from "vscode-languageclient";
66
import { IFeature } from "../feature";
77
import { Logger } from "../logging";
8+
import { LanguageClientConsumer } from "../languageClientConsumer";
89

910
interface ICommand {
1011
name: string;
@@ -23,13 +24,13 @@ export const GetCommandRequestType = new RequestType0<ICommand[], void, void>("p
2324
/**
2425
* A PowerShell Command listing feature. Implements a treeview control.
2526
*/
26-
export class GetCommandsFeature implements IFeature {
27+
export class GetCommandsFeature extends LanguageClientConsumer implements IFeature {
2728
private command: vscode.Disposable;
28-
private languageClient: LanguageClient;
2929
private commandsExplorerProvider: CommandsExplorerProvider;
3030
private commandsExplorerTreeView: vscode.TreeView<Command>;
3131

3232
constructor(private log: Logger) {
33+
super();
3334
this.command = vscode.commands.registerCommand("PowerShell.RefreshCommandsExplorer",
3435
() => this.CommandExplorerRefresh());
3536
this.commandsExplorerProvider = new CommandsExplorerProvider();

src/features/HelpCompletion.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { LanguageClient, RequestType } from "vscode-languageclient";
88
import { IFeature } from "../feature";
99
import { Logger } from "../logging";
1010
import Settings = require("../settings");
11+
import { LanguageClientConsumer } from "../languageClientConsumer";
1112

1213
export const CommentHelpRequestType =
1314
new RequestType<any, any, void, void>("powerShell/getCommentHelp");
@@ -24,13 +25,13 @@ interface ICommentHelpRequestResult {
2425

2526
enum SearchState { Searching, Locked, Found }
2627

27-
export class HelpCompletionFeature implements IFeature {
28+
export class HelpCompletionFeature extends LanguageClientConsumer implements IFeature {
2829
private helpCompletionProvider: HelpCompletionProvider;
29-
private languageClient: LanguageClient;
3030
private disposable: Disposable;
3131
private settings: Settings.ISettings;
3232

3333
constructor(private log: Logger) {
34+
super();
3435
this.settings = Settings.load();
3536

3637
if (this.settings.helpCompletion !== Settings.HelpCompletion.Disabled) {

src/features/NewFileOrProject.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
*--------------------------------------------------------*/
44

55
import vscode = require("vscode");
6-
import { LanguageClient, NotificationType, RequestType } from "vscode-languageclient";
6+
import { LanguageClient, RequestType } from "vscode-languageclient";
77
import { IFeature } from "../feature";
8+
import { LanguageClientConsumer } from "../languageClientConsumer";
89

9-
export class NewFileOrProjectFeature implements IFeature {
10+
export class NewFileOrProjectFeature extends LanguageClientConsumer implements IFeature {
1011

1112
private readonly loadIcon = " $(sync) ";
1213
private command: vscode.Disposable;
13-
private languageClient: LanguageClient;
1414
private waitingForClientToken: vscode.CancellationTokenSource;
1515

1616
constructor() {
17+
super();
1718
this.command =
1819
vscode.commands.registerCommand("PowerShell.NewProjectFromTemplate", () => {
1920

src/features/RemoteFiles.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import os = require("os");
66
import path = require("path");
77
import vscode = require("vscode");
8-
import { LanguageClient, NotificationType, RequestType, TextDocumentIdentifier } from "vscode-languageclient";
8+
import { LanguageClient, NotificationType, TextDocumentIdentifier } from "vscode-languageclient";
99
import { IFeature } from "../feature";
10+
import { LanguageClientConsumer } from "../languageClientConsumer";
1011

1112
// NOTE: The following two DidSaveTextDocument* types will
1213
// be removed when #593 gets fixed.
@@ -22,12 +23,12 @@ export const DidSaveTextDocumentNotificationType =
2223
new NotificationType<IDidSaveTextDocumentParams, void>(
2324
"textDocument/didSave");
2425

25-
export class RemoteFilesFeature implements IFeature {
26+
export class RemoteFilesFeature extends LanguageClientConsumer implements IFeature {
2627

2728
private tempSessionPathPrefix: string;
28-
private languageClient: LanguageClient;
2929

3030
constructor() {
31+
super();
3132
// Get the common PowerShell Editor Services temporary file path
3233
// so that remote files from previous sessions can be closed.
3334
this.tempSessionPathPrefix =

src/features/ShowHelp.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,18 @@ import vscode = require("vscode");
66
import { LanguageClient, NotificationType } from "vscode-languageclient";
77
import { IFeature } from "../feature";
88
import { Logger } from "../logging";
9+
import { LanguageClientConsumer } from "../languageClientConsumer";
910

1011
export const ShowHelpNotificationType =
1112
new NotificationType<any, void>("powerShell/showHelp");
1213

13-
export class ShowHelpFeature implements IFeature {
14+
export class ShowHelpFeature extends LanguageClientConsumer implements IFeature {
1415
private command: vscode.Disposable;
1516
private deprecatedCommand: vscode.Disposable;
16-
private languageClient: LanguageClient;
1717

1818
constructor(private log: Logger) {
19+
super();
1920
this.command = vscode.commands.registerCommand("PowerShell.ShowHelp", (item?) => {
20-
if (this.languageClient === undefined) {
21-
this.log.writeAndShowError(`<${ShowHelpFeature.name}>: ` +
22-
"Unable to instantiate; language client undefined.");
23-
return;
24-
}
2521
if (!item || !item.Name) {
2622

2723
const editor = vscode.window.activeTextEditor;

src/languageClientConsumer.ts

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*---------------------------------------------------------
2+
* Copyright (C) Microsoft Corporation. All rights reserved.
3+
*--------------------------------------------------------*/
4+
5+
import { LanguageClient, IFeature } from "./feature";
6+
import { window } from "vscode";
7+
8+
export class LanguageClientConsumer {
9+
private _languageClient: LanguageClient;
10+
11+
public get languageClient(): LanguageClient {
12+
if (!this._languageClient) {
13+
window.showInformationMessage(
14+
"PowerShell extension has not finished starting up yet. Please try again in a few moments.");
15+
}
16+
return this._languageClient;
17+
}
18+
19+
public set languageClient(value: LanguageClient) {
20+
this._languageClient = value;
21+
}
22+
}

src/main.ts

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import { Logger, LogLevel } from "./logging";
3434
import { SessionManager } from "./session";
3535
import Settings = require("./settings");
3636
import { PowerShellLanguageId } from "./utils";
37-
import utils = require("./utils");
3837

3938
// The most reliable way to get the name and version of the current extension.
4039
// tslint:disable-next-line: no-var-requires

0 commit comments

Comments
 (0)