44
55import vscode = require( "vscode" ) ;
66import { 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
1025export 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