Skip to content

Commit 9f15c59

Browse files
Kapil Borledaviwil
authored andcommitted
Implement a very basic comment help provider
1 parent 887baf2 commit 9f15c59

File tree

1 file changed

+65
-4
lines changed

1 file changed

+65
-4
lines changed

src/features/HelpCompletion.ts

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,34 @@
44

55
import vscode = require("vscode");
66
import { IFeature } from "../feature";
7-
import { TextDocumentChangeEvent, workspace, Disposable } from "vscode";
8-
import { LanguageClient } from "vscode-languageclient/lib/main";
7+
import { TextDocumentChangeEvent, workspace, Disposable, Position } from "vscode";
8+
import { LanguageClient, RequestType } from "vscode-languageclient";
9+
10+
export namespace CommentHelpRequest {
11+
export const type = new RequestType<any, any, void, void>("powerShell/getCommentHelp");
12+
}
13+
14+
interface CommentHelpRequestParams {
15+
documentUri: string;
16+
triggerPosition: Position;
17+
}
18+
19+
interface CommentHelpRequestResult {
20+
content: string[];
21+
}
22+
23+
enum SearchState { Searching, Locked, Found };
924

1025
export class HelpCompletionFeature implements IFeature {
1126
private languageClient: LanguageClient;
1227
private triggerCharacters: string;
1328
private disposable: Disposable;
29+
private searchState: SearchState;
1430
constructor() {
1531
this.triggerCharacters = "#<";
1632
let subscriptions = [];
1733
workspace.onDidChangeTextDocument(this.onEvent, this, subscriptions);
34+
this.searchState = SearchState.Searching;
1835
this.disposable = Disposable.from(...subscriptions);
1936
}
2037

@@ -23,10 +40,54 @@ export class HelpCompletionFeature implements IFeature {
2340
}
2441

2542
dispose() {
26-
43+
this.disposable.dispose();
2744
}
2845

2946
onEvent(changeEvent: TextDocumentChangeEvent): void {
30-
console.log(`event triggered. change content: ${changeEvent.contentChanges[0].text}`);
47+
let text = changeEvent.contentChanges[0].text;
48+
switch (this.searchState) {
49+
case SearchState.Searching:
50+
if (text.length === 1 && text[0] === this.triggerCharacters[0]) {
51+
this.searchState = SearchState.Locked;
52+
}
53+
break;
54+
55+
case SearchState.Locked:
56+
if (text.length === 1 && text[0] === this.triggerCharacters[1]) {
57+
this.searchState = SearchState.Found;
58+
}
59+
break;
60+
}
61+
62+
let r = changeEvent.contentChanges[0].range;
63+
console.log(`Search State: ${this.searchState.toString()}; Range: (${r.start.line}, ${r.start.character}), (${r.end.line}, ${r.end.character})`);
64+
if (this.searchState === SearchState.Found) {
65+
this.searchState = SearchState.Searching;
66+
if (this.languageClient) {
67+
let change = changeEvent.contentChanges[0];
68+
let triggerStartPos = change.range.start;
69+
let triggerEndPos = change.range.end;
70+
let doc = changeEvent.document;
71+
this.languageClient.sendRequest(
72+
CommentHelpRequest.type,
73+
{
74+
documentUri: changeEvent.document.uri.toString(),
75+
triggerPosition: triggerStartPos
76+
}).then(result => {
77+
let content = result.content;
78+
if (content === undefined) {
79+
return;
80+
}
81+
82+
// todo allow "##" as trigger characters
83+
// todo remove the new line after help block
84+
// todo get the eol character programmatically or let the server return one whole string
85+
let editor = vscode.window.activeTextEditor;
86+
let replaceRange = new vscode.Range(triggerStartPos.translate(0, -1), triggerStartPos.translate(0, 1));
87+
let text = content.join("\r\n");
88+
editor.edit(editbuilder => editbuilder.replace(replaceRange, text));
89+
});
90+
}
91+
}
3192
}
3293
}

0 commit comments

Comments
 (0)