1
1
import * as vt from 'vscode-textmate/release/main' ;
2
2
import path = require( 'path' ) ;
3
+ import fs = require( 'fs' ) ;
3
4
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
+ }
6
36
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 ) ;
10
50
11
51
const marker = '^^' ;
12
52
@@ -31,24 +71,21 @@ function getInputFile(oriLines: string[]): string {
31
71
"\n-----------------------------------\n\n" ;
32
72
}
33
73
34
- function getGrammarInfo ( grammarFileName : string ) {
35
- return "Grammar: " + grammarFileName + "\n-----------------------------------\n" ;
74
+ function getGrammarInfo ( kind : GrammarKind ) {
75
+ return "Grammar: " + grammarFileNames [ kind ] + "\n-----------------------------------\n" ;
36
76
}
37
77
38
- const tsGrammarInfo = getGrammarInfo ( tsGrammarFileName ) ;
39
- const tsReactGrammarInfo = getGrammarInfo ( tsReactGrammarFileName ) ;
40
-
41
78
interface Grammar {
79
+ kind : GrammarKind ;
42
80
grammar : vt . IGrammar ;
43
81
ruleStack ?: vt . StackElement ;
44
82
}
45
-
46
- function initGrammar ( grammar : vt . IGrammar ) : Grammar {
47
- return { grammar } ;
83
+ function initGrammar ( kind : GrammarKind , grammar : vt . IGrammar ) : Grammar {
84
+ return { kind, grammar } ;
48
85
}
49
86
50
87
function tokenizeLine ( grammar : Grammar , line : string ) {
51
- const lineTokens = grammar . grammar . tokenizeLine ( line , grammar . ruleStack ) ;
88
+ const lineTokens = grammar . grammar . tokenizeLine ( line , grammar . ruleStack ! ) ;
52
89
grammar . ruleStack = lineTokens . ruleStack ;
53
90
return lineTokens . tokens ;
54
91
}
@@ -82,20 +119,29 @@ function hasDiffLineToken(first: vt.IToken, second: vt.IToken) {
82
119
}
83
120
84
121
function 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' ) ;
87
123
}
88
124
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 ;
91
127
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
+ }
92
143
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 } {
99
145
let outputLines : string [ ] = [ ] ;
100
146
let cleanLines : string [ ] = [ ] ;
101
147
let baselineLines : string [ ] = [ ] ;
@@ -136,9 +182,9 @@ export function generateScopes(text: string, parsedFileName: path.ParsedPath): {
136
182
}
137
183
}
138
184
139
- const otherDiffBaseline = foundDiff ? "\n\n\n" + getBaseline ( otherGrammar , otherBaselines ) : "" ;
185
+ const otherDiffBaseline = foundDiff ? "\n\n\n" + getBaseline ( otherGrammar ! , otherBaselines ) : "" ;
140
186
return {
141
- markerScopes : markers ? ( getInputFile ( oriLines ) + getBaseline ( mainGrammar , outputLines ) ) : null ,
187
+ markerScopes : markers ? ( getInputFile ( oriLines ) + getBaseline ( mainGrammar , outputLines ) ) : undefined ,
142
188
wholeBaseline : getInputFile ( cleanLines ) + getBaseline ( mainGrammar , baselineLines ) + otherDiffBaseline
143
189
} ;
144
190
}
0 commit comments