ReviewOS

home-lang/home

TypeScript checker parity: eliminate the remaining 30 failures

#69
Closed chris opened this 14 days ago · 717 comments
14 days ago

Parent: #67

Scope

Make ts_checker fully green by porting the remaining TypeScript semantics and exact diagnostic behavior. Do not weaken assertions or encode fixture-specific outcomes.

Current verified state

After fixing distributive-conditional union member ownership:

  • 2,976 / 3,006 pass
  • 30 fail
  • 0 crash (down from 2 crashes)

The crash fix copies union member IDs before recursive conditional evaluation so interner reallocations cannot invalidate a borrowed slice.

Remaining failure clusters

  • Enum/member literal assignment compatibility.
  • Global-script this indexed access diagnostics.
  • Generic defaults, conditional distribution, NonNullable, mapped and template types.
  • Variadic tuple inference and callback arity.
  • Overload diagnostic anchoring and CheckJS/JSDoc arity.
  • Accessor read/write and spread typing.
  • Alias/generic-instance diagnostic rendering.
  • Recursive type depth/circular mapped diagnostics.

Completion gate

  • ./pantry/.bin/zig build test -Dfilter=ts_checker --summary failures reports 3,006 / 3,006.
  • No crash, timeout, or skipped parity assertion replaces a failure.
  • Each semantic cluster lands in a focused conventional commit with regression coverage.
14 days ago

Pushed 9928e08be (fix(ts-checker): suppress invalid-radix duplicate cascades).

Parity impact:

  • binaryIntegerLiteralError: 0/1 -> 1/1 exact
  • octalIntegerLiteralError: 0/1 -> 1/1 exact
  • Full exact corpus: 4935/5907 -> 4937/5907
  • Remaining failures: 972 -> 970
  • New failures: 0
  • Change size: 35 changed lines in 1 file (34 insertions, 1 deletion)

Implementation:

  • Detect recovered object literals containing 0b / 0o numeric property keys.
  • Suppress the TS1117 cascade only when those keys coexist with parser diagnostics.
  • Preserve ordinary numeric/string duplicate-property diagnostics during unrelated parse recovery.
  • Add focused binary/octal and ordinary-duplicate regression coverage.

Verification:

  • checker: 3075/3075
  • conformance: 1368/1368
  • focused exact slice: 2/2
  • exact TypeScript corpus: 4937/5907, no regressions
  • rebased TS1117 guards: 4/4 combined

Tracks #69.

14 days ago

Pushed b7f13027a (fix(ts-checker): prune impossible typeof assignment branches).

This ports the TS2454 control-flow behavior for impossible positive typeof branches. The assignment scanner now evaluates annotated primitive unions conservatively, treats empty enum constituents as having no reachable runtime tag, and removes a pending variable only from the proven-impossible branch clone. The guard itself and every reachable branch still report use-before-assignment. Unknown aliases and non-empty enums retain the existing behavior.

Parity impact:

  • Exact corpus: 4937/5907 -> 4938/5907
  • Resolved fixture: symbolType19
  • New failures: 0
  • Remaining failures: 969
  • Change size: 112 inserted lines across implementation and focused test coverage

Verification:

  • focused TS2454 checker regression: 2/2
  • exact symbolType19 rerun after rebase: 1/1
  • checker suite: 3076/3076
  • conformance suite: 1368/1368
  • full exact corpus: 5907 surveyed, 4938 passed, 969 failed, 0 skipped

The commit is authored and committed as Chris with no co-authors.

14 days ago

Pushed 5c86a75a3 (fix(ts-parser): recover invalid exported throw statements).

This ports TypeScript's malformed-throw recovery cascade end to end. A semicolon-only throw; now emits TS1109, synthesizes a zero-width undefined operand, and continues parsing. When the later export modifier precedes a statement-only keyword such as throw, the parser emits TS1128 at export and preserves the underlying statement rather than creating an invalid export wrapper.

Parity impact:

  • Exact corpus: 4938/5907 -> 4939/5907
  • Resolved fixture: invalidThrowStatement
  • New failures: 0
  • Remaining failures: 968
  • Change size: 74 inserted lines across parser logic plus parser/driver regression coverage

Verification:

  • focused parser regression: 2/2
  • exact invalidThrowStatement: 1/1
  • parser suite: 739/739
  • driver suite: 136/136
  • checker suite: 3076/3076
  • conformance suite: 1368/1368
  • full exact corpus: 5907 surveyed, 4939 passed, 968 failed, 0 skipped

The commit is authored and committed as Chris with no co-authors.

14 days ago

Pushed 6401fac61 (fix(ts-parser): gate labeled var errors by selected target).

This ports TypeScript's target-sensitive TS1344 behavior for labeled var statements: the legacy ES5 sloppy form stays valid, while strict source and ES2015+ targets report A label is not allowed here. The exact-corpus loader now also honors the chosen (target=es5) baseline instead of merging every value from a multi-target source directive into one syntax mode.

Parity impact:

  • Exact corpus: 4939/5907 -> 4947/5907
  • Resolved fixtures: 8
  • invalidDoWhileContinueStatements
  • invalidForContinueStatements
  • invalidForInContinueStatements
  • invalidWhileContinueStatements
  • labeledStatementWithLabel
  • labeledStatementWithLabel_es2015
  • privateNameES5Ban
  • privateNameInObjectLiteral-3
  • New failures: 0
  • Remaining failures: 960
  • Change size: 38 lines (30 insertions, 8 deletions)

Verification:

  • focused target-selection and fixture batch: 9/9
  • parser suite: 740/740
  • driver suite: 136/136
  • checker suite: 3076/3076
  • conformance suite: 1369/1369
  • full exact corpus: 5907 surveyed, 4947 passed, 960 failed, 0 skipped

The commit is authored and committed as Chris with no co-authors.

14 days ago

Pushed aa0f6cea2 (fix(ts-parser): parse labeled bodies as nested statements).

This ports the TypeScript parser behavior that treats a labeled statement body as a nested statement. The existing block modifier validation now sees label: export ... and reports TS1184 (Modifiers cannot appear here) alongside the labeled-declaration diagnostic.

Exact parity impact:

  • Aggregate: 4947/5907 -> 4948/5907
  • Resolved: labeledStatementExportDeclarationNoCrash1
  • New failures: 0

Verification:

  • Parser: 741/741
  • Driver: 136/136
  • Checker: 3076/3076
  • Conformance: 1369/1369
  • Full exact TypeScript corpus: 4948 passed, 959 failed, 0 skipped

Scope: 1 parser file, 17 changed lines (10 insertions, 7 deletions).

14 days ago

Pushed 1e56b57e2 (fix(ts-parser): classify unresolved jumps by function scope).

This ports TypeScript's parent-chain grammar behavior for unresolved labeled jumps. Home now keeps only active labels: a jump that reaches a function boundary reports TS1107, while a source-level non-enclosing break reaches the source-file root and reports TS1116. This preserves the method-body TS1107 in plainJSBinderErrors while correcting the top-level invalid-break fixtures.

Exact parity impact:

  • Aggregate: 4948/5907 -> 4952/5907
  • Resolved: invalidDoWhileBreakStatements, invalidForBreakStatements, invalidForInBreakStatements, invalidWhileBreakStatements
  • New failures: 0

Verification:

  • Focused exact: 5/5 (four resolved fixtures plus plainJSBinderErrors regression guard)
  • Parser: 741/741
  • Driver: 136/136
  • Checker: 3076/3076
  • Conformance: 1369/1369
  • Full exact TypeScript corpus: 4952 passed, 955 failed, 0 skipped

Scope: 1 parser file, 23 changed lines (4 insertions, 19 deletions).

14 days ago

Pushed 7c9ef92c9 (fix(ts-checker): walk object member type references).

This ports TypeScript's unresolved-type diagnostic traversal through structural object annotations. Home now visits object members plus index-signature key/value types and reports missing nested type names, while honoring enclosing type parameters. The diagnostic walk remains separate from the unresolved-type lowering predicate, preserving clean union-index and mapped-type semantics.

Exact parity impact:

  • Aggregate: 4952/5907 -> 4953/5907
  • Resolved: parserObjectType6
  • New failures: 0

