@gtkx/codegen 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/dist/dsl/context.d.ts +104 -0
- package/dist/dsl/context.d.ts.map +1 -0
- package/dist/dsl/context.js +140 -0
- package/dist/dsl/context.js.map +1 -0
- package/dist/dsl/emit.d.ts +28 -0
- package/dist/dsl/emit.d.ts.map +1 -0
- package/dist/dsl/emit.js +41 -0
- package/dist/dsl/emit.js.map +1 -0
- package/dist/dsl/identifier.d.ts +28 -0
- package/dist/dsl/identifier.d.ts.map +1 -0
- package/dist/dsl/identifier.js +45 -0
- package/dist/dsl/identifier.js.map +1 -0
- package/dist/dsl/imports.d.ts +58 -0
- package/dist/dsl/imports.d.ts.map +1 -0
- package/dist/dsl/imports.js +107 -0
- package/dist/dsl/imports.js.map +1 -0
- package/dist/dsl/module.d.ts +53 -0
- package/dist/dsl/module.d.ts.map +1 -0
- package/dist/dsl/module.js +76 -0
- package/dist/dsl/module.js.map +1 -0
- package/dist/ffi/pipeline.d.ts +19 -0
- package/dist/ffi/pipeline.d.ts.map +1 -0
- package/dist/ffi/pipeline.js +107 -0
- package/dist/ffi/pipeline.js.map +1 -0
- package/dist/fingerprint.d.ts +30 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +33 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/gi-store.d.ts +34 -0
- package/dist/gi-store.d.ts.map +1 -0
- package/dist/gi-store.js +154 -0
- package/dist/gi-store.js.map +1 -0
- package/dist/gir/boxed.d.ts +66 -0
- package/dist/gir/boxed.d.ts.map +1 -0
- package/dist/gir/boxed.js +49 -0
- package/dist/gir/boxed.js.map +1 -0
- package/dist/gir/callback.d.ts +15 -0
- package/dist/gir/callback.d.ts.map +1 -0
- package/dist/gir/callback.js +17 -0
- package/dist/gir/callback.js.map +1 -0
- package/dist/gir/class.d.ts +49 -0
- package/dist/gir/class.d.ts.map +1 -0
- package/dist/gir/class.js +42 -0
- package/dist/gir/class.js.map +1 -0
- package/dist/gir/enum.d.ts +39 -0
- package/dist/gir/enum.d.ts.map +1 -0
- package/dist/gir/enum.js +24 -0
- package/dist/gir/enum.js.map +1 -0
- package/dist/gir/field.d.ts +27 -0
- package/dist/gir/field.d.ts.map +1 -0
- package/dist/gir/field.js +19 -0
- package/dist/gir/field.js.map +1 -0
- package/dist/gir/function.d.ts +47 -0
- package/dist/gir/function.d.ts.map +1 -0
- package/dist/gir/function.js +28 -0
- package/dist/gir/function.js.map +1 -0
- package/dist/gir/namespace.d.ts +65 -0
- package/dist/gir/namespace.d.ts.map +1 -0
- package/dist/gir/namespace.js +60 -0
- package/dist/gir/namespace.js.map +1 -0
- package/dist/gir/parameter.d.ts +82 -0
- package/dist/gir/parameter.d.ts.map +1 -0
- package/dist/gir/parameter.js +66 -0
- package/dist/gir/parameter.js.map +1 -0
- package/dist/gir/parse.d.ts +78 -0
- package/dist/gir/parse.d.ts.map +1 -0
- package/dist/gir/parse.js +155 -0
- package/dist/gir/parse.js.map +1 -0
- package/dist/gir/primitives.d.ts +36 -0
- package/dist/gir/primitives.d.ts.map +1 -0
- package/dist/gir/primitives.js +109 -0
- package/dist/gir/primitives.js.map +1 -0
- package/dist/gir/property.d.ts +29 -0
- package/dist/gir/property.d.ts.map +1 -0
- package/dist/gir/property.js +16 -0
- package/dist/gir/property.js.map +1 -0
- package/dist/gir/qualified-name.d.ts +37 -0
- package/dist/gir/qualified-name.d.ts.map +1 -0
- package/dist/gir/qualified-name.js +39 -0
- package/dist/gir/qualified-name.js.map +1 -0
- package/dist/gir/qualify.d.ts +32 -0
- package/dist/gir/qualify.d.ts.map +1 -0
- package/dist/gir/qualify.js +60 -0
- package/dist/gir/qualify.js.map +1 -0
- package/dist/gir/repository.d.ts +82 -0
- package/dist/gir/repository.d.ts.map +1 -0
- package/dist/gir/repository.js +122 -0
- package/dist/gir/repository.js.map +1 -0
- package/dist/gir/signal.d.ts +22 -0
- package/dist/gir/signal.d.ts.map +1 -0
- package/dist/gir/signal.js +20 -0
- package/dist/gir/signal.js.map +1 -0
- package/dist/gir/size.d.ts +67 -0
- package/dist/gir/size.d.ts.map +1 -0
- package/dist/gir/size.js +87 -0
- package/dist/gir/size.js.map +1 -0
- package/dist/gir/type-ref.d.ts +79 -0
- package/dist/gir/type-ref.d.ts.map +1 -0
- package/dist/gir/type-ref.js +101 -0
- package/dist/gir/type-ref.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-store.d.ts +22 -0
- package/dist/jsx-store.d.ts.map +1 -0
- package/dist/jsx-store.js +40 -0
- package/dist/jsx-store.js.map +1 -0
- package/dist/react/compounds-meta.d.ts +18 -0
- package/dist/react/compounds-meta.d.ts.map +1 -0
- package/dist/react/compounds-meta.js +93 -0
- package/dist/react/compounds-meta.js.map +1 -0
- package/dist/react/compounds.d.ts +27 -0
- package/dist/react/compounds.d.ts.map +1 -0
- package/dist/react/compounds.js +164 -0
- package/dist/react/compounds.js.map +1 -0
- package/dist/react/internal.d.ts +14 -0
- package/dist/react/internal.d.ts.map +1 -0
- package/dist/react/internal.js +79 -0
- package/dist/react/internal.js.map +1 -0
- package/dist/react/jsx.d.ts +22 -0
- package/dist/react/jsx.d.ts.map +1 -0
- package/dist/react/jsx.js +134 -0
- package/dist/react/jsx.js.map +1 -0
- package/dist/react/pipeline.d.ts +13 -0
- package/dist/react/pipeline.d.ts.map +1 -0
- package/dist/react/pipeline.js +25 -0
- package/dist/react/pipeline.js.map +1 -0
- package/dist/react/props.d.ts +38 -0
- package/dist/react/props.d.ts.map +1 -0
- package/dist/react/props.js +231 -0
- package/dist/react/props.js.map +1 -0
- package/dist/react/slot-props.d.ts +10 -0
- package/dist/react/slot-props.d.ts.map +1 -0
- package/dist/react/slot-props.js +56 -0
- package/dist/react/slot-props.js.map +1 -0
- package/dist/react/widgets.d.ts +83 -0
- package/dist/react/widgets.d.ts.map +1 -0
- package/dist/react/widgets.js +152 -0
- package/dist/react/widgets.js.map +1 -0
- package/dist/runner.d.ts +55 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +60 -0
- package/dist/runner.js.map +1 -0
- package/dist/store-fs.d.ts +109 -0
- package/dist/store-fs.d.ts.map +1 -0
- package/dist/store-fs.js +98 -0
- package/dist/store-fs.js.map +1 -0
- package/dist/transpile.d.ts +32 -0
- package/dist/transpile.d.ts.map +1 -0
- package/dist/transpile.js +63 -0
- package/dist/transpile.js.map +1 -0
- package/dist/typecheck-store.d.ts +41 -0
- package/dist/typecheck-store.d.ts.map +1 -0
- package/dist/typecheck-store.js +102 -0
- package/dist/typecheck-store.js.map +1 -0
- package/dist/writers/alias.d.ts +13 -0
- package/dist/writers/alias.d.ts.map +1 -0
- package/dist/writers/alias.js +17 -0
- package/dist/writers/alias.js.map +1 -0
- package/dist/writers/async.d.ts +22 -0
- package/dist/writers/async.d.ts.map +1 -0
- package/dist/writers/async.js +48 -0
- package/dist/writers/async.js.map +1 -0
- package/dist/writers/boxed-constructor.d.ts +26 -0
- package/dist/writers/boxed-constructor.d.ts.map +1 -0
- package/dist/writers/boxed-constructor.js +85 -0
- package/dist/writers/boxed-constructor.js.map +1 -0
- package/dist/writers/boxed-field-accessor.d.ts +18 -0
- package/dist/writers/boxed-field-accessor.d.ts.map +1 -0
- package/dist/writers/boxed-field-accessor.js +260 -0
- package/dist/writers/boxed-field-accessor.js.map +1 -0
- package/dist/writers/boxed-layout.d.ts +27 -0
- package/dist/writers/boxed-layout.d.ts.map +1 -0
- package/dist/writers/boxed-layout.js +128 -0
- package/dist/writers/boxed-layout.js.map +1 -0
- package/dist/writers/boxed.d.ts +20 -0
- package/dist/writers/boxed.d.ts.map +1 -0
- package/dist/writers/boxed.js +71 -0
- package/dist/writers/boxed.js.map +1 -0
- package/dist/writers/callables.d.ts +124 -0
- package/dist/writers/callables.d.ts.map +1 -0
- package/dist/writers/callables.js +283 -0
- package/dist/writers/callables.js.map +1 -0
- package/dist/writers/callback.d.ts +16 -0
- package/dist/writers/callback.d.ts.map +1 -0
- package/dist/writers/callback.js +38 -0
- package/dist/writers/callback.js.map +1 -0
- package/dist/writers/class-struct-record.d.ts +31 -0
- package/dist/writers/class-struct-record.d.ts.map +1 -0
- package/dist/writers/class-struct-record.js +67 -0
- package/dist/writers/class-struct-record.js.map +1 -0
- package/dist/writers/class-struct.d.ts +22 -0
- package/dist/writers/class-struct.d.ts.map +1 -0
- package/dist/writers/class-struct.js +85 -0
- package/dist/writers/class-struct.js.map +1 -0
- package/dist/writers/class.d.ts +16 -0
- package/dist/writers/class.d.ts.map +1 -0
- package/dist/writers/class.js +307 -0
- package/dist/writers/class.js.map +1 -0
- package/dist/writers/constant.d.ts +15 -0
- package/dist/writers/constant.d.ts.map +1 -0
- package/dist/writers/constant.js +23 -0
- package/dist/writers/constant.js.map +1 -0
- package/dist/writers/constants.d.ts +15 -0
- package/dist/writers/constants.d.ts.map +1 -0
- package/dist/writers/constants.js +23 -0
- package/dist/writers/constants.js.map +1 -0
- package/dist/writers/constructor-props.d.ts +32 -0
- package/dist/writers/constructor-props.d.ts.map +1 -0
- package/dist/writers/constructor-props.js +110 -0
- package/dist/writers/constructor-props.js.map +1 -0
- package/dist/writers/enum.d.ts +21 -0
- package/dist/writers/enum.d.ts.map +1 -0
- package/dist/writers/enum.js +48 -0
- package/dist/writers/enum.js.map +1 -0
- package/dist/writers/function.d.ts +40 -0
- package/dist/writers/function.d.ts.map +1 -0
- package/dist/writers/function.js +127 -0
- package/dist/writers/function.js.map +1 -0
- package/dist/writers/gtype-binding.d.ts +19 -0
- package/dist/writers/gtype-binding.d.ts.map +1 -0
- package/dist/writers/gtype-binding.js +40 -0
- package/dist/writers/gtype-binding.js.map +1 -0
- package/dist/writers/inheritance.d.ts +48 -0
- package/dist/writers/inheritance.d.ts.map +1 -0
- package/dist/writers/inheritance.js +90 -0
- package/dist/writers/inheritance.js.map +1 -0
- package/dist/writers/interface.d.ts +16 -0
- package/dist/writers/interface.d.ts.map +1 -0
- package/dist/writers/interface.js +155 -0
- package/dist/writers/interface.js.map +1 -0
- package/dist/writers/method.d.ts +150 -0
- package/dist/writers/method.d.ts.map +1 -0
- package/dist/writers/method.js +510 -0
- package/dist/writers/method.js.map +1 -0
- package/dist/writers/param-classify.d.ts +93 -0
- package/dist/writers/param-classify.d.ts.map +1 -0
- package/dist/writers/param-classify.js +163 -0
- package/dist/writers/param-classify.js.map +1 -0
- package/dist/writers/property-accessor.d.ts +19 -0
- package/dist/writers/property-accessor.d.ts.map +1 -0
- package/dist/writers/property-accessor.js +117 -0
- package/dist/writers/property-accessor.js.map +1 -0
- package/dist/writers/registration.d.ts +27 -0
- package/dist/writers/registration.d.ts.map +1 -0
- package/dist/writers/registration.js +30 -0
- package/dist/writers/registration.js.map +1 -0
- package/dist/writers/return-wrap.d.ts +39 -0
- package/dist/writers/return-wrap.d.ts.map +1 -0
- package/dist/writers/return-wrap.js +152 -0
- package/dist/writers/return-wrap.js.map +1 -0
- package/dist/writers/runtime-override.d.ts +18 -0
- package/dist/writers/runtime-override.d.ts.map +1 -0
- package/dist/writers/runtime-override.js +44 -0
- package/dist/writers/runtime-override.js.map +1 -0
- package/dist/writers/signal.d.ts +21 -0
- package/dist/writers/signal.d.ts.map +1 -0
- package/dist/writers/signal.js +260 -0
- package/dist/writers/signal.js.map +1 -0
- package/dist/writers/ts-type.d.ts +50 -0
- package/dist/writers/ts-type.d.ts.map +1 -0
- package/dist/writers/ts-type.js +75 -0
- package/dist/writers/ts-type.js.map +1 -0
- package/dist/writers/types-ts.d.ts +27 -0
- package/dist/writers/types-ts.d.ts.map +1 -0
- package/dist/writers/types-ts.js +97 -0
- package/dist/writers/types-ts.js.map +1 -0
- package/dist/writers/value.d.ts +89 -0
- package/dist/writers/value.d.ts.map +1 -0
- package/dist/writers/value.js +402 -0
- package/dist/writers/value.js.map +1 -0
- package/package.json +55 -0
- package/src/dsl/context.ts +146 -0
- package/src/dsl/emit.ts +42 -0
- package/src/dsl/identifier.ts +52 -0
- package/src/dsl/imports.ts +109 -0
- package/src/dsl/module.ts +75 -0
- package/src/ffi/pipeline.ts +113 -0
- package/src/fingerprint.ts +50 -0
- package/src/gi-store.ts +199 -0
- package/src/gir/boxed.ts +94 -0
- package/src/gir/callback.ts +26 -0
- package/src/gir/class.ts +79 -0
- package/src/gir/enum.ts +55 -0
- package/src/gir/field.ts +40 -0
- package/src/gir/function.ts +67 -0
- package/src/gir/namespace.ts +118 -0
- package/src/gir/parameter.ts +120 -0
- package/src/gir/parse.ts +171 -0
- package/src/gir/primitives.ts +137 -0
- package/src/gir/property.ts +39 -0
- package/src/gir/qualified-name.ts +55 -0
- package/src/gir/qualify.ts +64 -0
- package/src/gir/repository.ts +149 -0
- package/src/gir/signal.ts +36 -0
- package/src/gir/size.ts +129 -0
- package/src/gir/type-ref.ts +180 -0
- package/src/index.ts +16 -0
- package/src/jsx-store.ts +53 -0
- package/src/react/compounds-meta.ts +99 -0
- package/src/react/compounds.ts +204 -0
- package/src/react/internal.ts +91 -0
- package/src/react/jsx.ts +155 -0
- package/src/react/pipeline.ts +29 -0
- package/src/react/props.ts +307 -0
- package/src/react/slot-props.ts +57 -0
- package/src/react/widgets.ts +185 -0
- package/src/runner.ts +89 -0
- package/src/store-fs.ts +157 -0
- package/src/transpile.ts +80 -0
- package/src/typecheck-store.ts +136 -0
- package/src/writers/alias.ts +19 -0
- package/src/writers/async.ts +44 -0
- package/src/writers/boxed-constructor.ts +105 -0
- package/src/writers/boxed-field-accessor.ts +306 -0
- package/src/writers/boxed-layout.ts +166 -0
- package/src/writers/boxed.ts +77 -0
- package/src/writers/callables.ts +339 -0
- package/src/writers/callback.ts +40 -0
- package/src/writers/class-struct-record.ts +75 -0
- package/src/writers/class-struct.ts +96 -0
- package/src/writers/class.ts +384 -0
- package/src/writers/constant.ts +29 -0
- package/src/writers/constructor-props.ts +130 -0
- package/src/writers/enum.ts +53 -0
- package/src/writers/function.ts +136 -0
- package/src/writers/gtype-binding.ts +48 -0
- package/src/writers/inheritance.ts +104 -0
- package/src/writers/interface.ts +168 -0
- package/src/writers/method.ts +678 -0
- package/src/writers/param-classify.ts +178 -0
- package/src/writers/property-accessor.ts +139 -0
- package/src/writers/registration.ts +42 -0
- package/src/writers/return-wrap.ts +180 -0
- package/src/writers/runtime-override.ts +59 -0
- package/src/writers/signal.ts +318 -0
- package/src/writers/ts-type.ts +115 -0
- package/src/writers/value.ts +485 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects the start half of a `Gio.AsyncReady` callable pair.
|
|
3
|
+
*
|
|
4
|
+
* Pairs follow two GIR conventions: an explicit `*_async` / `*_finish`
|
|
5
|
+
* suffix (the older style), or a base name paired with a `<root>_finish`
|
|
6
|
+
* (the modern GTK 4 style, e.g. `gtk_file_dialog_open` /
|
|
7
|
+
* `gtk_file_dialog_open_finish`).
|
|
8
|
+
*
|
|
9
|
+
* The runtime convention is to wrap the pair with `promisify(asyncFn,
|
|
10
|
+
* finishFn, cancellable, { leading })`. This detector returns the
|
|
11
|
+
* matching finish counterpart's GIR name when one exists in the same
|
|
12
|
+
* set of callables, so the class writer can wire the wrapper.
|
|
13
|
+
*
|
|
14
|
+
* @param fn - The candidate async-start callable
|
|
15
|
+
* @param siblings - Other callables on the same type to scan for the
|
|
16
|
+
* matching `*_finish`
|
|
17
|
+
* @returns The matching `*_finish` GIR name, or `undefined` when there is
|
|
18
|
+
* no pair
|
|
19
|
+
*/
|
|
20
|
+
export const matchAsyncFinishName = (fn, siblings) => {
|
|
21
|
+
if (fn.name.endsWith("_async")) {
|
|
22
|
+
const root = fn.name.slice(0, -"_async".length);
|
|
23
|
+
const finishName = `${root}_finish`;
|
|
24
|
+
const match = siblings.find((sibling) => sibling.name === finishName);
|
|
25
|
+
return match === undefined ? undefined : finishName;
|
|
26
|
+
}
|
|
27
|
+
if (fn.name.endsWith("_finish"))
|
|
28
|
+
return undefined;
|
|
29
|
+
const finishName = `${fn.name}_finish`;
|
|
30
|
+
const match = siblings.find((sibling) => sibling.name === finishName);
|
|
31
|
+
if (match === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (!hasAsyncReadyCallbackParameter(fn))
|
|
34
|
+
return undefined;
|
|
35
|
+
return finishName;
|
|
36
|
+
};
|
|
37
|
+
const hasAsyncReadyCallbackParameter = (fn) => {
|
|
38
|
+
for (const parameter of fn.parameters) {
|
|
39
|
+
if (parameter.scope !== undefined)
|
|
40
|
+
return true;
|
|
41
|
+
if (parameter.type?.kind !== "named")
|
|
42
|
+
continue;
|
|
43
|
+
if (parameter.type.typeName === "AsyncReadyCallback")
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/writers/async.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAe,EAAE,QAAgC,EAAsB,EAAE;IAC1G,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,IAAI,SAAS,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACtE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACxD,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,CAAC,EAAe,EAAW,EAAE;IAChE,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO;YAAE,SAAS;QAC/C,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,oBAAoB;YAAE,OAAO,IAAI,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirBoxed } from "../gir/boxed.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders the `export interface <Boxed>ConstructorProps` declaration: the
|
|
5
|
+
* camelCase, optional, nullable form of every writable field. Opaque boxed
|
|
6
|
+
* records (disguised, no GType) have no known fields and get an empty bag.
|
|
7
|
+
*
|
|
8
|
+
* @param context - The module context
|
|
9
|
+
* @param boxed - The boxed record
|
|
10
|
+
* @param className - The local PascalCase class name
|
|
11
|
+
*/
|
|
12
|
+
export declare const renderBoxedConstructorPropsInterface: (context: ModuleContext, boxed: GirBoxed, className: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Renders a boxed record's constructor.
|
|
15
|
+
*
|
|
16
|
+
* The constructor allocates zero-filled native memory of the struct's size and
|
|
17
|
+
* writes each provided field at its byte offset, threading bitfield members
|
|
18
|
+
* through a read-modify-write into their shared storage word. Opaque records
|
|
19
|
+
* have no known layout, so their constructor throws.
|
|
20
|
+
*
|
|
21
|
+
* @param context - The module context
|
|
22
|
+
* @param boxed - The boxed record
|
|
23
|
+
* @param className - The local PascalCase class name
|
|
24
|
+
*/
|
|
25
|
+
export declare const renderBoxedConstructor: (context: ModuleContext, boxed: GirBoxed, className: string) => string;
|
|
26
|
+
//# sourceMappingURL=boxed-constructor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-constructor.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-constructor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAqBhD;;;;;;;;GAQG;AACH,eAAO,MAAM,oCAAoC,GAC7C,SAAS,aAAa,EACtB,OAAO,QAAQ,EACf,WAAW,MAAM,KAClB,MAWF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,EAAE,WAAW,MAAM,KAAG,MAenG,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { quote, toCamelCase, toIdentifier } from "@gtkx/utils";
|
|
2
|
+
import { indent } from "../dsl/emit.js";
|
|
3
|
+
import { computeBoxedFieldSlots } from "./boxed-layout.js";
|
|
4
|
+
import { renderTsType } from "./ts-type.js";
|
|
5
|
+
import { renderFfiType } from "./value.js";
|
|
6
|
+
const isWritableFieldSlot = (entry) => !entry.field.private &&
|
|
7
|
+
entry.field.writable &&
|
|
8
|
+
entry.field.callback === undefined &&
|
|
9
|
+
entry.field.type !== undefined;
|
|
10
|
+
const isOpaque = (boxed) => boxed.glibGetType === undefined && boxed.disguised;
|
|
11
|
+
/**
|
|
12
|
+
* Renders the `export interface <Boxed>ConstructorProps` declaration: the
|
|
13
|
+
* camelCase, optional, nullable form of every writable field. Opaque boxed
|
|
14
|
+
* records (disguised, no GType) have no known fields and get an empty bag.
|
|
15
|
+
*
|
|
16
|
+
* @param context - The module context
|
|
17
|
+
* @param boxed - The boxed record
|
|
18
|
+
* @param className - The local PascalCase class name
|
|
19
|
+
*/
|
|
20
|
+
export const renderBoxedConstructorPropsInterface = (context, boxed, className) => {
|
|
21
|
+
if (isOpaque(boxed))
|
|
22
|
+
return `export interface ${className}ConstructorProps {}`;
|
|
23
|
+
const { slots } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
|
|
24
|
+
const lines = slots
|
|
25
|
+
.filter(isWritableFieldSlot)
|
|
26
|
+
.map((entry) => `${toIdentifier(toCamelCase(entry.field.name))}?: ${renderTsType(context, entry.field.type, true)};`);
|
|
27
|
+
const body = lines.length === 0 ? "" : `\n${indent(lines.join("\n"), 1)}\n`;
|
|
28
|
+
return `export interface ${className}ConstructorProps {${body}}`;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Renders a boxed record's constructor.
|
|
32
|
+
*
|
|
33
|
+
* The constructor allocates zero-filled native memory of the struct's size and
|
|
34
|
+
* writes each provided field at its byte offset, threading bitfield members
|
|
35
|
+
* through a read-modify-write into their shared storage word. Opaque records
|
|
36
|
+
* have no known layout, so their constructor throws.
|
|
37
|
+
*
|
|
38
|
+
* @param context - The module context
|
|
39
|
+
* @param boxed - The boxed record
|
|
40
|
+
* @param className - The local PascalCase class name
|
|
41
|
+
*/
|
|
42
|
+
export const renderBoxedConstructor = (context, boxed, className) => {
|
|
43
|
+
if (isOpaque(boxed)) {
|
|
44
|
+
return `constructor() {\n${indent(`throw new Error(${quote(`Cannot construct ${className}: opaque boxed type with no known layout`)});`, 1)}\n}`;
|
|
45
|
+
}
|
|
46
|
+
context.addNativeImport("alloc");
|
|
47
|
+
context.addRuntimeImport("setHandle");
|
|
48
|
+
const { slots, size } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
|
|
49
|
+
const statements = [`const handle = alloc(${allocArgs(context, boxed, size).join(", ")});`];
|
|
50
|
+
for (const entry of slots) {
|
|
51
|
+
if (!isWritableFieldSlot(entry))
|
|
52
|
+
continue;
|
|
53
|
+
statements.push(renderFieldWrite(context, entry));
|
|
54
|
+
}
|
|
55
|
+
statements.push("setHandle(this, handle);");
|
|
56
|
+
const body = statements.join("\n");
|
|
57
|
+
return `constructor(props: ${className}ConstructorProps = {}) {\n${indent(body, 1)}\n}`;
|
|
58
|
+
};
|
|
59
|
+
const allocArgs = (context, boxed, size) => {
|
|
60
|
+
const glibTypeName = boxed.glibTypeName ?? boxed.cType;
|
|
61
|
+
const lib = context.namespace.sharedLibrary;
|
|
62
|
+
const args = [String(size)];
|
|
63
|
+
if (glibTypeName !== undefined || lib !== undefined) {
|
|
64
|
+
args.push(glibTypeName !== undefined ? quote(glibTypeName) : "undefined");
|
|
65
|
+
}
|
|
66
|
+
if (lib !== undefined)
|
|
67
|
+
args.push(quote(lib));
|
|
68
|
+
return args;
|
|
69
|
+
};
|
|
70
|
+
const renderFieldWrite = (context, entry) => {
|
|
71
|
+
context.addRuntimeImport("t");
|
|
72
|
+
context.addNativeImport("write");
|
|
73
|
+
const ffiType = renderFfiType(context, entry.field.type, "none");
|
|
74
|
+
const name = toIdentifier(toCamelCase(entry.field.name));
|
|
75
|
+
const offset = entry.slot.byteOffset;
|
|
76
|
+
if (entry.slot.bitWidth === undefined) {
|
|
77
|
+
return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, props.${name});`;
|
|
78
|
+
}
|
|
79
|
+
context.addNativeImport("read");
|
|
80
|
+
const mask = (1 << entry.slot.bitWidth) - 1;
|
|
81
|
+
const bitOffset = entry.slot.bitOffset ?? 0;
|
|
82
|
+
const merged = `(((read(handle, ${ffiType}, ${offset}) as number) & ~(${mask} << ${bitOffset})) | ((Number(props.${name}) & ${mask}) << ${bitOffset})) >>> 0`;
|
|
83
|
+
return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, ${merged});`;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=boxed-constructor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-constructor.js","sourceRoot":"","sources":["../../src/writers/boxed-constructor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC,OAAO,EAAuB,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQ3C,MAAM,mBAAmB,GAAG,CAAC,KAAqB,EAA8B,EAAE,CAC9E,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO;IACpB,KAAK,CAAC,KAAK,CAAC,QAAQ;IACpB,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS;IAClC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AAEnC,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAW,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;AAElG;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAChD,OAAsB,EACtB,KAAe,EACf,SAAiB,EACX,EAAE;IACR,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,oBAAoB,SAAS,qBAAqB,CAAC;IAC/E,MAAM,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,KAAK;SACd,MAAM,CAAC,mBAAmB,CAAC;SAC3B,GAAG,CACA,CAAC,KAAK,EAAE,EAAE,CACN,GAAG,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAC3G,CAAC;IACN,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;IAC5E,OAAO,oBAAoB,SAAS,qBAAqB,IAAI,GAAG,CAAC;AACrE,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAE,SAAiB,EAAU,EAAE;IACzG,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,oBAAoB,MAAM,CAAC,mBAAmB,KAAK,CAAC,oBAAoB,SAAS,0CAA0C,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;IACrJ,CAAC;IACD,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,CAAC,wBAAwB,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,SAAS;QAC1C,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,sBAAsB,SAAS,6BAA6B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AAC5F,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAE,IAAY,EAAqB,EAAE;IAC3F,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,IAAI,YAAY,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,GAAG,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAE,KAAwB,EAAU,EAAE;IAClF,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,aAAa,IAAI,iCAAiC,OAAO,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC;IACnG,CAAC;IACD,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,mBAAmB,OAAO,KAAK,MAAM,oBAAoB,IAAI,OAAO,SAAS,uBAAuB,IAAI,OAAO,IAAI,QAAQ,SAAS,UAAU,CAAC;IAC9J,OAAO,aAAa,IAAI,iCAAiC,OAAO,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC;AAC/F,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirField } from "../gir/field.js";
|
|
3
|
+
import { type BoxedFieldSlot } from "./boxed-layout.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders the `get` / `set` accessor pair for a single boxed field.
|
|
6
|
+
*
|
|
7
|
+
* The accessor reads through the runtime's `read(handle, ffiType, offset)`
|
|
8
|
+
* (or `write` for the setter), with bitfield members threading through a
|
|
9
|
+
* read-modify-write sequence into their shared storage word. Fields whose
|
|
10
|
+
* type cannot be marshaled at present (callbacks, varargs, inline arrays
|
|
11
|
+
* of complex types) are skipped silently.
|
|
12
|
+
*
|
|
13
|
+
* @param context - The module context
|
|
14
|
+
* @param slot - The field plus its layout slot
|
|
15
|
+
* @param claimedNames - Names already used by emitted methods
|
|
16
|
+
*/
|
|
17
|
+
export declare const renderBoxedFieldAccessor: (context: ModuleContext, slot: BoxedFieldSlot, claimedNames: ReadonlySet<string>, siblingFields: readonly GirField[]) => string | undefined;
|
|
18
|
+
//# sourceMappingURL=boxed-field-accessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-field-accessor.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-field-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAMhF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACjC,SAAS,aAAa,EACtB,MAAM,cAAc,EACpB,cAAc,WAAW,CAAC,MAAM,CAAC,EACjC,eAAe,SAAS,QAAQ,EAAE,KACnC,MAAM,GAAG,SAmCX,CAAC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { toCamelCase, toIdentifier } from "@gtkx/utils";
|
|
2
|
+
import { indent } from "../dsl/emit.js";
|
|
3
|
+
import { computeBoxedFieldSlots } from "./boxed-layout.js";
|
|
4
|
+
import { typeRefIsClassStruct } from "./class-struct-record.js";
|
|
5
|
+
import { wrapReturnValue } from "./return-wrap.js";
|
|
6
|
+
import { renderTsType } from "./ts-type.js";
|
|
7
|
+
import { renderFfiType } from "./value.js";
|
|
8
|
+
/**
|
|
9
|
+
* Renders the `get` / `set` accessor pair for a single boxed field.
|
|
10
|
+
*
|
|
11
|
+
* The accessor reads through the runtime's `read(handle, ffiType, offset)`
|
|
12
|
+
* (or `write` for the setter), with bitfield members threading through a
|
|
13
|
+
* read-modify-write sequence into their shared storage word. Fields whose
|
|
14
|
+
* type cannot be marshaled at present (callbacks, varargs, inline arrays
|
|
15
|
+
* of complex types) are skipped silently.
|
|
16
|
+
*
|
|
17
|
+
* @param context - The module context
|
|
18
|
+
* @param slot - The field plus its layout slot
|
|
19
|
+
* @param claimedNames - Names already used by emitted methods
|
|
20
|
+
*/
|
|
21
|
+
export const renderBoxedFieldAccessor = (context, slot, claimedNames, siblingFields) => {
|
|
22
|
+
const { field } = slot;
|
|
23
|
+
if (field.private)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (!field.readable && !field.writable)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (field.callback !== undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (field.type === undefined)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (typeRefIsClassStruct(context, field.type))
|
|
32
|
+
return undefined;
|
|
33
|
+
const jsName = toIdentifier(toCamelCase(field.name));
|
|
34
|
+
if (claimedNames.has(jsName))
|
|
35
|
+
return undefined;
|
|
36
|
+
if (jsName === "constructor")
|
|
37
|
+
return undefined;
|
|
38
|
+
const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
|
|
39
|
+
if (structArray !== undefined)
|
|
40
|
+
return structArray;
|
|
41
|
+
if (!isAccessorEligibleType(field.type)) {
|
|
42
|
+
const tsType = renderTsType(context, field.type, false);
|
|
43
|
+
const modifier = field.writable ? "declare" : "declare readonly";
|
|
44
|
+
return `${modifier} ${jsName}: ${tsType};`;
|
|
45
|
+
}
|
|
46
|
+
const ffiType = renderFfiType(context, field.type, "none");
|
|
47
|
+
const tsType = renderTsType(context, field.type, false);
|
|
48
|
+
const accessorOptions = {
|
|
49
|
+
context,
|
|
50
|
+
jsName,
|
|
51
|
+
tsType,
|
|
52
|
+
ffiType,
|
|
53
|
+
slot: slot.slot,
|
|
54
|
+
fieldType: field.type,
|
|
55
|
+
};
|
|
56
|
+
const blocks = [getterBlock(accessorOptions)];
|
|
57
|
+
if (field.writable) {
|
|
58
|
+
blocks.push(setterBlock(accessorOptions));
|
|
59
|
+
}
|
|
60
|
+
return blocks.join("\n\n");
|
|
61
|
+
};
|
|
62
|
+
const isAccessorEligibleType = (ref) => {
|
|
63
|
+
switch (ref.kind) {
|
|
64
|
+
case "primitive":
|
|
65
|
+
return ref.category !== "void" && ref.category !== "unichar";
|
|
66
|
+
case "named":
|
|
67
|
+
return true;
|
|
68
|
+
case "array":
|
|
69
|
+
return ref.fixedSize !== undefined;
|
|
70
|
+
case "list":
|
|
71
|
+
case "hashtable":
|
|
72
|
+
return false;
|
|
73
|
+
case "callback":
|
|
74
|
+
case "varargs":
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
const resolveInlineStructFields = (context, ref) => {
|
|
79
|
+
if (ref === undefined || ref.kind !== "named")
|
|
80
|
+
return undefined;
|
|
81
|
+
if (ref.cType?.endsWith("*") === true)
|
|
82
|
+
return undefined;
|
|
83
|
+
const resolved = context.repository.resolveNamed(ref.namespaceName ?? context.namespace.name, ref.typeName);
|
|
84
|
+
if (resolved === undefined || resolved.kind !== "boxed")
|
|
85
|
+
return undefined;
|
|
86
|
+
if (resolved.value.cType?.endsWith("*") === true)
|
|
87
|
+
return undefined;
|
|
88
|
+
if (resolved.value.fields.length === 0)
|
|
89
|
+
return undefined;
|
|
90
|
+
return resolved.value.fields;
|
|
91
|
+
};
|
|
92
|
+
const arrayLengthExpression = (arrayRef, siblingFields) => {
|
|
93
|
+
if (arrayRef.fixedSize !== undefined)
|
|
94
|
+
return String(arrayRef.fixedSize);
|
|
95
|
+
if (arrayRef.lengthParameterIndex === undefined)
|
|
96
|
+
return undefined;
|
|
97
|
+
const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];
|
|
98
|
+
if (lengthField === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
return `this.${toIdentifier(toCamelCase(lengthField.name))}`;
|
|
101
|
+
};
|
|
102
|
+
const renderElementReadObject = (context, fields, baseOffset) => {
|
|
103
|
+
const { slots } = computeBoxedFieldSlots(context, fields);
|
|
104
|
+
const entries = [];
|
|
105
|
+
for (const { field, slot } of slots) {
|
|
106
|
+
if (field.private || field.type === undefined || field.callback !== undefined)
|
|
107
|
+
continue;
|
|
108
|
+
const jsName = toIdentifier(toCamelCase(field.name));
|
|
109
|
+
const offset = baseOffset + slot.byteOffset;
|
|
110
|
+
const nested = resolveInlineStructFields(context, field.type);
|
|
111
|
+
if (nested !== undefined) {
|
|
112
|
+
entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!isAccessorEligibleType(field.type))
|
|
116
|
+
continue;
|
|
117
|
+
const ffi = renderFfiType(context, field.type, "none");
|
|
118
|
+
if (slot.bitWidth === undefined) {
|
|
119
|
+
entries.push(`${jsName}: read(__array, ${ffi}, __base + ${offset}) as ${renderTsType(context, field.type, false)}`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const shift = slot.bitOffset ?? 0;
|
|
123
|
+
entries.push(`${jsName}: (((read(__array, ${ffi}, __base + ${offset}) as number) >>> ${shift}) & ${bitMask(slot.bitWidth)})`);
|
|
124
|
+
}
|
|
125
|
+
return `{ ${entries.join(", ")} }`;
|
|
126
|
+
};
|
|
127
|
+
const appendElementWriteStatements = (context, options) => {
|
|
128
|
+
const { fields, baseOffset, valuePath, out } = options;
|
|
129
|
+
const { slots } = computeBoxedFieldSlots(context, fields);
|
|
130
|
+
for (const { field, slot } of slots) {
|
|
131
|
+
if (field.private || field.type === undefined || field.callback !== undefined)
|
|
132
|
+
continue;
|
|
133
|
+
const valueExpr = `${valuePath}.${toIdentifier(toCamelCase(field.name))}`;
|
|
134
|
+
const offset = baseOffset + slot.byteOffset;
|
|
135
|
+
const nested = resolveInlineStructFields(context, field.type);
|
|
136
|
+
if (nested !== undefined) {
|
|
137
|
+
appendElementWriteStatements(context, { fields: nested, baseOffset: offset, valuePath: valueExpr, out });
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!isAccessorEligibleType(field.type))
|
|
141
|
+
continue;
|
|
142
|
+
const ffi = renderFfiType(context, field.type, "none");
|
|
143
|
+
if (slot.bitWidth === undefined) {
|
|
144
|
+
out.push(`write(__array, ${ffi}, __base + ${offset}, ${valueExpr});`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const mask = bitMask(slot.bitWidth);
|
|
148
|
+
const shift = slot.bitOffset ?? 0;
|
|
149
|
+
out.push(`write(__array, ${ffi}, __base + ${offset}, ((read(__array, ${ffi}, __base + ${offset}) & ~(${mask} << ${shift})) | ((Number(${valueExpr}) & ${mask}) << ${shift})) >>> 0);`);
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
const structArrayGetterBlock = (options) => {
|
|
153
|
+
const { context, jsName, tsType, bufferType, offset, lengthExpr, elementSize, elementFields } = options;
|
|
154
|
+
const element = renderElementReadObject(context, elementFields, 0);
|
|
155
|
+
const loop = [`const __base = __index * ${elementSize};`, `__result.push(${element});`].join("\n");
|
|
156
|
+
const body = [
|
|
157
|
+
`const __array = read(getHandle(this), ${bufferType}, ${offset});`,
|
|
158
|
+
`const __result: ${tsType} = [];`,
|
|
159
|
+
`for (let __index = 0; __index < ${lengthExpr}; __index++) {`,
|
|
160
|
+
indent(loop, 1),
|
|
161
|
+
"}",
|
|
162
|
+
"return __result;",
|
|
163
|
+
].join("\n");
|
|
164
|
+
return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
|
|
165
|
+
};
|
|
166
|
+
const structArraySetterBlock = (options) => {
|
|
167
|
+
const { context, jsName, tsType, bufferType, offset, elementSize, elementFields } = options;
|
|
168
|
+
const writes = [];
|
|
169
|
+
appendElementWriteStatements(context, {
|
|
170
|
+
fields: elementFields,
|
|
171
|
+
baseOffset: 0,
|
|
172
|
+
valuePath: "__element",
|
|
173
|
+
out: writes,
|
|
174
|
+
});
|
|
175
|
+
const loop = [`const __element = __value[__index];`, `const __base = __index * ${elementSize};`, ...writes].join("\n");
|
|
176
|
+
const body = [
|
|
177
|
+
`const __array = read(getHandle(this), ${bufferType}, ${offset});`,
|
|
178
|
+
`for (let __index = 0; __index < __value.length; __index++) {`,
|
|
179
|
+
indent(loop, 1),
|
|
180
|
+
"}",
|
|
181
|
+
`write(getHandle(this), ${bufferType}, ${offset}, __array);`,
|
|
182
|
+
].join("\n");
|
|
183
|
+
return `set ${jsName}(__value: ${tsType}) {\n${indent(body, 1)}\n}`;
|
|
184
|
+
};
|
|
185
|
+
const renderStructArrayAccessor = (context, target) => {
|
|
186
|
+
const { field, jsName, slot, siblingFields } = target;
|
|
187
|
+
const arrayRef = field.type;
|
|
188
|
+
if (arrayRef === undefined || arrayRef.kind !== "array" || slot.bitWidth !== undefined)
|
|
189
|
+
return undefined;
|
|
190
|
+
const elementFields = resolveInlineStructFields(context, arrayRef.element);
|
|
191
|
+
if (elementFields === undefined)
|
|
192
|
+
return undefined;
|
|
193
|
+
const lengthExpr = arrayLengthExpression(arrayRef, siblingFields);
|
|
194
|
+
if (lengthExpr === undefined)
|
|
195
|
+
return undefined;
|
|
196
|
+
const elementSize = computeBoxedFieldSlots(context, elementFields).size;
|
|
197
|
+
if (elementSize === 0)
|
|
198
|
+
return undefined;
|
|
199
|
+
context.addNativeImport("read");
|
|
200
|
+
context.addRuntimeImport("getHandle");
|
|
201
|
+
context.addRuntimeImport("t");
|
|
202
|
+
const options = {
|
|
203
|
+
context,
|
|
204
|
+
jsName,
|
|
205
|
+
tsType: renderTsType(context, arrayRef, false),
|
|
206
|
+
bufferType: `t.struct("borrowed", ${lengthExpr} * ${elementSize})`,
|
|
207
|
+
offset: slot.byteOffset,
|
|
208
|
+
lengthExpr,
|
|
209
|
+
elementSize,
|
|
210
|
+
elementFields,
|
|
211
|
+
};
|
|
212
|
+
const blocks = [];
|
|
213
|
+
if (field.readable)
|
|
214
|
+
blocks.push(structArrayGetterBlock(options));
|
|
215
|
+
if (field.writable) {
|
|
216
|
+
context.addNativeImport("write");
|
|
217
|
+
blocks.push(structArraySetterBlock(options));
|
|
218
|
+
}
|
|
219
|
+
return blocks.length === 0 ? undefined : blocks.join("\n\n");
|
|
220
|
+
};
|
|
221
|
+
const getterBlock = (options) => {
|
|
222
|
+
const { context, jsName, tsType, ffiType, slot, fieldType } = options;
|
|
223
|
+
context.addNativeImport("read");
|
|
224
|
+
context.addRuntimeImport("getHandle");
|
|
225
|
+
if (slot.bitWidth === undefined) {
|
|
226
|
+
const valueExpression = `read(getHandle(this), ${ffiType}, ${slot.byteOffset})`;
|
|
227
|
+
const wrapped = wrapReturnValue(context, {
|
|
228
|
+
ref: fieldType,
|
|
229
|
+
transfer: "none",
|
|
230
|
+
nullable: false,
|
|
231
|
+
valueExpression,
|
|
232
|
+
});
|
|
233
|
+
const body = `return ${wrapped};`;
|
|
234
|
+
return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
|
|
235
|
+
}
|
|
236
|
+
const mask = bitMask(slot.bitWidth);
|
|
237
|
+
const shift = slot.bitOffset ?? 0;
|
|
238
|
+
const body = `const __unit = read(getHandle(this), ${ffiType}, ${slot.byteOffset}) as number;\nreturn (((__unit >>> ${shift}) & ${mask}) >>> 0) as ${tsType};`;
|
|
239
|
+
return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
|
|
240
|
+
};
|
|
241
|
+
const setterBlock = (options) => {
|
|
242
|
+
const { context, jsName, tsType, ffiType, slot } = options;
|
|
243
|
+
context.addNativeImport("write");
|
|
244
|
+
context.addRuntimeImport("getHandle");
|
|
245
|
+
if (slot.bitWidth === undefined) {
|
|
246
|
+
const body = `write(getHandle(this), ${ffiType}, ${slot.byteOffset}, value);`;
|
|
247
|
+
return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
|
|
248
|
+
}
|
|
249
|
+
context.addNativeImport("read");
|
|
250
|
+
const mask = bitMask(slot.bitWidth);
|
|
251
|
+
const shift = slot.bitOffset ?? 0;
|
|
252
|
+
const body = `const __unit = read(getHandle(this), ${ffiType}, ${slot.byteOffset}) as number;\nconst __next = ((__unit & ~(${mask} << ${shift})) | ((Number(value) & ${mask}) << ${shift})) >>> 0;\nwrite(getHandle(this), ${ffiType}, ${slot.byteOffset}, __next);`;
|
|
253
|
+
return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
|
|
254
|
+
};
|
|
255
|
+
const bitMask = (width) => {
|
|
256
|
+
if (width >= 32)
|
|
257
|
+
return 0xffffffff;
|
|
258
|
+
return (1 << width) - 1;
|
|
259
|
+
};
|
|
260
|
+
//# sourceMappingURL=boxed-field-accessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-field-accessor.js","sourceRoot":"","sources":["../../src/writers/boxed-field-accessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirField } from "../gir/field.js";
|
|
3
|
+
import { type FieldSlot } from "../gir/size.js";
|
|
4
|
+
/**
|
|
5
|
+
* Computed slot for a single boxed field, ready for accessor emission.
|
|
6
|
+
*/
|
|
7
|
+
export type BoxedFieldSlot = {
|
|
8
|
+
readonly field: GirField;
|
|
9
|
+
readonly slot: FieldSlot;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Computes per-field storage slots for a boxed record.
|
|
13
|
+
*
|
|
14
|
+
* Walks every field (private fields included so their storage occupies
|
|
15
|
+
* space) and resolves each to a primitive-size {@link FieldLayoutInput}.
|
|
16
|
+
* Private fields are returned with their slots so callers can filter on
|
|
17
|
+
* `field.private` while still seeing the layout-correct offsets of public
|
|
18
|
+
* fields after them.
|
|
19
|
+
*
|
|
20
|
+
* @param context - The module context
|
|
21
|
+
* @param fields - The boxed's field list in declaration order
|
|
22
|
+
*/
|
|
23
|
+
export declare const computeBoxedFieldSlots: (context: ModuleContext, fields: readonly GirField[], isUnion?: boolean) => {
|
|
24
|
+
readonly slots: readonly BoxedFieldSlot[];
|
|
25
|
+
readonly size: number;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=boxed-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-layout.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAIH,KAAK,SAAS,EAEjB,MAAM,gBAAgB,CAAC;AAKxB;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,EACtB,QAAQ,SAAS,QAAQ,EAAE,EAC3B,iBAAe,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAcpE,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { primitiveCategory } from "../gir/primitives.js";
|
|
2
|
+
import { computeFieldSlots, layoutOfPrimitive, } from "../gir/size.js";
|
|
3
|
+
const POINTER_LAYOUT = { size: 8, align: 8 };
|
|
4
|
+
/**
|
|
5
|
+
* Computes per-field storage slots for a boxed record.
|
|
6
|
+
*
|
|
7
|
+
* Walks every field (private fields included so their storage occupies
|
|
8
|
+
* space) and resolves each to a primitive-size {@link FieldLayoutInput}.
|
|
9
|
+
* Private fields are returned with their slots so callers can filter on
|
|
10
|
+
* `field.private` while still seeing the layout-correct offsets of public
|
|
11
|
+
* fields after them.
|
|
12
|
+
*
|
|
13
|
+
* @param context - The module context
|
|
14
|
+
* @param fields - The boxed's field list in declaration order
|
|
15
|
+
*/
|
|
16
|
+
export const computeBoxedFieldSlots = (context, fields, isUnion = false) => {
|
|
17
|
+
const inputs = [];
|
|
18
|
+
for (const field of fields) {
|
|
19
|
+
inputs.push(fieldLayoutInput(context, field, new Set()));
|
|
20
|
+
}
|
|
21
|
+
const result = computeFieldSlots(inputs, isUnion);
|
|
22
|
+
const slots = result.slots.map((slot, index) => {
|
|
23
|
+
const field = fields[index];
|
|
24
|
+
if (field === undefined) {
|
|
25
|
+
throw new Error("computeBoxedFieldSlots: parallel arrays diverged");
|
|
26
|
+
}
|
|
27
|
+
return { field, slot };
|
|
28
|
+
});
|
|
29
|
+
return { slots, size: result.size };
|
|
30
|
+
};
|
|
31
|
+
const fieldLayoutInput = (context, field, visited) => {
|
|
32
|
+
if (field.callback !== undefined) {
|
|
33
|
+
return { layout: POINTER_LAYOUT, bits: undefined };
|
|
34
|
+
}
|
|
35
|
+
if (field.type === undefined) {
|
|
36
|
+
return { layout: POINTER_LAYOUT, bits: undefined };
|
|
37
|
+
}
|
|
38
|
+
return { layout: layoutOfType(context, field.type, visited), bits: field.bits };
|
|
39
|
+
};
|
|
40
|
+
const layoutOfType = (context, ref, visited) => {
|
|
41
|
+
switch (ref.kind) {
|
|
42
|
+
case "primitive":
|
|
43
|
+
return layoutOfPrimitive(ref.category);
|
|
44
|
+
case "named":
|
|
45
|
+
return layoutOfNamed(context, ref, visited);
|
|
46
|
+
case "array":
|
|
47
|
+
return arrayLayout(context, ref, visited);
|
|
48
|
+
case "list":
|
|
49
|
+
case "hashtable":
|
|
50
|
+
case "callback":
|
|
51
|
+
case "varargs":
|
|
52
|
+
return POINTER_LAYOUT;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const arrayLayout = (context, ref, visited) => {
|
|
56
|
+
if (ref.fixedSize === undefined)
|
|
57
|
+
return POINTER_LAYOUT;
|
|
58
|
+
const elementLayout = layoutOfType(context, ref.element, visited);
|
|
59
|
+
return { size: elementLayout.size * ref.fixedSize, align: elementLayout.align };
|
|
60
|
+
};
|
|
61
|
+
const layoutOfNamed = (context, ref, visited) => {
|
|
62
|
+
if (ref.cType?.endsWith("*") === true)
|
|
63
|
+
return POINTER_LAYOUT;
|
|
64
|
+
const namespaceName = ref.namespaceName ?? context.namespace.name;
|
|
65
|
+
const resolved = context.repository.resolveNamed(namespaceName, ref.typeName);
|
|
66
|
+
if (resolved === undefined)
|
|
67
|
+
return POINTER_LAYOUT;
|
|
68
|
+
return layoutOfResolved(context, resolved, visited);
|
|
69
|
+
};
|
|
70
|
+
const layoutOfResolved = (context, resolved, visited) => {
|
|
71
|
+
switch (resolved.kind) {
|
|
72
|
+
case "class":
|
|
73
|
+
case "interface":
|
|
74
|
+
return POINTER_LAYOUT;
|
|
75
|
+
case "boxed":
|
|
76
|
+
return layoutOfBoxedRecord(context, resolved, visited);
|
|
77
|
+
case "enum":
|
|
78
|
+
return layoutOfPrimitive("int32");
|
|
79
|
+
case "callback":
|
|
80
|
+
return POINTER_LAYOUT;
|
|
81
|
+
case "alias":
|
|
82
|
+
return resolveAliasLayout(context, resolved, visited);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const layoutOfBoxedRecord = (context, resolved, visited) => {
|
|
86
|
+
if (resolved.value.cType?.endsWith("*") === true)
|
|
87
|
+
return POINTER_LAYOUT;
|
|
88
|
+
const key = `${resolved.namespace.name}.${resolved.value.name}`;
|
|
89
|
+
if (visited.has(key))
|
|
90
|
+
return POINTER_LAYOUT;
|
|
91
|
+
const cached = recordLayoutCache.get(key);
|
|
92
|
+
if (cached !== undefined)
|
|
93
|
+
return cached;
|
|
94
|
+
const nextVisited = new Set(visited);
|
|
95
|
+
nextVisited.add(key);
|
|
96
|
+
const inputs = [];
|
|
97
|
+
for (const field of resolved.value.fields) {
|
|
98
|
+
if (field.callback !== undefined) {
|
|
99
|
+
inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (field.type === undefined) {
|
|
103
|
+
inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
inputs.push({ layout: layoutOfType(context, field.type, nextVisited), bits: field.bits });
|
|
107
|
+
}
|
|
108
|
+
if (inputs.length === 0)
|
|
109
|
+
return POINTER_LAYOUT;
|
|
110
|
+
const { size } = computeFieldSlots(inputs, resolved.value.isUnion);
|
|
111
|
+
const align = Math.max(1, ...inputs.map((input) => input.layout.align));
|
|
112
|
+
const layout = { size, align };
|
|
113
|
+
recordLayoutCache.set(key, layout);
|
|
114
|
+
return layout;
|
|
115
|
+
};
|
|
116
|
+
const recordLayoutCache = new Map();
|
|
117
|
+
const resolveAliasLayout = (context, resolved, visited) => {
|
|
118
|
+
const ref = resolved.targetRef;
|
|
119
|
+
if (ref === undefined)
|
|
120
|
+
return POINTER_LAYOUT;
|
|
121
|
+
if (ref.kind === "named") {
|
|
122
|
+
const primitive = primitiveCategory(ref.typeName);
|
|
123
|
+
if (primitive !== undefined)
|
|
124
|
+
return layoutOfPrimitive(primitive);
|
|
125
|
+
}
|
|
126
|
+
return layoutOfType(context, ref, visited);
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=boxed-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxed-layout.js","sourceRoot":"","sources":["../../src/writers/boxed-layout.ts"],"names":[],"mappings":"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"}
|