Skip to content

Commit 15ae26c

Browse files
Release program after finishing program emit, Only cache dts and json source files (#1623)
Co-authored-by: Copilot <[email protected]>
1 parent 6ca9119 commit 15ae26c

File tree

10 files changed

+65
-56
lines changed

10 files changed

+65
-56
lines changed

internal/execute/build/buildtask.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ func (t *buildTask) report(orchestrator *Orchestrator, configPath tspath.Path, b
7070
buildResult.programStats = append(buildResult.programStats, t.statistics)
7171
}
7272
if t.program != nil {
73-
buildResult.result.IncrementalProgram = append(buildResult.result.IncrementalProgram, t.program)
73+
if orchestrator.opts.Testing != nil {
74+
orchestrator.opts.Testing.OnProgram(t.program)
75+
}
76+
t.program.MakeReadonly()
7477
buildResult.statistics.ProjectsBuilt++
7578
}
7679
if t.pseudoBuild {

internal/execute/build/host.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ func (h *host) GetSourceFile(opts ast.SourceFileParseOptions) *ast.SourceFile {
114114
}
115115

116116
file := h.host.GetSourceFile(opts)
117-
file, _ = h.sourceFiles.LoadOrStore(opts, file)
117+
// Cache dts and json files as they will be reused
118+
if file != nil && (tspath.IsDeclarationFileName(file.FileName()) || tspath.FileExtensionIs(file.FileName(), tspath.ExtensionJson)) {
119+
file, _ = h.sourceFiles.LoadOrStore(opts, file)
120+
}
118121
return file
119122
}
120123

internal/execute/incremental/affectedfileshandler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,8 @@ func (h *affectedFilesHandler) updateSnapshot() {
324324
h.updatedSignatures.Range(func(filePath tspath.Path, update *updatedSignature) bool {
325325
if info, ok := h.program.snapshot.fileInfos.Load(filePath); ok {
326326
info.signature = update.signature
327-
if h.program.updatedSignatureKinds != nil {
328-
h.program.updatedSignatureKinds[filePath] = update.kind
327+
if h.program.testingData != nil {
328+
h.program.testingData.UpdatedSignatureKinds[filePath] = update.kind
329329
}
330330
}
331331
return true

internal/execute/incremental/emitfileshandler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ func (h *emitFilesHandler) updateSnapshot() []*compiler.EmitResult {
229229
h.signatures.Range(func(file tspath.Path, signature string) bool {
230230
info, _ := h.program.snapshot.fileInfos.Load(file)
231231
info.signature = signature
232-
if h.program.updatedSignatureKinds != nil {
233-
h.program.updatedSignatureKinds[file] = SignatureUpdateKindStoredAtEmit
232+
if h.program.testingData != nil {
233+
h.program.testingData.UpdatedSignatureKinds[file] = SignatureUpdateKindStoredAtEmit
234234
}
235235
h.program.snapshot.buildInfoEmitPending.Store(true)
236236
return true

internal/execute/incremental/program.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ type BuildHost interface {
3030
}
3131

3232
type Program struct {
33-
snapshot *snapshot
34-
program *compiler.Program
35-
semanticDiagnosticsPerFile *collections.SyncMap[tspath.Path, *diagnosticsOrBuildInfoDiagnosticsWithFileName]
36-
updatedSignatureKinds map[tspath.Path]SignatureUpdateKind
37-
host BuildHost
33+
snapshot *snapshot
34+
program *compiler.Program
35+
host BuildHost
36+
37+
// Testing data
38+
testingData *TestingData
3839
}
3940

4041
var _ compiler.ProgramLike = (*Program)(nil)
@@ -47,12 +48,14 @@ func NewProgram(program *compiler.Program, oldProgram *Program, buildHost BuildH
4748
}
4849

4950
if testing {
51+
incrementalProgram.testingData = &TestingData{}
52+
incrementalProgram.testingData.SemanticDiagnosticsPerFile = &incrementalProgram.snapshot.semanticDiagnosticsPerFile
5053
if oldProgram != nil {
51-
incrementalProgram.semanticDiagnosticsPerFile = &oldProgram.snapshot.semanticDiagnosticsPerFile
54+
incrementalProgram.testingData.OldProgramSemanticDiagnosticsPerFile = &oldProgram.snapshot.semanticDiagnosticsPerFile
5255
} else {
53-
incrementalProgram.semanticDiagnosticsPerFile = &collections.SyncMap[tspath.Path, *diagnosticsOrBuildInfoDiagnosticsWithFileName]{}
56+
incrementalProgram.testingData.OldProgramSemanticDiagnosticsPerFile = &collections.SyncMap[tspath.Path, *diagnosticsOrBuildInfoDiagnosticsWithFileName]{}
5457
}
55-
incrementalProgram.updatedSignatureKinds = make(map[tspath.Path]SignatureUpdateKind)
58+
incrementalProgram.testingData.UpdatedSignatureKinds = make(map[tspath.Path]SignatureUpdateKind)
5659
}
5760
return incrementalProgram
5861
}
@@ -61,16 +64,10 @@ type TestingData struct {
6164
SemanticDiagnosticsPerFile *collections.SyncMap[tspath.Path, *diagnosticsOrBuildInfoDiagnosticsWithFileName]
6265
OldProgramSemanticDiagnosticsPerFile *collections.SyncMap[tspath.Path, *diagnosticsOrBuildInfoDiagnosticsWithFileName]
6366
UpdatedSignatureKinds map[tspath.Path]SignatureUpdateKind
64-
ConfigFilePath string
6567
}
6668

67-
func (p *Program) GetTestingData(program *compiler.Program) TestingData {
68-
return TestingData{
69-
SemanticDiagnosticsPerFile: &p.snapshot.semanticDiagnosticsPerFile,
70-
OldProgramSemanticDiagnosticsPerFile: p.semanticDiagnosticsPerFile,
71-
UpdatedSignatureKinds: p.updatedSignatureKinds,
72-
ConfigFilePath: p.snapshot.options.ConfigFilePath,
73-
}
69+
func (p *Program) GetTestingData() *TestingData {
70+
return p.testingData
7471
}
7572

7673
func (p *Program) panicIfNoProgram(method string) {
@@ -84,6 +81,11 @@ func (p *Program) GetProgram() *compiler.Program {
8481
return p.program
8582
}
8683

84+
func (p *Program) MakeReadonly() {
85+
p.program = nil
86+
p.testingData = nil
87+
}
88+
8789
// Options implements compiler.AnyProgram interface.
8890
func (p *Program) Options() *core.CompilerOptions {
8991
return p.snapshot.options

internal/execute/tsc.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,11 @@ func performIncrementalCompilation(
290290
compileTimes,
291291
testing,
292292
)
293+
if testing != nil {
294+
testing.OnProgram(incrementalProgram)
295+
}
293296
return tsc.CommandLineResult{
294-
Status: result.Status,
295-
IncrementalProgram: []*incremental.Program{incrementalProgram},
297+
Status: result.Status,
296298
}
297299
}
298300

internal/execute/tsc/compile.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ type Watcher interface {
4040
}
4141

4242
type CommandLineResult struct {
43-
Status ExitStatus
44-
IncrementalProgram []*incremental.Program
45-
Watcher Watcher
43+
Status ExitStatus
44+
Watcher Watcher
4645
}
4746

4847
type CommandLineTesting interface {
@@ -55,6 +54,7 @@ type CommandLineTesting interface {
5554
OnBuildStatusReportStart(w io.Writer)
5655
OnBuildStatusReportEnd(w io.Writer)
5756
GetTrace(w io.Writer) func(msg string)
57+
OnProgram(program *incremental.Program)
5858
}
5959

6060
type CompileTimes struct {

internal/execute/tsctests/runner.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (test *tscInput) run(t *testing.T, scenario string) {
8080
sys.baselineFSwithDiff(baselineBuilder)
8181
result := test.executeCommand(sys, baselineBuilder, test.commandLineArgs)
8282
sys.serializeState(baselineBuilder)
83-
sys.baselinePrograms(baselineBuilder, result.IncrementalProgram, result.Watcher)
83+
sys.baselinePrograms(baselineBuilder)
8484
var unexpectedDiff string
8585

8686
for index, do := range test.edits {
@@ -95,14 +95,13 @@ func (test *tscInput) run(t *testing.T, scenario string) {
9595
}
9696
sys.baselineFSwithDiff(baselineBuilder)
9797

98-
var editResult tsc.CommandLineResult
9998
if result.Watcher == nil {
100-
editResult = test.executeCommand(sys, baselineBuilder, commandLineArgs)
99+
result = test.executeCommand(sys, baselineBuilder, commandLineArgs)
101100
} else {
102101
result.Watcher.DoCycle()
103102
}
104103
sys.serializeState(baselineBuilder)
105-
sys.baselinePrograms(baselineBuilder, editResult.IncrementalProgram, result.Watcher)
104+
sys.baselinePrograms(baselineBuilder)
106105
})
107106
wg.Queue(func() {
108107
// Compute build with all the edits

internal/execute/tsctests/sys.go

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ type snapshot struct {
140140

141141
type testSys struct {
142142
currentWrite *strings.Builder
143+
programBaselines strings.Builder
143144
tracer *harnessutil.TracerForBaselining
144145
serializedDiff *snapshot
145146
forIncrementalCorrectness bool
@@ -263,57 +264,53 @@ func (s *testSys) GetTrace(w io.Writer) func(str string) {
263264
}
264265
}
265266

266-
func (s *testSys) baselinePrograms(baseline *strings.Builder, programs []*incremental.Program, watcher tsc.Watcher) {
267-
if watcher != nil {
268-
programs = []*incremental.Program{watcher.GetProgram()}
269-
}
270-
for index, program := range programs {
271-
if index > 0 {
272-
baseline.WriteString("\n")
273-
}
274-
s.baselineProgram(baseline, program)
275-
}
276-
}
277-
278-
func (s *testSys) baselineProgram(baseline *strings.Builder, program *incremental.Program) {
279-
if program == nil {
280-
return
267+
func (s *testSys) OnProgram(program *incremental.Program) {
268+
if s.programBaselines.Len() != 0 {
269+
s.programBaselines.WriteString("\n")
281270
}
282271

283-
testingData := program.GetTestingData(program.GetProgram())
284-
if testingData.ConfigFilePath != "" {
285-
baseline.WriteString(tspath.GetRelativePathFromDirectory(s.cwd, testingData.ConfigFilePath, tspath.ComparePathsOptions{
272+
testingData := program.GetTestingData()
273+
if configFilePath := program.Options().ConfigFilePath; configFilePath != "" {
274+
s.programBaselines.WriteString(tspath.GetRelativePathFromDirectory(s.cwd, configFilePath, tspath.ComparePathsOptions{
286275
UseCaseSensitiveFileNames: s.FS().UseCaseSensitiveFileNames(),
287276
CurrentDirectory: s.GetCurrentDirectory(),
288277
}) + "::\n")
289278
}
290-
baseline.WriteString("SemanticDiagnostics::\n")
279+
s.programBaselines.WriteString("SemanticDiagnostics::\n")
291280
for _, file := range program.GetProgram().GetSourceFiles() {
292281
if diagnostics, ok := testingData.SemanticDiagnosticsPerFile.Load(file.Path()); ok {
293282
if oldDiagnostics, ok := testingData.OldProgramSemanticDiagnosticsPerFile.Load(file.Path()); !ok || oldDiagnostics != diagnostics {
294-
baseline.WriteString("*refresh* " + file.FileName() + "\n")
283+
s.programBaselines.WriteString("*refresh* " + file.FileName() + "\n")
295284
}
296285
} else {
297-
baseline.WriteString("*not cached* " + file.FileName() + "\n")
286+
s.programBaselines.WriteString("*not cached* " + file.FileName() + "\n")
298287
}
299288
}
300289

301290
// Write signature updates
302-
baseline.WriteString("Signatures::\n")
291+
s.programBaselines.WriteString("Signatures::\n")
303292
for _, file := range program.GetProgram().GetSourceFiles() {
304293
if kind, ok := testingData.UpdatedSignatureKinds[file.Path()]; ok {
305294
switch kind {
306295
case incremental.SignatureUpdateKindComputedDts:
307-
baseline.WriteString("(computed .d.ts) " + file.FileName() + "\n")
296+
s.programBaselines.WriteString("(computed .d.ts) " + file.FileName() + "\n")
308297
case incremental.SignatureUpdateKindStoredAtEmit:
309-
baseline.WriteString("(stored at emit) " + file.FileName() + "\n")
298+
s.programBaselines.WriteString("(stored at emit) " + file.FileName() + "\n")
310299
case incremental.SignatureUpdateKindUsedVersion:
311-
baseline.WriteString("(used version) " + file.FileName() + "\n")
300+
s.programBaselines.WriteString("(used version) " + file.FileName() + "\n")
312301
}
313302
}
314303
}
315304
}
316305

306+
func (s *testSys) baselinePrograms(baseline *strings.Builder) {
307+
baseline.WriteString(s.programBaselines.String())
308+
s.programBaselines.Reset()
309+
}
310+
311+
func (s *testSys) baselineProgram(program *incremental.Program) {
312+
}
313+
317314
func (s *testSys) serializeState(baseline *strings.Builder) {
318315
s.baselineOutput(baseline)
319316
s.baselineFSwithDiff(baseline)

internal/execute/watcher.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ func (w *Watcher) DoCycle() {
8686
// print something???
8787
// fmt.Fprintln(w.sys.Writer(), "no changes detected at ", w.sys.Now())
8888
}
89+
if w.testing != nil {
90+
w.testing.OnProgram(w.program)
91+
}
8992
}
9093

9194
func (w *Watcher) compileAndEmit() {

0 commit comments

Comments
 (0)