1
1
/*---------------------------------------------------------
2
2
* Copyright (C) Microsoft Corporation. All rights reserved.
3
3
*--------------------------------------------------------*/
4
-
4
+ import fs = require ( "fs" ) ;
5
5
import * as path from "path" ;
6
6
import * as vscode from "vscode" ;
7
7
import {
8
8
DocumentSelector ,
9
9
LanguageClient ,
10
10
} from "vscode-languageclient" ;
11
11
import { IFeature } from "../feature" ;
12
- import { Logger } from "../logging" ;
12
+ import { ILogger } from "../logging" ;
13
13
import * as Settings from "../settings" ;
14
14
15
15
/**
@@ -497,23 +497,26 @@ export class FoldingFeature implements IFeature {
497
497
* @param logger The logging object to send messages to
498
498
* @param documentSelector documentSelector object for this Folding Provider
499
499
*/
500
- constructor ( private logger : Logger , documentSelector : DocumentSelector ) {
501
- const grammar : IGrammar = this . grammar ( logger ) ;
502
-
500
+ constructor ( private logger : ILogger , documentSelector : DocumentSelector ) {
503
501
const settings = Settings . load ( ) ;
504
502
if ( ! ( settings . codeFolding && settings . codeFolding . enable ) ) { return ; }
505
503
506
- // If the PowerShell grammar is not available for some reason, don't register a folding provider,
507
- // which reverts VSCode to the default indentation style folding
508
- if ( grammar == null ) {
509
- logger . writeWarning ( "Unable to load the PowerShell grammar file" ) ;
510
- return ;
511
- }
504
+ this . loadPSGrammar ( logger )
505
+ . then ( ( grammar ) => {
506
+ // If the PowerShell grammar is not available for some reason, don't register a folding provider,
507
+ // which reverts VSCode to the default indentation style folding
508
+ if ( ! grammar ) {
509
+ logger . writeWarning ( "Unable to load the PowerShell grammar file" ) ;
510
+ return ;
511
+ }
512
512
513
- this . foldingProvider = new FoldingProvider ( grammar ) ;
514
- vscode . languages . registerFoldingRangeProvider ( documentSelector , this . foldingProvider ) ;
513
+ this . foldingProvider = new FoldingProvider ( grammar ) ;
514
+ vscode . languages . registerFoldingRangeProvider ( documentSelector , this . foldingProvider ) ;
515
515
516
- logger . write ( "Syntax Folding Provider registered" ) ;
516
+ logger . write ( "Syntax Folding Provider registered" ) ;
517
+ } , ( err ) => {
518
+ this . logger . writeError ( `Failed to load grammar file - error: ${ err } ` ) ;
519
+ } ) ;
517
520
}
518
521
519
522
/* dispose() is required by the IFeature interface, but is not required by this feature */
@@ -527,7 +530,7 @@ export class FoldingFeature implements IFeature {
527
530
* @param logger The logging object to send messages to
528
531
* @returns A grammar parser for the PowerShell language is succesful or undefined if an error occured
529
532
*/
530
- public grammar ( logger : Logger ) : IGrammar {
533
+ public loadPSGrammar ( logger : ILogger ) : Thenable < IGrammar > {
531
534
const tm = this . getCoreNodeModule ( "vscode-textmate" , logger ) ;
532
535
if ( tm == null ) { return undefined ; }
533
536
logger . writeDiagnostic ( `Loaded the vscode-textmate module` ) ;
@@ -537,10 +540,18 @@ export class FoldingFeature implements IFeature {
537
540
const grammarPath = this . powerShellGrammarPath ( ) ;
538
541
if ( grammarPath == null ) { return undefined ; }
539
542
logger . writeDiagnostic ( `PowerShell grammar file specified as ${ grammarPath } ` ) ;
540
- try {
541
- return registry . loadGrammarFromPathSync ( grammarPath ) ;
542
- } catch ( err ) {
543
- logger . writeError ( `Error while loading the PowerShell grammar file at ${ grammarPath } ` , err ) ;
543
+
544
+ // Branching for the different vscode-textmate modules
545
+ if ( "loadGrammarFromPathSync" in registry ) {
546
+ // V3 of the module allows synchronous loading of a grammar
547
+ return new Promise ( ( grammar ) => {
548
+ return registry . loadGrammarFromPathSync ( grammarPath ) ;
549
+ } ) ;
550
+ } else {
551
+ // However in V4+ this is async only
552
+ const content = fs . readFileSync ( grammarPath ) ;
553
+ const rawGrammar = tm . parseRawGrammar ( content . toString ( ) , grammarPath ) ;
554
+ return registry . addGrammar ( rawGrammar ) ;
544
555
}
545
556
}
546
557
@@ -552,7 +563,7 @@ export class FoldingFeature implements IFeature {
552
563
* @param logger The logging object to send messages to
553
564
* @returns The required module, or null if the module cannot be required
554
565
*/
555
- private getCoreNodeModule ( moduleName : string , logger : Logger ) {
566
+ private getCoreNodeModule ( moduleName : string , logger : ILogger ) {
556
567
// Attempt to load the module from known locations
557
568
const loadLocations : string [ ] = [
558
569
`${ vscode . env . appRoot } /node_modules.asar/${ moduleName } ` ,
0 commit comments