Skip to content

Commit 3022dc5

Browse files
committed
WIP
1 parent 1b50b3d commit 3022dc5

14 files changed

+87
-73
lines changed

src/features/Console.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ function onInputEntered(responseText: string | undefined): IShowInputPromptRespo
170170

171171
export class ConsoleFeature extends LanguageClientConsumer {
172172
private commands: vscode.Disposable[];
173-
private handlers: vscode.Disposable[];
173+
private handlers: vscode.Disposable[] = [];
174174

175175
constructor(private log: Logger) {
176176
super();
@@ -203,7 +203,7 @@ export class ConsoleFeature extends LanguageClientConsumer {
203203
selectionRange = editor.document.lineAt(editor.selection.start.line).range;
204204
}
205205

206-
await this.languageClient.sendRequest(EvaluateRequestType, {
206+
await this.languageClient?.sendRequest(EvaluateRequestType, {
207207
expression: editor.document.getText(selectionRange),
208208
});
209209

src/features/CustomViews.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class HtmlContentView extends CustomView {
158158
styleSheetPaths: [],
159159
};
160160

161-
private webviewPanel: vscode.WebviewPanel;
161+
private webviewPanel: vscode.WebviewPanel | undefined;
162162

163163
constructor(
164164
id: string,
@@ -196,9 +196,7 @@ class HtmlContentView extends CustomView {
196196
}
197197

198198
public showContent(viewColumn: vscode.ViewColumn): void {
199-
if (this.webviewPanel) {
200-
this.webviewPanel.dispose();
201-
}
199+
this.webviewPanel?.dispose();
202200

203201
let localResourceRoots: vscode.Uri[] = [];
204202
if (this.htmlContent.javaScriptPaths) {

src/features/DebugSession.ts

+22-9
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ export class DebugSessionFeature extends LanguageClientConsumer
3333
implements DebugConfigurationProvider, vscode.DebugAdapterDescriptorFactory {
3434

3535
private sessionCount: number = 1;
36-
private tempDebugProcess: PowerShellProcess;
37-
private tempSessionDetails: IEditorServicesSessionDetails;
38-
private handlers: vscode.Disposable[];
36+
private tempDebugProcess: PowerShellProcess | undefined;
37+
private tempSessionDetails: IEditorServicesSessionDetails | undefined;
38+
private handlers: vscode.Disposable[] = [];
3939
private configs: Record<DebugConfig, DebugConfiguration> = {
4040
[DebugConfig.LaunchCurrentFile]: {
4141
name: "PowerShell: Launch Current File",
@@ -68,7 +68,7 @@ export class DebugSessionFeature extends LanguageClientConsumer
6868
super();
6969
// Register a debug configuration provider
7070
context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider("PowerShell", this));
71-
context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory("PowerShell", this))
71+
context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory("PowerShell", this));
7272
}
7373

7474
createDebugAdapterDescriptor(
@@ -79,6 +79,11 @@ export class DebugSessionFeature extends LanguageClientConsumer
7979
? this.tempSessionDetails
8080
: this.sessionManager.getSessionDetails();
8181

82+
if (sessionDetails === undefined) {
83+
this.logger.writeAndShowError(`No session details available for ${session.name}`);
84+
return;
85+
}
86+
8287
this.logger.writeVerbose(`Connecting to pipe: ${sessionDetails.debugServicePipeName}`);
8388
this.logger.writeVerbose(`Debug configuration: ${JSON.stringify(session.configuration)}`);
8489

@@ -254,11 +259,17 @@ export class DebugSessionFeature extends LanguageClientConsumer
254259
private async resolveAttachDebugConfiguration(config: DebugConfiguration): Promise<DebugConfiguration | undefined | null> {
255260
const platformDetails = getPlatformDetails();
256261
const versionDetails = this.sessionManager.getPowerShellVersionDetails();
262+
if (versionDetails === undefined) {
263+
vscode.window.showErrorMessage(`Session version details were not found for ${config.name}`)
264+
return null;
265+
}
266+
257267
// Cross-platform attach to process was added in 6.2.0-preview.4.
258268
if (versionDetails.version < "7.0.0" && platformDetails.operatingSystem !== OperatingSystem.Windows) {
259269
vscode.window.showErrorMessage(`Attaching to a PowerShell Host Process on ${OperatingSystem[platformDetails.operatingSystem]} requires PowerShell 7.0 or higher.`);
260270
return undefined;
261271
}
272+
262273
// If nothing is set, prompt for the processId.
263274
if (!config.customPipeName && !config.processId) {
264275
config.processId = await vscode.commands.executeCommand("PowerShell.PickPSHostProcess");
@@ -267,13 +278,15 @@ export class DebugSessionFeature extends LanguageClientConsumer
267278
return null;
268279
}
269280
}
281+
270282
if (!config.runspaceId && !config.runspaceName) {
271283
config.runspaceId = await vscode.commands.executeCommand("PowerShell.PickRunspace", config.processId);
272284
// No runspace selected. Cancel attach.
273285
if (!config.runspaceId) {
274286
return null;
275287
}
276288
}
289+
277290
return config;
278291
}
279292
}
@@ -341,7 +354,7 @@ export class PickPSHostProcessFeature extends LanguageClientConsumer {
341354

342355
private command: vscode.Disposable;
343356
private waitingForClientToken?: vscode.CancellationTokenSource;
344-
private getLanguageClientResolve: (value: LanguageClient) => void;
357+
private getLanguageClientResolve?: (value: LanguageClient) => void;
345358

346359
constructor() {
347360
super();
@@ -356,7 +369,7 @@ export class PickPSHostProcessFeature extends LanguageClientConsumer {
356369
public setLanguageClient(languageClient: LanguageClient) {
357370
this.languageClient = languageClient;
358371

359-
if (this.waitingForClientToken) {
372+
if (this.waitingForClientToken && this.getLanguageClientResolve) {
360373
this.getLanguageClientResolve(this.languageClient);
361374
this.clearWaitingToken();
362375
}
@@ -462,7 +475,7 @@ export class PickRunspaceFeature extends LanguageClientConsumer {
462475

463476
private command: vscode.Disposable;
464477
private waitingForClientToken?: vscode.CancellationTokenSource;
465-
private getLanguageClientResolve: (value: LanguageClient) => void;
478+
private getLanguageClientResolve?: (value: LanguageClient) => void;
466479

467480
constructor() {
468481
super();
@@ -476,7 +489,7 @@ export class PickRunspaceFeature extends LanguageClientConsumer {
476489
public setLanguageClient(languageClient: LanguageClient) {
477490
this.languageClient = languageClient;
478491

479-
if (this.waitingForClientToken) {
492+
if (this.waitingForClientToken && this.getLanguageClientResolve) {
480493
this.getLanguageClientResolve(this.languageClient);
481494
this.clearWaitingToken();
482495
}
@@ -526,7 +539,7 @@ export class PickRunspaceFeature extends LanguageClientConsumer {
526539
}
527540

528541
private async pickRunspace(processId: string): Promise<string | undefined> {
529-
const response = await this.languageClient.sendRequest(GetRunspaceRequestType, { processId });
542+
const response = await this.languageClient?.sendRequest(GetRunspaceRequestType, { processId });
530543
const items: IRunspaceItem[] = [];
531544
for (const runspace of response) {
532545
// Skip default runspace

src/features/ExpandAlias.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export class ExpandAliasFeature extends LanguageClientConsumer {
2424
const sls = selection.start;
2525
const sle = selection.end;
2626

27-
let text;
28-
let range;
27+
let text: string | any[];
28+
let range: vscode.Range | vscode.Position;
2929

3030
if ((sls.character === sle.character) && (sls.line === sle.line)) {
3131
text = document.getText();
@@ -35,7 +35,7 @@ export class ExpandAliasFeature extends LanguageClientConsumer {
3535
range = new vscode.Range(sls.line, sls.character, sle.line, sle.character);
3636
}
3737

38-
this.languageClient.sendRequest(ExpandAliasRequestType, { text }).then((result) => {
38+
this.languageClient?.sendRequest(ExpandAliasRequestType, { text }).then((result) => {
3939
editor.edit((editBuilder) => {
4040
editBuilder.replace(range, result.text);
4141
});

src/features/ExtensionCommands.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,16 @@ interface IInvokeRegisteredEditorCommandParameter {
172172

173173
export class ExtensionCommandsFeature extends LanguageClientConsumer {
174174
private commands: vscode.Disposable[];
175-
private handlers: vscode.Disposable[];
175+
private handlers: vscode.Disposable[] = [];
176176
private extensionCommands: IExtensionCommand[] = [];
177177

178178
constructor(private log: Logger) {
179179
super();
180180
this.commands = [
181181
vscode.commands.registerCommand("PowerShell.ShowAdditionalCommands", async () => {
182-
await this.showExtensionCommands(this.languageClient);
182+
if (this.languageClient !== undefined) {
183+
await this.showExtensionCommands(this.languageClient);
184+
}
183185
}),
184186

185187
vscode.commands.registerCommand("PowerShell.InvokeRegisteredEditorCommand",
@@ -191,7 +193,7 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
191193
const commandToExecute = this.extensionCommands.find((x) => x.name === param.commandName);
192194

193195
if (commandToExecute) {
194-
await this.languageClient.sendRequest(
196+
await this.languageClient?.sendRequest(
195197
InvokeExtensionCommandRequestType,
196198
{
197199
name: commandToExecute.name,
@@ -340,10 +342,10 @@ export class ExtensionCommandsFeature extends LanguageClientConsumer {
340342

341343
private onCommandSelected(
342344
chosenItem: IExtensionCommandQuickPickItem | undefined,
343-
client: LanguageClient) {
345+
client: LanguageClient | undefined) {
344346

345347
if (chosenItem !== undefined) {
346-
client.sendRequest(
348+
client?.sendRequest(
347349
InvokeExtensionCommandRequestType,
348350
{
349351
name: chosenItem.command.name,

src/features/FindModule.ts

+23-23
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ export class FindModuleFeature extends LanguageClientConsumer {
4444

4545
this.pickPowerShellModule().then((moduleName) => {
4646
if (moduleName) {
47-
// vscode.window.setStatusBarMessage("Installing PowerShell Module " + moduleName, 1500);
48-
this.languageClient.sendRequest(InstallModuleRequestType, moduleName);
47+
this.languageClient?.sendRequest(InstallModuleRequestType, moduleName);
4948
}
5049
});
5150
});
@@ -55,37 +54,38 @@ export class FindModuleFeature extends LanguageClientConsumer {
5554
this.command.dispose();
5655
}
5756

58-
private pickPowerShellModule(): Thenable<string> {
59-
return this.languageClient.sendRequest(FindModuleRequestType, undefined).then((modules) => {
60-
const items: QuickPickItem[] = [];
57+
private async pickPowerShellModule(): Promise<string | undefined> {
58+
const modules = await this.languageClient?.sendRequest(FindModuleRequestType, undefined);
59+
const items: QuickPickItem[] = [];
6160

62-
// We've got the modules info, let's cancel the timeout unless it's already been cancelled
63-
if (this.cancelFindToken) {
64-
this.clearCancelFindToken();
65-
} else {
66-
// Already timed out, would be weird to display modules after we said it timed out.
67-
return Promise.resolve("");
68-
}
61+
// We've got the modules info, let's cancel the timeout unless it's already been cancelled
62+
if (this.cancelFindToken) {
63+
this.clearCancelFindToken();
64+
} else {
65+
// Already timed out, would be weird to display modules after we said it timed out.
66+
return Promise.resolve("");
67+
}
6968

69+
if (modules !== undefined) {
7070
for (const item in modules) {
7171
if (modules.hasOwnProperty(item)) {
7272
items.push({ label: modules[item].name, description: modules[item].description });
7373
}
7474
}
75+
}
7576

76-
if (items.length === 0) {
77-
return Promise.reject("No PowerShell modules were found.");
78-
}
77+
if (items.length === 0) {
78+
return Promise.reject("No PowerShell modules were found.");
79+
}
7980

80-
const options: vscode.QuickPickOptions = {
81-
placeHolder: "Select a PowerShell module to install",
82-
matchOnDescription: true,
83-
matchOnDetail: true,
84-
};
81+
const options: vscode.QuickPickOptions = {
82+
placeHolder: "Select a PowerShell module to install",
83+
matchOnDescription: true,
84+
matchOnDetail: true,
85+
};
8586

86-
return vscode.window.showQuickPick(items, options).then((item) => {
87-
return item ? item.label : "";
88-
});
87+
return vscode.window.showQuickPick(items, options).then((item) => {
88+
return item ? item.label : "";
8989
});
9090
}
9191

src/features/GenerateBugReport.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ ${this.generateExtensionTable(extensions)}
7979
this.command.dispose();
8080
}
8181

82-
private generateExtensionTable(installedExtensions): string {
82+
private generateExtensionTable(installedExtensions: vscode.Extension<any>[]): string {
8383
if (!installedExtensions.length) {
8484
return "none";
8585
}

src/features/GetCommands.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class GetCommandsFeature extends LanguageClientConsumer {
6666
}
6767
this.languageClient.sendRequest(GetCommandRequestType).then((result) => {
6868
const SidebarConfig = vscode.workspace.getConfiguration("powershell.sideBar");
69-
const excludeFilter = (SidebarConfig.CommandExplorerExcludeFilter).map((filter) => filter.toLowerCase());
69+
const excludeFilter = (SidebarConfig.CommandExplorerExcludeFilter).map((filter: string) => filter.toLowerCase());
7070
result = result.filter((command) => (excludeFilter.indexOf(command.moduleName.toLowerCase()) === -1));
7171
this.commandsExplorerProvider.powerShellCommands = result.map(toCommand);
7272
this.commandsExplorerProvider.refresh();
@@ -90,7 +90,7 @@ export class GetCommandsFeature extends LanguageClientConsumer {
9090

9191
class CommandsExplorerProvider implements vscode.TreeDataProvider<Command> {
9292
public readonly onDidChangeTreeData: vscode.Event<Command | undefined>;
93-
public powerShellCommands: Command[];
93+
public powerShellCommands: Command[] = [];
9494
private didChangeTreeData: vscode.EventEmitter<Command | undefined> = new vscode.EventEmitter<Command>();
9595

9696
constructor() {

src/features/ShowHelp.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ export class ShowHelpFeature extends LanguageClientConsumer {
2626
const cwr = doc.getWordRangeAtPosition(selection.active);
2727
const text = doc.getText(cwr);
2828

29-
this.languageClient.sendNotification(ShowHelpNotificationType, { text });
29+
this.languageClient?.sendNotification(ShowHelpNotificationType, { text });
3030
} else {
31-
this.languageClient.sendNotification(ShowHelpNotificationType, { text: item.Name } );
31+
this.languageClient?.sendNotification(ShowHelpNotificationType, { text: item.Name } );
3232
}
3333
});
3434
}

src/languageClientConsumer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ import { LanguageClient } from "vscode-languageclient/node";
66

77
export abstract class LanguageClientConsumer {
88

9-
private _languageClient: LanguageClient;
9+
private _languageClient: LanguageClient | undefined;
1010

1111
public setLanguageClient(languageClient: LanguageClient) {
1212
this.languageClient = languageClient;
1313
}
1414

1515
abstract dispose(): void;
1616

17-
public get languageClient(): LanguageClient {
17+
public get languageClient(): LanguageClient | undefined {
1818
if (!this._languageClient) {
1919
window.showInformationMessage(
2020
"PowerShell extension has not finished starting up yet. Please try again in a few moments.");
2121
}
2222
return this._languageClient;
2323
}
2424

25-
public set languageClient(value: LanguageClient) {
25+
public set languageClient(value: LanguageClient | undefined) {
2626
this._languageClient = value;
2727
}
2828
}

src/logging.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ export interface ILogger {
3030

3131
export class Logger implements ILogger {
3232
public logBasePath: vscode.Uri;
33-
public logSessionPath: vscode.Uri;
33+
public logSessionPath: vscode.Uri | undefined;
3434
public MinimumLogLevel: LogLevel = LogLevel.Normal;
3535

3636
private commands: vscode.Disposable[];
3737
private logChannel: vscode.OutputChannel;
38-
private logFilePath: vscode.Uri;
38+
private logFilePath: vscode.Uri | undefined;
3939

4040
constructor(logBasePath: vscode.Uri) {
4141
this.logChannel = vscode.window.createOutputChannel("PowerShell Extension Logs");
@@ -59,7 +59,7 @@ export class Logger implements ILogger {
5959
}
6060

6161
public getLogFilePath(baseName: string): vscode.Uri {
62-
return vscode.Uri.joinPath(this.logSessionPath, `${baseName}.log`);
62+
return vscode.Uri.joinPath(this.logSessionPath!, `${baseName}.log`);
6363
}
6464

6565
private writeAtLevel(logLevel: LogLevel, message: string, ...additionalMessages: string[]): void {

src/platform.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ export class PowerShellExeFinder {
8080
// Additional configured PowerShells
8181
private readonly additionalPSExeSettings: IPowerShellAdditionalExePathSettings;
8282

83-
private winPS: IPossiblePowerShellExe;
83+
private winPS: IPossiblePowerShellExe | undefined;
8484

85-
private alternateBitnessWinPS: IPossiblePowerShellExe;
85+
private alternateBitnessWinPS: IPossiblePowerShellExe | undefined;
8686

8787
/**
8888
* Create a new PowerShellFinder object to discover PowerShell installations.

0 commit comments

Comments
 (0)