@@ -24,7 +24,7 @@ import {
24
24
OperatingSystem , PowerShellExeFinder
25
25
} from "./platform" ;
26
26
import { LanguageClientConsumer } from "./languageClientConsumer" ;
27
- import { SemVer } from "semver" ;
27
+ import { SemVer , satisfies } from "semver" ;
28
28
29
29
export enum SessionStatus {
30
30
NeverStarted ,
@@ -458,17 +458,36 @@ export class SessionManager implements Middleware {
458
458
try {
459
459
this . sessionDetails = await languageServerProcess . start ( "EditorServices" ) ;
460
460
} catch ( err ) {
461
- this . setSessionFailure ( "PowerShell process failed to start: " , err instanceof Error ? err . message : "unknown" ) ;
461
+ // We should kill the process in case it's stuck.
462
+ void languageServerProcess . dispose ( ) ;
463
+
464
+ // PowerShell never started, probably a bad version!
465
+ const version = await languageServerProcess . getVersionCli ( ) ;
466
+ if ( version . major === 5 ) {
467
+ this . setSessionFailure (
468
+ "It looks like you're trying to use Windows PowerShell, which is supported on a best-effort basis. Can you try PowerShell 7?" ) ;
469
+ } else if ( satisfies ( version , ">=6.0.0 <7.2.0" ) ) {
470
+ this . setSessionFailure (
471
+ `PowerShell ${ version } has reached end-of-support, please update! Also see: https://aka.ms/pwsh-support-lifecycle` ) ;
472
+ const updater = new UpdatePowerShell ( this , this . sessionSettings , this . logger , version ) ;
473
+ // NOTE: We specifically don't want to wait for this.
474
+ void updater . checkForUpdate ( ) ;
475
+ } else {
476
+ this . setSessionFailure (
477
+ "PowerShell process didn't start! Would you like to open an issue?" ) ;
478
+ }
479
+ return ;
462
480
}
463
481
464
- if ( this . sessionDetails ? .status === "started" ) {
482
+ if ( this . sessionDetails . status === "started" ) { // Successful start with a session file
465
483
this . logger . write ( "Language server started." ) ;
466
484
try {
467
485
await this . startLanguageClient ( this . sessionDetails ) ;
486
+ return languageServerProcess ;
468
487
} catch ( err ) {
469
488
this . setSessionFailure ( "Language client failed to start: " , err instanceof Error ? err . message : "unknown" ) ;
470
489
}
471
- } else if ( this . sessionDetails ? .status === "failed" ) {
490
+ } else if ( this . sessionDetails . status === "failed" ) { // PowerShell started but indicated it failed
472
491
if ( this . sessionDetails . reason === "unsupported" ) {
473
492
this . setSessionFailure (
474
493
"PowerShell language features are only supported on PowerShell version 5.1 and 7+. " +
@@ -483,10 +502,8 @@ export class SessionManager implements Middleware {
483
502
}
484
503
} else {
485
504
this . setSessionFailure (
486
- `Unknown session status '${ this . sessionDetails ? .status } ' with reason '${ this . sessionDetails ? .reason } ` ) ;
505
+ `Unknown session status '${ this . sessionDetails . status } ' with reason '${ this . sessionDetails . reason } ` ) ;
487
506
}
488
-
489
- return languageServerProcess ;
490
507
}
491
508
492
509
private async findPowerShell ( ) : Promise < IPowerShellExeDetails | undefined > {
0 commit comments