@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,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GObject's class- and interface-struct roots. Every concrete class struct
|
|
3
|
+
* (`GEnumClass`, `GFlagsClass`, …) embeds one of these as its first field; the
|
|
4
|
+
* roots themselves open with a bare `GType` and are matched by name.
|
|
5
|
+
*/
|
|
6
|
+
const GTYPE_STRUCT_ROOTS = new Set(["GObject.TypeClass", "GObject.TypeInterface"]);
|
|
7
|
+
/**
|
|
8
|
+
* Class/interface-struct records that carry no embedded `GTypeClass`/
|
|
9
|
+
* `GTypeInterface` marker and therefore have to be named outright.
|
|
10
|
+
*/
|
|
11
|
+
const EXPLICIT_CLASS_STRUCTS = new Set(["Pango.AttrClass"]);
|
|
12
|
+
const qualify = (namespaceName, name) => `${namespaceName}.${name}`;
|
|
13
|
+
/**
|
|
14
|
+
* Reports whether a `<record>` is a GObject class- or interface-struct — the
|
|
15
|
+
* runtime vtable of a type rather than a marshallable value. These are never
|
|
16
|
+
* constructed or passed by value from JavaScript, so codegen emits neither the
|
|
17
|
+
* record nor any binding that references it.
|
|
18
|
+
*
|
|
19
|
+
* @param namespaceName - The namespace the record lives in
|
|
20
|
+
* @param boxed - The record under consideration
|
|
21
|
+
*/
|
|
22
|
+
export const isClassStructRecord = (namespaceName, boxed) => {
|
|
23
|
+
const qualified = qualify(namespaceName, boxed.name);
|
|
24
|
+
if (GTYPE_STRUCT_ROOTS.has(qualified) || EXPLICIT_CLASS_STRUCTS.has(qualified))
|
|
25
|
+
return true;
|
|
26
|
+
const first = boxed.fields[0];
|
|
27
|
+
if (first === undefined || first.type === undefined || first.type.kind !== "named")
|
|
28
|
+
return false;
|
|
29
|
+
const fieldNamespace = first.type.namespaceName ?? namespaceName;
|
|
30
|
+
return GTYPE_STRUCT_ROOTS.has(qualify(fieldNamespace, first.type.typeName));
|
|
31
|
+
};
|
|
32
|
+
const refIsClassStruct = (context, ref) => {
|
|
33
|
+
if (ref === undefined)
|
|
34
|
+
return false;
|
|
35
|
+
switch (ref.kind) {
|
|
36
|
+
case "named": {
|
|
37
|
+
const namespaceName = ref.namespaceName ?? context.namespace.name;
|
|
38
|
+
const resolved = context.repository.resolveNamed(namespaceName, ref.typeName);
|
|
39
|
+
if (resolved === undefined || resolved.kind !== "boxed")
|
|
40
|
+
return false;
|
|
41
|
+
return isClassStructRecord(resolved.namespace.name, resolved.value);
|
|
42
|
+
}
|
|
43
|
+
case "array":
|
|
44
|
+
case "list":
|
|
45
|
+
return refIsClassStruct(context, ref.element);
|
|
46
|
+
default:
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Reports whether a type reference resolves to a class/interface-struct record,
|
|
52
|
+
* following array and list element types.
|
|
53
|
+
*
|
|
54
|
+
* @param context - The module context
|
|
55
|
+
* @param ref - The type reference, or `undefined`
|
|
56
|
+
*/
|
|
57
|
+
export const typeRefIsClassStruct = (context, ref) => refIsClassStruct(context, ref);
|
|
58
|
+
/**
|
|
59
|
+
* Reports whether a callable's return type or any parameter resolves to a
|
|
60
|
+
* class/interface-struct record, so its binding and wrapper can be dropped.
|
|
61
|
+
*
|
|
62
|
+
* @param context - The module context
|
|
63
|
+
* @param fn - The callable
|
|
64
|
+
*/
|
|
65
|
+
export const callableReferencesClassStruct = (context, fn) => refIsClassStruct(context, fn.returnValue.type) ||
|
|
66
|
+
fn.parameters.some((parameter) => refIsClassStruct(context, parameter.type));
|
|
67
|
+
//# sourceMappingURL=class-struct-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-struct-record.js","sourceRoot":"","sources":["../../src/writers/class-struct-record.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,uBAAuB,CAAC,CAAC,CAAC;AAEnF;;;GAGG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAE5D,MAAM,OAAO,GAAG,CAAC,aAAqB,EAAE,IAAY,EAAU,EAAE,CAAC,GAAG,aAAa,IAAI,IAAI,EAAE,CAAC;AAE5F;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,aAAqB,EAAE,KAAe,EAAW,EAAE;IACnF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACjG,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC;IACjE,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAE,GAA2B,EAAW,EAAE;IACtF,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9E,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,KAAK,CAAC;YACtE,OAAO,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;QACD,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACP,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD;YACI,OAAO,KAAK,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAE,GAA2B,EAAW,EAAE,CACjG,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,OAAsB,EAAE,EAAe,EAAW,EAAE,CAC9F,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;IAC9C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirClass } from "../gir/class.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders the `{ … }` vtable descriptor literal for a class or interface
|
|
5
|
+
* descriptor's `vfuncs` field, or `undefined` when the type exposes no
|
|
6
|
+
* marshallable slots.
|
|
7
|
+
*
|
|
8
|
+
* Each entry describes one overridable vtable slot — keyed by the slot's
|
|
9
|
+
* camelCase name and carrying `{ kind, className, vfuncName, byteOffset,
|
|
10
|
+
* argTypes, returnType }` — so the runtime `registerClass` can auto-discover
|
|
11
|
+
* a subclass method, locate the matching slot by byte offset, and register a
|
|
12
|
+
* trampoline with the correct marshalling. Slots whose signature cannot be
|
|
13
|
+
* marshalled (non-introspectable, variadic, out-parameters without
|
|
14
|
+
* caller-allocates, or nested callbacks) are omitted. The `kind` discriminator
|
|
15
|
+
* lets the runtime register an interface vfunc mapping in addition to the class
|
|
16
|
+
* one when the descriptor's role is `"interface"`.
|
|
17
|
+
*
|
|
18
|
+
* @param context - The module context
|
|
19
|
+
* @param klass - The class or interface
|
|
20
|
+
*/
|
|
21
|
+
export declare const renderVfuncMetadata: (context: ModuleContext, klass: GirClass) => string | undefined;
|
|
22
|
+
//# sourceMappingURL=class-struct.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-struct.d.ts","sourceRoot":"","sources":["../../src/writers/class-struct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQhD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,MAAM,GAAG,SAOtF,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { quote, toCamelCase, toIdentifier, toPascalCase } from "@gtkx/utils";
|
|
2
|
+
import { indent } from "../dsl/emit.js";
|
|
3
|
+
import { callbackFromNode } from "../gir/callback.js";
|
|
4
|
+
import { computeBoxedFieldSlots } from "./boxed-layout.js";
|
|
5
|
+
import { renderFfiType } from "./value.js";
|
|
6
|
+
/**
|
|
7
|
+
* Renders the `{ … }` vtable descriptor literal for a class or interface
|
|
8
|
+
* descriptor's `vfuncs` field, or `undefined` when the type exposes no
|
|
9
|
+
* marshallable slots.
|
|
10
|
+
*
|
|
11
|
+
* Each entry describes one overridable vtable slot — keyed by the slot's
|
|
12
|
+
* camelCase name and carrying `{ kind, className, vfuncName, byteOffset,
|
|
13
|
+
* argTypes, returnType }` — so the runtime `registerClass` can auto-discover
|
|
14
|
+
* a subclass method, locate the matching slot by byte offset, and register a
|
|
15
|
+
* trampoline with the correct marshalling. Slots whose signature cannot be
|
|
16
|
+
* marshalled (non-introspectable, variadic, out-parameters without
|
|
17
|
+
* caller-allocates, or nested callbacks) are omitted. The `kind` discriminator
|
|
18
|
+
* lets the runtime register an interface vfunc mapping in addition to the class
|
|
19
|
+
* one when the descriptor's role is `"interface"`.
|
|
20
|
+
*
|
|
21
|
+
* @param context - The module context
|
|
22
|
+
* @param klass - The class or interface
|
|
23
|
+
*/
|
|
24
|
+
export const renderVfuncMetadata = (context, klass) => {
|
|
25
|
+
if (klass.glibTypeStruct === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const structName = toPascalCase(klass.glibTypeStruct);
|
|
28
|
+
const kind = klass.isInterface ? "interface" : "class";
|
|
29
|
+
const entries = vtableEntries(context, structName, kind, klass.glibTypeStruct);
|
|
30
|
+
if (entries.length === 0)
|
|
31
|
+
return undefined;
|
|
32
|
+
return `{\n${entries.map((entry) => indent(entry, 1)).join("\n")}\n}`;
|
|
33
|
+
};
|
|
34
|
+
const vtableEntries = (context, structName, kind, typeStruct) => {
|
|
35
|
+
const resolved = context.repository.resolveNamed(context.namespace.name, typeStruct);
|
|
36
|
+
if (resolved === undefined || resolved.kind !== "boxed")
|
|
37
|
+
return [];
|
|
38
|
+
const { slots } = computeBoxedFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
|
|
39
|
+
const entries = [];
|
|
40
|
+
const claimedNames = new Set();
|
|
41
|
+
for (const { field, slot } of slots) {
|
|
42
|
+
if (field.callback === undefined)
|
|
43
|
+
continue;
|
|
44
|
+
const key = toIdentifier(toCamelCase(field.name));
|
|
45
|
+
if (key === "constructor" || claimedNames.has(key))
|
|
46
|
+
continue;
|
|
47
|
+
const callback = callbackFromNode(field.callback);
|
|
48
|
+
if (!isVtableSlotEligible(callback))
|
|
49
|
+
continue;
|
|
50
|
+
claimedNames.add(key);
|
|
51
|
+
entries.push(renderDescriptor(context, { key, structName, kind, field, callback, byteOffset: slot.byteOffset }));
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
};
|
|
55
|
+
const isVtableSlotEligible = (callback) => {
|
|
56
|
+
if (!callback.introspectable)
|
|
57
|
+
return false;
|
|
58
|
+
for (const param of callback.parameters) {
|
|
59
|
+
if (param.isVarargs)
|
|
60
|
+
return false;
|
|
61
|
+
if ((param.direction === "out" || param.direction === "inout") && !param.callerAllocates)
|
|
62
|
+
return false;
|
|
63
|
+
if (isCallbackRef(param.type))
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return !isCallbackRef(callback.returnValue.type);
|
|
67
|
+
};
|
|
68
|
+
const isCallbackRef = (ref) => ref?.kind === "callback";
|
|
69
|
+
const renderDescriptor = (context, options) => {
|
|
70
|
+
const { key, structName, kind, field, callback, byteOffset } = options;
|
|
71
|
+
const argTypes = callback.parameters
|
|
72
|
+
.map((param) => renderFfiType(context, param.type, param.transferOwnership))
|
|
73
|
+
.join(", ");
|
|
74
|
+
const returnType = renderFfiType(context, callback.returnValue.type, callback.returnValue.transferOwnership);
|
|
75
|
+
const lines = [
|
|
76
|
+
`kind: ${quote(kind)},`,
|
|
77
|
+
`className: ${quote(structName)},`,
|
|
78
|
+
`vfuncName: ${quote(field.name)},`,
|
|
79
|
+
`byteOffset: ${byteOffset},`,
|
|
80
|
+
`argTypes: [${argTypes}],`,
|
|
81
|
+
`returnType: ${returnType},`,
|
|
82
|
+
];
|
|
83
|
+
return `${key}: {\n${lines.map((line) => indent(line, 1)).join("\n")}\n},`;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=class-struct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class-struct.js","sourceRoot":"","sources":["../../src/writers/class-struct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirClass } from "../gir/class.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits a full class declaration for a `<class>` element.
|
|
5
|
+
*
|
|
6
|
+
* Walks the class's constructors, static functions, and methods, emitting
|
|
7
|
+
* each as a JS method body on the class declaration plus a hoisted `const`
|
|
8
|
+
* binding for the corresponding FFI symbol. Properties and signals are
|
|
9
|
+
* surfaced by their own writers; this function owns the class shape and
|
|
10
|
+
* the GType / class-struct registration calls.
|
|
11
|
+
*
|
|
12
|
+
* @param context - The module context
|
|
13
|
+
* @param klass - The class to emit
|
|
14
|
+
*/
|
|
15
|
+
export declare const emitClass: (context: ModuleContext, klass: GirClass) => void;
|
|
16
|
+
//# sourceMappingURL=class.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/writers/class.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA4BhD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,IA0BnE,CAAC"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { toCamelCase, toPascalCase } from "@gtkx/utils";
|
|
2
|
+
import { indent } from "../dsl/emit.js";
|
|
3
|
+
import { splitQualifiedName } from "../gir/qualified-name.js";
|
|
4
|
+
import { qualifyFunction, qualifyTypeRef } from "../gir/qualify.js";
|
|
5
|
+
import { matchAsyncFinishName } from "./async.js";
|
|
6
|
+
import { appendMethodBinding, appendShadowedAliases, dedupeCallables, emitBindings, indexMethodsByName, renderInstanceMethod, renderStaticHead, } from "./callables.js";
|
|
7
|
+
import { renderVfuncMetadata } from "./class-struct.js";
|
|
8
|
+
import { renderClassConstructor, renderConstructorPropsInterface } from "./constructor-props.js";
|
|
9
|
+
import { renderGetTypeReference } from "./gtype-binding.js";
|
|
10
|
+
import { collectInterfaceProperties, forEachAncestor, resolveImplementedInterface } from "./inheritance.js";
|
|
11
|
+
import { methodExportName, renderPromisifiedBody, renderPromisifiedSignature } from "./method.js";
|
|
12
|
+
import { inputParameters } from "./param-classify.js";
|
|
13
|
+
import { renderPropertyAccessor } from "./property-accessor.js";
|
|
14
|
+
import { appendNativeClassRegistration } from "./registration.js";
|
|
15
|
+
import { renderRuntimeOverride } from "./runtime-override.js";
|
|
16
|
+
import { renderSignalMembers } from "./signal.js";
|
|
17
|
+
import { renderTsType } from "./ts-type.js";
|
|
18
|
+
/**
|
|
19
|
+
* Emits a full class declaration for a `<class>` element.
|
|
20
|
+
*
|
|
21
|
+
* Walks the class's constructors, static functions, and methods, emitting
|
|
22
|
+
* each as a JS method body on the class declaration plus a hoisted `const`
|
|
23
|
+
* binding for the corresponding FFI symbol. Properties and signals are
|
|
24
|
+
* surfaced by their own writers; this function owns the class shape and
|
|
25
|
+
* the GType / class-struct registration calls.
|
|
26
|
+
*
|
|
27
|
+
* @param context - The module context
|
|
28
|
+
* @param klass - The class to emit
|
|
29
|
+
*/
|
|
30
|
+
export const emitClass = (context, klass) => {
|
|
31
|
+
if (!klass.introspectable)
|
|
32
|
+
return;
|
|
33
|
+
if (klass.name.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
const className = toPascalCase(klass.name);
|
|
36
|
+
const callables = {
|
|
37
|
+
constructors: dedupeCallables(klass.constructors),
|
|
38
|
+
functions: dedupeCallables(klass.functions),
|
|
39
|
+
methods: dedupeCallables(klass.methods),
|
|
40
|
+
};
|
|
41
|
+
emitBindings(context, callables);
|
|
42
|
+
const parentExpression = resolveParent(context, klass);
|
|
43
|
+
const extendsClause = parentExpression === undefined ? "" : ` extends ${parentExpression}`;
|
|
44
|
+
const members = renderClassMembers(context, klass, callables, parentExpression !== undefined);
|
|
45
|
+
const body = members.map((member) => indent(member, 1)).join("\n\n");
|
|
46
|
+
context.module.appendDeclaration(`export class ${className}${extendsClause} {\n${body}\n}`);
|
|
47
|
+
context.module.appendDeclaration(renderConstructorPropsInterface(context, klass, className));
|
|
48
|
+
const interfaceRefs = klass.implements
|
|
49
|
+
.map((name) => resolveImplementsReference(context, name))
|
|
50
|
+
.filter((entry) => entry !== undefined);
|
|
51
|
+
if (interfaceRefs.length > 0) {
|
|
52
|
+
context.module.appendDeclaration(`export interface ${className} extends ${interfaceRefs.join(", ")} {}`);
|
|
53
|
+
}
|
|
54
|
+
appendClassRegistrations(context, klass, className);
|
|
55
|
+
};
|
|
56
|
+
const renderClassMembers = (context, klass, callables, hasParent) => {
|
|
57
|
+
const className = toPascalCase(klass.name);
|
|
58
|
+
const members = ["declare __gtype__: number;"];
|
|
59
|
+
const constructorBlock = renderClassConstructor(context, klass, className, hasParent);
|
|
60
|
+
if (constructorBlock !== undefined)
|
|
61
|
+
members.push(constructorBlock);
|
|
62
|
+
const claimedNames = new Set();
|
|
63
|
+
members.push(...renderStaticHead(context, callables, className, "gobject"));
|
|
64
|
+
const inherited = collectInheritedMethods(context, klass);
|
|
65
|
+
const methodByName = indexMethodsByName(callables.methods);
|
|
66
|
+
appendInstanceMethods({
|
|
67
|
+
context,
|
|
68
|
+
methods: callables.methods,
|
|
69
|
+
methodByName,
|
|
70
|
+
inherited,
|
|
71
|
+
members,
|
|
72
|
+
claimedNames,
|
|
73
|
+
className,
|
|
74
|
+
});
|
|
75
|
+
appendShadowedAliases({ context, methods: callables.methods, methodByName, members, claimedNames });
|
|
76
|
+
appendFlattenedInterfaceMethods({ context, klass, inheritedNames: inherited.names, members, claimedNames });
|
|
77
|
+
for (const property of klass.properties) {
|
|
78
|
+
const block = renderPropertyAccessor(context, property, claimedNames, methodByName);
|
|
79
|
+
if (block !== undefined)
|
|
80
|
+
members.push(block);
|
|
81
|
+
}
|
|
82
|
+
for (const property of collectInterfaceProperties(context, klass)) {
|
|
83
|
+
const block = renderPropertyAccessor(context, property, claimedNames, methodByName);
|
|
84
|
+
if (block !== undefined)
|
|
85
|
+
members.push(block);
|
|
86
|
+
}
|
|
87
|
+
members.push(...renderSignalMembers(context, klass));
|
|
88
|
+
return members;
|
|
89
|
+
};
|
|
90
|
+
const appendInstanceMethods = (options) => {
|
|
91
|
+
const { context, methods, methodByName, inherited, members, claimedNames, className } = options;
|
|
92
|
+
for (const callable of methods) {
|
|
93
|
+
const rename = conflictRename(context, callable, inherited, className);
|
|
94
|
+
const block = renderClassInstanceMember(context, callable, methodByName, rename);
|
|
95
|
+
if (block === undefined)
|
|
96
|
+
continue;
|
|
97
|
+
members.push(block);
|
|
98
|
+
claimedNames.add(rename ?? methodExportName(callable));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* The disambiguated name a colliding instance method is emitted under:
|
|
103
|
+
* `<lowerClassName><MethodName>` (e.g. `iconViewSetCursor`).
|
|
104
|
+
*/
|
|
105
|
+
const conflictingMethodName = (className, methodName) => {
|
|
106
|
+
const camel = toCamelCase(className);
|
|
107
|
+
return `${camel.charAt(0).toLowerCase()}${camel.slice(1)}${toPascalCase(methodName)}`;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Copies every interface method onto the implementing class.
|
|
111
|
+
*
|
|
112
|
+
* GObject interfaces are structural at the C level: a class that implements
|
|
113
|
+
* `Gdk.Paintable` can be passed to `gdk_paintable_snapshot`, but the JS
|
|
114
|
+
* wrapper only exposes that method if codegen emits it. Each implemented
|
|
115
|
+
* interface's methods are re-rooted to the interface's namespace, bound
|
|
116
|
+
* against the implementing class's shared library (the loader resolves the
|
|
117
|
+
* symbol through that library's dependency graph), and emitted as direct
|
|
118
|
+
* instance members. Names already provided by the class itself or inherited
|
|
119
|
+
* from an ancestor (or an ancestor-implemented interface) are skipped so the
|
|
120
|
+
* most-derived definition wins and no member is declared twice.
|
|
121
|
+
*
|
|
122
|
+
* @param options - {@link AppendFlattenedInterfaceMethodsOptions}
|
|
123
|
+
*/
|
|
124
|
+
const appendFlattenedInterfaceMethods = (options) => {
|
|
125
|
+
const { context, klass, inheritedNames, members, claimedNames } = options;
|
|
126
|
+
for (const implementName of klass.implements) {
|
|
127
|
+
const iface = resolveImplementedInterface(context, implementName);
|
|
128
|
+
if (iface === undefined)
|
|
129
|
+
continue;
|
|
130
|
+
const methods = dedupeCallables(iface.klass.methods).map((method) => qualifyFunction(method, iface.namespaceName));
|
|
131
|
+
const methodByName = indexMethodsByName(methods);
|
|
132
|
+
for (const method of methods) {
|
|
133
|
+
const name = methodExportName(method);
|
|
134
|
+
if (name === "constructor")
|
|
135
|
+
continue;
|
|
136
|
+
if (claimedNames.has(name) || inheritedNames.has(name))
|
|
137
|
+
continue;
|
|
138
|
+
const block = renderClassInstanceMember(context, method, methodByName);
|
|
139
|
+
if (block === undefined)
|
|
140
|
+
continue;
|
|
141
|
+
appendMethodBinding(context, method);
|
|
142
|
+
members.push(block);
|
|
143
|
+
claimedNames.add(name);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const appendClassRegistrations = (context, klass, className) => {
|
|
148
|
+
const getTypeRef = klass.glibGetType === undefined
|
|
149
|
+
? undefined
|
|
150
|
+
: renderGetTypeReference(context, klass.glibGetType, klass.glibTypeName);
|
|
151
|
+
appendNativeClassRegistration(context, {
|
|
152
|
+
className,
|
|
153
|
+
role: "class",
|
|
154
|
+
getTypeRef,
|
|
155
|
+
vfuncs: renderVfuncMetadata(context, klass),
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
const renderClassInstanceMember = (context, callable, siblings, nameOverride) => {
|
|
159
|
+
if (!callable.introspectable || callable.shadowedBy !== undefined || callable.cIdentifier === undefined) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
const name = nameOverride ?? methodExportName(callable);
|
|
163
|
+
if (name === "constructor")
|
|
164
|
+
return undefined;
|
|
165
|
+
const override = renderRuntimeOverride(callable, name);
|
|
166
|
+
if (override !== undefined)
|
|
167
|
+
return override;
|
|
168
|
+
const promisified = renderPromisifiedMember(context, callable, siblings, name);
|
|
169
|
+
if (promisified !== undefined)
|
|
170
|
+
return promisified;
|
|
171
|
+
return renderInstanceMethod(context, callable, nameOverride);
|
|
172
|
+
};
|
|
173
|
+
const renderPromisifiedMember = (context, callable, siblings, name) => {
|
|
174
|
+
const finishName = matchAsyncFinishName(callable, [...siblings.values()]);
|
|
175
|
+
if (finishName === undefined)
|
|
176
|
+
return undefined;
|
|
177
|
+
const finishFn = siblings.get(finishName);
|
|
178
|
+
if (finishFn === undefined)
|
|
179
|
+
return undefined;
|
|
180
|
+
const cIdentifier = callable.cIdentifier;
|
|
181
|
+
if (cIdentifier === undefined)
|
|
182
|
+
return undefined;
|
|
183
|
+
const { signature, returnType } = renderPromisifiedSignature(context, callable, finishFn);
|
|
184
|
+
const finishMember = methodExportName(finishFn);
|
|
185
|
+
const body = renderPromisifiedBody(context, callable, finishMember, cIdentifier);
|
|
186
|
+
return `${name}(${signature}): ${returnType} {\n${indent(body, 1)}\n}`;
|
|
187
|
+
};
|
|
188
|
+
const resolveImplementsReference = (context, name) => {
|
|
189
|
+
const { namespaceName, typeName } = splitQualifiedName(name, context.namespace.name);
|
|
190
|
+
const resolved = context.repository.resolveNamed(namespaceName, typeName);
|
|
191
|
+
if (resolved === undefined || resolved.kind !== "interface")
|
|
192
|
+
return undefined;
|
|
193
|
+
if (namespaceName === context.namespace.name)
|
|
194
|
+
return toPascalCase(typeName);
|
|
195
|
+
const alias = context.addCrossNamespaceImport(namespaceName);
|
|
196
|
+
return `${alias}.${toPascalCase(typeName)}`;
|
|
197
|
+
};
|
|
198
|
+
const collectInheritedMethods = (context, klass) => {
|
|
199
|
+
const accumulator = {
|
|
200
|
+
returnTypes: new Map(),
|
|
201
|
+
definitions: new Map(),
|
|
202
|
+
names: new Set(),
|
|
203
|
+
};
|
|
204
|
+
forEachAncestor(context, klass, (ancestor) => {
|
|
205
|
+
absorbInheritedMethods(context, ancestor, accumulator);
|
|
206
|
+
absorbInheritedInterfaceMethodNames(context, ancestor, accumulator.names);
|
|
207
|
+
});
|
|
208
|
+
return accumulator;
|
|
209
|
+
};
|
|
210
|
+
const absorbInheritedMethods = (context, resolved, accumulator) => {
|
|
211
|
+
const { returnTypes, definitions, names } = accumulator;
|
|
212
|
+
for (const method of resolved.klass.methods) {
|
|
213
|
+
if (!method.introspectable)
|
|
214
|
+
continue;
|
|
215
|
+
const name = toCamelCase(method.name);
|
|
216
|
+
names.add(name);
|
|
217
|
+
if (returnTypes.has(name))
|
|
218
|
+
continue;
|
|
219
|
+
definitions.set(name, { method, namespaceName: resolved.namespaceName });
|
|
220
|
+
const qualifiedType = qualifyTypeRef(method.returnValue.type, resolved.namespaceName);
|
|
221
|
+
returnTypes.set(name, renderTsType(context, qualifiedType, method.returnValue.nullable));
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
const absorbInheritedInterfaceMethodNames = (context, ancestor, names) => {
|
|
225
|
+
for (const implementName of ancestor.klass.implements) {
|
|
226
|
+
const iface = resolveImplementedInterface(context, implementName, ancestor.namespaceName);
|
|
227
|
+
if (iface === undefined)
|
|
228
|
+
continue;
|
|
229
|
+
for (const method of iface.klass.methods) {
|
|
230
|
+
if (!method.introspectable)
|
|
231
|
+
continue;
|
|
232
|
+
names.add(toCamelCase(method.name));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* The disambiguated name an instance method is emitted under when it collides
|
|
238
|
+
* incompatibly with an inherited method, or `undefined` when no rename applies.
|
|
239
|
+
*
|
|
240
|
+
* A collision is incompatible when the inherited method of the same name has a
|
|
241
|
+
* different return type, a distinct enum at a parameter position, or a
|
|
242
|
+
* different input-parameter arity — each of which would make the override
|
|
243
|
+
* structurally unassignable to its base. The colliding method is renamed so
|
|
244
|
+
* both it and the inherited method stay callable.
|
|
245
|
+
*/
|
|
246
|
+
const conflictRename = (context, callable, inherited, className) => {
|
|
247
|
+
if (!callable.introspectable)
|
|
248
|
+
return undefined;
|
|
249
|
+
const name = methodExportName(callable);
|
|
250
|
+
const inheritedReturn = inherited.returnTypes.get(name);
|
|
251
|
+
const inheritedMethod = inherited.definitions.get(name);
|
|
252
|
+
if (inheritedReturn === undefined || inheritedMethod === undefined)
|
|
253
|
+
return undefined;
|
|
254
|
+
const ownReturn = renderTsType(context, callable.returnValue.type, callable.returnValue.nullable);
|
|
255
|
+
const conflicts = inheritedReturn !== ownReturn ||
|
|
256
|
+
hasParameterEnumConflict(context, callable, inheritedMethod) ||
|
|
257
|
+
inputParameters(callable).length !== inputParameters(inheritedMethod.method).length;
|
|
258
|
+
return conflicts ? conflictingMethodName(className, callable.name) : undefined;
|
|
259
|
+
};
|
|
260
|
+
/**
|
|
261
|
+
* Whether an override pairs a distinct enum against the inherited method at
|
|
262
|
+
* any input-parameter position.
|
|
263
|
+
*
|
|
264
|
+
* Numeric enums are mutually assignable with `number`, so a `number`/enum
|
|
265
|
+
* pairing is compatible; two *different* enums are not, which would make the
|
|
266
|
+
* derived class structurally unassignable to its base. Such an override is
|
|
267
|
+
* dropped so the inherited signature stands.
|
|
268
|
+
*
|
|
269
|
+
* @param context - The module context
|
|
270
|
+
* @param own - The override declared on the derived class
|
|
271
|
+
* @param inherited - The nearest ancestor definition of the same name
|
|
272
|
+
*/
|
|
273
|
+
const hasParameterEnumConflict = (context, own, inherited) => {
|
|
274
|
+
const ownParams = inputParameters(own);
|
|
275
|
+
const inheritedParams = inputParameters(inherited.method);
|
|
276
|
+
const count = Math.min(ownParams.length, inheritedParams.length);
|
|
277
|
+
for (let index = 0; index < count; index += 1) {
|
|
278
|
+
const ownParam = ownParams[index];
|
|
279
|
+
const inheritedParam = inheritedParams[index];
|
|
280
|
+
if (ownParam === undefined || inheritedParam === undefined)
|
|
281
|
+
continue;
|
|
282
|
+
const ownEnum = enumIdentity(context, ownParam.parameter.type, context.namespace.name);
|
|
283
|
+
const inheritedEnum = enumIdentity(context, inheritedParam.parameter.type, inherited.namespaceName);
|
|
284
|
+
if (ownEnum !== undefined && inheritedEnum !== undefined && ownEnum !== inheritedEnum)
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
};
|
|
289
|
+
const enumIdentity = (context, ref, defaultNamespace) => {
|
|
290
|
+
const qualified = qualifyTypeRef(ref, defaultNamespace);
|
|
291
|
+
if (qualified === undefined || qualified.kind !== "named")
|
|
292
|
+
return undefined;
|
|
293
|
+
const resolved = context.repository.resolveNamed(qualified.namespaceName ?? defaultNamespace, qualified.typeName);
|
|
294
|
+
if (resolved === undefined || resolved.kind !== "enum")
|
|
295
|
+
return undefined;
|
|
296
|
+
return `${resolved.namespace.name}.${resolved.value.name}`;
|
|
297
|
+
};
|
|
298
|
+
const resolveParent = (context, klass) => {
|
|
299
|
+
if (klass.parent === undefined)
|
|
300
|
+
return undefined;
|
|
301
|
+
const { namespaceName, typeName } = splitQualifiedName(klass.parent, context.namespace.name);
|
|
302
|
+
if (namespaceName === context.namespace.name)
|
|
303
|
+
return toPascalCase(typeName);
|
|
304
|
+
const alias = context.addCrossNamespaceImport(namespaceName);
|
|
305
|
+
return `${alias}.${toPascalCase(typeName)}`;
|
|
306
|
+
};
|
|
307
|
+
//# sourceMappingURL=class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/writers/class.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirConstant } from "../gir/namespace.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits an `export const NAME = value` declaration for a namespace constant.
|
|
5
|
+
*
|
|
6
|
+
* A constant whose declared type marshals to a string (`utf8` / `filename` /
|
|
7
|
+
* `gchararray`) is always quoted — even when its value is all digits, as with
|
|
8
|
+
* `G_CSET_DIGITS = "0123456789"`. Other constants keep the bare-numeral form
|
|
9
|
+
* when the value is a plain number and are quoted otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @param context - The module context
|
|
12
|
+
* @param constant - The constant
|
|
13
|
+
*/
|
|
14
|
+
export declare const emitConstant: (context: ModuleContext, constant: GirConstant) => void;
|
|
15
|
+
//# sourceMappingURL=constant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../src/writers/constant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,aAAa,EAAE,UAAU,WAAW,KAAG,IAE5E,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { quote } from "@gtkx/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Emits an `export const NAME = value` declaration for a namespace constant.
|
|
4
|
+
*
|
|
5
|
+
* A constant whose declared type marshals to a string (`utf8` / `filename` /
|
|
6
|
+
* `gchararray`) is always quoted — even when its value is all digits, as with
|
|
7
|
+
* `G_CSET_DIGITS = "0123456789"`. Other constants keep the bare-numeral form
|
|
8
|
+
* when the value is a plain number and are quoted otherwise.
|
|
9
|
+
*
|
|
10
|
+
* @param context - The module context
|
|
11
|
+
* @param constant - The constant
|
|
12
|
+
*/
|
|
13
|
+
export const emitConstant = (context, constant) => {
|
|
14
|
+
context.module.appendDeclaration(`export const ${constant.name} = ${constantLiteral(constant)};`);
|
|
15
|
+
};
|
|
16
|
+
const constantLiteral = (constant) => {
|
|
17
|
+
if (isStringTyped(constant.type))
|
|
18
|
+
return quote(constant.value);
|
|
19
|
+
return isNumericLiteral(constant.value) ? constant.value : quote(constant.value);
|
|
20
|
+
};
|
|
21
|
+
const isStringTyped = (type) => type?.kind === "primitive" && type.category === "string";
|
|
22
|
+
const isNumericLiteral = (value) => /^-?(?:\d+|\d*\.\d+)$/.test(value);
|
|
23
|
+
//# sourceMappingURL=constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/writers/constant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAKpC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAsB,EAAE,QAAqB,EAAQ,EAAE;IAChF,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,QAAQ,CAAC,IAAI,MAAM,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACtG,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAqB,EAAU,EAAE;IACtD,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAA4B,EAAW,EAAE,CAC5D,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAE7D,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirConstant } from "../gir/namespace.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits an `export const NAME = value` declaration for a namespace constant.
|
|
5
|
+
*
|
|
6
|
+
* A constant whose declared type marshals to a string (`utf8` / `filename` /
|
|
7
|
+
* `gchararray`) is always quoted — even when its value is all digits, as with
|
|
8
|
+
* `G_CSET_DIGITS = "0123456789"`. Other constants keep the bare-numeral form
|
|
9
|
+
* when the value is a plain number and are quoted otherwise.
|
|
10
|
+
*
|
|
11
|
+
* @param ctx - The module context
|
|
12
|
+
* @param constant - The constant
|
|
13
|
+
*/
|
|
14
|
+
export declare const emitConstant: (ctx: ModuleContext, constant: GirConstant) => void;
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/writers/constants.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,KAAK,aAAa,EAAE,UAAU,WAAW,KAAG,IAExE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { quote } from "@gtkx/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Emits an `export const NAME = value` declaration for a namespace constant.
|
|
4
|
+
*
|
|
5
|
+
* A constant whose declared type marshals to a string (`utf8` / `filename` /
|
|
6
|
+
* `gchararray`) is always quoted — even when its value is all digits, as with
|
|
7
|
+
* `G_CSET_DIGITS = "0123456789"`. Other constants keep the bare-numeral form
|
|
8
|
+
* when the value is a plain number and are quoted otherwise.
|
|
9
|
+
*
|
|
10
|
+
* @param ctx - The module context
|
|
11
|
+
* @param constant - The constant
|
|
12
|
+
*/
|
|
13
|
+
export const emitConstant = (ctx, constant) => {
|
|
14
|
+
ctx.module.appendDeclaration(`export const ${constant.name} = ${constantLiteral(constant)};`);
|
|
15
|
+
};
|
|
16
|
+
const constantLiteral = (constant) => {
|
|
17
|
+
if (isStringTyped(constant.type))
|
|
18
|
+
return quote(constant.value);
|
|
19
|
+
return isNumericLiteral(constant.value) ? constant.value : quote(constant.value);
|
|
20
|
+
};
|
|
21
|
+
const isStringTyped = (type) => type?.kind === "primitive" && type.category === "string";
|
|
22
|
+
const isNumericLiteral = (value) => /^-?(?:\d+|\d*\.\d+)$/.test(value);
|
|
23
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/writers/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAKpC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAkB,EAAE,QAAqB,EAAQ,EAAE;IAC5E,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,QAAQ,CAAC,IAAI,MAAM,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClG,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAAqB,EAAU,EAAE;IACtD,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAA4B,EAAW,EAAE,CAC5D,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAE7D,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC"}
|