@@ -102,17 +102,26 @@ func (t *parseTask) load(loader *fileLoader) {
102102 // to avoid adding spurious lookups to file watcher tracking.
103103 t .metadata = ast.SourceFileMetaData {ImpliedNodeFormat : core .ResolutionModeCommonJS }
104104 } else {
105+ // Resolution: load metadata (package.json lookups involve stat calls).
106+ loader .filesParser .resolveSem .Acquire ()
105107 t .metadata = loader .loadSourceFileMetaData (t .normalizedFilePath )
108+ loader .filesParser .resolveSem .Release ()
106109 }
107110
111+ // Parsing: parse the source file (CPU-heavy).
112+ loader .filesParser .parseSem .Acquire ()
108113 file := loader .parseSourceFile (t )
114+ loader .filesParser .parseSem .Release ()
109115 if file == nil {
110116 return
111117 }
112118
113119 t .file = file
114120 t .subTasks = make ([]* parseTask , 0 , len (file .ReferencedFiles )+ len (file .Imports ())+ len (file .ModuleAugmentations ))
115121
122+ // Resolution: resolve references, type directives, and imports (stat-heavy).
123+ loader .filesParser .resolveSem .Acquire ()
124+
116125 compilerOptions := loader .opts .Config .CompilerOptions ()
117126 if ! compilerOptions .NoResolve .IsTrue () {
118127 for index , ref := range file .ReferencedFiles {
@@ -152,6 +161,8 @@ func (t *parseTask) load(loader *fileLoader) {
152161 }
153162
154163 loader .resolveImportsAndModuleAugmentations (t )
164+
165+ loader .filesParser .resolveSem .Release ()
155166}
156167
157168func (t * parseTask ) redirect (loader * fileLoader , fileName string ) {
@@ -165,6 +176,8 @@ func (t *parseTask) redirect(loader *fileLoader, fileName string) {
165176}
166177
167178func (t * parseTask ) loadAutomaticTypeDirectives (loader * fileLoader ) {
179+ loader .filesParser .resolveSem .Acquire ()
180+ defer loader .filesParser .resolveSem .Release ()
168181 toParseTypeRefs , typeResolutionsInFile , typeResolutionsTrace , pDiagnostics := loader .resolveAutomaticTypeDirectives (t .normalizedFilePath )
169182 t .typeResolutionsInFile = typeResolutionsInFile
170183 t .typeResolutionsTrace = typeResolutionsTrace
@@ -197,6 +210,8 @@ func (t *parseTask) addSubTask(ref resolvedRef, libFile *LibFile) {
197210
198211type filesParser struct {
199212 wg core.WorkGroup
213+ resolveSem * core.Semaphore
214+ parseSem * core.Semaphore
200215 taskDataByPath collections.SyncMap [tspath.Path , * parseTaskData ]
201216 maxDepth int
202217}
0 commit comments