Skip to content

feat(semantic): report TS1228 for invalid type predicates#23174

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/ts1228-diagnostics
Jun 11, 2026
Merged

feat(semantic): report TS1228 for invalid type predicates#23174
graphite-app[bot] merged 1 commit into
mainfrom
codex/ts1228-diagnostics

Conversation

@camc314

@camc314 camc314 commented Jun 9, 2026

Copy link
Copy Markdown
Contributor
  • Emit TS1228 for invalid type predicate positions from semantic syntax checks.
  • Treat valid predicates as only those that are the immediate return type of a function, method, function type, call signature, or non-accessor method signature.

Why semantic

TypeScript parses type predicates as part of the normal type grammar, then validates their placement later in checker logic. This is not a parser recovery decision: the syntax can be represented in the AST, but whether it is legal depends on the predicate node's parent chain.

Keeping this check in semantic avoids parser mode plumbing and matches that model. The semantic checker can inspect ancestry to reject predicates in property annotations, constructor types, accessors, construct signatures, and nested or parenthesized type positions while reporting the span on the predicate node itself.

@github-actions github-actions Bot added the A-parser Area - Parser label Jun 9, 2026
@codspeed-hq

codspeed-hq Bot commented Jun 9, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 62 untouched benchmarks
⏩ 9 skipped benchmarks1


Comparing codex/ts1228-diagnostics (a6064c1) with main (2409a10)

Open in CodSpeed

Footnotes

  1. 9 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@camc314 camc314 force-pushed the codex/ts1228-diagnostics branch from 4a5b95e to 7ecbdb6 Compare June 10, 2026 09:22
@camc314 camc314 changed the title fix(parser): report TS1228 for invalid type predicates fix(semantic): report TS1228 for invalid type predicates Jun 10, 2026
@camc314 camc314 removed the A-parser Area - Parser label Jun 10, 2026
@github-actions github-actions Bot added the A-semantic Area - Semantic label Jun 10, 2026
@camc314 camc314 changed the title fix(semantic): report TS1228 for invalid type predicates feat(semantic): report TS1228 for invalid type predicates Jun 10, 2026
@camc314 camc314 force-pushed the codex/ts1228-diagnostics branch from 5ad4855 to e5492e2 Compare June 10, 2026 11:26
@camc314 camc314 marked this pull request as ready for review June 10, 2026 11:30
@camc314 camc314 requested a review from Dunqing as a code owner June 10, 2026 11:30
Copilot AI review requested due to automatic review settings June 10, 2026 11:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a semantic (post-parse) TypeScript syntax check to emit TS1228 when a TSTypePredicate/asserts predicate appears in an invalid position, matching TypeScript’s model where predicates parse as types but are validated later based on their ancestor chain.

Changes:

  • Add a new TS diagnostic constructor for TS(1228) (“type predicate only allowed in return type position for functions and methods”).
  • Introduce an ancestry-based checker that validates TSTypePredicate placement and reports TS1228 when invalid.
  • Update the TypeScript parser coverage snapshot to reflect the new semantic errors (moving some cases out of “Expect Syntax Error” and into TS diagnostics output).

Reviewed changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated no comments.

File Description
tasks/coverage/snapshots/parser_typescript.snap Snapshot update reflecting new TS1228 semantic diagnostics for previously “syntax error” coverage cases.
crates/oxc_semantic/src/diagnostics.rs Adds a TS(1228) diagnostic helper (type_predicate_only_in_return_type).
crates/oxc_semantic/src/checker/typescript.rs Adds check_ts_type_predicate and ancestry-based allowed-position logic for type predicates.
crates/oxc_semantic/src/checker/mod.rs Wires AstKind::TSTypePredicate into the semantic checker dispatch.

@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Jun 11, 2026
@camc314 camc314 self-assigned this Jun 11, 2026

camc314 commented Jun 11, 2026

Copy link
Copy Markdown
Contributor Author

Merge activity

- Emit TS1228 for invalid type predicate positions from semantic syntax checks.
- Treat valid predicates as only those that are the immediate return type of a function, method, function type, call signature, or non-accessor method signature.

## Why semantic
TypeScript parses type predicates as part of the normal type grammar, then validates their placement later in checker logic. This is not a parser recovery decision: the syntax can be represented in the AST, but whether it is legal depends on the predicate node's parent chain.