Verification:

  • Focused checker regression: 2/2
  • Focused exact: 1/1
  • Union-index regression: 2/2
  • Parser: 741/741
  • Driver: 136/136
  • Checker: 3077/3077
  • Conformance: 1369/1369
  • Full exact TypeScript corpus: 4953 passed, 954 failed, 0 skipped

Scope: 1 checker file, 21 inserted lines.

14 days ago

Pushed ccaf1196b (fix(ts-checker): resolve parameterized type roots).

This ports TypeScript's unresolved-name behavior for parameterized type references. Home now checks generic arguments and then resolves the root through enclosing type parameters, imports/reference libs, local generic declarations, and compiler/default-lib utility types. A root that still has no type-space resolution reports TS2304, so malformed X<T \ recovery preserves diagnostics for both X and T without flagging Record/Partial/Readonly/NoInfer/NonNullable/string-mapping or imported generic types.

Exact parity impact:

  • Aggregate: 4953/5907 -> 4954/5907
  • Resolved: parserSkippedTokens20
  • New failures: 0

Verification:

  • New parameterized-root checker regression: 2/2
  • Focused generic resolver guards: NoInfer 6/6, NonNullable 4/4, Record 2/2, React reference-lib 2/2, mapped utility cases 2/2 each, intrinsic uppercase 2/2
  • Focused exact: 1/1
  • Parser: 741/741
  • Driver: 136/136
  • Checker: 3078/3078
  • Conformance: 1369/1369
  • Full exact TypeScript corpus: 4954 passed, 953 failed, 0 skipped

Scope: 1 checker file, 19 changed lines (18 insertions, 1 deletion).

14 days ago

Parity progress: assigned ECMAScript private names remain undeclared\n\nCommit: f6572c3\nConventional commit: fix(ts-checker): keep assigned private names undeclared\n\nWhat changed:\n- Constructor member inference no longer synthesizes this.#name assignments into a class shape.\n- Checked-JS cross-method member inference likewise excludes ECMAScript private identifiers.\n- Checked-JS constructor member access no longer short-circuits private names as ordinary inferred expandos.\n- Missing checked-JS private assignment targets now flow through normal TS2339 reporting.\n\nLogical parity:\nTypeScript private identifiers are introduced only by class-element declarations. Assigning this.#z cannot declare #z in either TypeScript or JavaScript, so the access must remain unresolved and report Property '#z' does not exist on type 'C'.\n\nExact corpus movement:\n- 4954/5907 -> 4956/5907 (+2)\n- Failures: 953 -> 951\n- Resolved: privateNameBadDeclaration\n- Resolved: privateNameJsBadDeclaration\n- Regressions: 0 (failure-set comparison)\n\nVerification:\n- Focused checker regressions: 2/2\n- Focused exact fixtures: 2/2\n- ts_parser: 741/741\n- ts_driver: 136/136\n- ts_checker: 3080/3080\n- ts_conformance: 1369/1369\n- Full exact TypeScript corpus: 4956/5907\n\nScope:\n- 1 file changed\n- 52 insertions, 3 deletions\n\nRemaining exact parity work: 951 fixtures.

14 days ago

Parity progress: private identifiers cannot create CommonJS exports\n\nCommit: 8ba43ca\nConventional commit: fix(ts-checker): reject private CommonJS export names\n\nWhat changed:\n- The implicit CommonJS exports exemption no longer applies when exports is the receiver of an ECMAScript private member.\n- exports.#name now reports the unresolved exports binding in addition to the private-name grammar/access diagnostic.\n- Ordinary exports.name assignments remain recognized as CommonJS export syntax.\n- A real local exports declaration continues to shadow the implicit fallback and does not report TS2304.\n\nLogical parity:\nA private identifier is lexical to a class and cannot name a CommonJS export property. Therefore exports.#name is not a valid CommonJS export assignment and must not manufacture an implicit exports binding.\n\nExact corpus movement:\n- 4956/5907 -> 4958/5907 (+2)\n- Failures: 951 -> 949\n- Resolved: privateNameBadAssignment\n- Resolved: privateNameJsBadAssignment\n- Regressions: 0 (failure-set comparison)\n\nVerification:\n- Focused checker regressions: 2/2\n- Focused exact fixtures: 2/2\n- ts_parser: 741/741\n- ts_driver: 136/136\n- ts_checker: 3082/3082\n- ts_conformance: 1369/1369\n- Full exact TypeScript corpus: 4958/5907\n\nScope:\n- 1 file changed\n- 43 insertions, 2 deletions\n\nRemaining exact parity work: 949 fixtures.

14 days ago

Parity progress: checked-JS private modifier diagnostics anchor at JSDoc tags\n\nCommit: 7bb2dd8\nConventional commit: fix(ts-checker): anchor private JSDoc modifier errors\n\nWhat changed:\n- Checked-JS JSDoc accessibility metadata now retains the source position of @public, @private, or @protected.\n- TS18010 diagnostics for private identifiers use that tag position instead of the following #name token.\n- Existing field, method, getter, and setter visibility inference continues to use the same accessibility value.\n\nLogical parity:\nFor JSDoc-derived modifiers, TypeScript attributes the incompatible modifier to the JSDoc tag that introduced it. All twelve field/method/accessor diagnostics now point at the modifier source.\n\nExact corpus movement:\n- 4958/5907 -> 4959/5907 (+1)\n- Failures: 949 -> 948\n- Resolved: privateNamesIncompatibleModifiersJs\n- Regressions: 0 (failure-set comparison)\n\nVerification:\n- Focused checker regression: 1/1\n- Focused exact fixture: 1/1\n- ts_parser: 741/741\n- ts_driver: 136/136\n- ts_checker: 3083/3083\n- ts_conformance: 1369/1369\n- Full exact TypeScript corpus: 4959/5907\n\nScope:\n- 1 file changed\n- 51 insertions, 7 deletions\n\nRemaining exact parity work: 948 fixtures.

14 days ago

Parity update: shipped bce7ef5 (fix(ts-checker): suppress invalid private declare cascades) to main.

Resolved fixture:

  • privateNamesIncompatibleModifiers: FAIL -> PASS

Implementation:

  • Recognizes bodyless ECMAScript private class members with a source-level declare modifier as parser-invalid ambient recovery shapes.
  • Suppresses checker-only TS7010 and TS7033 implicit-any cascades after the parser has already emitted the canonical invalid-modifier diagnostics.
  • Keeps malformed private methods out of class overload bookkeeping, preventing the following sibling method from receiving spurious TS2389.
  • Adds a boundary test proving an ordinary bodyless ECMAScript private method still receives normal implicit-any checking.

Measured parity:

  • exact corpus: 4959/5907 -> 4960/5907 (+1)
  • remaining failures: 948 -> 947
  • resolved set: privateNamesIncompatibleModifiers only
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused checker unit: pass
  • focused exact fixture: 1/1
  • checker: 3084/3084
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • full exact corpus: 4960/5907

Change size:

  • 1 file
  • 58 insertions
  • 6 deletions

The parity ledger now stands at 4960/5907 with 947 fixtures remaining.

14 days ago

Parity update: shipped fcd3be4 (fix(ts-checker): preserve empty class method semantics) to main.

Resolved fixtures:

  • privateNameReadonly: FAIL -> PASS
  • staticIndexSignature7: FAIL -> PASS

Implementation:

  • Ordinary non-async, non-generator class methods with no value return now infer void, or never for definitely exiting bodies, during initial class-member shaping.
  • Sibling method bodies and static index compatibility checks therefore see the same return type that the later body pass records.
  • Anonymous class expressions now use a lexical private-method fallback when the named-class registry cannot identify an ECMAScript private method.
  • Assignments to those anonymous private methods now emit canonical TS2803 while retaining normal assignment compatibility diagnostics.
  • Added direct regression coverage for the exact privateNameReadonly messages and the staticIndexSignature7 () => void TS2411 message.

Measured parity:

  • exact corpus: 4960/5907 -> 4962/5907 (+2)
  • remaining failures: 947 -> 945
  • resolved set: privateNameReadonly, staticIndexSignature7
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • anonymous private-method regression: pass
  • static index void-return regression: pass
  • focused exact privateNameReadonly: 1/1
  • checker: 3086/3086
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4962/5907

