diff --git a/apps/oxlint/src-js/generated/visitor.d.ts b/apps/oxlint/src-js/generated/visitor.d.ts index 4e41e2761d80c..6bda7af9035f1 100644 --- a/apps/oxlint/src-js/generated/visitor.d.ts +++ b/apps/oxlint/src-js/generated/visitor.d.ts @@ -3,7 +3,11 @@ import type * as ESTree from "./types.d.ts"; -export interface VisitorObject { +type BivarianceHackHandler any> = { + bivarianceHack(...args: Parameters): ReturnType; +}["bivarianceHack"]; + +interface StrictVisitorObject { DebuggerStatement?: (node: ESTree.DebuggerStatement) => void; "DebuggerStatement:exit"?: (node: ESTree.DebuggerStatement) => void; EmptyStatement?: (node: ESTree.EmptyStatement) => void; @@ -384,5 +388,10 @@ export interface VisitorObject { "TSTypeReference:exit"?: (node: ESTree.TSTypeReference) => void; TSUnionType?: (node: ESTree.TSUnionType) => void; "TSUnionType:exit"?: (node: ESTree.TSUnionType) => void; - [key: string]: (node: ESTree.Node) => void; } + +export type VisitorObject = { + [K in keyof StrictVisitorObject]?: + | BivarianceHackHandler> + | undefined; +} & Record void> | undefined>; diff --git a/tasks/ast_tools/src/generators/estree_visit.rs b/tasks/ast_tools/src/generators/estree_visit.rs index 70e61269fdb44..d38b4cbc79c44 100644 --- a/tasks/ast_tools/src/generators/estree_visit.rs +++ b/tasks/ast_tools/src/generators/estree_visit.rs @@ -507,13 +507,22 @@ fn generate(codegen: &Codegen) -> Codes { }} "); + // See https://github.com/DefinitelyTyped/DefinitelyTyped/pull/20219 for why we need "Bivariance hack" #[rustfmt::skip] let visitor_type_oxlint = format!(" import type * as ESTree from './types.d.ts'; - export interface VisitorObject {{ - {visitor_type} [key: string]: (node: ESTree.Node) => void; + type BivarianceHackHandler any> = {{ + bivarianceHack(...args: Parameters): ReturnType; + }}[\"bivarianceHack\"]; + + interface StrictVisitorObject {{ + {visitor_type} }} + + export type VisitorObject = {{ + [K in keyof StrictVisitorObject]?: BivarianceHackHandler> | undefined; + }} & Record void> | undefined>; "); // Type definitions for walk.js.