Skip to content

Commit 448829a

Browse files
committed
Program to take ParsedCommandLine as config instead of separate options, root names, diagnostics etc
1 parent e8d352c commit 448829a

File tree

11 files changed

+131
-86
lines changed

11 files changed

+131
-86
lines changed

internal/checker/checker_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ foo.bar;`
4141
parsed, errors := tsoptions.GetParsedCommandLineOfConfigFile("/tsconfig.json", &core.CompilerOptions{}, host, nil)
4242
assert.Equal(t, len(errors), 0, "Expected no errors in parsed command line")
4343

44-
p := compiler.NewProgramFromParsedCommandLine(parsed, host)
44+
p := compiler.NewProgram(compiler.ProgramOptions{
45+
Config: parsed,
46+
Host: host,
47+
})
4548
p.BindSourceFiles()
4649
c, done := p.GetTypeChecker(t.Context())
4750
defer done()
@@ -70,7 +73,10 @@ func TestCheckSrcCompiler(t *testing.T) {
7073
host := compiler.NewCompilerHost(nil, rootPath, fs, bundled.LibPath())
7174
parsed, errors := tsoptions.GetParsedCommandLineOfConfigFile(tspath.CombinePaths(rootPath, "tsconfig.json"), &core.CompilerOptions{}, host, nil)
7275
assert.Equal(t, len(errors), 0, "Expected no errors in parsed command line")
73-
p := compiler.NewProgramFromParsedCommandLine(parsed, host)
76+
p := compiler.NewProgram(compiler.ProgramOptions{
77+
Config: parsed,
78+
Host: host,
79+
})
7480
p.CheckSourceFiles(t.Context())
7581
}
7682

@@ -84,7 +90,10 @@ func BenchmarkNewChecker(b *testing.B) {
8490
host := compiler.NewCompilerHost(nil, rootPath, fs, bundled.LibPath())
8591
parsed, errors := tsoptions.GetParsedCommandLineOfConfigFile(tspath.CombinePaths(rootPath, "tsconfig.json"), &core.CompilerOptions{}, host, nil)
8692
assert.Equal(b, len(errors), 0, "Expected no errors in parsed command line")
87-
p := compiler.NewProgramFromParsedCommandLine(parsed, host)
93+
p := compiler.NewProgram(compiler.ProgramOptions{
94+
Config: parsed,
95+
Host: host,
96+
})
8897

8998
b.ReportAllocs()
9099

internal/compiler/program.go

Lines changed: 28 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,21 @@ import (
2121
)
2222

2323
type ProgramOptions struct {
24-
RootFiles []string
25-
Host CompilerHost
26-
Options *core.CompilerOptions
27-
SingleThreaded core.Tristate
28-
ProjectReference []core.ProjectReference
29-
ConfigFileParsingDiagnostics []*ast.Diagnostic
30-
CreateCheckerPool func(*Program) CheckerPool
31-
32-
TypingsLocation string
33-
ProjectName string
24+
Host CompilerHost
25+
Config *tsoptions.ParsedCommandLine
26+
SingleThreaded core.Tristate
27+
CreateCheckerPool func(*Program) CheckerPool
28+
TypingsLocation string
29+
ProjectName string
3430
}
3531

3632
type Program struct {
37-
host CompilerHost
38-
programOptions ProgramOptions
39-
compilerOptions *core.CompilerOptions
40-
configFileName string
41-
nodeModules map[string]*ast.SourceFile
42-
checkerPool CheckerPool
43-
currentDirectory string
44-
configFileParsingDiagnostics []*ast.Diagnostic
33+
host CompilerHost
34+
programOptions ProgramOptions
35+
compilerOptions *core.CompilerOptions
36+
nodeModules map[string]*ast.SourceFile
37+
checkerPool CheckerPool
38+
currentDirectory string
4539

4640
sourceAffectingCompilerOptionsOnce sync.Once
4741
sourceAffectingCompilerOptions *core.SourceFileAffectingCompilerOptions
@@ -175,8 +169,7 @@ func (p *Program) GetSourceFileFromReference(origin *ast.SourceFile, ref *ast.Fi
175169
func NewProgram(options ProgramOptions) *Program {
176170
p := &Program{}
177171
p.programOptions = options
178-
p.compilerOptions = options.Options
179-
p.configFileParsingDiagnostics = slices.Clip(options.ConfigFileParsingDiagnostics)
172+
p.compilerOptions = options.Config.CompilerOptions()
180173
if p.compilerOptions == nil {
181174
panic("compiler options required")
182175
}
@@ -211,7 +204,7 @@ func NewProgram(options ProgramOptions) *Program {
211204
}
212205
}
213206

214-
p.processedFiles = processAllProgramFiles(p.host, p.programOptions, p.compilerOptions, p.resolver, options.RootFiles, libs, p.singleThreaded())
207+
p.processedFiles = processAllProgramFiles(p.host, p.programOptions, p.compilerOptions, p.resolver, options.Config.FileNames(), libs, p.singleThreaded())
215208
p.filesByPath = make(map[tspath.Path]*ast.SourceFile, len(p.files))
216209
for _, file := range p.files {
217210
p.filesByPath[file.Path()] = file
@@ -236,20 +229,18 @@ func (p *Program) UpdateProgram(changedFilePath tspath.Path) (*Program, bool) {
236229
return NewProgram(p.programOptions), false
237230
}
238231
result := &Program{
239-
host: p.host,
240-
programOptions: p.programOptions,
241-
compilerOptions: p.compilerOptions,
242-
configFileName: p.configFileName,
243-
nodeModules: p.nodeModules,
244-
currentDirectory: p.currentDirectory,
245-
configFileParsingDiagnostics: p.configFileParsingDiagnostics,
246-
resolver: p.resolver,
247-
comparePathsOptions: p.comparePathsOptions,
248-
processedFiles: p.processedFiles,
249-
filesByPath: p.filesByPath,
250-
currentNodeModulesDepth: p.currentNodeModulesDepth,
251-
usesUriStyleNodeCoreModules: p.usesUriStyleNodeCoreModules,
252-
unsupportedExtensions: p.unsupportedExtensions,
232+
host: p.host,
233+
programOptions: p.programOptions,
234+
compilerOptions: p.compilerOptions,
235+
nodeModules: p.nodeModules,
236+
currentDirectory: p.currentDirectory,
237+
resolver: p.resolver,
238+
comparePathsOptions: p.comparePathsOptions,
239+
processedFiles: p.processedFiles,
240+
filesByPath: p.filesByPath,
241+
currentNodeModulesDepth: p.currentNodeModulesDepth,
242+
usesUriStyleNodeCoreModules: p.usesUriStyleNodeCoreModules,
243+
unsupportedExtensions: p.unsupportedExtensions,
253244
}
254245
result.initCheckerPool()
255246
index := core.FindIndex(result.files, func(file *ast.SourceFile) bool { return file.Path() == newFile.Path() })
@@ -302,22 +293,11 @@ func equalCheckJSDirectives(d1 *ast.CheckJsDirective, d2 *ast.CheckJsDirective)
302293
return d1 == nil && d2 == nil || d1 != nil && d2 != nil && d1.Enabled == d2.Enabled
303294
}
304295

305-
func NewProgramFromParsedCommandLine(config *tsoptions.ParsedCommandLine, host CompilerHost) *Program {
306-
programOptions := ProgramOptions{
307-
RootFiles: config.FileNames(),
308-
Options: config.CompilerOptions(),
309-
Host: host,
310-
// todo: ProjectReferences
311-
ConfigFileParsingDiagnostics: config.GetConfigFileParsingDiagnostics(),
312-
}
313-
return NewProgram(programOptions)
314-
}
315-
316296
func (p *Program) SourceFiles() []*ast.SourceFile { return p.files }
317297
func (p *Program) Options() *core.CompilerOptions { return p.compilerOptions }
318298
func (p *Program) Host() CompilerHost { return p.host }
319299
func (p *Program) GetConfigFileParsingDiagnostics() []*ast.Diagnostic {
320-
return slices.Clip(p.configFileParsingDiagnostics)
300+
return slices.Clip(p.programOptions.Config.GetConfigFileParsingDiagnostics())
321301
}
322302

323303
func (p *Program) singleThreaded() bool {
@@ -432,7 +412,7 @@ func (p *Program) getOptionsDiagnosticsOfConfigFile() []*ast.Diagnostic {
432412
if p.Options() == nil || p.Options().ConfigFilePath == "" {
433413
return nil
434414
}
435-
return p.configFileParsingDiagnostics // TODO: actually call getDiagnosticsHelper on config path
415+
return p.GetConfigFileParsingDiagnostics() // TODO: actually call getDiagnosticsHelper on config path
436416
}
437417

438418
func (p *Program) getSyntacticDiagnosticsForFile(ctx context.Context, sourceFile *ast.SourceFile) []*ast.Diagnostic {

internal/compiler/program_test.go

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,13 @@ func TestProgram(t *testing.T) {
232232
opts := core.CompilerOptions{Target: testCase.target}
233233

234234
program := NewProgram(ProgramOptions{
235-
RootFiles: []string{"c:/dev/src/index.ts"},
236-
Host: NewCompilerHost(&opts, "c:/dev/src", fs, bundled.LibPath()),
237-
Options: &opts,
235+
Config: &tsoptions.ParsedCommandLine{
236+
ParsedConfig: &core.ParsedOptions{
237+
FileNames: []string{"c:/dev/src/index.ts"},
238+
CompilerOptions: &opts,
239+
},
240+
},
241+
Host: NewCompilerHost(&opts, "c:/dev/src", fs, bundled.LibPath()),
238242
})
239243

240244
actualFiles := []string{}
@@ -265,9 +269,13 @@ func BenchmarkNewProgram(b *testing.B) {
265269

266270
opts := core.CompilerOptions{Target: testCase.target}
267271
programOpts := ProgramOptions{
268-
RootFiles: []string{"c:/dev/src/index.ts"},
269-
Host: NewCompilerHost(&opts, "c:/dev/src", fs, bundled.LibPath()),
270-
Options: &opts,
272+
Config: &tsoptions.ParsedCommandLine{
273+
ParsedConfig: &core.ParsedOptions{
274+
FileNames: []string{"c:/dev/src/index.ts"},
275+
CompilerOptions: &opts,
276+
},
277+
},
278+
Host: NewCompilerHost(&opts, "c:/dev/src", fs, bundled.LibPath()),
271279
}
272280

273281
for b.Loop() {
@@ -290,8 +298,8 @@ func BenchmarkNewProgram(b *testing.B) {
290298
assert.Equal(b, len(errors), 0, "Expected no errors in parsed command line")
291299

292300
opts := ProgramOptions{
293-
Host: host,
294-
Options: parsed.CompilerOptions(),
301+
Config: parsed,
302+
Host: host,
295303
}
296304

297305
for b.Loop() {

internal/execute/export_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ func RunWatchCycle(w *watcher) {
2929
return
3030
}
3131
// todo: updateProgram()
32-
w.program = compiler.NewProgramFromParsedCommandLine(w.options, w.host)
32+
w.program = compiler.NewProgram(compiler.ProgramOptions{
33+
Config: w.options,
34+
Host: w.host,
35+
})
3336
if w.hasBeenModified(w.program) {
3437
w.compileAndEmit()
3538
}

internal/execute/tsc.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,10 @@ func performCompilation(sys System, cb cbType, config *tsoptions.ParsedCommandLi
176176
host := compiler.NewCachedFSCompilerHost(config.CompilerOptions(), sys.GetCurrentDirectory(), sys.FS(), sys.DefaultLibraryPath())
177177
// todo: cache, statistics, tracing
178178
parseStart := time.Now()
179-
program := compiler.NewProgramFromParsedCommandLine(config, host)
179+
program := compiler.NewProgram(compiler.ProgramOptions{
180+
Config: config,
181+
Host: host,
182+
})
180183
parseTime := time.Since(parseStart)
181184

182185
result := emitFilesAndReportErrors(sys, program, reportDiagnostic)

internal/execute/watch.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ func (w *watcher) doCycle() {
3535
return
3636
}
3737
// updateProgram()
38-
w.program = compiler.NewProgramFromParsedCommandLine(w.options, w.host)
38+
w.program = compiler.NewProgram(compiler.ProgramOptions{
39+
Config: w.options,
40+
Host: w.host,
41+
})
3942
if w.hasBeenModified(w.program) {
4043
fmt.Fprint(w.sys.Writer(), "build starting at ", w.sys.Now(), w.sys.NewLine())
4144
timeStart := w.sys.Now()

internal/project/project.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ type Project struct {
147147
compilerOptions *core.CompilerOptions
148148
typeAcquisition *core.TypeAcquisition
149149
parsedCommandLine *tsoptions.ParsedCommandLine
150+
programConfig *tsoptions.ParsedCommandLine
150151
program *compiler.Program
151152
checkerPool *checkerPool
152153

@@ -471,6 +472,7 @@ func (p *Project) updateGraph() bool {
471472
case PendingReloadFileNames:
472473
p.parsedCommandLine = tsoptions.ReloadFileNamesOfParsedCommandLine(p.parsedCommandLine, p.host.FS())
473474
writeFileNames = p.setRootFiles(p.parsedCommandLine.FileNames())
475+
p.programConfig = nil
474476
case PendingReloadFull:
475477
if err := p.loadConfig(); err != nil {
476478
panic(fmt.Sprintf("failed to reload config: %v", err))
@@ -512,16 +514,37 @@ func (p *Project) updateProgram() bool {
512514
}
513515
var oldProgramReused bool
514516
if p.program == nil || p.dirtyFilePath == "" {
515-
rootFileNames := p.GetRootFileNames()
516-
compilerOptions := p.compilerOptions
517+
if p.programConfig == nil {
518+
if p.parsedCommandLine != nil {
519+
if len(p.typingFiles) == 0 {
520+
p.programConfig = p.parsedCommandLine
521+
} else {
522+
parsedConfig := *p.parsedCommandLine.ParsedConfig
523+
parsedConfig.FileNames = p.GetRootFileNames()
524+
p.programConfig = &tsoptions.ParsedCommandLine{
525+
ParsedConfig: &parsedConfig,
526+
ConfigFile: p.parsedCommandLine.ConfigFile,
527+
Errors: p.parsedCommandLine.Errors,
528+
}
529+
}
530+
} else {
531+
rootFileNames := p.GetRootFileNames()
532+
compilerOptions := p.compilerOptions
533+
p.programConfig = &tsoptions.ParsedCommandLine{
534+
ParsedConfig: &core.ParsedOptions{
535+
CompilerOptions: compilerOptions,
536+
FileNames: rootFileNames,
537+
},
538+
}
539+
}
540+
}
517541
var typingsLocation string
518542
if typeAcquisition := p.getTypeAcquisition(); typeAcquisition != nil && typeAcquisition.Enable.IsTrue() {
519543
typingsLocation = p.host.TypingsInstaller().TypingsLocation
520544
}
521545
p.program = compiler.NewProgram(compiler.ProgramOptions{
522-
RootFiles: rootFileNames,
546+
Config: p.programConfig,
523547
Host: p,
524-
Options: compilerOptions,
525548
TypingsLocation: typingsLocation,
526549
CreateCheckerPool: func(program *compiler.Program) compiler.CheckerPool {
527550
p.checkerPool = newCheckerPool(4, program, p.Log)
@@ -694,6 +717,7 @@ func (p *Project) UpdateTypingFiles(typingsInfo *TypingsInfo, typingFiles []stri
694717
if !slices.Equal(typingFiles, p.typingFiles) {
695718
// If typing files changed, then only schedule project update
696719
p.typingFiles = typingFiles
720+
p.programConfig = nil
697721

698722
// // Invalidate files with unresolved imports
699723
// this.resolutionCache.setFilesWithInvalidatedNonRelativeUnresolvedImports(this.cachedUnresolvedImportsPerFile);
@@ -790,6 +814,7 @@ func (p *Project) removeFile(info *ScriptInfo, fileExists bool, detachFromProjec
790814
case KindInferred:
791815
p.rootFileNames.Delete(info.path)
792816
p.typeAcquisition = nil
817+
p.programConfig = nil
793818
case KindConfigured:
794819
p.pendingReload = PendingReloadFileNames
795820
}
@@ -813,6 +838,7 @@ func (p *Project) AddRoot(info *ScriptInfo) {
813838
p.mu.Lock()
814839
defer p.mu.Unlock()
815840
p.addRoot(info)
841+
p.programConfig = nil
816842
p.markAsDirtyLocked()
817843
}
818844

@@ -845,6 +871,7 @@ func (p *Project) loadConfig() error {
845871
panic("loadConfig called on non-configured project")
846872
}
847873

874+
p.programConfig = nil
848875
if configFileContent, ok := p.host.FS().ReadFile(p.configFileName); ok {
849876
configDir := tspath.GetDirectoryPath(p.configFileName)
850877
tsConfigSourceFile := tsoptions.NewTsconfigSourceFileFromFilePath(p.configFileName, p.configFilePath, configFileContent)

internal/testrunner/compiler_runner.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,19 +255,19 @@ func newCompilerTest(
255255
units := testCaseContentWithConfig.testUnitData
256256
var toBeCompiled []*harnessutil.TestFile
257257
var otherFiles []*harnessutil.TestFile
258-
var tsConfigOptions core.CompilerOptions
258+
var tsConfig *tsoptions.ParsedCommandLine
259259
hasNonDtsFiles := core.Some(
260260
units,
261261
func(unit *testUnit) bool { return !tspath.FileExtensionIs(unit.name, tspath.ExtensionDts) })
262262
var tsConfigFiles []*harnessutil.TestFile
263263
if testCaseContentWithConfig.tsConfig != nil {
264-
tsConfigOptions = *testCaseContentWithConfig.tsConfig.ParsedConfig.CompilerOptions
264+
tsConfig = testCaseContentWithConfig.tsConfig
265265
tsConfigFiles = []*harnessutil.TestFile{
266266
createHarnessTestFile(testCaseContentWithConfig.tsConfigFileUnitData, currentDirectory),
267267
}
268268
for _, unit := range units {
269269
if slices.Contains(
270-
testCaseContentWithConfig.tsConfig.ParsedConfig.FileNames,
270+
tsConfig.ParsedConfig.FileNames,
271271
tspath.GetNormalizedAbsolutePath(unit.name, currentDirectory),
272272
) {
273273
toBeCompiled = append(toBeCompiled, createHarnessTestFile(unit, currentDirectory))
@@ -303,7 +303,7 @@ func newCompilerTest(
303303
toBeCompiled,
304304
otherFiles,
305305
harnessConfig,
306-
&tsConfigOptions,
306+
tsConfig,
307307
currentDirectory,
308308
testCaseContentWithConfig.symlinks,
309309
)

0 commit comments

Comments
 (0)