4
4
5
5
import vscode = require( "vscode" ) ;
6
6
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 } ;
9
24
10
25
export class HelpCompletionFeature implements IFeature {
11
26
private languageClient : LanguageClient ;
12
27
private triggerCharacters : string ;
13
28
private disposable : Disposable ;
29
+ private searchState : SearchState ;
14
30
constructor ( ) {
15
31
this . triggerCharacters = "#<" ;
16
32
let subscriptions = [ ] ;
17
33
workspace . onDidChangeTextDocument ( this . onEvent , this , subscriptions ) ;
34
+ this . searchState = SearchState . Searching ;
18
35
this . disposable = Disposable . from ( ...subscriptions ) ;
19
36
}
20
37
@@ -23,10 +40,54 @@ export class HelpCompletionFeature implements IFeature {
23
40
}
24
41
25
42
dispose ( ) {
26
-
43
+ this . disposable . dispose ( ) ;
27
44
}
28
45
29
46
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
+ }
31
92
}
32
93
}
0 commit comments