diff --git a/internal/checker/checker.go b/internal/checker/checker.go index ccade6b56f..69a4f7c7f7 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -857,9 +857,11 @@ type Checker struct { activeTypeMappersCaches []map[string]*Type ambientModulesOnce sync.Once ambientModules []*ast.Symbol + + mu sync.Mutex } -func NewChecker(program Program) *Checker { +func NewChecker(program Program) (*Checker, *sync.Mutex) { program.BindSourceFiles() c := &Checker{} @@ -1071,7 +1073,7 @@ func NewChecker(program Program) *Checker { c.initializeClosures() c.initializeIterationResolvers() c.initializeChecker() - return c + return c, &c.mu } func createFileIndexMap(files []*ast.SourceFile) map[*ast.SourceFile]int { diff --git a/internal/checker/emitresolver.go b/internal/checker/emitresolver.go index a40d49b2a9..877f2d1831 100644 --- a/internal/checker/emitresolver.go +++ b/internal/checker/emitresolver.go @@ -34,7 +34,7 @@ type DeclarationFileLinks struct { type EmitResolver struct { checker *Checker - checkerMu sync.Mutex + checkerMu *sync.Mutex isValueAliasDeclaration func(node *ast.Node) bool aliasMarkingVisitor func(node *ast.Node) bool referenceResolver binder.ReferenceResolver @@ -47,6 +47,7 @@ func newEmitResolver(checker *Checker) *EmitResolver { e := &EmitResolver{checker: checker} e.isValueAliasDeclaration = e.isValueAliasDeclarationWorker e.aliasMarkingVisitor = e.aliasMarkingVisitorWorker + e.checkerMu = &checker.mu return e } diff --git a/internal/compiler/checkerpool.go b/internal/compiler/checkerpool.go index f7594696f9..50025dd7ed 100644 --- a/internal/compiler/checkerpool.go +++ b/internal/compiler/checkerpool.go @@ -26,7 +26,7 @@ type checkerPool struct { createCheckersOnce sync.Once checkers []*checker.Checker - locks []sync.Mutex + locks []*sync.Mutex fileAssociations map[*ast.SourceFile]*checker.Checker } @@ -37,7 +37,7 @@ func newCheckerPool(checkerCount int, program *Program) *checkerPool { program: program, checkerCount: checkerCount, checkers: make([]*checker.Checker, checkerCount), - locks: make([]sync.Mutex, checkerCount), + locks: make([]*sync.Mutex, checkerCount), } return pool @@ -74,7 +74,7 @@ func (p *checkerPool) createCheckers() { wg := core.NewWorkGroup(p.program.SingleThreaded()) for i := range p.checkerCount { wg.Queue(func() { - p.checkers[i] = checker.NewChecker(p.program) + p.checkers[i], p.locks[i] = checker.NewChecker(p.program) }) } diff --git a/internal/project/checkerpool.go b/internal/project/checkerpool.go index a83a2e833f..0e1ba1cd04 100644 --- a/internal/project/checkerpool.go +++ b/internal/project/checkerpool.go @@ -218,7 +218,7 @@ func (p *CheckerPool) isFullLocked() bool { func (p *CheckerPool) createCheckerLocked() (*checker.Checker, int) { for i, existing := range p.checkers { if existing == nil { - checker := checker.NewChecker(p.program) + checker, _ := checker.NewChecker(p.program) p.checkers[i] = checker return checker, i } diff --git a/internal/transformers/tstransforms/importelision_test.go b/internal/transformers/tstransforms/importelision_test.go index 3dc5c227cd..5e57db5a6c 100644 --- a/internal/transformers/tstransforms/importelision_test.go +++ b/internal/transformers/tstransforms/importelision_test.go @@ -213,7 +213,7 @@ func TestImportElision(t *testing.T) { compilerOptions := &core.CompilerOptions{} - c := checker.NewChecker(&fakeProgram{ + c, _ := checker.NewChecker(&fakeProgram{ singleThreaded: true, compilerOptions: compilerOptions, files: files,