Skip to content

Commit 02198db

Browse files
rjmholtrkeithhill
authored andcommitted
Defend HelpCompletion from null message from VSCode (#1236)
* Defend HelpCompletion from null message from VSCode * Null check changeEvent.contentChanges[0] and log bad messages * Move contentChanges length check below null chk It is actually very common that contentChanges array is length 0 so let's not gen a message to the log.
1 parent 3edb290 commit 02198db

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

src/features/HelpCompletion.ts

+17-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Disposable, EndOfLine, Position, Range, SnippetString,
66
TextDocument, TextDocumentChangeEvent, window, workspace } from "vscode";
77
import { LanguageClient, RequestType } from "vscode-languageclient";
88
import { IFeature } from "../feature";
9+
import { Logger } from "../logging";
910

1011
export const CommentHelpRequestType =
1112
new RequestType<any, any, void, void>("powerShell/getCommentHelp");
@@ -27,7 +28,7 @@ export class HelpCompletionFeature implements IFeature {
2728
private languageClient: LanguageClient;
2829
private disposable: Disposable;
2930

30-
constructor() {
31+
constructor(private log: Logger) {
3132
this.helpCompletionProvider = new HelpCompletionProvider();
3233
const subscriptions = [];
3334
workspace.onDidChangeTextDocument(this.onEvent, this, subscriptions);
@@ -44,14 +45,21 @@ export class HelpCompletionFeature implements IFeature {
4445
}
4546

4647
public onEvent(changeEvent: TextDocumentChangeEvent): void {
47-
this.helpCompletionProvider.updateState(
48-
changeEvent.document,
49-
changeEvent.contentChanges[0].text,
50-
changeEvent.contentChanges[0].range);
51-
52-
// todo raise an event when trigger is found, and attach complete() to the event.
53-
if (this.helpCompletionProvider.triggerFound) {
54-
this.helpCompletionProvider.complete().then(() => this.helpCompletionProvider.reset());
48+
if (!(changeEvent && changeEvent.contentChanges)) {
49+
this.log.write(`Bad TextDocumentChangeEvent message: ${JSON.stringify(changeEvent)}`);
50+
return;
51+
}
52+
53+
if (changeEvent.contentChanges.length > 0) {
54+
this.helpCompletionProvider.updateState(
55+
changeEvent.document,
56+
changeEvent.contentChanges[0].text,
57+
changeEvent.contentChanges[0].range);
58+
59+
// todo raise an event when trigger is found, and attach complete() to the event.
60+
if (this.helpCompletionProvider.triggerFound) {
61+
this.helpCompletionProvider.complete().then(() => this.helpCompletionProvider.reset());
62+
}
5563
}
5664
}
5765
}

src/main.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ export function activate(context: vscode.ExtensionContext): void {
124124
new DebugSessionFeature(context, sessionManager),
125125
new PickPSHostProcessFeature(),
126126
new SpecifyScriptArgsFeature(context),
127-
new HelpCompletionFeature(),
127+
new HelpCompletionFeature(logger),
128128
new CustomViewsFeature(),
129129
];
130130

0 commit comments

Comments
 (0)