Skip to content

Commit 652b18c

Browse files
Port IsSourceFileFromExternalLibrary, fix node18 emit (#1234)
Co-authored-by: Jake Bailey <[email protected]>
1 parent 264347f commit 652b18c

File tree

159 files changed

+797
-2978
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+797
-2978
lines changed

internal/ast/utilities.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1611,7 +1611,7 @@ func IsEffectiveExternalModule(node *SourceFile, compilerOptions *core.CompilerO
16111611
}
16121612

16131613
func isCommonJSContainingModuleKind(kind core.ModuleKind) bool {
1614-
return kind == core.ModuleKindCommonJS || kind == core.ModuleKindNode16 || kind == core.ModuleKindNodeNext
1614+
return kind == core.ModuleKindCommonJS || core.ModuleKindNode16 <= kind && kind <= core.ModuleKindNodeNext
16151615
}
16161616

16171617
func IsExternalModuleIndicator(node *Statement) bool {

internal/compiler/emitHost.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,7 @@ func (host *emitHost) GetEmitResolver(file *ast.SourceFile, skipDiagnostics bool
124124
defer done()
125125
return checker.GetEmitResolver(file, skipDiagnostics)
126126
}
127+
128+
func (host *emitHost) IsSourceFileFromExternalLibrary(file *ast.SourceFile) bool {
129+
return host.program.IsSourceFileFromExternalLibrary(file)
130+
}

internal/compiler/emitter.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package compiler
22

33
import (
44
"encoding/base64"
5-
"strings"
65

76
"github.com/microsoft/typescript-go/internal/ast"
87
"github.com/microsoft/typescript-go/internal/core"
@@ -305,10 +304,7 @@ func sourceFileMayBeEmitted(sourceFile *ast.SourceFile, host printer.EmitHost, f
305304
return false
306305
}
307306

308-
// !!! Source file from node_modules are not emitted. In Strada, this depends on module resolution and uses
309-
// `sourceFilesFoundSearchingNodeModules` in `createProgram`. For now, we will just check for `/node_modules/` in
310-
// the file name.
311-
if strings.Contains(sourceFile.FileName(), "/node_modules/") {
307+
if host.IsSourceFileFromExternalLibrary(sourceFile) {
312308
return false
313309
}
314310

internal/compiler/fileloader.go

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ type processedFiles struct {
4949
jsxRuntimeImportSpecifiers map[tspath.Path]*jsxRuntimeImportSpecifier
5050
importHelpersImportSpecifiers map[tspath.Path]*ast.Node
5151
// List of present unsupported extensions
52-
unsupportedExtensions []string
52+
unsupportedExtensions []string
53+
sourceFilesFoundSearchingNodeModules collections.Set[tspath.Path]
5354
}
5455

5556
type jsxRuntimeImportSpecifier struct {
@@ -111,6 +112,7 @@ func processAllProgramFiles(
111112
var jsxRuntimeImportSpecifiers map[tspath.Path]*jsxRuntimeImportSpecifier
112113
var importHelpersImportSpecifiers map[tspath.Path]*ast.Node
113114
var unsupportedExtensions []string
115+
var sourceFilesFoundSearchingNodeModules collections.Set[tspath.Path]
114116

115117
loader.parseTasks.collect(&loader, loader.rootTasks, func(task *parseTask, _ []tspath.Path) {
116118
if task.isRedirected {
@@ -153,22 +155,26 @@ func processAllProgramFiles(
153155
if slices.Contains(tspath.SupportedJSExtensionsFlat, extension) {
154156
unsupportedExtensions = core.AppendIfUnique(unsupportedExtensions, extension)
155157
}
158+
if task.fromExternalLibrary {
159+
sourceFilesFoundSearchingNodeModules.Add(path)
160+
}
156161
})
157162
loader.sortLibs(libFiles)
158163

159164
allFiles := append(libFiles, files...)
160165

161166
return processedFiles{
162-
resolver: loader.resolver,
163-
files: allFiles,
164-
filesByPath: filesByPath,
165-
projectReferenceFileMapper: loader.projectReferenceFileMapper,
166-
resolvedModules: resolvedModules,
167-
typeResolutionsInFile: typeResolutionsInFile,
168-
sourceFileMetaDatas: sourceFileMetaDatas,
169-
jsxRuntimeImportSpecifiers: jsxRuntimeImportSpecifiers,
170-
importHelpersImportSpecifiers: importHelpersImportSpecifiers,
171-
unsupportedExtensions: unsupportedExtensions,
167+
resolver: loader.resolver,
168+
files: allFiles,
169+
filesByPath: filesByPath,
170+
projectReferenceFileMapper: loader.projectReferenceFileMapper,
171+
resolvedModules: resolvedModules,
172+
typeResolutionsInFile: typeResolutionsInFile,
173+
sourceFileMetaDatas: sourceFileMetaDatas,
174+
jsxRuntimeImportSpecifiers: jsxRuntimeImportSpecifiers,
175+
importHelpersImportSpecifiers: importHelpersImportSpecifiers,
176+
unsupportedExtensions: unsupportedExtensions,
177+
sourceFilesFoundSearchingNodeModules: sourceFilesFoundSearchingNodeModules,
172178
}
173179
}
174180

@@ -180,7 +186,7 @@ func (p *fileLoader) addRootTasks(files []string, isLib bool) {
180186
for _, fileName := range files {
181187
absPath := tspath.GetNormalizedAbsolutePath(fileName, p.opts.Host.GetCurrentDirectory())
182188
if core.Tristate.IsTrue(p.opts.Config.CompilerOptions().AllowNonTsExtensions) || slices.Contains(p.supportedExtensions, tspath.TryGetExtensionFromPath(absPath)) {
183-
p.rootTasks = append(p.rootTasks, &parseTask{normalizedFilePath: absPath, isLib: isLib})
189+
p.rootTasks = append(p.rootTasks, &parseTask{normalizedFilePath: absPath, isLib: isLib, root: true})
184190
}
185191
}
186192
}
@@ -327,38 +333,38 @@ func (p *fileLoader) resolveTripleslashPathReference(moduleName string, containi
327333
}
328334
}
329335

330-
func (p *fileLoader) resolveTypeReferenceDirectives(file *ast.SourceFile, meta ast.SourceFileMetaData) (
331-
toParse []resolvedRef,
332-
typeResolutionsInFile module.ModeAwareCache[*module.ResolvedTypeReferenceDirective],
333-
) {
334-
if len(file.TypeReferenceDirectives) != 0 {
335-
toParse = make([]resolvedRef, 0, len(file.TypeReferenceDirectives))
336-
typeResolutionsInFile = make(module.ModeAwareCache[*module.ResolvedTypeReferenceDirective], len(file.TypeReferenceDirectives))
337-
for _, ref := range file.TypeReferenceDirectives {
338-
redirect := p.projectReferenceFileMapper.getRedirectForResolution(file)
339-
resolutionMode := getModeForTypeReferenceDirectiveInFile(ref, file, meta, module.GetCompilerOptionsWithRedirect(p.opts.Config.CompilerOptions(), redirect))
340-
resolved := p.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), resolutionMode, redirect)
341-
typeResolutionsInFile[module.ModeAwareCacheKey{Name: ref.FileName, Mode: resolutionMode}] = resolved
342-
if resolved.IsResolved() {
343-
toParse = append(toParse, resolvedRef{
344-
fileName: resolved.ResolvedFileName,
345-
increaseDepth: resolved.IsExternalLibraryImport,
346-
elideOnDepth: false,
347-
})
348-
}
336+
func (p *fileLoader) resolveTypeReferenceDirectives(t *parseTask) {
337+
file := t.file
338+
if len(file.TypeReferenceDirectives) == 0 {
339+
return
340+
}
341+
meta := t.metadata
342+
343+
typeResolutionsInFile := make(module.ModeAwareCache[*module.ResolvedTypeReferenceDirective], len(file.TypeReferenceDirectives))
344+
for _, ref := range file.TypeReferenceDirectives {
345+
redirect := p.projectReferenceFileMapper.getRedirectForResolution(file)
346+
resolutionMode := getModeForTypeReferenceDirectiveInFile(ref, file, meta, module.GetCompilerOptionsWithRedirect(p.opts.Config.CompilerOptions(), redirect))
347+
resolved := p.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), resolutionMode, redirect)
348+
typeResolutionsInFile[module.ModeAwareCacheKey{Name: ref.FileName, Mode: resolutionMode}] = resolved
349+
if resolved.IsResolved() {
350+
t.addSubTask(resolvedRef{
351+
fileName: resolved.ResolvedFileName,
352+
increaseDepth: resolved.IsExternalLibraryImport,
353+
elideOnDepth: false,
354+
isFromExternalLibrary: resolved.IsExternalLibraryImport,
355+
}, false)
349356
}
350357
}
351-
return toParse, typeResolutionsInFile
358+
359+
t.typeResolutionsInFile = typeResolutionsInFile
352360
}
353361

354362
const externalHelpersModuleNameText = "tslib" // TODO(jakebailey): dedupe
355363

356-
func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile, meta ast.SourceFileMetaData) (
357-
toParse []resolvedRef,
358-
resolutionsInFile module.ModeAwareCache[*module.ResolvedModule],
359-
importHelpersImportSpecifier *ast.Node,
360-
jsxRuntimeImportSpecifier_ *jsxRuntimeImportSpecifier,
361-
) {
364+
func (p *fileLoader) resolveImportsAndModuleAugmentations(t *parseTask) {
365+
file := t.file
366+
meta := t.metadata
367+
362368
moduleNames := make([]*ast.Node, 0, len(file.Imports())+len(file.ModuleAugmentations)+2)
363369

364370
isJavaScriptFile := ast.IsSourceFileJS(file)
@@ -370,14 +376,14 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile,
370376
if optionsForFile.ImportHelpers.IsTrue() {
371377
specifier := p.createSyntheticImport(externalHelpersModuleNameText, file)
372378
moduleNames = append(moduleNames, specifier)
373-
importHelpersImportSpecifier = specifier
379+
t.importHelpersImportSpecifier = specifier
374380
}
375381

376382
jsxImport := ast.GetJSXRuntimeImport(ast.GetJSXImplicitImportBase(optionsForFile, file), optionsForFile)
377383
if jsxImport != "" {
378384
specifier := p.createSyntheticImport(jsxImport, file)
379385
moduleNames = append(moduleNames, specifier)
380-
jsxRuntimeImportSpecifier_ = &jsxRuntimeImportSpecifier{
386+
t.jsxRuntimeImportSpecifier = &jsxRuntimeImportSpecifier{
381387
moduleReference: jsxImport,
382388
specifier: specifier,
383389
}
@@ -395,8 +401,7 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile,
395401
}
396402

397403
if len(moduleNames) != 0 {
398-
toParse = make([]resolvedRef, 0, len(moduleNames))
399-
resolutionsInFile = make(module.ModeAwareCache[*module.ResolvedModule], len(moduleNames))
404+
resolutionsInFile := make(module.ModeAwareCache[*module.ResolvedModule], len(moduleNames))
400405

401406
for index, entry := range moduleNames {
402407
moduleName := entry.Text()
@@ -433,16 +438,17 @@ func (p *fileLoader) resolveImportsAndModuleAugmentations(file *ast.SourceFile,
433438
(importIndex < 0 || (importIndex < len(file.Imports()) && (ast.IsInJSFile(file.Imports()[importIndex]) || file.Imports()[importIndex].Flags&ast.NodeFlagsJSDoc == 0)))
434439

435440
if shouldAddFile {
436-
toParse = append(toParse, resolvedRef{
437-
fileName: resolvedFileName,
438-
increaseDepth: resolvedModule.IsExternalLibraryImport,
439-
elideOnDepth: isJsFileFromNodeModules,
440-
})
441+
t.addSubTask(resolvedRef{
442+
fileName: resolvedFileName,
443+
increaseDepth: resolvedModule.IsExternalLibraryImport,
444+
elideOnDepth: isJsFileFromNodeModules,
445+
isFromExternalLibrary: resolvedModule.IsExternalLibraryImport,
446+
}, false)
441447
}
442448
}
443-
}
444449

445-
return toParse, resolutionsInFile, importHelpersImportSpecifier, jsxRuntimeImportSpecifier_
450+
t.resolutionsInFile = resolutionsInFile
451+
}
446452
}
447453

448454
// Returns a DiagnosticMessage if we won't include a resolved module due to its extension.

internal/compiler/fileloadertask.go

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ type fileLoaderWorkerTask[T any] interface {
1717
getSubTasks() []T
1818
shouldIncreaseDepth() bool
1919
shouldElideOnDepth() bool
20+
isRoot() bool
21+
isFromExternalLibrary() bool
22+
markFromExternalLibrary()
2023
}
2124

2225
type fileLoaderWorker[K fileLoaderWorkerTask[K]] struct {
@@ -32,42 +35,55 @@ type queuedTask[K fileLoaderWorkerTask[K]] struct {
3235
}
3336

3437
func (w *fileLoaderWorker[K]) runAndWait(loader *fileLoader, tasks []K) {
35-
w.start(loader, tasks, 0)
38+
w.start(loader, tasks, 0, false)
3639
w.wg.RunAndWait()
3740
}
3841

39-
func (w *fileLoaderWorker[K]) start(loader *fileLoader, tasks []K, depth int) {
42+
func (w *fileLoaderWorker[K]) start(loader *fileLoader, tasks []K, depth int, isFromExternalLibrary bool) {
4043
for i, task := range tasks {
44+
taskIsFromExternalLibrary := isFromExternalLibrary || task.isFromExternalLibrary()
4145
newTask := &queuedTask[K]{task: task, lowestDepth: math.MaxInt}
4246
loadedTask, loaded := w.tasksByFileName.LoadOrStore(task.FileName(), newTask)
4347
task = loadedTask.task
4448
if loaded {
4549
tasks[i] = task
4650
}
4751

48-
currentDepth := depth
49-
if task.shouldIncreaseDepth() {
50-
currentDepth++
51-
}
52-
53-
if task.shouldElideOnDepth() && currentDepth > w.maxDepth {
54-
continue
55-
}
56-
5752
w.wg.Queue(func() {
5853
loadedTask.mu.Lock()
5954
defer loadedTask.mu.Unlock()
6055

61-
if !task.isLoaded() {
62-
task.load(loader)
56+
currentDepth := depth
57+
if task.shouldIncreaseDepth() {
58+
currentDepth++
6359
}
6460

61+
startSubtasks := false
62+
6563
if currentDepth < loadedTask.lowestDepth {
6664
// If we're seeing this task at a lower depth than before,
6765
// reprocess its subtasks to ensure they are loaded.
6866
loadedTask.lowestDepth = currentDepth
69-
subTasks := task.getSubTasks()
70-
w.start(loader, subTasks, currentDepth)
67+
startSubtasks = true
68+
}
69+
70+
if !task.isRoot() && taskIsFromExternalLibrary && !task.isFromExternalLibrary() {
71+
// If we're seeing this task now as an external library,
72+
// reprocess its subtasks to ensure they are also marked as external.
73+
task.markFromExternalLibrary()
74+
startSubtasks = true
75+
}
76+
77+
if task.shouldElideOnDepth() && currentDepth > w.maxDepth {
78+
return
79+
}
80+
81+
if !task.isLoaded() {
82+
task.load(loader)
83+
}
84+
85+
if startSubtasks {
86+
w.start(loader, task.getSubTasks(), loadedTask.lowestDepth, task.isFromExternalLibrary())
7187
}
7288
})
7389
}

0 commit comments

Comments
 (0)