11import * as vt from 'vscode-textmate/release/main' ;
22import path = require( 'path' ) ;
3+ import fs = require( 'fs' ) ;
34
4- const tsGrammarFileName = "TypeScript.tmLanguage"
5- const tsReactGrammarFileName = "TypeScriptReact.tmLanguage"
5+ enum GrammarKind {
6+ ts = 'source.ts' ,
7+ tsx = 'source.tsx'
8+ }
9+ const grammarFileNames : Record < GrammarKind , string > = {
10+ [ GrammarKind . ts ] : "TypeScript.tmLanguage" ,
11+ [ GrammarKind . tsx ] : "TypeScriptReact.tmLanguage"
12+ } ;
13+ function grammarPath ( kind : GrammarKind ) {
14+ return path . join ( __dirname , '..' , grammarFileNames [ kind ] ) ;
15+ }
16+ const grammarPaths = {
17+ [ GrammarKind . ts ] : grammarPath ( GrammarKind . ts ) ,
18+ [ GrammarKind . tsx ] : grammarPath ( GrammarKind . tsx )
19+ } ;
20+
21+ const registery = new vt . Registry ( {
22+ loadGrammar : function ( scopeName : GrammarKind ) {
23+ const path = grammarPaths [ scopeName ] ;
24+ if ( path ) {
25+ return new Promise ( ( resolve , reject ) => {
26+ fs . readFile ( path , ( error , content ) => {
27+ if ( error ) {
28+ reject ( error ) ;
29+ } else {
30+ const rawGrammar = vt . parseRawGrammar ( content . toString ( ) , path ) ;
31+ resolve ( rawGrammar ) ;
32+ }
33+ } ) ;
34+ } ) ;
35+ }
636
7- const register = new vt . Registry ( ) ;
8- const tsGrammar = register . loadGrammarFromPathSync ( path . join ( __dirname , '..' , tsGrammarFileName ) ) ;
9- const tsReactGrammar = register . loadGrammarFromPathSync ( path . join ( __dirname , '..' , tsReactGrammarFileName ) ) ;
37+ return Promise . resolve ( null ) ;
38+ }
39+ } ) ;
40+
41+ interface ThenableGrammar {
42+ kind : GrammarKind ;
43+ grammar : vt . Thenable < vt . IGrammar > ;
44+ }
45+ function thenableGrammar ( kind : GrammarKind ) : ThenableGrammar {
46+ return { kind, grammar : registery . loadGrammar ( kind ) } ;
47+ }
48+ const tsGrammar = thenableGrammar ( GrammarKind . ts ) ;
49+ const tsReactGrammar = thenableGrammar ( GrammarKind . tsx ) ;
1050
1151const marker = '^^' ;
1252
@@ -31,24 +71,21 @@ function getInputFile(oriLines: string[]): string {
3171 "\n-----------------------------------\n\n" ;
3272}
3373
34- function getGrammarInfo ( grammarFileName : string ) {
35- return "Grammar: " + grammarFileName + "\n-----------------------------------\n" ;
74+ function getGrammarInfo ( kind : GrammarKind ) {
75+ return "Grammar: " + grammarFileNames [ kind ] + "\n-----------------------------------\n" ;
3676}
3777
38- const tsGrammarInfo = getGrammarInfo ( tsGrammarFileName ) ;
39- const tsReactGrammarInfo = getGrammarInfo ( tsReactGrammarFileName ) ;
40-
4178interface Grammar {
79+ kind : GrammarKind ;
4280 grammar : vt . IGrammar ;
4381 ruleStack ?: vt . StackElement ;
4482}
45-
46- function initGrammar ( grammar : vt . IGrammar ) : Grammar {
47- return { grammar } ;
83+ function initGrammar ( kind : GrammarKind , grammar : vt . IGrammar ) : Grammar {
84+ return { kind, grammar } ;
4885}
4986
5087function tokenizeLine ( grammar : Grammar , line : string ) {
51- const lineTokens = grammar . grammar . tokenizeLine ( line , grammar . ruleStack ) ;
88+ const lineTokens = grammar . grammar . tokenizeLine ( line , grammar . ruleStack ! ) ;
5289 grammar . ruleStack = lineTokens . ruleStack ;
5390 return lineTokens . tokens ;
5491}
@@ -82,20 +119,29 @@ function hasDiffLineToken(first: vt.IToken, second: vt.IToken) {
82119}
83120
84121function getBaseline ( grammar : Grammar , outputLines : string [ ] ) {
85- const grammarInfo = grammar . grammar === tsGrammar ? tsGrammarInfo : tsReactGrammarInfo ;
86- return grammarInfo + outputLines . join ( '\n' ) ;
122+ return getGrammarInfo ( grammar . kind ) + outputLines . join ( '\n' ) ;
87123}
88124
89- export function generateScopes ( text : string , parsedFileName : path . ParsedPath ) : { markerScopes : string , wholeBaseline : string } {
90- const grammar = parsedFileName . ext === '.tsx' ? tsReactGrammar : tsGrammar ;
125+ export function generateScopes ( text : string , parsedFileName : path . ParsedPath ) {
126+ const mainGrammar = parsedFileName . ext === '.tsx' ? tsReactGrammar : tsGrammar ;
91127 const oriLines = text . split ( / \r \n | \r | \n / ) ;
128+ const otherGrammar = oriLines [ 0 ] . search ( / \/ \/ \s * @ o n l y O w n G r a m m a r / i) < 0 ?
129+ mainGrammar === tsGrammar ? tsReactGrammar : tsGrammar :
130+ undefined ;
131+
132+ return Promise . all ( [
133+ mainGrammar . grammar ,
134+ otherGrammar ?
135+ otherGrammar . grammar :
136+ Promise . resolve ( undefined )
137+ ] ) . then ( ( [ mainIGrammar , otherIGrammar ] ) => generateScopesWorker (
138+ initGrammar ( mainGrammar . kind , mainIGrammar ) ,
139+ otherIGrammar && initGrammar ( otherGrammar ! . kind , otherIGrammar ) ,
140+ oriLines
141+ ) ) ;
142+ }
92143
93- let mainGrammar = initGrammar ( grammar ) ;
94- let otherGrammar : Grammar = null ;
95- if ( oriLines [ 0 ] . search ( / \/ \/ \s * @ o n l y O w n G r a m m a r / i) < 0 ) {
96- otherGrammar = initGrammar ( grammar === tsGrammar ? tsReactGrammar : tsGrammar ) ;
97- }
98-
144+ function generateScopesWorker ( mainGrammar : Grammar , otherGrammar : Grammar | undefined , oriLines : string [ ] ) : { markerScopes : string | undefined , wholeBaseline : string } {
99145 let outputLines : string [ ] = [ ] ;
100146 let cleanLines : string [ ] = [ ] ;
101147 let baselineLines : string [ ] = [ ] ;
@@ -136,9 +182,9 @@ export function generateScopes(text: string, parsedFileName: path.ParsedPath): {
136182 }
137183 }
138184
139- const otherDiffBaseline = foundDiff ? "\n\n\n" + getBaseline ( otherGrammar , otherBaselines ) : "" ;
185+ const otherDiffBaseline = foundDiff ? "\n\n\n" + getBaseline ( otherGrammar ! , otherBaselines ) : "" ;
140186 return {
141- markerScopes : markers ? ( getInputFile ( oriLines ) + getBaseline ( mainGrammar , outputLines ) ) : null ,
187+ markerScopes : markers ? ( getInputFile ( oriLines ) + getBaseline ( mainGrammar , outputLines ) ) : undefined ,
142188 wholeBaseline : getInputFile ( cleanLines ) + getBaseline ( mainGrammar , baselineLines ) + otherDiffBaseline
143189 } ;
144190}
0 commit comments