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":