Repository: denoland/deno
Pull request: BREAKING(ext/ffi): remove deprecated `UnsafeFnPointer` constructor type with untyped `Deno.PointerObject` parameter


Changed files:
filename: cli/tsc/dts/lib.deno.ns.d.ts
patch: @@ -536,10 +536,7 @@ declare namespace Deno {
    * set of permissions to the test context.
    *
    * @category Permissions */
-  export type PermissionOptions =
-    | "inherit"
-    | "none"
-    | PermissionOptionsObject;
+  export type PermissionOptions = "inherit" | "none" | PermissionOptionsObject;
 
   /**
    * A set of options which can define the permissions within a test or worker
@@ -944,10 +941,7 @@ declare namespace Deno {
      *
      * @category Testing
      */
-    (
-      name: string,
-      fn: (t: TestContext) => void | Promise<void>,
-    ): void;
+    (name: string, fn: (t: TestContext) => void | Promise<void>): void;
 
     /** Register a test which will be run when `deno test` is used on the command
      * line and the containing module looks like a test module.
@@ -1079,10 +1073,7 @@ declare namespace Deno {
      *
      * @category Testing
      */
-    ignore(
-      name: string,
-      fn: (t: TestContext) => void | Promise<void>,
-    ): void;
+    ignore(name: string, fn: (t: TestContext) => void | Promise<void>): void;
 
     /** Shorthand property for ignoring a particular test case.
      *
@@ -1128,10 +1119,7 @@ declare namespace Deno {
      *
      * @category Testing
      */
-    only(
-      name: string,
-      fn: (t: TestContext) => void | Promise<void>,
-    ): void;
+    only(name: string, fn: (t: TestContext) => void | Promise<void>): void;
 
     /** Shorthand property for focusing a particular test case.
      *
@@ -3964,10 +3952,7 @@ declare namespace Deno {
    *
    * @category Permissions
    */
-  export type PermissionState =
-    | "granted"
-    | "denied"
-    | "prompt";
+  export type PermissionState = "granted" | "denied" | "prompt";
 
   /** The permission descriptor for the `allow-run` and `deny-run` permissions, which controls
    * access to what sub-processes can be executed by Deno. The option `command`
@@ -4107,7 +4092,7 @@ declare namespace Deno {
    *
    * @category Permissions */
   export interface PermissionStatusEventMap {
-    "change": Event;
+    change: Event;
   }
 
   /** An {@linkcode EventTarget} returned from the {@linkcode Deno.permissions}
@@ -5311,9 +5296,7 @@ declare namespace Deno {
    * @category HTTP Server
    */
   export function serve(
-    options:
-      | ServeTcpOptions
-      | (ServeTcpOptions & TlsCertifiedKeyPem),
+    options: ServeTcpOptions | (ServeTcpOptions & TlsCertifiedKeyPem),
     handler: ServeHandler<Deno.NetAddr>,
   ): HttpServer<Deno.NetAddr>;
   /** Serves HTTP requests with the given option bag.
@@ -5392,11 +5375,7 @@ declare namespace Deno {
    *
    * @category FFI
    */
-  export type NativeBigIntType =
-    | "u64"
-    | "i64"
-    | "usize"
-    | "isize";
+  export type NativeBigIntType = "u64" | "i64" | "usize" | "isize";
 
   /** The native boolean type for interfacing to foreign functions.
    *
@@ -5512,7 +5491,8 @@ declare namespace Deno {
     : T extends NativeBigIntType ? bigint
     : T extends NativeBooleanType ? boolean
     : T extends NativePointerType
-      ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue
+      ? T extends NativeTypedPointer<infer U> ? U | null
+      : PointerValue
     : T extends NativeFunctionType
       ? T extends NativeTypedFunction<infer U> ? PointerValue<U> | null
       : PointerValue
@@ -5536,7 +5516,8 @@ declare namespace Deno {
     : T extends NativeBigIntType ? bigint
     : T extends NativeBooleanType ? boolean
     : T extends NativePointerType
-      ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue
+      ? T extends NativeTypedPointer<infer U> ? U | null
+      : PointerValue
     : T extends NativeFunctionType
       ? T extends NativeTypedFunction<infer U> ? PointerObject<U> | null
       : PointerValue
@@ -5550,9 +5531,8 @@ declare namespace Deno {
    */
   export type ToNativeParameterTypes<T extends readonly NativeType[]> =
     //
-    [(T[number])[]] extends [T] ? ToNativeType<T[number]>[]
-      : [readonly (T[number])[]] extends [T]
-        ? readonly ToNativeType<T[number]>[]
+    [T[number][]] extends [T] ? ToNativeType<T[number]>[]
+      : [readonly T[number][]] extends [T] ? readonly ToNativeType<T[number]>[]
       : T extends readonly [...NativeType[]] ? {
           [K in keyof T]: ToNativeType<T[K]>;
         }
@@ -5575,7 +5555,8 @@ declare namespace Deno {
     : T extends NativeBigIntType ? bigint
     : T extends NativeBooleanType ? boolean
     : T extends NativePointerType
-      ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue
+      ? T extends NativeTypedPointer<infer U> ? U | null
+      : PointerValue
     : T extends NativeBufferType ? PointerValue
     : T extends NativeFunctionType
       ? T extends NativeTypedFunction<infer U> ? PointerObject<U> | null
@@ -5599,7 +5580,8 @@ declare namespace Deno {
     : T extends NativeBigIntType ? bigint
     : T extends NativeBooleanType ? boolean
     : T extends NativePointerType
-      ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue
+      ? T extends NativeTypedPointer<infer U> ? U | null
+      : PointerValue
     : T extends NativeBufferType ? PointerValue
     : T extends NativeFunctionType
       ? T extends NativeTypedFunction<infer U> ? PointerObject<U> | null
@@ -5609,12 +5591,10 @@ declare namespace Deno {
 
   /** @category FFI
    */
-  export type FromNativeParameterTypes<
-    T extends readonly NativeType[],
-  > =
+  export type FromNativeParameterTypes<T extends readonly NativeType[]> =
     //
-    [(T[number])[]] extends [T] ? FromNativeType<T[number]>[]
-      : [readonly (T[number])[]] extends [T]
+    [T[number][]] extends [T] ? FromNativeType<T[number]>[]
+      : [readonly T[number][]] extends [T]
         ? readonly FromNativeType<T[number]>[]
       : T extends readonly [...NativeType[]] ? {
           [K in keyof T]: FromNativeType<T[K]>;
@@ -5695,8 +5675,10 @@ declare namespace Deno {
 
   /** @category FFI
    */
-  export type ConditionalAsync<IsAsync extends boolean | undefined, T> =
-    IsAsync extends true ? Promise<T> : T;
+  export type ConditionalAsync<
+    IsAsync extends boolean | undefined,
+    T,
+  > = IsAsync extends true ? Promise<T> : T;
 
   /** A utility type that infers a foreign library interface.
    *
@@ -5804,10 +5786,7 @@ declare namespace Deno {
     getCString(offset?: number): string;
     /** Gets a C string (`null` terminated string) at the specified byte offset
      * from the specified pointer. */
-    static getCString(
-      pointer: PointerObject,
-      offset?: number,
-    ): string;
+    static getCString(pointer: PointerObject, offset?: number): string;
     /** Gets an `ArrayBuffer` of length `byteLength` at the specified byte
      * offset from the pointer. */
     getArrayBuffer(byteLength: number, offset?: number): ArrayBuffer;
@@ -5847,9 +5826,10 @@ declare namespace Deno {
     /** The definition of the function. */
     definition: Fn;
 
-    constructor(pointer: PointerObject<NoInfer<Fn>>, definition: Fn);
-    /** @deprecated Properly type {@linkcode pointer} using {@linkcode NativeTypedFunction} or {@linkcode UnsafeCallbackDefinition} types. */
-    constructor(pointer: PointerObject, definition: Fn);
+    constructor(
+      pointer: PointerObject<NoInfer<Omit<Fn, "nonblocking">>>,
+      definition: Fn,
+    );
 
     /** Call the foreign function. */
     call: FromForeignFunction<Fn>;
@@ -5876,9 +5856,10 @@ declare namespace Deno {
   export type UnsafeCallbackFunction<
     Parameters extends readonly NativeType[] = readonly NativeType[],
     Result extends NativeResultType = NativeResultType,
-  > = Parameters extends readonly [] ? () => ToNativeResultType<Result> : (
-    ...args: FromNativeParameterTypes<Parameters>
-  ) => ToNativeResultType<Result>;
+  > = Parameters extends readonly [] ? () => ToNativeResultType<Result>
+    : (
+      ...args: FromNativeParameterTypes<Parameters>
+    ) => ToNativeResultType<Result>;
 
   /** An unsafe function pointer for passing JavaScript functions as C function
    * pointers to foreign function calls.

filename: tests/ffi/tests/ffi_types.ts
patch: @@ -2,86 +2,78 @@
 // deno-lint-ignore-file
 // Only for testing types. Invoke with `deno cache`
 
-const remote = Deno.dlopen(
-  "dummy_lib.so",
-  {
-    method1: { parameters: ["usize", "bool"], result: "void" },
-    method2: { parameters: [], result: "void" },
-    method3: { parameters: ["usize"], result: "void" },
-    method4: { parameters: ["isize"], result: "void" },
-    method5: { parameters: ["u8"], result: "void" },
-    method6: { parameters: ["u16"], result: "void" },
-    method7: { parameters: ["u32"], result: "void" },
-    method8: { parameters: ["u64"], result: "void" },
-    method9: { parameters: ["i8"], result: "void" },
-    method10: { parameters: ["i16"], result: "void" },
-    method11: { parameters: ["i32"], result: "void" },
-    method12: { parameters: ["i64"], result: "void" },
-    method13: { parameters: ["f32"], result: "void" },
-    method14: { parameters: ["f64"], result: "void" },
-    method15: { parameters: ["pointer"], result: "void" },
-    method16: { parameters: [], result: "usize" },
-    method17: { parameters: [], result: "usize", nonblocking: true },
-    method18: { parameters: [], result: "pointer" },
-    method19: { parameters: [], result: "pointer", nonblocking: true },
-    method20: {
-      parameters: ["pointer"],
-      result: "void",
-    },
-    method21: {
-      parameters: [
-        "pointer",
-      ],
-      result: "void",
-    },
-    method22: {
-      parameters: ["pointer"],
-      result: "void",
-    },
-    method23: {
-      parameters: ["buffer"],
-      result: "void",
-    },
-    method24: {
-      parameters: ["bool"],
-      result: "bool",
-    },
-    method25: {
-      parameters: [],
-      result: "void",
-      optional: true,
-    },
-    static1: { type: "usize" },
-    static2: { type: "pointer" },
-    static3: { type: "usize" },
-    static4: { type: "isize" },
-    static5: { type: "u8" },
-    static6: { type: "u16" },
-    static7: { type: "u32" },
-    static8: { type: "u64" },
-    static9: { type: "i8" },
-    static10: { type: "i16" },
-    static11: { type: "i32" },
-    static12: { type: "i64" },
-    static13: { type: "f32" },
-    static14: { type: "f64" },
-    static15: { type: "bool" },
-    static16: {
-      type: "bool",
-      optional: true,
-    },
+const remote = Deno.dlopen("dummy_lib.so", {
+  method1: { parameters: ["usize", "bool"], result: "void" },
+  method2: { parameters: [], result: "void" },
+  method3: { parameters: ["usize"], result: "void" },
+  method4: { parameters: ["isize"], result: "void" },
+  method5: { parameters: ["u8"], result: "void" },
+  method6: { parameters: ["u16"], result: "void" },
+  method7: { parameters: ["u32"], result: "void" },
+  method8: { parameters: ["u64"], result: "void" },
+  method9: { parameters: ["i8"], result: "void" },
+  method10: { parameters: ["i16"], result: "void" },
+  method11: { parameters: ["i32"], result: "void" },
+  method12: { parameters: ["i64"], result: "void" },
+  method13: { parameters: ["f32"], result: "void" },
+  method14: { parameters: ["f64"], result: "void" },
+  method15: { parameters: ["pointer"], result: "void" },
+  method16: { parameters: [], result: "usize" },
+  method17: { parameters: [], result: "usize", nonblocking: true },
+  method18: { parameters: [], result: "pointer" },
+  method19: { parameters: [], result: "pointer", nonblocking: true },
+  method20: {
+    parameters: ["pointer"],
+    result: "void",
   },
-);
+  method21: {
+    parameters: ["pointer"],
+    result: "void",
+  },
+  method22: {
+    parameters: ["pointer"],
+    result: "void",
+  },
+  method23: {
+    parameters: ["buffer"],
+    result: "void",
+  },
+  method24: {
+    parameters: ["bool"],
+    result: "bool",
+  },
+  method25: {
+    parameters: [],
+    result: "void",
+    optional: true,
+  },
+  static1: { type: "usize" },
+  static2: { type: "pointer" },
+  static3: { type: "usize" },
+  static4: { type: "isize" },
+  static5: { type: "u8" },
+  static6: { type: "u16" },
+  static7: { type: "u32" },
+  static8: { type: "u64" },
+  static9: { type: "i8" },
+  static10: { type: "i16" },
+  static11: { type: "i32" },
+  static12: { type: "i64" },
+  static13: { type: "f32" },
+  static14: { type: "f64" },
+  static15: { type: "bool" },
+  static16: {
+    type: "bool",
+    optional: true,
+  },
+});
 
-Deno.dlopen(
-  "dummy_lib_2.so",
-  {
-    wrong_method1: {
-      parameters: [],
-      result: "function",
-    },
+Deno.dlopen("dummy_lib_2.so", {
+  wrong_method1: {
+    parameters: [],
+    result: "function",
   },
-);
+});
 
 // @ts-expect-error: Invalid argument
 remote.symbols.method1(0);
@@ -173,7 +165,7 @@ result4.then((_0: Deno.BufferSource) => {});
 result4.then((_1: null | Deno.UnsafePointer) => {});
 
 const fnptr = new Deno.UnsafeFnPointer(
-  {} as Deno.PointerObject,
+  {} as Deno.PointerObject<Deno.ForeignFunction<["u32", "pointer"], "void">>,
   {
     parameters: ["u32", "pointer"],
     result: "void",
@@ -340,16 +332,18 @@ const static16_right: boolean | null = remote.symbols.static16;
 
 // Adapted from https://stackoverflow.com/a/53808212/10873797
 type Equal<T, U> = (<G>() => G extends T ? 1 : 2) extends
-  (<G>() => G extends U ? 1 : 2) ? true
+  <G>() => G extends U ? 1 : 2 ? true
   : false;
 
 type AssertEqual<
   Expected extends $,
   Got extends $$,
   $ = [Equal<Got, Expected>] extends [true] ? Expected
-    : ([Expected] extends [Got] ? never : Got),
+    : [Expected] extends [Got] ? never
+    : Got,
   $$ = [Equal<Expected, Got>] extends [true] ? Got
-    : ([Got] extends [Expected] ? never : Got),
+    : [Got] extends [Expected] ? never
+    : Got,
 > = never;
 
 type AssertNotEqual<
@@ -372,9 +366,7 @@ type MyFunctionDefinition = Deno.UnsafeCallbackDefinition<
   [typeof foo, "u32"],
   typeof myPointer
 >;
-const myFunction = "function" as Deno.NativeTypedFunction<
-  MyFunctionDefinition
->;
+const myFunction = "function" as Deno.NativeTypedFunction<MyFunctionDefinition>;
 
 type __Tests__ = [
   empty: AssertEqual<
@@ -396,14 +388,12 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      {
-        pushBuf: {
-          parameters: ["buffer", "pointer", "function"];
-          result: "void";
-        };
-      }
-    >
+    Deno.DynamicLibrary<{
+      pushBuf: {
+        parameters: ["buffer", "pointer", "function"];
+        result: "void";
+      };
+    }>
   >,
   higher_order_returns: AssertEqual<
     {
@@ -416,27 +406,23 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      {
-        pushBuf: {
-          parameters: ["buffer", "pointer", "function"];
-          result: "pointer";
-        };
-      }
-    >
+    Deno.DynamicLibrary<{
+      pushBuf: {
+        parameters: ["buffer", "pointer", "function"];
+        result: "pointer";
+      };
+    }>
   >,
   non_exact_params: AssertEqual<
     {
       symbols: {
-        foo: (
-          ...args: (number | Deno.PointerValue | null)[]
-        ) => bigint;
+        foo: (...args: (number | Deno.PointerValue | null)[]) => bigint;
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: ("i32" | "pointer")[]; result: "u64" } }
-    >
+    Deno.DynamicLibrary<{
+      foo: { parameters: ("i32" | "pointer")[]; result: "u64" };
+    }>
   >,
   non_exact_params_empty: AssertEqual<
     {
@@ -445,9 +431,7 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: []; result: "i32" } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: []; result: "i32" } }>
   >,
   non_exact_params_empty: AssertNotEqual<
     {
@@ -456,9 +440,7 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: []; result: "i32" } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: []; result: "i32" } }>
   >,
   enum_param: AssertEqual<
     {
@@ -467,9 +449,7 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: [typeof foo]; result: "void" } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: [typeof foo]; result: "void" } }>
   >,
   enum_return: AssertEqual<
     {
@@ -478,9 +458,7 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: []; result: typeof foo } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof foo } }>
   >,
   typed_pointer_param: AssertEqual<
     {
@@ -489,9 +467,9 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: [typeof myPointer]; result: "void" } }
-    >
+    Deno.DynamicLibrary<{
+      foo: { parameters: [typeof myPointer]; result: "void" };
+    }>
   >,
   typed_pointer_return: AssertEqual<
     {
@@ -500,9 +478,7 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: []; result: typeof myPointer } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof myPointer } }>
   >,
   typed_function_param: AssertEqual<
     {
@@ -511,9 +487,9 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: [typeof myFunction]; result: "void" } }
-    >
+    Deno.DynamicLibrary<{
+      foo: { parameters: [typeof myFunction]; result: "void" };
+    }>
   >,
   typed_function_return: AssertEqual<
     {
@@ -522,8 +498,6 @@ type __Tests__ = [
       };
       close(): void;
     },
-    Deno.DynamicLibrary<
-      { foo: { parameters: []; result: typeof myFunction } }
-    >
+    Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof myFunction } }>
   >,
 ];