From 13da1b55534959f48b6dda9ac057a2c11f07068a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 17:05:35 +0000 Subject: [PATCH 1/3] Initial plan From 9f9869e88751c15fe7be1647072abca18d553a5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 17:25:08 +0000 Subject: [PATCH 2/3] Fix ts-check after reference directives Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- internal/parser/parser.go | 3 +++ .../tsCheckPreservedAfterReference.errors.txt | 20 +++++++++++++++++++ .../tsCheckPreservedAfterReference.ts | 16 +++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 testdata/baselines/reference/compiler/tsCheckPreservedAfterReference.errors.txt create mode 100644 testdata/tests/cases/compiler/tsCheckPreservedAfterReference.ts diff --git a/internal/parser/parser.go b/internal/parser/parser.go index c1f4b5a4c6..4fb5f851ca 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -6607,6 +6607,9 @@ func (p *Parser) processPragmasIntoFields(context *ast.SourceFile) { case "ts-check", "ts-nocheck": // _last_ of either nocheck or check in a file is the "winner" for _, directive := range context.Pragmas { + if directive.Name != "ts-check" && directive.Name != "ts-nocheck" { + continue + } if context.CheckJsDirective == nil || directive.TextRange.Pos() > context.CheckJsDirective.Range.Pos() { context.CheckJsDirective = &ast.CheckJsDirective{ Enabled: directive.Name == "ts-check", diff --git a/testdata/baselines/reference/compiler/tsCheckPreservedAfterReference.errors.txt b/testdata/baselines/reference/compiler/tsCheckPreservedAfterReference.errors.txt new file mode 100644 index 0000000000..51db1216e3 --- /dev/null +++ b/testdata/baselines/reference/compiler/tsCheckPreservedAfterReference.errors.txt @@ -0,0 +1,20 @@ +/checked.js(4,1): error TS2322: Type 'number' is not assignable to type 'string'. +/checked.ts(4,1): error TS2322: Type 'number' is not assignable to type 'string'. + + +==== /checked.ts (1 errors) ==== + // @ts-check + /// + let a = ''; + a = 1; + ~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + +==== /checked.js (1 errors) ==== + // @ts-check + /// + let b = ''; + b = 1; + ~ +!!! error TS2322: Type 'number' is not assignable to type 'string'. + \ No newline at end of file diff --git a/testdata/tests/cases/compiler/tsCheckPreservedAfterReference.ts b/testdata/tests/cases/compiler/tsCheckPreservedAfterReference.ts new file mode 100644 index 0000000000..2fe12ed17a --- /dev/null +++ b/testdata/tests/cases/compiler/tsCheckPreservedAfterReference.ts @@ -0,0 +1,16 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @noTypesAndSymbols: true + +// @filename: /checked.ts +// @ts-check +/// +let a = ''; +a = 1; + +// @filename: /checked.js +// @ts-check +/// +let b = ''; +b = 1; From 30a15a390cdcfdb60d98199bceaa3d5c44047584 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 27 May 2026 18:46:54 +0000 Subject: [PATCH 3/3] Simplify ts-check pragma handling Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- internal/parser/parser.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/internal/parser/parser.go b/internal/parser/parser.go index 4fb5f851ca..122c4178d7 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -6606,15 +6606,10 @@ func (p *Parser) processPragmasIntoFields(context *ast.SourceFile) { } case "ts-check", "ts-nocheck": // _last_ of either nocheck or check in a file is the "winner" - for _, directive := range context.Pragmas { - if directive.Name != "ts-check" && directive.Name != "ts-nocheck" { - continue - } - if context.CheckJsDirective == nil || directive.TextRange.Pos() > context.CheckJsDirective.Range.Pos() { - context.CheckJsDirective = &ast.CheckJsDirective{ - Enabled: directive.Name == "ts-check", - Range: directive.CommentRange, - } + if context.CheckJsDirective == nil || pragma.TextRange.Pos() > context.CheckJsDirective.Range.Pos() { + context.CheckJsDirective = &ast.CheckJsDirective{ + Enabled: pragma.Name == "ts-check", + Range: pragma.CommentRange, } } case "jsx", "jsxfrag", "jsximportsource", "jsxruntime":