Keeping this check in semantic avoids parser mode plumbing and matches that model. The semantic checker can inspect ancestry to reject predicates in property annotations, constructor types, accessors, construct signatures, and nested or parenthesized type positions while reporting the span on the predicate node itself.
@graphite-app graphite-app Bot force-pushed the codex/ts1228-diagnostics branch from a6064c1 to 47991bd Compare June 11, 2026 19:50
@graphite-app graphite-app Bot merged commit 47991bd into main Jun 11, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jun 11, 2026
@graphite-app graphite-app Bot deleted the codex/ts1228-diagnostics branch June 11, 2026 19:54
Boshen added a commit that referenced this pull request Jun 15, 2026
### 💥 BREAKING CHANGES

- 7a24911 codegen: [**BREAKING**] Borrow sourcemaps from codegen
(#23422) (Boshen)
- bb0ed44 transformer: [**BREAKING**] Disable styled-components
transpileTemplateLiterals by default (#23171) (Boshen)

### 🚀 Features

- 1490a0a linter/react: Implement react-compiler rule (#23202) (Boshen)
- 6c0bdf0 transformer/react-refresh: Support `module.property.useHook()`
(#23190) (Dunqing)
- 47991bd semantic: Report TS1228 for invalid type predicates (#23174)
(camc314)
- 1d3af58 parser: Add TS2398 parameter property diagnostic (#23216)
(camc314)
- 44313da semantic: Add `scope_is_descendant_of` api (#22313) (camc314)
- e5050c0 parser: Improve diagnostic for rest initializer (#23205)
(camc314)
- ec266bb transformer: Run React Compiler as a feature-gated transform
pass (#23201) (Boshen)
- e7374fe parser: Report error for `const` modifier on interface type
parameter (#23173) (camc314)
- a7c1c9b parser: Report ambient definite variable assertions (#23165)
(camc314)
- d169fcd parser: Report invalid class definite assertions (#23164)
(camc314)
- 00244d8 parser: Report definite property initializer errors (#23160)
(camc314)

### 🐛 Bug Fixes

- 52d0c31 transformer: Replace ambient dot defines (#23231) (camc314)
- 2c28748 transformer/class: Parent generated constructors to class
scope (#23222) (camc314)
- 8edd234 parser: Report accessor definite assertion on token (#23203)
(camc314)
- de38a3f react_compiler: Keep imports referenced only by a local
re-export (#23176) (Boshen)
- f5721c2 codegen: Preserve parentheses around `intrinsic` type
reference (#23156) (Boshen)
- e89f81d parser: Don't emit TS1477 for parenthesized instantiation
expression (#23147) (Boshen)
- 8a04149 parser: Reject module-referencing imports/exports in a
namespace body (#22829) (Boshen)

### ⚡ Performance

- 2783295 parser: Table-driven operator precedence lookup (#23346)
(Boshen)
- 231d5de parser: Single-match member expression dispatch (#23347)
(Boshen)
- e89729b codegen: Accept one-shot wrap closures (#23265) (camc314)
- a6c11fa parser: Force-inline read_non_decimal to fold per-digit number
dispatch (#23157) (Boshen)
- d74964c parser: Store class definite assertion offset (#23170)
(camc314)
- f0fda4d parser: Shrink-wrap cold diagnostic tails out of hot frames
(#23159) (Boshen)
- a082180 parser: Store definite assertion offset (#23167) (camc314)
- 534f9c6 oxc: Conditionally rebuild semantic in compiler pipeline
(#23153) (Boshen)
- b435c6a parser: Skip checkpoint for `infer T extends U` constraint in
disallow context (#23128) (Boshen)
- 7464dce parser: Peek instead of checkpoint/rewind for `export default`
modifier (#23124) (Boshen)
- 80a9a32 parser: Fast-path single-keyword TS declarations (#23083)
(Boshen)
- da1a6c6 diagnostics: Migrate to allocation-optimized oxc-miette
(#23094) (Boshen)
- b7b08ce parser: Peek once for the static modifier disambiguation
(#23079) (Boshen)
- e7e07a3 parser: Fold unary dispatch into a single match (#23076)
(Boshen)

### 📚 Documentation

- d241add semantic: Add `AGENTS.md` test guidance for agents (#23441)
(camc314)
- 026f1ae parser: Add `AGENTS.md` test guidance for agents (#23440)
(camc314)
- 09755ac transformer: Add `AGENTS.md` test guidance for agents (#23439)
(camc314)
- e6bdfd4 lexer: Correct reference link for `byte_handlers!` (#23313)
(Dunqing)
- 65b6d7a allocator: Fix memory leaks in `Arena` examples (#23257)
(overlookmotel)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-semantic Area - Semantic

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants