@@ -67,93 +67,99 @@ export class PickPSHostProcessFeature implements IFeature {
67
67
private command : vscode . Disposable ;
68
68
private languageClient : LanguageClient ;
69
69
private waitingForClientToken : vscode . CancellationTokenSource ;
70
+ private getLanguageClientResolve : ( value ?: LanguageClient | Thenable < LanguageClient > ) => void ;
70
71
71
72
constructor ( ) {
73
+
72
74
this . command =
73
75
vscode . commands . registerCommand ( 'PowerShell.PickPSHostProcess' , ( ) => {
74
-
75
- if ( ! this . languageClient && ! this . waitingForClientToken ) {
76
- return new Promise < string > ( ( resolve , reject ) => {
77
- reject ( "PowerShell has not fully initialized. Try to attach again after PowerShell has been initialized." ) ;
78
- } ) ;
79
-
80
- // // If PowerShell isn't finished loading yet, show a loading message
81
- // // until the LanguageClient is passed on to us
82
- // var cancelled = false;
83
- // var timedOut = false;
84
- // this.waitingForClientToken = new vscode.CancellationTokenSource();
85
-
86
- // vscode.window
87
- // .showQuickPick(
88
- // ["Cancel"],
89
- // { placeHolder: "Attach to PowerShell host process: Please wait, starting PowerShell..." },
90
- // this.waitingForClientToken.token)
91
- // .then(response => {
92
- // if (response === "Cancel") {
93
- // this.clearWaitingToken();
94
- // }
95
- // });
96
-
97
- // // Cancel the loading prompt after 60 seconds
98
- // setTimeout(() => {
99
- // if (this.waitingForClientToken) {
100
- // this.clearWaitingToken();
101
-
102
- // vscode.window.showErrorMessage(
103
- // "Attach to PowerShell host process: PowerShell session took too long to start.");
104
- // }
105
- // }, 60000);
106
-
107
- // // Wait w/timeout on language client to be initialized and then return this.pickPSHostProcess;
108
- }
109
- else {
110
- return this . pickPSHostProcess ( ) ;
111
- }
76
+ return this . getLanguageClient ( )
77
+ . then ( _ => this . pickPSHostProcess ( ) , _ => undefined ) ;
112
78
} ) ;
113
79
}
114
80
115
81
public setLanguageClient ( languageClient : LanguageClient ) {
116
82
this . languageClient = languageClient ;
117
83
118
84
if ( this . waitingForClientToken ) {
85
+ this . getLanguageClientResolve ( this . languageClient ) ;
119
86
this . clearWaitingToken ( ) ;
120
- // Signal language client initialized
121
87
}
122
88
}
123
89
124
90
public dispose ( ) {
125
91
this . command . dispose ( ) ;
126
92
}
127
93
128
- // In node, the function returned a Promise<string> not sure about "Thenable<string>"
129
- private pickPSHostProcess ( ) : Promise < string > {
130
- return new Promise ( ( resolve , reject ) => {
131
- this . languageClient . sendRequest ( GetPSHostProcessesRequest . type , null ) . then ( hostProcesses => {
132
- var items : ProcessItem [ ] = [ ] ;
133
-
134
- for ( var p in hostProcesses ) {
135
- items . push ( {
136
- label : hostProcesses [ p ] . processName ,
137
- description : hostProcesses [ p ] . processId . toString ( ) ,
138
- detail : hostProcesses [ p ] . mainWindowTitle ,
139
- pid : hostProcesses [ p ] . processId
140
- } ) ;
141
- } ;
142
-
143
- if ( items . length === 0 ) {
144
- reject ( "There are no PowerShell host processes to attach to." ) ;
94
+ private getLanguageClient ( ) : Thenable < LanguageClient > {
95
+ if ( this . languageClient ) {
96
+ return Promise . resolve ( this . languageClient ) ;
97
+ }
98
+ else {
99
+ // If PowerShell isn't finished loading yet, show a loading message
100
+ // until the LanguageClient is passed on to us
101
+ this . waitingForClientToken = new vscode . CancellationTokenSource ( ) ;
102
+
103
+ return new Promise < LanguageClient > (
104
+ ( resolve , reject ) => {
105
+ this . getLanguageClientResolve = resolve ;
106
+
107
+ vscode . window
108
+ . showQuickPick (
109
+ [ "Cancel" ] ,
110
+ { placeHolder : "Attach to PowerShell host process: Please wait, starting PowerShell..." } ,
111
+ this . waitingForClientToken . token )
112
+ . then ( response => {
113
+ if ( response === "Cancel" ) {
114
+ this . clearWaitingToken ( ) ;
115
+ reject ( ) ;
116
+ }
117
+ } ) ;
118
+
119
+ // Cancel the loading prompt after 60 seconds
120
+ setTimeout ( ( ) => {
121
+ if ( this . waitingForClientToken ) {
122
+ this . clearWaitingToken ( ) ;
123
+ reject ( ) ;
124
+
125
+ vscode . window . showErrorMessage (
126
+ "Attach to PowerShell host process: PowerShell session took too long to start." ) ;
127
+ }
128
+ } , 60000 ) ;
145
129
}
146
- else {
147
- let options : vscode . QuickPickOptions = {
148
- placeHolder : "Select a PowerShell host process to attach to" ,
149
- matchOnDescription : true ,
150
- matchOnDetail : true
151
- } ;
152
-
153
- return vscode . window . showQuickPick ( items , options ) . then ( item => {
154
- resolve ( item ? item . pid : "" ) ;
155
- } ) ;
130
+ ) ;
131
+ }
132
+ }
133
+
134
+ private pickPSHostProcess ( ) : Thenable < string > {
135
+ return this . languageClient . sendRequest ( GetPSHostProcessesRequest . type , null ) . then ( hostProcesses => {
136
+ var items : ProcessItem [ ] = [ ] ;
137
+
138
+ for ( var p in hostProcesses ) {
139
+ var windowTitle = "" ;
140
+ if ( hostProcesses [ p ] . mainWindowTitle ) {
141
+ windowTitle = `, Title: ${ hostProcesses [ p ] . mainWindowTitle } ` ;
156
142
}
143
+
144
+ items . push ( {
145
+ label : hostProcesses [ p ] . processName ,
146
+ description : `PID: ${ hostProcesses [ p ] . processId . toString ( ) } ${ windowTitle } ` ,
147
+ pid : hostProcesses [ p ] . processId
148
+ } ) ;
149
+ } ;
150
+
151
+ if ( items . length === 0 ) {
152
+ return Promise . reject ( "There are no PowerShell host processes to attach to." ) ;
153
+ }
154
+
155
+ let options : vscode . QuickPickOptions = {
156
+ placeHolder : "Select a PowerShell host process to attach to" ,
157
+ matchOnDescription : true ,
158
+ matchOnDetail : true
159
+ } ;
160
+
161
+ return vscode . window . showQuickPick ( items , options ) . then ( item => {
162
+ return item ? item . pid : "" ;
157
163
} ) ;
158
164
} ) ;
159
165
}
0 commit comments