Skip to content

Commit 7a99cd9

Browse files
authored
Add baseline/diff generation for JS emit (#651)
1 parent 4840bb9 commit 7a99cd9

File tree

20,795 files changed

+969294
-83
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

20,795 files changed

+969294
-83
lines changed

Herebyfile.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const { values: options } = parseArgs({
2525
args: process.argv.slice(2),
2626
options: {
2727
race: { type: "boolean" },
28+
tests: { type: "string", short: "t" },
2829
fix: { type: "boolean" },
2930
noembed: { type: "boolean" },
3031
debug: { type: "boolean" },
@@ -203,6 +204,7 @@ export const generate = task({
203204
const goTestFlags = [
204205
...goBuildFlags,
205206
...goBuildTags(),
207+
...(options.tests ? [`-run=${options.tests}`] : []),
206208
];
207209

208210
const goTestEnv = {

cmd/tsgo/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ func main() {
220220
var emitTime time.Duration
221221
if compilerOptions.NoEmit.IsFalseOrUnknown() {
222222
emitStart := time.Now()
223-
result := program.Emit(&ts.EmitOptions{})
223+
result := program.Emit(ts.EmitOptions{})
224224
diagnostics = append(diagnostics, result.Diagnostics...)
225225
emitTime = time.Since(emitStart)
226226
}

internal/ast/utilities.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1675,7 +1675,7 @@ func GetExternalModuleName(node *Node) *Expression {
16751675
case KindImportType:
16761676
return getImportTypeNodeLiteral(node)
16771677
case KindCallExpression:
1678-
return node.AsCallExpression().Arguments.Nodes[0]
1678+
return core.FirstOrNil(node.AsCallExpression().Arguments.Nodes)
16791679
case KindModuleDeclaration:
16801680
if IsStringLiteral(node.AsModuleDeclaration().Name()) {
16811681
return node.AsModuleDeclaration().Name()

internal/ast/visitor.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -258,18 +258,21 @@ func (v *NodeVisitor) visitTopLevelStatements(nodes *StatementList) *StatementLi
258258
}
259259

260260
func (v *NodeVisitor) liftToBlock(node *Statement) *Statement {
261-
if node != nil && node.Kind == KindSyntaxList {
262-
nodes := node.AsSyntaxList().Children
263-
if len(nodes) == 0 {
264-
node = nil
265-
} else if len(nodes) == 1 {
266-
node = nodes[0]
261+
var nodes []*Node
262+
if node != nil {
263+
if node.Kind == KindSyntaxList {
264+
nodes = node.AsSyntaxList().Children
267265
} else {
268-
node = v.Factory.NewBlock(v.Factory.NewNodeList(nodes), true /*multiLine*/)
269-
}
270-
if node != nil && node.Kind == KindSyntaxList {
271-
panic("The result of visiting and lifting a Node may not be SyntaxList")
266+
nodes = []*Node{node}
272267
}
273268
}
269+
if len(nodes) == 1 {
270+
node = nodes[0]
271+
} else {
272+
node = v.Factory.NewBlock(v.Factory.NewNodeList(nodes), true /*multiLine*/)
273+
}
274+
if node.Kind == KindSyntaxList {
275+
panic("The result of visiting and lifting a Node may not be SyntaxList")
276+
}
274277
return node
275278
}

internal/binder/referenceresolver.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ var _ ReferenceResolver = &referenceResolver{}
2727

2828
type referenceResolver struct {
2929
resolver *NameResolver
30+
options *core.CompilerOptions
3031
hooks ReferenceResolverHooks
3132
}
3233

33-
func NewReferenceResolver(hooks ReferenceResolverHooks) ReferenceResolver {
34+
func NewReferenceResolver(options *core.CompilerOptions, hooks ReferenceResolverHooks) ReferenceResolver {
3435
return &referenceResolver{
35-
hooks: hooks,
36+
options: options,
37+
hooks: hooks,
3638
}
3739
}
3840

@@ -91,7 +93,9 @@ func (r *referenceResolver) getReferencedValueSymbol(reference *ast.IdentifierNo
9193
}
9294

9395
if r.resolver == nil {
94-
r.resolver = &NameResolver{}
96+
r.resolver = &NameResolver{
97+
CompilerOptions: r.options,
98+
}
9599
}
96100

97101
return r.resolver.Resolve(location, reference.Text(), ast.SymbolFlagsExportValue|ast.SymbolFlagsValue|ast.SymbolFlagsAlias, nil /*nameNotFoundMessage*/, false /*isUse*/, false /*excludeGlobals*/)

internal/checker/emitresolver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (r *emitResolver) isValueAliasDeclarationWorker(node *ast.Node) bool {
8181
core.Some(exportClause.AsNamedExports().Elements.Nodes, r.isValueAliasDeclaration))
8282
case ast.KindExportAssignment:
8383
if node.AsExportAssignment().Expression != nil && node.AsExportAssignment().Expression.Kind == ast.KindIdentifier {
84-
return r.isAliasResolvedToValue(c.getSymbolOfDeclaration(node) /*excludeTypeOnlyValues*/, true)
84+
return r.isAliasResolvedToValue(c.getSymbolOfDeclaration(node), true /*excludeTypeOnlyValues*/)
8585
}
8686
return true
8787
}
@@ -166,7 +166,7 @@ func (r *emitResolver) GetExternalModuleFileFromDeclaration(node *ast.Node) *ast
166166

167167
func (r *emitResolver) getReferenceResolver() binder.ReferenceResolver {
168168
if r.referenceResolver == nil {
169-
r.referenceResolver = binder.NewReferenceResolver(binder.ReferenceResolverHooks{
169+
r.referenceResolver = binder.NewReferenceResolver(r.checker.compilerOptions, binder.ReferenceResolverHooks{
170170
ResolveName: r.checker.resolveName,
171171
GetResolvedSymbol: r.checker.getResolvedSymbol,
172172
GetMergedSymbol: r.checker.getMergedSymbol,

internal/compiler/emitter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func (e *emitter) getScriptTransformers(emitContext *printer.EmitContext, source
7474
emitResolver.MarkLinkedReferencesRecursively(sourceFile)
7575
referenceResolver = emitResolver
7676
} else {
77-
referenceResolver = binder.NewReferenceResolver(binder.ReferenceResolverHooks{})
77+
referenceResolver = binder.NewReferenceResolver(options, binder.ReferenceResolverHooks{})
7878
}
7979

8080
// erase types

internal/compiler/program.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ type sourceMapEmitResult struct {
528528
sourceMap *sourcemap.RawSourceMap
529529
}
530530

531-
func (p *Program) Emit(options *EmitOptions) *EmitResult {
531+
func (p *Program) Emit(options EmitOptions) *EmitResult {
532532
// !!! performance measurement
533533
p.BindSourceFiles()
534534

internal/execute/tsc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ func compileAndEmit(sys System, program *compiler.Program, reportDiagnostic diag
225225
emitResult := &compiler.EmitResult{EmitSkipped: true, Diagnostics: []*ast.Diagnostic{}}
226226
if !options.ListFilesOnly.IsTrue() {
227227
// !!! Emit is not yet fully implemented, will not emit unless `outfile` specified
228-
emitResult = program.Emit(&compiler.EmitOptions{})
228+
emitResult = program.Emit(compiler.EmitOptions{})
229229
}
230230
diagnostics = append(diagnostics, emitResult.Diagnostics...)
231231

internal/testrunner/compiler_runner.go

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,13 @@ func (r *CompilerBaselineRunner) EnumerateTestFiles() []string {
8888
func (r *CompilerBaselineRunner) RunTests(t *testing.T) {
8989
r.cleanUpLocal(t)
9090
files := r.EnumerateTestFiles()
91-
skippedTests := []string{
92-
"mappedTypeRecursiveInference.ts", // Needed until we have type printer with truncation limit.
91+
skippedTests := map[string]string{
92+
"mappedTypeRecursiveInference.ts": "Skipped until we have type printer with truncation limit.",
93+
"jsFileCompilationWithoutJsExtensions.ts": "Skipped until we have proper allowJS support (and errors when not enabled.)",
94+
"fileReferencesWithNoExtensions.ts": "Skipped until we support adding missing extensions in subtasks in fileloader.go",
95+
"typeOnlyMerge2.ts": "Needs investigation",
96+
"typeOnlyMerge3.ts": "Needs investigation",
97+
"filesEmittingIntoSameOutput.ts": "Output order nondeterministic due to collision on filename during parallel emit.",
9398
}
9499
deprecatedTests := []string{
95100
// Test deprecated `importsNotUsedAsValue`
@@ -100,7 +105,8 @@ func (r *CompilerBaselineRunner) RunTests(t *testing.T) {
100105
"importsNotUsedAsValues_error.ts",
101106
}
102107
for _, filename := range files {
103-
if slices.Contains(skippedTests, tspath.GetBaseFileName(filename)) {
108+
if msg, ok := skippedTests[tspath.GetBaseFileName(filename)]; ok {
109+
t.Run(tspath.GetBaseFileName(filename), func(t *testing.T) { t.Skip(msg) })
104110
continue
105111
}
106112
if slices.Contains(deprecatedTests, tspath.GetBaseFileName(filename)) {
@@ -174,6 +180,7 @@ func (r *CompilerBaselineRunner) runSingleConfigTest(t *testing.T, testName stri
174180
compilerTest := newCompilerTest(t, testName, test.filename, &payload, config)
175181

176182
compilerTest.verifyDiagnostics(t, r.testSuitName, r.isSubmodule)
183+
compilerTest.verifyJavaScriptOutput(t, r.testSuitName, r.isSubmodule)
177184
compilerTest.verifyTypesAndSymbols(t, r.testSuitName, r.isSubmodule)
178185
// !!! Verify all baselines
179186
}
@@ -325,8 +332,6 @@ var concurrentSkippedErrorBaselines = core.NewSetFromItems(
325332
"recursiveExportAssignmentAndFindAliasedType2.ts",
326333
"recursiveExportAssignmentAndFindAliasedType3.ts",
327334
"superInStaticMembers1.ts target=es2015",
328-
"typeOnlyMerge2.ts",
329-
"typeOnlyMerge3.ts",
330335
)
331336

332337
func (c *compilerTest) verifyDiagnostics(t *testing.T, suiteName string, isSubmodule bool) {
@@ -345,6 +350,33 @@ func (c *compilerTest) verifyDiagnostics(t *testing.T, suiteName string, isSubmo
345350
})
346351
}
347352

353+
func (c *compilerTest) verifyJavaScriptOutput(t *testing.T, suiteName string, isSubmodule bool) {
354+
if !c.hasNonDtsFiles {
355+
return
356+
}
357+
358+
t.Run("output", func(t *testing.T) {
359+
defer testutil.RecoverAndFail(t, "Panic on creating js output for test "+c.filename)
360+
headerComponents := tspath.GetPathComponentsRelativeTo(repo.TestDataPath, c.filename, tspath.ComparePathsOptions{})
361+
if isSubmodule {
362+
headerComponents = headerComponents[4:] // Strip "./../_submodules/TypeScript" prefix
363+
}
364+
header := tspath.GetPathFromPathComponents(headerComponents)
365+
tsbaseline.DoJsEmitBaseline(
366+
t,
367+
c.configuredName,
368+
header,
369+
c.options,
370+
c.result,
371+
c.tsConfigFiles,
372+
c.toBeCompiled,
373+
c.otherFiles,
374+
c.harnessOptions,
375+
baseline.Options{Subfolder: suiteName, IsSubmodule: isSubmodule},
376+
)
377+
})
378+
}
379+
348380
func (c *compilerTest) verifyTypesAndSymbols(t *testing.T, suiteName string, isSubmodule bool) {
349381
noTypesAndSymbols := c.harnessOptions.NoTypesAndSymbols
350382
if noTypesAndSymbols {

0 commit comments

Comments
 (0)