Change size:

  • 1 file
  • 86 insertions
  • 3 deletions

The parity ledger now stands at 4962/5907 with 945 fixtures remaining.

14 days ago

Parity update: shipped 6ecf6a5 (fix(ts-checker): name generic private classes canonically) to main.

Resolved fixture:

  • privateNamesInGenericClasses: FAIL -> PASS

Implementation:

  • TS18013 now renders the declaring class symbol name rather than appending its type-parameter list.
  • Generic private access diagnostics therefore use class C, matching upstream, instead of the instantiated-looking C<t>.
  • Synthetic anonymous class keys still render as the canonical (anonymous) label.
  • Other diagnostic families continue using the existing generic-aware class display.
  • Added a focused regression asserting the exact generic-class TS18013 message.

Measured parity:

  • exact corpus: 4962/5907 -> 4963/5907 (+1)
  • remaining failures: 945 -> 944
  • resolved set: privateNamesInGenericClasses only
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused TS18013 regression: pass
  • focused exact fixture: 1/1
  • checker: 3087/3087
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4963/5907

Change size:

  • 1 file
  • 23 insertions
  • 2 deletions

The parity ledger now stands at 4963/5907 with 944 fixtures remaining.

14 days ago

Parity update: shipped 8c75a5a (fix(ts-checker): preserve private brands through interfaces) to main.

Resolved fixture:

  • privateNamesInterfaceExtendingClass: FAIL -> PASS

Implementation:

  • The outside-class private-identifier path now recognizes interface receiver types whose visibility originates from an extended class.
  • Those semantically resolved receivers bypass the generic TS18016 syntax fallback.
  • Normal ECMAScript private-brand checking then emits canonical TS18013 against the declaring class.
  • Genuinely unbound private identifiers outside class bodies remain eligible for TS18016.
  • Added a focused precedence regression asserting one TS18013 and zero TS18016 diagnostics.

Measured parity:

  • exact corpus: 4963/5907 -> 4964/5907 (+1)
  • remaining failures: 944 -> 943
  • resolved set: privateNamesInterfaceExtendingClass only
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused precedence regression: pass
  • focused exact fixture: 1/1
  • checker: 3088/3088
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4964/5907

Change size:

  • 1 file
  • 27 insertions
  • 1 deletion

The parity ledger now stands at 4964/5907 with 943 fixtures remaining.

14 days ago

Parity update: shipped 9bb3ffdad (fix(ts-checker): preserve contextual assertion fields) to main.

Resolved fixture:

  • privateNamesAssertion: FAIL -> PASS

Implementation:

  • Annotated class-field arrow and function initializers now receive the callable type from their declared field annotation as contextual input.
  • The checker validates the function body under that contextual signature before deriving the source initializer signature.
  • Contextual asserts / type-predicate metadata is copied onto the derived signature together with its predicate return representation, preserving assertion semantics through assignability.
  • Ordinary contextual functions still infer their actual body return, so incompatible fields such as () => string = () => { return 1; } continue to emit TS2322.
  • Added focused regression coverage that asserts the private assertion field stays clean while the genuine return mismatch remains.

Measured parity:

  • exact corpus: 4964/5907 -> 4965/5907 (+1)
  • remaining failures: 943 -> 942
  • resolved set: privateNamesAssertion only
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused exact fixture: 1/1
  • checker: 3089/3089
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4965/5907

Change size:

  • 1 file
  • 48 changed lines
  • 46 insertions
  • 2 deletions

The parity ledger now stands at 4965/5907 with 942 fixtures remaining.

Tracks #69.

14 days ago

Parity update: shipped 13a2b020e (fix(ts-checker): resolve forward static private names) to main.

Resolved fixture:

  • privateNameStaticFieldDerivedClasses: FAIL -> PASS

Implementation:

  • A bare class-name receiver can now resolve through its visible forward class declaration before the class static type has been materialized.
  • The syntax-backed fallback confirms the referenced ECMAScript private member is actually declared and static on that class.
  • The recovered declaration identity flows through the normal TS18013 accessibility checker, preserving the declaring class name and private-brand semantics.
  • Once TS18013 is emitted, the property access is terminal so the generic missing-member path cannot append a redundant TS2339.
  • Ordinary any receivers, instance private names, and genuinely absent private names retain their existing behavior.
  • Added focused coverage asserting one canonical TS18013 and zero TS2339 diagnostics for a forward Derived.#value access from Base.

Measured parity:

  • exact corpus: 4965/5907 -> 4966/5907 (+1)
  • remaining failures: 942 -> 941
  • resolved set: privateNameStaticFieldDerivedClasses only
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused exact fixture: 1/1
  • checker: 3090/3090
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4966/5907

Change size:

  • 1 file
  • 78 changed lines
  • 77 insertions
  • 1 deletion

The parity ledger now stands at 4966/5907 with 941 fixtures remaining.

Tracks #69.

14 days ago

Parity update: shipped 39c75822d (fix(ts-checker): keep static private brands class-local) to main.

Resolved fixtures:

  • privateNameStaticAccessorssDerivedClasses: FAIL -> PASS
  • privateNamesAndStaticFields: FAIL -> PASS

Implementation:

  • ECMAScript private static members are now excluded from derived constructor shapes instead of being inherited structurally.
  • Same-spelled private static declarations on base and derived classes remain distinct brands and no longer trigger a false TS2417 static-side compatibility error.
  • Access to a base-only private static name through typeof Derived now emits TS2339 on the derived constructor rather than climbing to the base brand and emitting TS18013.
  • The same ownership rule works when the derived constructor is only forward-declared: its syntax supplies the class and parent identity, while an own forward private static declaration still follows the normal TS18013 path.
  • Synthetic structural member ids are checked through getOptional before inspecting source spelling, preserving internal constructor slots safely.
  • Added focused coverage for materialized and forward derived constructors, both lexical access contexts, and incompatible same-spelled base/derived static private declarations.

Measured parity:

  • exact corpus: 4966/5907 -> 4968/5907 (+2)
  • remaining failures: 941 -> 939
  • resolved set: privateNameStaticAccessorssDerivedClasses, privateNamesAndStaticFields
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused exact fixtures: 2/2
  • checker: 3091/3091
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4968/5907

Change size:

  • 1 file
  • 82 changed lines
  • 82 insertions
  • 0 deletions

The parity ledger now stands at 4968/5907 with 939 fixtures remaining.

Tracks #69.

14 days ago

Parity update: shipped 97ce2fb4e (fix(ts-checker): apply lexical brands to derived instances) to main.

Resolved fixtures:

  • privateNamesConstructorChain-1: FAIL -> PASS
  • privateNamesConstructorChain-2: FAIL -> PASS

Implementation:

  • Instance private access now resolves the nearest enclosing class that lexically declares the #name before considering a same-spelled private declaration on the receiver class.
  • The lexical brand is valid when the receiver is the declaring class or derives from it, matching the runtime brand installed by the base constructor on derived instances.
  • Forward child classes are supported by a bounded ancestry walk that prefers registered parent links and falls back to parsed extends syntax, including generic Child<T> extends Parent<T> forms.
  • Resolution stops at the nearest lexical declaration, so unrelated or nested same-spelled brands do not fall through to an outer class.
  • Static private ownership remains on the separate class-local path shipped in 39c75822d.
  • Added focused coverage for a forward generic child that redeclares the same-spelled instance private name.

Measured parity:

  • exact corpus: 4968/5907 -> 4970/5907 (+2)
  • remaining failures: 939 -> 937
  • resolved set: privateNamesConstructorChain-1, privateNamesConstructorChain-2
  • newly failing fixtures: none
  • regressions: 0

Verification:

  • focused exact fixtures: 2/2
  • checker: 3092/3092
  • parser: 749/749
  • driver: 136/136
  • conformance: 1369/1369
  • baseline-aware conformance: 586/586
  • full exact corpus: 4970/5907

Change size:

  • 1 file
  • 64 changed lines
  • 64 insertions
  • 0 deletions

The commit was rebased conflict-free over unrelated f593e5e0e MySQL work before push; the TypeScript diff and measured corpus result are unchanged.

The parity ledger now stands at 4970/5907 with 937 fixtures remaining.

Tracks #69.

14 days ago

Pushed d03c1c6f0 (fix(ts-checker): exclude private names from keyof).

This chunk ports the remaining privateNamesAndkeyof behavior into Home:

  • excludes ECMAScript #private fields, methods, and accessors from both checker and lowerer keyof key collection paths
  • reduces an all-private object key set to never
  • preserves symbolic named-object assignment diagnostics such as keyof A
  • keeps TypeScript's expanded string | number | symbol diagnostic display for keyof any
  • adds focused checker coverage for accepting a visible key and rejecting private/missing keys

Exact movement: 4,970/5,907 -> 4,971/5,907, with failures 937 -> 936. The sole resolved fixture is privateNamesAndkeyof; the complete failure-set comparison found zero new failures. The code delta is 40 insertions, 1 deletion across 2 files.

Verification:

  • ts_checker: 3,093/3,093
  • focused exact privateNamesAndkeyof: 1/1
  • ts_parser: 749/749
  • ts_driver: 136/136
  • ts_conformance: 1,369/1,369
  • baseline-aware: 586/586
  • full exact corpus: 4,971/5,907

Authored and committed by Chris Breuer with no coauthors.

14 days ago

Pushed bff155e9a (fix(ts-checker): deduplicate static object rest prototype).

This small chunk fixes static class object-rest construction at the source:

  • reuses the prototype member already present on a class static type
  • synthesizes a fallback prototype only when the source static shape genuinely lacks one
  • prevents residual types such as { prototype: C; prototype: C; }
  • adds focused checker coverage for static private-field access through an object-rest binding

Exact movement: 4,971/5,907 -> 4,972/5,907, with failures 936 -> 935. The sole resolved fixture is privateNameAndObjectRestSpread; the complete failure-set comparison found zero new failures. The code delta is 29 insertions, 2 deletions in 1 file.

Verification:

  • ts_checker: 3,094/3,094
  • focused exact privateNameAndObjectRestSpread: 1/1
  • ts_parser: 749/749
  • ts_driver: 136/136
  • ts_conformance: 1,369/1,369
  • baseline-aware: 586/586
  • full exact corpus: 4,972/5,907

The commit was rebased conflict-free over unrelated runtime work, then pushed with Chris Breuer as both author and committer and no coauthors.

14 days ago

Pushed e69959e93 (fix(ts-parser): reject bare private-name hashes).

This parser chunk ports the bare-hash private-name recovery used by TypeScript:

  • classifies # without an identifier body as an invalid token
  • preserves valid #name private identifiers and the existing #! shebang behavior
  • recovers invalid hashes in class-member declarations and both member-access parser paths
  • makes top-level #, class-body #, and this.# each emit exactly one TS1127
  • prevents the previous TS1451, TS2304, and Property '#' checker cascades
  • adds lexer and parser coverage for all three malformed positions

Exact movement: 4,972/5,907 -> 4,973/5,907, with failures 935 -> 934. The sole resolved fixture is privateNameHashCharName; the complete failure-set comparison found zero new failures. The code delta is 58 insertions across 2 files.

Verification:

  • ts_lexer: 78/78
  • ts_parser: 750/750
  • ts_checker: 3,094/3,094
  • focused exact privateNameHashCharName: 1/1
  • ts_driver: 136/136
  • ts_conformance: 1,369/1,369
  • baseline-aware: 586/586
  • full exact corpus: 4,973/5,907

Authored and committed by Chris Breuer with no coauthors.

14 days ago

Pushed 59a314bc3 (fix(ts-checker): align async private generator diagnostics) to main.

This chunk ports the remaining behavior needed by privateNameStaticMethodAsync:

  • reports TS1029 when static follows async on a class member
  • recognizes yield await Promise.resolve(value) as a concrete async-generator yield under noImplicitAny, avoiding the spurious TS7055
  • adds focused parser and checker regression coverage

Exact parity movement:

  • privateNameStaticMethodAsync: failing -> passing
  • full exact corpus: 4973/5907 -> 4974/5907
  • failures: 934 -> 933
  • full failure-name set diff: exactly one removed, zero added
  • source delta: 2 files, 71 insertions, 9 deletions

Validation:

  • parser: 751/751
  • checker: 3095/3095
  • focused exact fixture: 1/1
  • full exact corpus: 4974/5907
  • driver: 136/136
  • conformance: 1369/1369
  • explicitly rooted baseline-aware corpus: 586/586
14 days ago

Pushed 9800b551a (fix(ts-checker): align private access on unknown and never) to main.

This chunk ports the private-name receiver semantics exercised by privateNameAndAny:

  • explicit unknown receivers now report TS18046 for private-name access
  • lexical private-name resolution continues after TS18046, so declared names remain valid while an undeclared name also reports TS2339 against any
  • private-name access through never now consistently reports TS2339 against never
  • focused checker coverage locks the unknown, any, and never diagnostic split

Exact parity movement:

  • privateNameAndAny: failing -> passing
  • all 12 expected diagnostics match byte-for-byte
  • full exact corpus: 4974/5907 -> 4975/5907
  • failures: 933 -> 932
  • full failure-name set diff: exactly one removed, zero added
  • source delta: 1 file, 38 insertions, 1 deletion

Validation:

  • checker: 3096/3096
  • focused exact fixture: 1/1
  • full exact corpus: 4975/5907
  • driver: 136/136
  • conformance: 1369/1369
  • explicitly rooted baseline-aware corpus: 586/586
14 days ago

Pushed b7c9392cb (fix(ts-checker): preserve cross-file private brands) to main.

This chunk ports the cross-module private-brand identity needed by privateNamesUnique-2:

  • explicit relative import-type receivers are resolved against normalized virtual-file paths before accepting a lexical ECMAScript private brand
  • same-named classes in different modules remain nominally distinct even when structural interning collapses their TypeIds
  • TS18013 is emitted through the shared private-access reporter
  • focused checker coverage locks the a.ts Foo vs b.ts Foo case

Exact parity movement:

  • privateNamesUnique-2: failing -> passing
  • full exact corpus: 4975/5907 -> 4976/5907
  • failures: 932 -> 931
  • full failure-name set diff: exactly one removed, zero added
  • source delta: 1 file, 87 insertions, 5 deletions

Validation:

  • checker: 3097/3097
  • focused exact fixture: 1/1
  • full exact corpus: 4976/5907
  • driver: 136/136
  • conformance: 1369/1369
  • explicitly rooted baseline-aware corpus: 586/586
14 days ago

Pushed 6b57aee49 (fix(ts-checker): render private apparent source types) to main.

This chunk ports the apparent-type diagnostic provenance needed by privateNamesUnique-4:

  • when a memberless interface has exactly one class base, missing ECMAScript-private property elaboration uses that base class as the apparent source name
  • A2 extends A1 now reports TS2741 against A1, preserving the nominal private-brand identity
  • ordinary missing-property source display remains unchanged
  • focused checker coverage locks the interface-over-empty-class shape

Exact parity movement:

  • privateNamesUnique-4: failing -> passing
  • full exact corpus: 4976/5907 -> 4977/5907
  • failures: 931 -> 930
  • full failure-name set diff: exactly one removed, zero added
  • source delta: 1 file, 43 insertions, 0 deletions

Validation:

  • checker: 3098/3098
  • focused exact fixture: 1/1
  • full exact corpus: 4977/5907
  • driver: 136/136
  • conformance: 1369/1369
  • explicitly rooted baseline-aware corpus: 586/586
14 days ago

TypeScript parity progress: legacy decorators on private names

Pushed fb5c3881e (fix(ts-checker): reject legacy decorators on private names) directly to main.

Logic ported

  • Mirrored TypeScript's nodeCanBeDecorated legacy-decorator rule for every named ECMAScript-private class member.
  • Private fields, methods, getters/setters, and auto-accessors now report TS1206 at the decorator token under experimentalDecorators.
  • Validation stops before decorator expression/signature checking, suppressing the previous TS1240, TS1241, TS1270, and TS1271 cascades.
  • Native decorator behavior remains unchanged.
  • Added an exact checker regression for a private field and private method, including diagnostic-code and source-position assertions.

Exact parity movement

  • Passed: 4977/5907 -> 4978/5907
  • Failed: 930 -> 929
  • Sole resolved fixture: privateNamesAndDecorators
  • Newly failing fixtures: 0
  • Remaining exact mismatches: 929

Verification

  • Checker: 3099/3099
  • Focused exact fixture: 1/1
  • Driver: 136/136
  • Conformance: 1369/1369
  • Baseline-aware rooted survey: 586/586
  • Full exact corpus: 4978/5907
  • Failure-set comparison: one removal, zero additions
  • git diff --check: clean

Scope

  • 1 file changed
  • 46 insertions, 8 deletions
  • Authored and committed as Chris <chrisbreuer93@gmail.com>
  • No coauthors
14 days ago

TypeScript parity progress: circular class-field inference

Pushed b8d911cad (fix(ts-checker): detect circular class field inference) directly to main.

Logic ported

  • Added separate instance/static dependency graphs for unannotated class-field initializers.
  • Followed this.member and this[key] references transitively through common expression forms.
  • Reported TS7022 for every field participating in a direct or indirect inference cycle under noImplicitAny.
  • Preserved computed diagnostic spelling such as ["#baz"] while anchoring at the field name.
  • Pre-seeded statically known computed data fields in the class shape.
  • Resolved known literal members from type-parameter constraints before TS7053 missing-index fallback.
  • Excluded computed method-shaped declarations from field pre-seeding so overload resolution remains unchanged.

Exact parity movement

  • Passed: 4978/5907 -> 4980/5907
  • Failed: 929 -> 927
  • Resolved fixtures: privateNameCircularReference, strictPropertyInitialization
  • Newly failing fixtures: 0
  • Remaining exact mismatches: 927

Regression audit

  • The first full audit exposed a new symbolProperty40 failure despite a positive aggregate.
  • Refined method-shape detection restored that fixture to 1/1 while preserving both intended gains.
  • Final failure-set comparison: two removals, zero additions.

Verification

  • Checker: 3100/3100
  • privateNameCircularReference: 1/1
  • strictPropertyInitialization: 1/1
  • symbolProperty40: 1/1
  • Driver: 136/136
  • Conformance: 1369/1369
  • Baseline-aware rooted survey: 586/586
  • Full exact corpus: 4980/5907
  • git diff --check: clean

Scope

  • 1 file changed
  • 168 insertions, 5 deletions
  • Authored and committed as Chris <chrisbreuer93@gmail.com>
  • No coauthors
14 days ago

TypeScript parity progress: nominal private-name receiver display

Pushed 2a537a156 (fix(ts-checker): render nominal type for private this misses) directly to main.

Logic ported

  • Undeclared ECMAScript-private names accessed through class this now render against the enclosing nominal class in TS2339.
  • Generic class parameters are preserved (A<T>), rather than collapsing to a bare class name.
  • The branch runs only after private-member lookup fails and only for an actual this receiver, leaving public misses and successful private accesses unchanged.
  • Added a generic A<T> regression asserting the complete diagnostic message.

Exact parity movement

  • Passed: 4980/5907 -> 4981/5907
  • Failed: 927 -> 926
  • Sole resolved fixture: privateNameAndIndexSignature
  • Newly failing fixtures: 0
  • Remaining exact mismatches: 926

Verification

  • Checker: 3101/3101
  • Focused exact fixture: 1/1
  • Driver: 136/136
  • Conformance: 1369/1369
  • Baseline-aware rooted survey: 586/586
  • Full exact corpus: 4981/5907
  • Failure-set comparison: one removal, zero additions
  • git diff --check: clean

Scope

  • 1 file changed
  • 32 insertions, 0 deletions
  • Authored and committed as Chris <chrisbreuer93@gmail.com>
  • No coauthors
14 days ago

Pushed 9d863b8b6 (fix(ts-driver): resolve package tslib helper arity).

This parity chunk teaches the TypeScript driver to resolve imported private-field helper declarations from the package layout node_modules/tslib/index.d.ts, in addition to direct tslib.d.ts virtual files. It also classifies private member reads, simple writes, compound assignments, and updates so incompatible __classPrivateFieldGet and __classPrivateFieldSet diagnostics are anchored to the receiver that actually requires each helper, matching the upstream TS2807 baselines.

Exact corpus movement:

  • Passing: 4981 -> 4983 / 5907
  • Failing: 926 -> 924
  • Newly passing: privateNameEmitHelpers, privateNameStaticEmitHelpers
  • Newly failing: none

Verification:

  • ts_driver: 137/137
  • ts_checker: 3101/3101 (checker unchanged; cached gate)
  • ts_conformance: 1369/1369
  • Baseline-aware type relationships: 586/586
  • Focused exact fixtures: 1/1 each
  • Full exact corpus: 4983/5907

Change size: 84 insertions, 5 deletions across 1 file.

Tracks #69.

14 days ago

Pushed 7518edfd7 (fix(ts-checker): enforce destructured member accessibility).

This parity chunk unwraps polymorphic this markers before object-binding member lookup, preserving inherited private members for accessibility checks. It also recovers lexical this class identity when normal type maps are unavailable and anchors renamed destructuring diagnostics at their source property keys rather than the local binding targets.

Exact corpus movement:

  • Passing: 4983 -> 4984 / 5907
  • Failing: 924 -> 923
  • Newly passing: privateProtectedMembersAreNotAccessibleDestructuring
  • Newly failing: none

Verification:

  • ts_checker: 3102/3102
  • Focused checker regression: 2/2
  • Exact upstream fixture: 1/1
  • ts_conformance: 1369/1369
  • Baseline-aware type relationships: 586/586
  • Full exact corpus: 4984/5907
  • Full audit ranges: 0-2999 = 2679/3000, 3000-5906 = 2305/2907
  • Uncapped failure-name diff: only the intended fixture removed; no additions

Change size: 88 insertions, 6 deletions across 1 file.

Tracks #69.

14 days ago

Pushed 706613a45 (fix(ts-checker): infer generic class constructor instances) to main.

This chunk closes the generic-constructor/private-member mismatch in privateNamesAndGenericClasses-2:

  • preserves the declaration-time constructor signature for class type-parameter inference;
  • infers omitted class type arguments from constructor arguments;
  • instantiates the generic class body with the inferred substitutions;
  • substitutes concrete class arguments into accessor setter types;
  • renders the expected nominal assignments (C<string> vs C<number>);
  • removes the spurious TS5082 on a.baz = 5 while retaining the expected private-access and assignment diagnostics.

Exact parity moved 4984 -> 4985 / 5907, with failures dropping 923 -> 922. The sorted failure comparison removed exactly privateNamesAndGenericClasses-2 and added no failures.

Verification:

  • checker: 3103/3103
  • focused checker tests: 2/2
  • exact target fixture: 1/1
  • conformance: 1369/1369
  • rooted type-relationship survey: 586/586
  • full exact corpus: 4985/5907
    • fixtures 0-2999: 2680/3000
    • fixtures 3000-5906: 2305/2907

Change size: 1 file, 80 insertions, 6 deletions.

14 days ago

Pushed 41b7ae7d5 (fix(ts-parser): recover private indexed access syntax) to main.

This chunk closes privateNamesAndIndexedAccess end to end:

  • indexed-access type parsing now stops before a private identifier instead of consuming it as unknown;
  • the stranded #bar] = 3 tail is preserved for declaration recovery;
  • parser recovery emits the upstream missing ], missing comma, and two invalid-declarator diagnostics without adding TS1155;
  • the recovered private binding reaches noImplicitAny analysis and emits TS7005;
  • string indexed access treats an ECMAScript #bar slot as distinct from an ordinary quoted "#bar" property;
  • class-declaration fallback handles indexed access while the enclosing class is still being checked.

Exact parity moved 4985 -> 4986 / 5907, with failures dropping 922 -> 921. The sorted full-corpus comparison removed exactly privateNamesAndIndexedAccess and added no failures.

Verification:

  • parser: 744/744
  • checker: 3105/3105
  • exact target fixture: 1/1
  • conformance: 1369/1369
  • rooted type-relationship survey: 586/586
  • full exact corpus: 4986/5907
    • fixtures 0-2999: 2681/3000
    • fixtures 3000-5906: 2305/2907

Change size: 2 files, 209 insertions, 3 deletions.

14 days ago

Parity progress: privateIndexer2

Pushed 522dd0aef (fix(ts-parser): recover private indexer syntax) to main.

This chunk ports TypeScript's context-sensitive recovery for malformed private indexers:

  • In type literals, adjacent private[index: Key]: Value syntax now consumes private and recovers the remaining member as an index signature without modifier diagnostics.
  • In object literals, private [index: Key]: Value continues through malformed shorthand/computed-property recovery and emits the same parser diagnostic shape as TypeScript.
  • Primitive type names encountered as values in that object-literal recovery remain TS2693 type-only value errors instead of becoming TS2552 name suggestions.

Exact corpus impact:

  • Flipped: privateIndexer2
  • Added failures: none
  • Passing: 4986 -> 4987 / 5907
  • Failing: 921 -> 920
  • Split audit: 2682/3000 + 2305/2907 = 4987/5907

Verification:

  • Parser: 745/745
  • Checker: 3106/3106
  • Focused exact fixture: 1/1
  • Conformance: 1369/1369
  • Rooted baseline-aware survey: 586/586
  • Exact full corpus: 4987/5907, with the sorted failure diff removing only privateIndexer2

Scope: 2 files changed, 64 insertions, 2 deletions.

14 days ago

Parity progress: ES5 super-field accessibility

Pushed ee7326e90 (fix(ts-checker): align ES5 super field diagnostics) to main.

This chunk ports the connected parser/checker behavior behind private and protected base-field accessibility:

  • this is now parsed as a complete primary type. In malformed a: this.foo, the dot receives TS1442 and recovery exposes foo as the next public class member, matching TypeScript's AST recovery and enabling the derived-class TS2415.
  • ES5 super.field access to a base data property now emits TS2340 instead of the ES2015+ TS2855 diagnostic.
  • Dotted typeof super.foo queries now diagnose the unresolved super root with TS2304 even when the class has a runtime super binding.
  • Overlapping private-base redeclaration and heritage-accessibility paths no longer emit duplicate TS2415 diagnostics for the same class.

Exact corpus impact:

  • Flipped: privateInstanceMemberAccessibility
  • Flipped: protectedClassPropertyAccessibleWithinSubclass3
  • Added failures: none
  • Passing: 4987 -> 4989 / 5907
  • Failing: 920 -> 918
  • Split audit: 2684/3000 + 2305/2907 = 4989/5907

Verification:

  • Parser: 746/746
  • Checker: 3107/3107
  • Focused exact fixture: 1/1
  • Conformance: 1369/1369
  • Rooted baseline-aware survey: 586/586
  • Exact full corpus: 4989/5907, with the sorted failure diff removing exactly the two fixtures above and adding none

Scope: 2 files changed, 68 insertions, 11 deletions.

14 days ago

Pushed 01e808393 (fix(ts-parser): recover invalid private brand assignments) to main.

This ports the remaining syntax/checker behavior needed by privateNameInInExpressionTransform:

  • assignment after a completed in expression now reports TS1005 at = and preserves the parsed expression instead of constructing an invalid assignment node;
  • private identifiers nested beneath higher-precedence binary operators on the left side of in are recognized as brand-check syntax rather than ordinary unresolved names;
  • those syntax-only private operands use any during checking, preventing spurious arithmetic-right-operand cascades while retaining the expected outer in diagnostics.

Exact parity moved 4989 -> 4990 / 5907 and exact failures moved 918 -> 917. The sorted corpus comparison removed exactly privateNameInInExpressionTransform and added no failures.

Verification:

  • parser: 747/747
  • checker: 3108/3108
  • focused checker regression: 2/2
  • focused exact fixture: 1/1
  • broad conformance: 1369/1369
  • rooted baseline-aware survey: 586/586
  • exact corpus split: 2685/3000 + 2305/2907 = 4990/5907

Change size: 53 insertions, 7 deletions across 2 files. This builds directly on the private-name parser/checker work tracked in the preceding #69 updates.

14 days ago

Published 1dbc803cd (fix(ts-checker): align private in-expression semantics) directly to main as Chris, with no coauthor trailers.

Parity movement:

  • Exact TypeScript conformance: 4990 -> 4991 / 5907
  • Canonical failures: 917 -> 916
  • Flipped exactly: privateNameInInExpression
  • Added regressions: none

Logical port completed in this chunk:

  • Align as and satisfies with relational precedence so prop in value as any forms the same tree as upstream TypeScript.
  • Track explicit strict grammar separately from implicit module strictness, preserving non-strict transform recovery while emitting TS18016 for strict private brand checks outside classes.
  • Match canonical TS1451 wording exactly.
  • Resolve private brand names through enclosing classes and emit TS2339 against the RHS type for unresolved names.
  • Reject private identifiers as for...in targets with TS2406.
  • Port checkNonNullType ordering to both ordinary operands of in: accept never, report unknown and nullable diagnostics first, narrow nullable unions, and suppress secondary TS2322 cascades.
  • Preserve the parenthesis-aware TS2571 anchor for non-entity unknown operands.

Verification on the final committed tree:

  • ts_parser: 750/750
  • parser precedence: 8/8
  • ts_checker: 3110/3110
  • focused private fixture regression preflight: 5/5
  • default ts_conformance: 1369/1369
  • baseline-aware survey: 586/586
  • exact corpus split: 2686/3000 + 2305/2907 = 4991/5907
  • sorted identity audit: 916 failures, exactly one removal and zero additions versus pushed baseline

Footprint: 3 files, 216 insertions, 28 deletions. This builds on 01e808393, which closed privateNameInInExpressionTransform; together the two small commits cover transform recovery and the broader checker/parser semantics without conflating their regression audits.

14 days ago

Published 606e3bd87 (fix(ts-conformance): strip ignoreDeprecations directives) directly to main as Chris, with no coauthor trailers.

Parity movement:

  • Exact TypeScript conformance: 4991 -> 5020 / 5907
  • Canonical failures: 916 -> 887
  • Flipped fixtures: 29
  • Added regressions: 0

Root cause and logical fix:

  • TypeScript test fixtures treat // @ignoreDeprecations: ... as runner metadata and remove it from .errors.txt diagnostic line numbering.
  • Home already used a shared runner-directive classifier for leading and later directive offsets, but the classifier omitted this valid compiler option.
  • Adding ignoreDeprecations to that shared classifier now strips the directive and adjacent trailing blank consistently across exact baseline rendering.
  • A regression test pins the canonical target + ignoreDeprecations + strict + alwaysStrict + blank shape at an offset of five lines.

Closed fixtures:

  • arrowFunctionContexts
  • FunctionDeclaration2_es6
  • for-of56
  • NonInitializedExportInInternalModule
  • parserStatementIsNotAMemberVariableDeclaration1
  • all 24 default/ES6 variants of emitArrowFunctionWhenUsingArguments{03..08,11,13..17}

Verification:

  • focused directive helper: pass
  • focused exact preflight: 7/7
  • default ts_conformance: 1369/1369
  • baseline-aware survey: 586/586
  • exact first half: 2688/3000
  • exact second half: 2332/2907
  • aggregate: 5020/5907, 887 failures
  • sorted identity audit: exactly 29 removals, 0 additions

Footprint: 1 file, 12 insertions. This is intentionally a standalone harness-parity commit following the private brand-check semantic work in 1dbc803cd, so each measured jump remains independently auditable.

14 days ago

Published b12145fad (fix(ts-conformance): complete runner directive matrix) directly to main as Chris, with no coauthor trailers.

Parity movement:

  • Exact TypeScript conformance: 5020 -> 5032 / 5907
  • Canonical failures: 887 -> 875
  • Flipped fixtures: 12
  • Added regressions: 0

Logical completion:

  • Cross-checked Home against TypeScript ts.optionDeclarations, the harness option declarations, and the actual directive names present in the 5,907-case conformance corpus.
  • Added 30 omitted compiler/harness options to the shared runner-directive classifier, covering emit, module resolution, strictness, JSX, library, and harness settings.
  • Kept source pragmas and annotation comments out of metadata normalization: ts-check, ts-expect-error, ts-ignore, ts-nocheck, internal, readonly, reference, and todo remain source-visible.
  • Added a table-driven unit test pinning both the accepted option set and the rejected pragma/comment set.

