Skip to content

Lower operator, constructor-operator and type-operator aliases #86

Closed

Description

@biuld

Part of #75 (Phase 2). Operator, constructor-operator, and type-operator aliases block 26 passing files in declaration lowering and five M2 failing cases — they are the largest single M2 blocker.

Declaration forms

infixr 6 Cons as :          -- constructor operator alias
infixl 5 foo as ##         -- value operator alias
type role Proxy nominal
infixr 4 type <=< as <|>  -- type operator alias

Failing cases it unblocks

File Expected Why it fails now
DctorOperatorAliasExport.purs TransitiveDctorExportError lowering rejects the declaration
OperatorAliasNoExport.purs TransitiveExportError lowering rejects the declaration
TypeOperatorAliasNoExport.purs TransitiveExportError lowering rejects the declaration
ExportConflictValueOp.purs ExportConflict export checking ignores operator aliases
ExportConflictTypeOp.purs ExportConflict export checking ignores type-operator aliases

Also blocked

FE-07's "one shared fixity and operator-resolution pass" — which operator sections also depend on. Sections are rejected at parse time ((1 +) and (+ 1) both fail with "expected expression, found Operator"), and they need the same fixity resolution.

Scope

  • Lower the alias declarations into the shared spine, in all three namespaces.
  • Resolve operator names through the fixity table so sections and pattern operators work.
  • Include aliases in import/export conflict checking (ExportConflictValueOp, ExportConflictTypeOp) and in transitive export validation (OperatorAliasNoExport, TypeOperatorAliasNoExport, DctorOperatorAliasExport).
  • Land the section forms this unblocks.

Acceptance

All five failing cases agree, the 26 passing declaration blockers drop, and FE-07 can move to Implemented once its remaining L2 gate is met.

Activity

  1. added
    gate:L2Blocks module, import, export and name resolution (D-04 L2)
    area:frontendFrontend: syntax, resolution, kinds, types, classes
    on Oct 1, 2026
  2. biuld commented on Oct 2, 2026

    @biuld
    OwnerAuthor

    Completed by PR #114, merged as f741436b35e365b84757057b9ac8067c4427014e.

    The five mapped M2 cases now agree with the official errors: DctorOperatorAliasExport (TransitiveDctorExportError), OperatorAliasNoExport and TypeOperatorAliasNoExport (TransitiveExportError), and ExportConflictValueOp / ExportConflictTypeOp (ExportConflict). The vendored L2 scoreboard reports 59/70 failing agreement and 59/413 passing modules resolved.

    P2 chains remain source ordered through P2; P3 resolves value, constructor, and type aliases through ordinary namespace lookup; P4 reassociates expression, pattern, and type chains and expands sections. Focused tests cover qualified and ambiguous targets, separated fixity groups, constructor patterns, and section/negation parsing. Runtime tests executed under Wasmtime.

    The original estimate of 26 passing declaration blockers is superseded by the measured net P2 reduction of 19 (106 to 87). Recounting vendored alias-bearing files by their current first blocker shows no remaining case first blocked on #86: the remaining P2 examples stop on pattern forms tracked by #85 or unary minus tracked by #89; other alias-bearing files reach missing-library or later backend blockers. The #86 Corpus cases field is therefore 0; the net reduction of 19 is not a remaining-case count.

    Validation: cargo fmt --all --check; cargo clippy --workspace --all-targets -- -D warnings; PSRS_REQUIRE_WASMTIME=1 cargo test --workspace; upstream differential 4/4; vendored L2 and Wasmtime-required L6 scoreboards. L6 reports 0/413 runtime agreement, with 255 missing-library blockers, 87 P2, 55 P10, 8 P3, 4 P0, 3 P5 typecheck, 1 P5 kind check, and 0 harness blockers.

  3. biuld commented on Oct 2, 2026

    @biuld
    OwnerAuthor

    Completed by merged PR #114 (f741436). Vendored L2 confirms the five named failing cases and 59/70 total agreement; passing blockers show a measured net P2 reduction of 19 (106 to 87). Required Wasmtime workspace tests passed; the L6 corpus baseline remains 0/413 due to other blockers. The #86 Corpus cases count is 0 after first-blocker recount; residual P2 work belongs to #85/#89. Full evidence: #86 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:frontendFrontend: syntax, resolution, kinds, types, classesenhancementNew feature or requestgate:L2Blocks module, import, export and name resolution (D-04 L2)

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions