Skip to content

Commit 466bef3

Browse files
jakebaileyauvredahejlsberg
authored
Create checkers in parallel, fix race on parents (#775)
Co-authored-by: auvred <aauvred@gmail.com> Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
1 parent e772e8f commit 466bef3

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

internal/checker/checker.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,8 @@ type Checker struct {
824824
}
825825

826826
func NewChecker(program Program) *Checker {
827+
program.BindSourceFiles()
828+
827829
c := &Checker{}
828830
c.id = nextCheckerID.Add(1)
829831
c.program = program
@@ -1198,7 +1200,6 @@ func (c *Checker) initializeIterationResolvers() {
11981200
}
11991201

12001202
func (c *Checker) initializeChecker() {
1201-
c.program.BindSourceFiles()
12021203
// Initialize global symbol table
12031204
augmentations := make([][]*ast.Node, 0, len(c.files))
12041205
for _, file := range c.files {
@@ -13214,7 +13215,9 @@ func (c *Checker) mergeSymbolTable(target ast.SymbolTable, source ast.SymbolTabl
1321413215
// When merging the module augmentation into a.ts, the symbol for `A` will itself be merged, so its parent
1321513216
// should be the merged module symbol. But the symbol for `B` has only one declaration, so its parent should
1321613217
// be the module augmentation symbol, which contains its only declaration.
13217-
merged.Parent = mergedParent
13218+
if merged.Flags&ast.SymbolFlagsTransient != 0 {
13219+
merged.Parent = mergedParent
13220+
}
1321813221
}
1321913222
target[id] = merged
1322013223
}

internal/compiler/program.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,13 @@ func (p *Program) CheckSourceFiles() {
215215
func (p *Program) createCheckers() {
216216
p.checkersOnce.Do(func() {
217217
p.checkers = make([]*checker.Checker, core.IfElse(p.programOptions.SingleThreaded, 1, 4))
218+
wg := core.NewWorkGroup(p.programOptions.SingleThreaded)
218219
for i := range p.checkers {
219-
p.checkers[i] = checker.NewChecker(p)
220+
wg.Queue(func() {
221+
p.checkers[i] = checker.NewChecker(p)
222+
})
220223
}
224+
wg.RunAndWait()
221225
p.checkersByFile = make(map[*ast.SourceFile]*checker.Checker)
222226
for i, file := range p.files {
223227
p.checkersByFile[file] = p.checkers[i%len(p.checkers)]

0 commit comments

Comments
 (0)