Closed fixtures:

  • autoAccessor1
  • autoAccessor3
  • autoAccessor4
  • decoratorMetadata-jsdoc
  • decoratorOnClassMethod17
  • destructuringArrayBindingPatternAndAssignment1ES5iterable
  • destructuringVariableDeclaration1ES5iterable
  • emptyVariableDeclarationBindingPatterns02_ES5iterable
  • ES5For-of26
  • overrideDynamicName1
  • overrideLateBindableIndexSignature1
  • overrideLateBindableName1

Verification:

  • directive matrix unit test: pass
  • affected-source exact preflight: 18 matched variants exact; deeper semantic mismatches remained visible
  • default ts_conformance: 1369/1369
  • baseline-aware survey: 586/586
  • exact first half: 2696/3000
  • exact second half: 2336/2907
  • aggregate: 5032/5907, 875 failures
  • sorted identity audit: exactly 12 removals, 0 additions

Footprint: 1 file, 51 insertions, 1 deletion. This follows the standalone ignoreDeprecations correction in 606e3bd87; separating them keeps the high-impact one-option discovery and the complete upstream matrix independently auditable.

14 days ago

Published 53be08b2b (fix(ts-parser): diagnose yield in type queries) directly to main as Chris, with no coauthor trailers.

Parity movement:

  • Exact TypeScript conformance: 5032 -> 5033 / 5907
  • Canonical failures: 875 -> 874
  • Flipped exactly: generatorTypeCheck38
  • Added regressions: none

Logical parser port:

  • typeof yield now treats yield as a contextual identifier before generic invalid-operand recovery.
  • Reserved uses reuse Home existing yield-name diagnostic machinery, preserving TS1212/TS1213/TS1214 selection for generator, strict, class, and module contexts.
  • Recovery still produces an unknown type reference, preventing a secondary unresolved-name diagnostic.
  • Sloppy ES5 typeof yield is accepted as an identifier query, matching the counterexample required by upstream grammar.

Verification:

  • ts_parser: 752/752
  • parser precedence: 8/8
  • focused exact generatorTypeCheck38: 1/1
  • default ts_conformance: 1369/1369
  • baseline-aware survey: 586/586
  • exact first half: 2696/3000
  • exact second half: 2337/2907
  • aggregate: 5033/5907, 874 failures
  • sorted identity audit: exactly 1 removal, 0 additions

Footprint: 1 file, 34 insertions. This is the first semantic parser ratchet after completing the corpus runner metadata matrix in b12145fad.

14 days ago

Pushed 56719bc: fix(ts-conformance): honor combined ES5 target matrices\n\nParity movement\n- Exact parity: 5,033 -> 5,034 / 5,907\n- Exact failures: 874 -> 873\n- Closed exactly ES5For-of19\n- Added failures: none\n- Split totals: 2,696/3,000 and 2,338/2,907\n\nImplementation\n- TS1250/TS1251/TS1252 now use the effective ES5 emit target rather than the separate target-deprecation baseline switch.\n- The conformance loader parses target=es5 from any position in a combined baseline option tuple, including (alwaysstrict=true,target=es5).\n- ts_driver honors ignoreDeprecations: 6.0 for target, module, and outFile deprecations while retaining unrelated compatibility errors such as TS5105.\n- Added focused checker coverage for the for-of block container and target/deprecation separation, matrix-parser coverage, and driver tests for the 6.0 suppression and 5.0 non-suppression boundary.\n- Change size: 105 insertions, 22 deletions across 3 files.\n\nVerification\n- ts_parser: pass\n- ts_precedence: pass\n- ts_checker: pass\n- ts_driver: pass\n- Focused exact ES5For-of19: 1/1\n- Full exact split audit: 5,034/5,907, with zero added failures\n- Conformance test executable: 1,371/1,371 in both slices\n- Smoke: 16/16\n- Named categories: 86/86\n- Baseline-aware categories: 586/586\n\nTracks #69.

14 days ago

Progress: recover invalid decorated expressions

Pushed 4d67d38f3 (fix(ts-parser): recover invalid decorated expressions).

This ports typescript-go's parseDecoratedExpression recovery for decorator sequences encountered in expression position without a following class. Home now consumes the decorator sequence, emits zero-width TS1109 at its boundary, synthesizes an inert missing expression, and leaves the following token to outer statement recovery. For var F = @dec () => {}, that produces the upstream TS1109 after ) plus TS1005 on => instead of Home's custom lowercase diagnostic.

Parity impact:

  • exact parity: 5,034/5,907 -> 5,035/5,907 (+1)
  • exact failures: 873 -> 872
  • split totals: 2,697/3,000 and 2,338/2,907
  • removed exactly: decoratorOnArrowFunction
  • newly failing fixtures: 0
  • change size: 1 file, 36 insertions, 2 deletions

Verification:

  • ts_parser: pass
  • ts_parser_precedence: pass
  • ts_checker: pass
  • ts_driver: pass
  • focused exact fixture: 1/1
  • full exact TypeScript audit: 5,035/5,907, with no added failures

This continues the parser-diagnostic parity work tracked by #69 and leaves the refreshed canonical failure set at 872 fixtures.

14 days ago

Progress: recover variable-list declaration boundaries

Pushed e01b769e3 (fix(ts-parser): recover variable list boundaries).

This ports typescript-go's parsing-context recovery when a same-line declaration starter cannot continue a variable-declaration list. Home now emits TS1005 ',' expected., leaves the declaration token unread, and yields to the outer statement parser. In var F = @dec function () {}, that lets the following unnamed function declaration emit TS1003 at (, completing the upstream TS1109/TS1005/TS1003 sequence.

Parity impact:

  • exact parity: 5,035/5,907 -> 5,036/5,907 (+1)
  • exact failures: 872 -> 871
  • split totals: 2,698/3,000 and 2,338/2,907
  • removed exactly: decoratorOnFunctionExpression
  • newly failing fixtures: 0
  • change size: 1 file, 63 insertions, 1 deletion

Verification:

  • ts_parser: pass
  • ts_parser_precedence: pass
  • ts_checker: pass
  • ts_driver: pass
  • focused exact decorated-expression fixtures: 2/2
  • full exact TypeScript audit: 5,036/5,907, with no added failures

This builds directly on the decorated-expression recovery in 4d67d38f3 and continues the parser parity track in #69. The refreshed canonical failure set is now 871 fixtures.

14 days ago

Progress: yield decorators from enum-member lists

Pushed 17c6c01bf (fix(ts-parser): yield decorators from enum lists).

This ports typescript-go's nested parsing-context recovery for decorator tokens inside enum bodies. The enum-member list now emits TS1132 without consuming @; outer declaration parsing consumes the decorator sequence and emits zero-width TS1146 when no declaration follows; the trailing identifier and brace remain available for normal TS2304 and TS1128 handling. This replaces Home's early TS1003 abort with the complete upstream diagnostic flow.

Parity impact:

  • exact parity: 5,036/5,907 -> 5,037/5,907 (+1)
  • exact failures: 871 -> 870
  • split totals: 2,699/3,000 and 2,338/2,907
  • removed exactly: decoratorOnEnum2
  • newly failing fixtures: 0
  • change size: 1 file, 61 insertions, 1 deletion

Verification:

  • ts_parser: pass
  • ts_parser_precedence: pass
  • ts_checker: pass
  • ts_driver: pass
  • focused exact decorator fixtures: 3/3
  • full exact TypeScript audit: 5,037/5,907, with no added failures

This extends the same parser-context work from 4d67d38f3 and e01b769e3, all tracked by #69. The refreshed canonical failure set is now 870 fixtures.

14 days ago

Pushed 0ad1fec28 (fix(ts-checker): gate await errors on parse diagnostics).

This chunk ports the relevant typescript-go await diagnostic behavior across the parser, checker, and driver:

  • recovers @dec\nawait as a missing declaration and emits TS1146 at the decorator boundary instead of the generic decorator-location diagnostic
  • gates checker await-context diagnostics when the source has true parse diagnostics, while preserving unconditional static-block await errors
  • classifies parser-emitted TS1163 and TS18028 as grammar-only diagnostics so they do not suppress sibling checker grammar errors

Exact parity impact:

  • flipped exactly decoratorOnAwait from failing to exact
  • moved exact parity from 5037/5907 to 5038/5907 (+1)
  • reduced failures from 870 to 869
  • split result: 2700/3000 and 2338/2907
  • added 0 failures across the complete 5907-case audit

The first full audit caught awaitAndYield and awaitAndYieldInProperty regressing under a broader parse-diagnostic signal. Refining the driver classification restored both before commit; the final failure-list diff removed only decoratorOnAwait.

Change size: 3 files, 105 insertions, 8 deletions.

Verification:

  • ts_parser
  • ts_parser_precedence
  • ts_checker
  • ts_driver (139/139)
  • focused exact guard set (6/6): decoratorOnAwait, the three previously closed decorator fixtures, awaitAndYield, and awaitAndYieldInProperty
  • full exact conformance audit: 5038/5907

This follows the preceding parser parity chunks 4d67d38f, e01b769e, and 17c6c01b in the ongoing TypeScript parity work.

14 days ago

Pushed db1d16c31 (fix(ts-conformance): default alwaysStrict to enabled).

This chunk ports TypeScript's current alwaysStrict !== false default into the Home conformance path while preserving explicit @alwaysStrict matrix selections and the declaration-file exemption. It also aligns the diagnostics exposed by that default:

  • labeled var statements report TS1344 only for ES2015+ targets, preserving TypeScript's ES5 recovery behavior;
  • function expressions carry explicit HIR metadata so strict ES5 TS1250 remains declaration-only;
  • outside-class private-brand TS18016 is treated as checker-owned grammar and is suppressed when the file has genuine parse diagnostics;
  • grammar-only diagnostics no longer incorrectly suppress sibling await-context diagnostics in the driver.

The exact audit caught two intermediate regression shapes before this was committed:

  • the first prototype fixed parserWithStatement2 but displaced privateNameInInExpressionTransform; deferred TS18016 suppression restored it while retaining ordinary privateNameInInExpression;
  • enabling strict mode then exposed TS1344/TS1250 false positives in labeledStatementDeclarationListInLoopNoCrash1/2; target-aware label handling and expression-aware TS1250 restored both;
  • a broad fn_decl -> fn_expr migration displaced classStaticBlock22, so the final implementation keeps existing node identity and adds only the narrow expression flag.

Exact parity moved 5038 -> 5039 / 5907 (+1) and failures fell 869 -> 868:

  • first half: 2701/3000 (299 failures)
  • second half: 2338/2907 (569 failures)
  • sole removed failure: parserWithStatement2
  • added failures: none

Verification on the final source:

  • parser suite: pass
  • HIR suite: pass
  • checker suite: pass
  • driver suite: pass
  • conformance suite: 1372/1372
  • focused exact regression matrix: 7/7
  • full exact failure-identity audit: 5907 cases, zero regressions
  • formatting and git diff --check: pass

Change size: 5 files, +130/-25.

This follows the preceding await-context parity chunk 0ad1fec28, which established the 5038 baseline.

Tracks #69.

14 days ago

Pushed 2aaf61e88 (fix(ts-conformance): honor selected module matrices).

This is a focused conformance-runner parity chunk. Multi-value fixtures such as:

// @module: preserve,esnext,nodenext,es2020,es2015,commonjs

produce separate TypeScript baselines. Home already selected one baseline filename, but it still compiled the first source directive value (preserve). For importDeferNamespace, the selected baseline was module=commonjs, so Home incorrectly omitted TS18060.

The runner now extracts the chosen (module=X) suffix and carries it through:

  • owned and borrowed corpus entries;
  • direct compileSource execution;
  • full ts_program graph execution;
  • resolver module-kind configuration;
  • implicit resolver strategy selection.

Baseline selection now takes precedence over the original comma-separated directive, matching the existing target/module-resolution matrix model.

Exact parity moved 5039 -> 5040 / 5907 (+1) and failures fell 868 -> 867:

  • first half: 2701/3000 (unchanged, identical 299-failure set)
  • second half: 2339/2907 (568 failures, +1)
  • sole removed failure: importDeferNamespace
  • added failures: none

Verification:

  • conformance suite: 1374/1374
  • focused deferred-import filter: 2/3
  • remaining focused failure: dynamicImportDefer, a separate missing checker path for dynamic import.defer() TS18060
  • full exact failure-identity audit: 5907 cases, zero regressions
  • formatting and git diff --check: pass

Change size: 1 file, +66/-10.

This follows db1d16c31, which established the 5039 baseline.

Tracks #69.

14 days ago

Dynamic deferred import parity

Landed fix(ts-checker): validate dynamic deferred imports (03020d236).

What changed:

  • Ported the TypeScript checkGrammarImportCallExpression meta-property branch for import.defer(...).
  • Home now reports TS18060 for dynamic deferred imports when module is not esnext or preserve.
  • Added checker coverage for the CommonJS error path and the Preserve clean path.

Parity movement:

  • Full corpus: 5,040 -> 5,041 passing out of 5,907.
  • Failures: 867 -> 866.
  • Sole removed failure: dynamicImportDefer.
  • Added failures: 0.

Audit:

  • First half: 2,701/3,000, failure identity unchanged.
  • Second half: 2,340/2,907, removed only dynamicImportDefer.
  • Combined failure list now has 866 entries.
  • Focused exact filter dynamicImportDefer,importDeferNamespace: 3/3 passing.
  • ts_conformance unit suite: passing.
  • Checker suite: passing.

Diff size:

  • packages/ts_checker/src/check.zig: +34/-0.

Tracks #69.

14 days ago

Import module-specifier diagnostic anchoring

Landed fix(ts-checker): retain import specifier positions (1eeadb6f0).

What changed:

  • Ported TypeScript's structural ModuleSpecifier diagnostic anchoring by retaining the parser token position in Home's import HIR.
  • Static imports, side-effect imports, and import = require(...) now carry the opening-quote position of their module string literal.
  • The checker uses that position directly and keeps its existing source-search fallback for non-import nodes.
  • Added a comment-heavy deferred-import regression that proves TS2307 lands on the quoted module token rather than the earlier a in as.

Parity movement:

  • Full corpus: 5,041 -> 5,042 passing out of 5,907.
  • Failures: 866 -> 865.
  • Sole removed failure: importDeferComments.
  • Added failures: 0.

Audit:

  • First half: 2,701/3,000, all 299 failure identities unchanged.
  • Second half: 2,340 -> 2,341 passing out of 2,907; failures 567 -> 566.
  • Combined failure list now has 865 entries.
  • Focused exact import-defer set: 4/4 passing.
  • ts_parser suite: passing.
  • ts_checker suite: passing.
  • ts_conformance suite: passing.

Diff size:

  • packages/hir/src/hir.zig: +4/-0.
  • packages/ts_parser/src/ts_parser.zig: +10/-1.
  • packages/ts_checker/src/check.zig: +25/-0.
  • Total: +39/-1.

Tracks #69.

14 days ago

Import-clause comma and recovery parity

Landed fix(ts-parser): require commas before import bindings (d19cc2d03).

What changed:

  • Ported TypeScript's parseImportClause gate: namespace and named bindings may follow a default import only when a comma was consumed.
  • Malformed import defer type * as ns from "./a" no longer becomes a valid deferred default-plus-namespace import.
  • Mirrored TypeScript's recovery by consuming the malformed * as module expression, reporting the missing terminator at the namespace name, preserving TS1434 on from, and continuing name checking for the trailing identifiers.
  • Added parser coverage for the missing-from, string-literal, and unexpected-keyword diagnostics.

Parity movement:

  • Full corpus: 5,042 -> 5,043 passing out of 5,907.
  • Failures: 865 -> 864.
  • Sole removed failure: importDeferTypeConflict2.
  • Added failures: 0.

Audit:

  • First half: 2,701/3,000, all 299 failure identities unchanged.
  • Second half: 2,341 -> 2,342 passing out of 2,907; failures 566 -> 565.
  • Combined failure list now has 864 entries.
  • Focused import-defer exact set: 4/5 passing; only the separate importDeferTypeConflict1 import-equals branch remains.
  • ts_parser suite: passing.
  • ts_checker suite: passing.
  • ts_conformance suite: passing.

Diff size:

  • packages/ts_parser/src/ts_parser.zig: +52/-3.

Tracks #69.

Sign in to comment on this issue.