5
5
"iter"
6
6
"slices"
7
7
"strings"
8
+ "sync"
8
9
"sync/atomic"
9
10
10
11
"github.com/microsoft/typescript-go/internal/ast"
@@ -30,12 +31,22 @@ type fileLoader struct {
30
31
31
32
totalFileCount atomic.Int32
32
33
libFileCount atomic.Int32
34
+
35
+ factoryMu sync.Mutex
36
+ factory ast.NodeFactory
33
37
}
34
38
35
39
type processedFiles struct {
36
- files []* ast.SourceFile
37
- resolvedModules map [tspath.Path ]module.ModeAwareCache [* module.ResolvedModule ]
38
- sourceFileMetaDatas map [tspath.Path ]* ast.SourceFileMetaData
40
+ files []* ast.SourceFile
41
+ resolvedModules map [tspath.Path ]module.ModeAwareCache [* module.ResolvedModule ]
42
+ sourceFileMetaDatas map [tspath.Path ]* ast.SourceFileMetaData
43
+ jsxRuntimeImportSpecifiers map [tspath.Path ]* jsxRuntimeImportSpecifier
44
+ importHelpersImportSpecifiers map [tspath.Path ]* ast.Node
45
+ }
46
+
47
+ type jsxRuntimeImportSpecifier struct {
48
+ moduleReference string
49
+ specifier * ast.Node
39
50
}
40
51
41
52
func processAllProgramFiles (
@@ -78,6 +89,8 @@ func processAllProgramFiles(
78
89
79
90
resolvedModules := make (map [tspath.Path ]module.ModeAwareCache [* module.ResolvedModule ], totalFileCount )
80
91
sourceFileMetaDatas := make (map [tspath.Path ]* ast.SourceFileMetaData , totalFileCount )
92
+ var jsxRuntimeImportSpecifiers map [tspath.Path ]* jsxRuntimeImportSpecifier
93
+ var importHelpersImportSpecifiers map [tspath.Path ]* ast.Node
81
94
82
95
for task := range loader .collectTasks (loader .rootTasks ) {
83
96
file := task .file
@@ -89,15 +102,29 @@ func processAllProgramFiles(
89
102
path := file .Path ()
90
103
resolvedModules [path ] = task .resolutionsInFile
91
104
sourceFileMetaDatas [path ] = task .metadata
105
+ if task .jsxRuntimeImportSpecifier != nil {
106
+ if jsxRuntimeImportSpecifiers == nil {
107
+ jsxRuntimeImportSpecifiers = make (map [tspath.Path ]* jsxRuntimeImportSpecifier , totalFileCount )
108
+ }
109
+ jsxRuntimeImportSpecifiers [path ] = task .jsxRuntimeImportSpecifier
110
+ }
111
+ if task .importHelpersImportSpecifier != nil {
112
+ if importHelpersImportSpecifiers == nil {
113
+ importHelpersImportSpecifiers = make (map [tspath.Path ]* ast.Node , totalFileCount )
114
+ }
115
+ importHelpersImportSpecifiers [path ] = task .importHelpersImportSpecifier
116
+ }
92
117
}
93
118
loader .sortLibs (libFiles )
94
119
95
120
allFiles := append (libFiles , files ... )
96
121
97
122
return processedFiles {
98
- files : allFiles ,
99
- resolvedModules : resolvedModules ,
100
- sourceFileMetaDatas : sourceFileMetaDatas ,
123
+ files : allFiles ,
124
+ resolvedModules : resolvedModules ,
125
+ sourceFileMetaDatas : sourceFileMetaDatas ,
126
+ jsxRuntimeImportSpecifiers : jsxRuntimeImportSpecifiers ,
127
+ importHelpersImportSpecifiers : importHelpersImportSpecifiers ,
101
128
}
102
129
}
103
130
@@ -203,8 +230,10 @@ type parseTask struct {
203
230
isLib bool
204
231
subTasks []* parseTask
205
232
206
- metadata * ast.SourceFileMetaData
207
- resolutionsInFile module.ModeAwareCache [* module.ResolvedModule ]
233
+ metadata * ast.SourceFileMetaData
234
+ resolutionsInFile module.ModeAwareCache [* module.ResolvedModule ]
235
+ importHelpersImportSpecifier * ast.Node
236
+ jsxRuntimeImportSpecifier * jsxRuntimeImportSpecifier
208
237
}
209
238
210
239
func (t * parseTask ) start (loader * fileLoader ) {
@@ -245,12 +274,14 @@ func (t *parseTask) start(loader *fileLoader) {
245
274
}
246
275
}
247
276
248
- importsAndAugmentations , resolutionsInFile := loader .resolveImportsAndModuleAugmentations (file )
249
- for _ , imp := range importsAndAugmentations {
277
+ toParse , resolutionsInFile , importHelpersImportSpecifier , jsxRuntimeImportSpecifier := loader .resolveImportsAndModuleAugmentations (file )
278
+ for _ , imp := range toParse {
250
279
t .addSubTask (imp , false )
251
280
}
252
281
253
282
t .resolutionsInFile = resolutionsInFile
283
+ t .importHelpersImportSpecifier = importHelpersImportSpecifier
284
+ t .jsxRuntimeImportSpecifier = jsxRuntimeImportSpecifier
254
285
255
286
loader .startTasks (t .subTasks )
256
287
})
@@ -286,13 +317,50 @@ func (p *fileLoader) resolveTripleslashPathReference(moduleName string, containi
286
317
return tspath .NormalizePath (referencedFileName )
287
318
}
288
319
289
- func (p * fileLoader ) resolveImportsAndModuleAugmentations (file * ast.SourceFile ) ([]string , module.ModeAwareCache [* module.ResolvedModule ]) {
290
- if len (file .Imports ) > 0 || len (file .ModuleAugmentations ) > 0 {
291
- toParse := make ([]string , 0 , len (file .Imports ))
292
- moduleNames := getModuleNames (file )
320
+ const externalHelpersModuleNameText = "tslib" // TODO(jakebailey): dedupe
321
+
322
+ func (p * fileLoader ) resolveImportsAndModuleAugmentations (file * ast.SourceFile ) (
323
+ toParse []string ,
324
+ resolutionsInFile module.ModeAwareCache [* module.ResolvedModule ],
325
+ importHelpersImportSpecifier * ast.Node ,
326
+ jsxRuntimeImportSpecifier_ * jsxRuntimeImportSpecifier ,
327
+ ) {
328
+ moduleNames := make ([]* ast.Node , 0 , len (file .Imports )+ len (file .ModuleAugmentations )+ 2 )
329
+ moduleNames = append (moduleNames , file .Imports ... )
330
+ for _ , imp := range file .ModuleAugmentations {
331
+ if imp .Kind == ast .KindStringLiteral {
332
+ moduleNames = append (moduleNames , imp )
333
+ }
334
+ // Do nothing if it's an Identifier; we don't need to do module resolution for `declare global`.
335
+ }
336
+
337
+ isJavaScriptFile := ast .IsSourceFileJS (file )
338
+ isExternalModuleFile := ast .IsExternalModule (file )
339
+
340
+ if isJavaScriptFile || (! file .IsDeclarationFile && (p .compilerOptions .GetIsolatedModules () || isExternalModuleFile )) {
341
+ if p .compilerOptions .ImportHelpers .IsTrue () {
342
+ specifier := p .createSyntheticImport (externalHelpersModuleNameText , file )
343
+ moduleNames = append (moduleNames , specifier )
344
+ importHelpersImportSpecifier = specifier
345
+ }
346
+
347
+ jsxImport := ast .GetJSXRuntimeImport (ast .GetJSXImplicitImportBase (p .compilerOptions , file ), p .compilerOptions )
348
+ if jsxImport != "" {
349
+ specifier := p .createSyntheticImport (jsxImport , file )
350
+ moduleNames = append (moduleNames , specifier )
351
+ jsxRuntimeImportSpecifier_ = & jsxRuntimeImportSpecifier {
352
+ moduleReference : jsxImport ,
353
+ specifier : specifier ,
354
+ }
355
+ }
356
+ }
357
+
358
+ if len (moduleNames ) != 0 {
359
+ toParse = make ([]string , 0 , len (moduleNames ))
360
+
293
361
resolutions := p .resolveModuleNames (moduleNames , file )
294
362
295
- resolutionsInFile : = make (module.ModeAwareCache [* module.ResolvedModule ], len (resolutions ))
363
+ resolutionsInFile = make (module.ModeAwareCache [* module.ResolvedModule ], len (resolutions ))
296
364
297
365
for i , resolution := range resolutions {
298
366
resolvedFileName := resolution .ResolvedFileName
@@ -325,10 +393,9 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile)
325
393
toParse = append (toParse , resolvedFileName )
326
394
}
327
395
}
328
-
329
- return toParse , resolutionsInFile
330
396
}
331
- return nil , nil
397
+
398
+ return toParse , resolutionsInFile , importHelpersImportSpecifier , jsxRuntimeImportSpecifier_
332
399
}
333
400
334
401
func (p * fileLoader ) resolveModuleNames (entries []* ast.Node , file * ast.SourceFile ) []* module.ResolvedModule {
@@ -349,3 +416,16 @@ func (p *fileLoader) resolveModuleNames(entries []*ast.Node, file *ast.SourceFil
349
416
350
417
return resolvedModules
351
418
}
419
+
420
+ func (p * fileLoader ) createSyntheticImport (text string , file * ast.SourceFile ) * ast.Node {
421
+ p .factoryMu .Lock ()
422
+ defer p .factoryMu .Unlock ()
423
+ externalHelpersModuleReference := p .factory .NewStringLiteral (text )
424
+ importDecl := p .factory .NewImportDeclaration (nil , nil , externalHelpersModuleReference , nil )
425
+ // !!! addInternalEmitFlags(importDecl, InternalEmitFlags.NeverApplyImportHelper);
426
+ externalHelpersModuleReference .Parent = importDecl
427
+ importDecl .Parent = file .AsNode ()
428
+ // !!! externalHelpersModuleReference.Flags &^= ast.NodeFlagsSynthesized
429
+ // !!! importDecl.Flags &^= ast.NodeFlagsSynthesized
430
+ return externalHelpersModuleReference
431
+ }
0 commit comments