@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,32 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirClass } from "../gir/class.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders the `export interface <Class>ConstructorProps` declaration.
|
|
5
|
+
*
|
|
6
|
+
* Each interface lists the camelCase, optional, nullable form of every
|
|
7
|
+
* property the class introduces and `extends` its parent's interface, so the
|
|
8
|
+
* full inherited prop set is available when typing `new <Class>(props)`.
|
|
9
|
+
*
|
|
10
|
+
* @param context - The module context
|
|
11
|
+
* @param klass - The class to render props for
|
|
12
|
+
* @param className - The local PascalCase class name
|
|
13
|
+
*/
|
|
14
|
+
export declare const renderConstructorPropsInterface: (context: ModuleContext, klass: GirClass, className: string) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Renders the constructor for a class, or `undefined` when none is needed.
|
|
17
|
+
*
|
|
18
|
+
* The parentless root of a GObject hierarchy gets the canonical base
|
|
19
|
+
* constructor that hands the assembled `GValue` record to
|
|
20
|
+
* `constructGObjectInstance`. A class that introduces constructable props gets
|
|
21
|
+
* a constructor that destructures and translates those props into `GValue`s,
|
|
22
|
+
* spreads the untranslated remainder, and forwards everything to `super`. A
|
|
23
|
+
* class that introduces no props gets no constructor and inherits its nearest
|
|
24
|
+
* typed ancestor's, keeping the chain free of redundant hops.
|
|
25
|
+
*
|
|
26
|
+
* @param context - The module context
|
|
27
|
+
* @param klass - The class being emitted
|
|
28
|
+
* @param className - The local PascalCase class name
|
|
29
|
+
* @param hasParent - Whether the class declares an `extends` clause
|
|
30
|
+
*/
|
|
31
|
+
export declare const renderClassConstructor: (context: ModuleContext, klass: GirClass, className: string, hasParent: boolean) => string | undefined;
|
|
32
|
+
//# sourceMappingURL=constructor-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor-props.d.ts","sourceRoot":"","sources":["../../src/writers/constructor-props.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAyChD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,EAAE,WAAW,MAAM,KAAG,MAQ5G,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,EACtB,OAAO,QAAQ,EACf,WAAW,MAAM,EACjB,WAAW,OAAO,KACnB,MAAM,GAAG,SAKX,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { quote, toCamelCase, toIdentifier, toPascalCase } from "@gtkx/utils";
|
|
2
|
+
import { indent } from "../dsl/emit.js";
|
|
3
|
+
import { splitQualifiedName } from "../gir/qualified-name.js";
|
|
4
|
+
import { collectInterfaceProperties } from "./inheritance.js";
|
|
5
|
+
import { renderTsType } from "./ts-type.js";
|
|
6
|
+
import { renderFfiType } from "./value.js";
|
|
7
|
+
/**
|
|
8
|
+
* Whether a property can be passed to a constructor: writable, construct, or
|
|
9
|
+
* construct-only properties only. Read-only properties cannot be set through
|
|
10
|
+
* `g_object_new_with_properties`.
|
|
11
|
+
*
|
|
12
|
+
* @param property - The GIR property
|
|
13
|
+
*/
|
|
14
|
+
const isConstructable = (property) => property.writable || property.construct || property.constructOnly;
|
|
15
|
+
/**
|
|
16
|
+
* The constructable properties a class introduces: its own writable/construct
|
|
17
|
+
* properties plus those it inherits from directly-implemented interfaces,
|
|
18
|
+
* deduplicated by camelCase JS name (the class's own declaration wins).
|
|
19
|
+
*
|
|
20
|
+
* Ancestor class properties are intentionally excluded — each class translates
|
|
21
|
+
* only the props it introduces and forwards the rest up the `super(...)` chain.
|
|
22
|
+
*
|
|
23
|
+
* @param context - The module context
|
|
24
|
+
* @param klass - The class whose construct props to collect
|
|
25
|
+
*/
|
|
26
|
+
const collectConstructableProps = (context, klass) => {
|
|
27
|
+
const all = [...klass.properties, ...collectInterfaceProperties(context, klass)].filter(isConstructable);
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const result = [];
|
|
30
|
+
for (const property of all) {
|
|
31
|
+
const jsName = toIdentifier(toCamelCase(property.name));
|
|
32
|
+
if (seen.has(jsName))
|
|
33
|
+
continue;
|
|
34
|
+
seen.add(jsName);
|
|
35
|
+
result.push(property);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Renders the `export interface <Class>ConstructorProps` declaration.
|
|
41
|
+
*
|
|
42
|
+
* Each interface lists the camelCase, optional, nullable form of every
|
|
43
|
+
* property the class introduces and `extends` its parent's interface, so the
|
|
44
|
+
* full inherited prop set is available when typing `new <Class>(props)`.
|
|
45
|
+
*
|
|
46
|
+
* @param context - The module context
|
|
47
|
+
* @param klass - The class to render props for
|
|
48
|
+
* @param className - The local PascalCase class name
|
|
49
|
+
*/
|
|
50
|
+
export const renderConstructorPropsInterface = (context, klass, className) => {
|
|
51
|
+
const parentRef = resolveParentPropsReference(context, klass);
|
|
52
|
+
const extendsClause = parentRef === undefined ? "" : ` extends ${parentRef}`;
|
|
53
|
+
const lines = collectConstructableProps(context, klass).map((property) => `${toIdentifier(toCamelCase(property.name))}?: ${renderTsType(context, property.type, true)};`);
|
|
54
|
+
const body = lines.length === 0 ? "" : `\n${indent(lines.join("\n"), 1)}\n`;
|
|
55
|
+
return `export interface ${className}ConstructorProps${extendsClause} {${body}}`;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Renders the constructor for a class, or `undefined` when none is needed.
|
|
59
|
+
*
|
|
60
|
+
* The parentless root of a GObject hierarchy gets the canonical base
|
|
61
|
+
* constructor that hands the assembled `GValue` record to
|
|
62
|
+
* `constructGObjectInstance`. A class that introduces constructable props gets
|
|
63
|
+
* a constructor that destructures and translates those props into `GValue`s,
|
|
64
|
+
* spreads the untranslated remainder, and forwards everything to `super`. A
|
|
65
|
+
* class that introduces no props gets no constructor and inherits its nearest
|
|
66
|
+
* typed ancestor's, keeping the chain free of redundant hops.
|
|
67
|
+
*
|
|
68
|
+
* @param context - The module context
|
|
69
|
+
* @param klass - The class being emitted
|
|
70
|
+
* @param className - The local PascalCase class name
|
|
71
|
+
* @param hasParent - Whether the class declares an `extends` clause
|
|
72
|
+
*/
|
|
73
|
+
export const renderClassConstructor = (context, klass, className, hasParent) => {
|
|
74
|
+
if (!hasParent)
|
|
75
|
+
return renderRootConstructor(context);
|
|
76
|
+
const props = collectConstructableProps(context, klass);
|
|
77
|
+
if (props.length === 0)
|
|
78
|
+
return undefined;
|
|
79
|
+
return renderTranslatingConstructor(context, props, className);
|
|
80
|
+
};
|
|
81
|
+
/** The forwarding record of marshalled `GValue`s a constructor hands to `super`. */
|
|
82
|
+
const GVALUE_RECORD = "Record<string, GValue | undefined>";
|
|
83
|
+
const renderRootConstructor = (context) => {
|
|
84
|
+
context.addConstructGObjectInstanceImport();
|
|
85
|
+
context.addRuntimeImport("GValue");
|
|
86
|
+
const body = "constructGObjectInstance(this, props);";
|
|
87
|
+
return `constructor(props: ${GVALUE_RECORD} = {}) {\n${indent(body, 1)}\n}`;
|
|
88
|
+
};
|
|
89
|
+
const renderTranslatingConstructor = (context, props, className) => {
|
|
90
|
+
context.addValueFromFfiOptionalImport();
|
|
91
|
+
context.addRuntimeImport("GValue");
|
|
92
|
+
const destructured = props.map((property) => toIdentifier(toCamelCase(property.name)));
|
|
93
|
+
const pattern = `{ ${[...destructured, "...rest"].join(", ")} }`;
|
|
94
|
+
const entries = props.map((property) => `${quote(property.name)}: valueFromFfiOptional(${renderFfiType(context, property.type, property.transferOwnership)}, ${toIdentifier(toCamelCase(property.name))}),`);
|
|
95
|
+
const recordLiteral = `{\n${indent(entries.join("\n"), 1)}\n}`;
|
|
96
|
+
const lines = [`const props: ${GVALUE_RECORD} = ${recordLiteral};`, "super({ ...props, ...rest });"];
|
|
97
|
+
const body = lines.join("\n");
|
|
98
|
+
return `constructor(${pattern}: ${className}ConstructorProps = {}) {\n${indent(body, 1)}\n}`;
|
|
99
|
+
};
|
|
100
|
+
const resolveParentPropsReference = (context, klass) => {
|
|
101
|
+
if (klass.parent === undefined)
|
|
102
|
+
return undefined;
|
|
103
|
+
const { namespaceName, typeName } = splitQualifiedName(klass.parent, context.namespace.name);
|
|
104
|
+
const propsName = `${toPascalCase(typeName)}ConstructorProps`;
|
|
105
|
+
if (namespaceName === context.namespace.name)
|
|
106
|
+
return propsName;
|
|
107
|
+
const alias = context.addCrossNamespaceImport(namespaceName);
|
|
108
|
+
return `${alias}.${propsName}`;
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=constructor-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor-props.js","sourceRoot":"","sources":["../../src/writers/constructor-props.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,CAAC,QAAqB,EAAW,EAAE,CACvD,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,yBAAyB,GAAG,CAAC,OAAsB,EAAE,KAAe,EAA0B,EAAE;IAClG,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,GAAG,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAE,SAAiB,EAAU,EAAE;IAClH,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC;IAC7E,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CACvD,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAC/G,CAAC;IACF,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,mBAAmB,aAAa,KAAK,IAAI,GAAG,CAAC;AACrF,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAClC,OAAsB,EACtB,KAAe,EACf,SAAiB,EACjB,SAAkB,EACA,EAAE;IACpB,IAAI,CAAC,SAAS;QAAE,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,4BAA4B,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,aAAa,GAAG,oCAAoC,CAAC;AAE3D,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAU,EAAE;IAC7D,OAAO,CAAC,iCAAiC,EAAE,CAAC;IAC5C,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,wCAAwC,CAAC;IACtD,OAAO,sBAAsB,aAAa,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CACjC,OAAsB,EACtB,KAA6B,EAC7B,SAAiB,EACX,EAAE;IACR,OAAO,CAAC,6BAA6B,EAAE,CAAC;IACxC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,QAAQ,EAAE,EAAE,CACT,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,KAAK,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1K,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;IAC/D,MAAM,KAAK,GAAG,CAAC,gBAAgB,aAAa,MAAM,aAAa,GAAG,EAAE,+BAA+B,CAAC,CAAC;IACrG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,eAAe,OAAO,KAAK,SAAS,6BAA6B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAsB,EAAE;IAChG,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC9D,IAAI,aAAa,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAC7D,OAAO,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirEnum } from "../gir/enum.js";
|
|
3
|
+
/**
|
|
4
|
+
* Emits the runtime declaration for an `<enumeration>` or `<bitfield>`.
|
|
5
|
+
*
|
|
6
|
+
* Two branches:
|
|
7
|
+
* - `glib:error-domain` present → `export type Name = number` plus
|
|
8
|
+
* `createErrorDomain(quark, members)` typed as `ErrorDomain<{ members }>`,
|
|
9
|
+
* since the domain object must stay `instanceof`-matchable.
|
|
10
|
+
* - GLib-registered enum/flags or C-only enum (no GLib registration) →
|
|
11
|
+
* a TypeScript `enum Name { members }` declaration.
|
|
12
|
+
*
|
|
13
|
+
* Member names are derived from the GIR `name` attribute, uppercased with
|
|
14
|
+
* hyphens normalized to underscores. Names that would start with a digit
|
|
15
|
+
* (e.g. `5_6_5` → `_5_6_5`) are prefixed with an underscore.
|
|
16
|
+
*
|
|
17
|
+
* @param context - The module context
|
|
18
|
+
* @param enumeration - The enum to emit
|
|
19
|
+
*/
|
|
20
|
+
export declare const emitEnum: (context: ModuleContext, enumeration: GirEnum) => void;
|
|
21
|
+
//# sourceMappingURL=enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../src/writers/enum.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS,aAAa,EAAE,aAAa,OAAO,KAAG,IAkBvE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { quote } from "@gtkx/utils";
|
|
2
|
+
/**
|
|
3
|
+
* Emits the runtime declaration for an `<enumeration>` or `<bitfield>`.
|
|
4
|
+
*
|
|
5
|
+
* Two branches:
|
|
6
|
+
* - `glib:error-domain` present → `export type Name = number` plus
|
|
7
|
+
* `createErrorDomain(quark, members)` typed as `ErrorDomain<{ members }>`,
|
|
8
|
+
* since the domain object must stay `instanceof`-matchable.
|
|
9
|
+
* - GLib-registered enum/flags or C-only enum (no GLib registration) →
|
|
10
|
+
* a TypeScript `enum Name { members }` declaration.
|
|
11
|
+
*
|
|
12
|
+
* Member names are derived from the GIR `name` attribute, uppercased with
|
|
13
|
+
* hyphens normalized to underscores. Names that would start with a digit
|
|
14
|
+
* (e.g. `5_6_5` → `_5_6_5`) are prefixed with an underscore.
|
|
15
|
+
*
|
|
16
|
+
* @param context - The module context
|
|
17
|
+
* @param enumeration - The enum to emit
|
|
18
|
+
*/
|
|
19
|
+
export const emitEnum = (context, enumeration) => {
|
|
20
|
+
if (!enumeration.introspectable)
|
|
21
|
+
return;
|
|
22
|
+
const name = enumeration.name;
|
|
23
|
+
const memberKeys = enumeration.members.map((member) => memberKey(member.name));
|
|
24
|
+
if (enumeration.errorDomain !== undefined) {
|
|
25
|
+
const memberEntries = enumeration.members.map((member, index) => `${memberKeys[index]}: ${member.value}`);
|
|
26
|
+
const typeFields = memberKeys.map((key) => `readonly ${key}: number`).join("; ");
|
|
27
|
+
context.addRuntimeImport("createErrorDomain");
|
|
28
|
+
context.addRuntimeImport("ErrorDomain");
|
|
29
|
+
const quarkExpression = renderQuarkExpression(context, enumeration.errorDomain);
|
|
30
|
+
context.module.appendDeclaration(`export type ${name} = number;`);
|
|
31
|
+
context.module.appendDeclaration(`export const ${name}: ErrorDomain<{ ${typeFields} }> = createErrorDomain(${quarkExpression}, { ${memberEntries.join(", ")} });`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const memberDeclarations = enumeration.members.map((member, index) => `${memberKeys[index]} = ${member.value}`);
|
|
35
|
+
context.module.appendDeclaration(`export enum ${name} { ${memberDeclarations.join(", ")} }`);
|
|
36
|
+
};
|
|
37
|
+
const memberKey = (name) => {
|
|
38
|
+
const upper = name.toUpperCase().replaceAll("-", "_");
|
|
39
|
+
return /^[0-9]/.test(upper) ? `_${upper}` : upper;
|
|
40
|
+
};
|
|
41
|
+
const renderQuarkExpression = (context, errorDomain) => {
|
|
42
|
+
if (context.namespace.name === "GLib") {
|
|
43
|
+
return `() => quarkFromString(${quote(errorDomain)})`;
|
|
44
|
+
}
|
|
45
|
+
const alias = context.addCrossNamespaceImport("GLib");
|
|
46
|
+
return `() => ${alias}.quarkFromString(${quote(errorDomain)})`;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum.js","sourceRoot":"","sources":["../../src/writers/enum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIpC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAE,WAAoB,EAAQ,EAAE;IAC3E,IAAI,CAAC,WAAW,CAAC,cAAc;QAAE,OAAO;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,WAAW,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1G,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAC9C,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;QAChF,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,IAAI,YAAY,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAC5B,gBAAgB,IAAI,mBAAmB,UAAU,2BAA2B,eAAe,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CACnI,CAAC;QACF,OAAO;IACX,CAAC;IACD,MAAM,kBAAkB,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAChH,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,IAAI,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAE,WAAmB,EAAU,EAAE;IAClF,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,yBAAyB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,SAAS,KAAK,oBAAoB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;AACnE,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirFunction } from "../gir/function.js";
|
|
3
|
+
import type { GirNamespace } from "../gir/namespace.js";
|
|
4
|
+
/**
|
|
5
|
+
* Renders the `t.fn(library, symbol, args, returnType)` expression for a
|
|
6
|
+
* callable. Returns `undefined` when the callable cannot be bound (no C
|
|
7
|
+
* identifier or missing namespace shared-library).
|
|
8
|
+
*
|
|
9
|
+
* @param context - The module context
|
|
10
|
+
* @param fn - The callable
|
|
11
|
+
*/
|
|
12
|
+
export declare const renderFnExpression: (context: ModuleContext, fn: GirFunction) => string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Emits both the bound `const fooBinding = t.fn(...)` and the
|
|
15
|
+
* `export function camelName(...)` wrapper for a namespace-level callable.
|
|
16
|
+
*
|
|
17
|
+
* Silently skipped when {@link renderFnExpression} cannot bind the callable
|
|
18
|
+
* (e.g. macros, unintrospectable signatures) or when the GIR marks the
|
|
19
|
+
* callable as `introspectable="0"`.
|
|
20
|
+
*
|
|
21
|
+
* @param context - The module context
|
|
22
|
+
* @param fn - The callable
|
|
23
|
+
*/
|
|
24
|
+
export declare const emitNamespaceFunction: (context: ModuleContext, fn: GirFunction) => void;
|
|
25
|
+
/**
|
|
26
|
+
* Emits a namespace's self-bootstrap statements as module-load side effects:
|
|
27
|
+
* a call to its zero-argument `init` entry point and a `whenStopped`
|
|
28
|
+
* registration for its zero-argument `finalize` entry point.
|
|
29
|
+
*
|
|
30
|
+
* GTK-style libraries expose top-level `init`/`finalize` functions (`gtk_init`,
|
|
31
|
+
* `adw_init`, `gtk_source_finalize`, …). Calling `init()` as the module is
|
|
32
|
+
* imported initializes the library's runtime before any of its types are
|
|
33
|
+
* touched — without it a `Gdk` display lookup can run before `gtk_init`.
|
|
34
|
+
* Deferring `finalize` to `whenStopped` runs it during shutdown.
|
|
35
|
+
*
|
|
36
|
+
* @param context - The module context
|
|
37
|
+
* @param namespace - The namespace being generated
|
|
38
|
+
*/
|
|
39
|
+
export declare const emitNamespaceBootstrap: (context: ModuleContext, namespace: GirNamespace) => void;
|
|
40
|
+
//# sourceMappingURL=function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/writers/function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmDxD;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,aAAa,EAAE,IAAI,WAAW,KAAG,MAAM,GAAG,SAarF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,aAAa,EAAE,IAAI,WAAW,KAAG,IAiB/E,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,aAAa,EAAE,WAAW,YAAY,KAAG,IAYxF,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { quote } from "@gtkx/utils";
|
|
2
|
+
import { arrayLiteral, indent, joinArgs } from "../dsl/emit.js";
|
|
3
|
+
import { namespaceFunctionExportName } from "../dsl/identifier.js";
|
|
4
|
+
import { callableReferencesClassStruct } from "./class-struct-record.js";
|
|
5
|
+
import { renderMethodBody, renderMethodReturnType, renderMethodSignature } from "./method.js";
|
|
6
|
+
import { closureAndDestroyIndices, needsRefArg } from "./param-classify.js";
|
|
7
|
+
import { renderFfiType, renderSelfFfiType, renderTrampolineType } from "./value.js";
|
|
8
|
+
/**
|
|
9
|
+
* Renders the FFI argument list for a callable, as a TypeScript array
|
|
10
|
+
* literal suitable as the third argument to `t.fn(...)`.
|
|
11
|
+
*
|
|
12
|
+
* Includes the instance parameter (if any), every regular parameter, and
|
|
13
|
+
* the implicit `GError**` ref when `throws=1`.
|
|
14
|
+
*
|
|
15
|
+
* @param context - The module context
|
|
16
|
+
* @param fn - The callable
|
|
17
|
+
*/
|
|
18
|
+
const renderArgsLiteral = (context, fn) => {
|
|
19
|
+
const args = [];
|
|
20
|
+
const instanceOffset = fn.instance === undefined ? 0 : 1;
|
|
21
|
+
if (fn.instance !== undefined) {
|
|
22
|
+
context.addRuntimeImport("t");
|
|
23
|
+
args.push(`{ type: ${renderSelfFfiType(context, fn.instance)} }`);
|
|
24
|
+
}
|
|
25
|
+
const closureIndices = closureAndDestroyIndices(fn);
|
|
26
|
+
fn.parameters.forEach((parameter, index) => {
|
|
27
|
+
if (parameter.isVarargs)
|
|
28
|
+
return;
|
|
29
|
+
if (closureIndices.has(index))
|
|
30
|
+
return;
|
|
31
|
+
const optional = parameter.direction === "in" && (parameter.nullable || parameter.optional);
|
|
32
|
+
args.push(argLiteral(context, parameter, optional, instanceOffset));
|
|
33
|
+
});
|
|
34
|
+
if (fn.throws) {
|
|
35
|
+
context.addRuntimeImport("t");
|
|
36
|
+
args.push(`{ type: t.ref(t.boxed("GError", "full", "libgobject-2.0.so.0", "g_error_get_type")) }`);
|
|
37
|
+
}
|
|
38
|
+
return arrayLiteral(args);
|
|
39
|
+
};
|
|
40
|
+
const argLiteral = (context, parameter, optional, instanceOffset) => {
|
|
41
|
+
const trampoline = renderTrampolineType(context, parameter.type, parameter);
|
|
42
|
+
const inner = trampoline ?? renderFfiType(context, parameter.type, parameter.transferOwnership, instanceOffset);
|
|
43
|
+
const refWrapped = needsRefArg(context, parameter);
|
|
44
|
+
const expression = refWrapped ? `t.ref(${inner})` : inner;
|
|
45
|
+
return optional && !refWrapped ? `{ type: ${expression}, optional: true }` : `{ type: ${expression} }`;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Renders the `t.fn(library, symbol, args, returnType)` expression for a
|
|
49
|
+
* callable. Returns `undefined` when the callable cannot be bound (no C
|
|
50
|
+
* identifier or missing namespace shared-library).
|
|
51
|
+
*
|
|
52
|
+
* @param context - The module context
|
|
53
|
+
* @param fn - The callable
|
|
54
|
+
*/
|
|
55
|
+
export const renderFnExpression = (context, fn) => {
|
|
56
|
+
if (fn.cIdentifier === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
const library = context.namespace.sharedLibrary;
|
|
59
|
+
if (library === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
context.addRuntimeImport("t");
|
|
62
|
+
const args = renderArgsLiteral(context, fn);
|
|
63
|
+
const returnType = renderFfiType(context, fn.returnValue.type, fn.returnValue.transferOwnership, fn.instance === undefined ? 0 : 1);
|
|
64
|
+
return `t.fn(${joinArgs([quote(library), quote(fn.cIdentifier), args, returnType])})`;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Emits both the bound `const fooBinding = t.fn(...)` and the
|
|
68
|
+
* `export function camelName(...)` wrapper for a namespace-level callable.
|
|
69
|
+
*
|
|
70
|
+
* Silently skipped when {@link renderFnExpression} cannot bind the callable
|
|
71
|
+
* (e.g. macros, unintrospectable signatures) or when the GIR marks the
|
|
72
|
+
* callable as `introspectable="0"`.
|
|
73
|
+
*
|
|
74
|
+
* @param context - The module context
|
|
75
|
+
* @param fn - The callable
|
|
76
|
+
*/
|
|
77
|
+
export const emitNamespaceFunction = (context, fn) => {
|
|
78
|
+
if (!fn.introspectable)
|
|
79
|
+
return;
|
|
80
|
+
if (fn.shadowedBy !== undefined)
|
|
81
|
+
return;
|
|
82
|
+
if (callableReferencesClassStruct(context, fn))
|
|
83
|
+
return;
|
|
84
|
+
const expression = renderFnExpression(context, fn);
|
|
85
|
+
if (expression === undefined)
|
|
86
|
+
return;
|
|
87
|
+
const bindingName = fn.cIdentifier;
|
|
88
|
+
if (bindingName === undefined)
|
|
89
|
+
return;
|
|
90
|
+
context.module.appendBinding(`const ${bindingName} = ${expression};`, bindingName);
|
|
91
|
+
const exportName = namespaceFunctionExportName(bindingName, fn.name, context.namespace.cSymbolPrefixes);
|
|
92
|
+
const signature = renderMethodSignature(context, fn);
|
|
93
|
+
const returnType = renderMethodReturnType(context, fn);
|
|
94
|
+
const body = renderMethodBody(context, fn, { bindingExpression: bindingName, isStatic: true });
|
|
95
|
+
context.module.appendDeclaration(`export function ${exportName}(${signature}): ${returnType} {\n${indent(body, 1)}\n}`);
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Emits a namespace's self-bootstrap statements as module-load side effects:
|
|
99
|
+
* a call to its zero-argument `init` entry point and a `whenStopped`
|
|
100
|
+
* registration for its zero-argument `finalize` entry point.
|
|
101
|
+
*
|
|
102
|
+
* GTK-style libraries expose top-level `init`/`finalize` functions (`gtk_init`,
|
|
103
|
+
* `adw_init`, `gtk_source_finalize`, …). Calling `init()` as the module is
|
|
104
|
+
* imported initializes the library's runtime before any of its types are
|
|
105
|
+
* touched — without it a `Gdk` display lookup can run before `gtk_init`.
|
|
106
|
+
* Deferring `finalize` to `whenStopped` runs it during shutdown.
|
|
107
|
+
*
|
|
108
|
+
* @param context - The module context
|
|
109
|
+
* @param namespace - The namespace being generated
|
|
110
|
+
*/
|
|
111
|
+
export const emitNamespaceBootstrap = (context, namespace) => {
|
|
112
|
+
for (const fn of namespace.functions) {
|
|
113
|
+
if (fn.parameters.length > 0)
|
|
114
|
+
continue;
|
|
115
|
+
if (!fn.introspectable || fn.shadowedBy !== undefined || fn.cIdentifier === undefined)
|
|
116
|
+
continue;
|
|
117
|
+
const exportName = namespaceFunctionExportName(fn.cIdentifier, fn.name, context.namespace.cSymbolPrefixes);
|
|
118
|
+
if (fn.name === "init") {
|
|
119
|
+
context.module.appendRegistration(`${exportName}();`);
|
|
120
|
+
}
|
|
121
|
+
else if (fn.name === "finalize") {
|
|
122
|
+
context.module.imports.addNamed("@gtkx/ffi", "whenStopped");
|
|
123
|
+
context.module.appendRegistration(`whenStopped().then(${exportName});`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/writers/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders the JS expression that resolves a class's `GType`, appending any
|
|
4
|
+
* required `t.fn` bindings to the module.
|
|
5
|
+
*
|
|
6
|
+
* For regular get-type symbols (`g_object_get_type`, `g_array_get_type`, …)
|
|
7
|
+
* the helper appends a `t.fn(...)` binding for the symbol and returns the bare
|
|
8
|
+
* function reference (`g_object_get_type`), which the runtime invokes once. For
|
|
9
|
+
* the GIR sentinel `"intern"` — used on `GVariant` and a few other types whose
|
|
10
|
+
* `GType` is registered intrinsically — it appends a binding for
|
|
11
|
+
* `g_type_from_name` and returns a `() => g_type_from_name("…")` thunk. Returns
|
|
12
|
+
* `undefined` when neither path is available.
|
|
13
|
+
*
|
|
14
|
+
* @param context - The module context
|
|
15
|
+
* @param getType - The C symbol name or the GIR sentinel `"intern"`
|
|
16
|
+
* @param glibTypeName - The GLib type name (for `"intern"` get-types)
|
|
17
|
+
*/
|
|
18
|
+
export declare const renderGetTypeReference: (context: ModuleContext, getType: string, glibTypeName: string | undefined) => string | undefined;
|
|
19
|
+
//# sourceMappingURL=gtype-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtype-binding.d.ts","sourceRoot":"","sources":["../../src/writers/gtype-binding.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,EACtB,SAAS,MAAM,EACf,cAAc,MAAM,GAAG,SAAS,KACjC,MAAM,GAAG,SAQX,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { quote } from "@gtkx/utils";
|
|
2
|
+
const TYPE_FROM_NAME_BINDING = "g_type_from_name";
|
|
3
|
+
const TYPE_FROM_NAME_LIB = "libgobject-2.0.so.0";
|
|
4
|
+
/**
|
|
5
|
+
* Renders the JS expression that resolves a class's `GType`, appending any
|
|
6
|
+
* required `t.fn` bindings to the module.
|
|
7
|
+
*
|
|
8
|
+
* For regular get-type symbols (`g_object_get_type`, `g_array_get_type`, …)
|
|
9
|
+
* the helper appends a `t.fn(...)` binding for the symbol and returns the bare
|
|
10
|
+
* function reference (`g_object_get_type`), which the runtime invokes once. For
|
|
11
|
+
* the GIR sentinel `"intern"` — used on `GVariant` and a few other types whose
|
|
12
|
+
* `GType` is registered intrinsically — it appends a binding for
|
|
13
|
+
* `g_type_from_name` and returns a `() => g_type_from_name("…")` thunk. Returns
|
|
14
|
+
* `undefined` when neither path is available.
|
|
15
|
+
*
|
|
16
|
+
* @param context - The module context
|
|
17
|
+
* @param getType - The C symbol name or the GIR sentinel `"intern"`
|
|
18
|
+
* @param glibTypeName - The GLib type name (for `"intern"` get-types)
|
|
19
|
+
*/
|
|
20
|
+
export const renderGetTypeReference = (context, getType, glibTypeName) => {
|
|
21
|
+
if (getType === "intern" || getType === "") {
|
|
22
|
+
if (glibTypeName === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
appendGTypeFromNameBinding(context);
|
|
25
|
+
return `() => ${TYPE_FROM_NAME_BINDING}(${quote(glibTypeName)})`;
|
|
26
|
+
}
|
|
27
|
+
appendGetTypeBinding(context, getType);
|
|
28
|
+
return getType;
|
|
29
|
+
};
|
|
30
|
+
const appendGetTypeBinding = (context, getType) => {
|
|
31
|
+
const lib = context.namespace.sharedLibrary ?? "";
|
|
32
|
+
const expression = `t.fn(${quote(lib)}, ${quote(getType)}, [], t.uint64)`;
|
|
33
|
+
context.module.appendBinding(`const ${getType} = ${expression};`, getType);
|
|
34
|
+
};
|
|
35
|
+
const appendGTypeFromNameBinding = (context) => {
|
|
36
|
+
const expression = `t.fn(${quote(TYPE_FROM_NAME_LIB)}, ${quote(TYPE_FROM_NAME_BINDING)}, ` +
|
|
37
|
+
`[{ type: t.string("borrowed") }], t.uint64)`;
|
|
38
|
+
context.module.appendBinding(`const ${TYPE_FROM_NAME_BINDING} = ${expression};`, TYPE_FROM_NAME_BINDING);
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=gtype-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gtype-binding.js","sourceRoot":"","sources":["../../src/writers/gtype-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGpC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAClD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAClC,OAAsB,EACtB,OAAe,EACf,YAAgC,EACd,EAAE;IACpB,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACzC,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjD,0BAA0B,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,SAAS,sBAAsB,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;IACrE,CAAC;IACD,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAE,OAAe,EAAQ,EAAE;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,OAAO,MAAM,UAAU,GAAG,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,OAAsB,EAAQ,EAAE;IAChE,MAAM,UAAU,GACZ,QAAQ,KAAK,CAAC,kBAAkB,CAAC,KAAK,KAAK,CAAC,sBAAsB,CAAC,IAAI;QACvE,6CAA6C,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,sBAAsB,MAAM,UAAU,GAAG,EAAE,sBAAsB,CAAC,CAAC;AAC7G,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ModuleContext } from "../dsl/context.js";
|
|
2
|
+
import type { GirClass } from "../gir/class.js";
|
|
3
|
+
import type { GirProperty } from "../gir/property.js";
|
|
4
|
+
import { type ResolvedQualifiedClass } from "../gir/qualified-name.js";
|
|
5
|
+
/**
|
|
6
|
+
* A directly-implemented interface resolved to its declaration and the
|
|
7
|
+
* namespace that declares it.
|
|
8
|
+
*/
|
|
9
|
+
export type ResolvedInterface = {
|
|
10
|
+
readonly klass: GirClass;
|
|
11
|
+
readonly namespaceName: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Resolves an `<implements>` entry to its `<interface>` declaration.
|
|
15
|
+
*
|
|
16
|
+
* Returns `undefined` when the name resolves to a non-interface entity or
|
|
17
|
+
* cannot be resolved at all.
|
|
18
|
+
*
|
|
19
|
+
* @param context - The module context
|
|
20
|
+
* @param name - The (possibly cross-namespace) interface name
|
|
21
|
+
*/
|
|
22
|
+
export declare const resolveImplementedInterface: (context: ModuleContext, name: string, defaultNamespace?: string) => ResolvedInterface | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Invokes `visit` for each ancestor class of `klass`, nearest first.
|
|
25
|
+
*
|
|
26
|
+
* Walks the same-namespace and cross-namespace parent chain, stopping at the
|
|
27
|
+
* first unresolved parent or a cycle. Each ancestor is reported together with
|
|
28
|
+
* the namespace it was resolved through so callers can qualify its references.
|
|
29
|
+
*
|
|
30
|
+
* @param context - The module context
|
|
31
|
+
* @param klass - The class whose ancestors to visit
|
|
32
|
+
* @param visit - Callback invoked once per resolved ancestor
|
|
33
|
+
*/
|
|
34
|
+
export declare const forEachAncestor: (context: ModuleContext, klass: GirClass, visit: (ancestor: ResolvedQualifiedClass) => void) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Collects the properties contributed by a class's directly-implemented
|
|
37
|
+
* interfaces that are not already declared on the class itself or inherited
|
|
38
|
+
* from an ancestor (or an ancestor-implemented interface).
|
|
39
|
+
*
|
|
40
|
+
* Each returned property carries its references re-rooted to the interface's
|
|
41
|
+
* namespace so the class writer can emit its accessor and constructor prop
|
|
42
|
+
* as if the property had been authored on the class.
|
|
43
|
+
*
|
|
44
|
+
* @param context - The module context
|
|
45
|
+
* @param klass - The implementing class
|
|
46
|
+
*/
|
|
47
|
+
export declare const collectInterfaceProperties: (context: ModuleContext, klass: GirClass) => readonly GirProperty[];
|
|
48
|
+
//# sourceMappingURL=inheritance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance.d.ts","sourceRoot":"","sources":["../../src/writers/inheritance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,KAAK,sBAAsB,EAA6C,MAAM,0BAA0B,CAAC;AAGlH;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,GACpC,SAAS,aAAa,EACtB,MAAM,MAAM,EACZ,mBAAkB,MAA+B,KAClD,iBAAiB,GAAG,SAKtB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GACxB,SAAS,aAAa,EACtB,OAAO,QAAQ,EACf,OAAO,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,KAClD,IAeF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,SAAS,WAAW,EAuBxG,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { toCamelCase, toIdentifier } from "@gtkx/utils";
|
|
2
|
+
import { resolveQualifiedClass, splitQualifiedName } from "../gir/qualified-name.js";
|
|
3
|
+
import { qualifyTypeRef } from "../gir/qualify.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves an `<implements>` entry to its `<interface>` declaration.
|
|
6
|
+
*
|
|
7
|
+
* Returns `undefined` when the name resolves to a non-interface entity or
|
|
8
|
+
* cannot be resolved at all.
|
|
9
|
+
*
|
|
10
|
+
* @param context - The module context
|
|
11
|
+
* @param name - The (possibly cross-namespace) interface name
|
|
12
|
+
*/
|
|
13
|
+
export const resolveImplementedInterface = (context, name, defaultNamespace = context.namespace.name) => {
|
|
14
|
+
const { namespaceName, typeName } = splitQualifiedName(name, defaultNamespace);
|
|
15
|
+
const resolved = context.repository.resolveNamed(namespaceName, typeName);
|
|
16
|
+
if (resolved === undefined || resolved.kind !== "interface")
|
|
17
|
+
return undefined;
|
|
18
|
+
return { klass: resolved.value, namespaceName: resolved.namespace.name };
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Invokes `visit` for each ancestor class of `klass`, nearest first.
|
|
22
|
+
*
|
|
23
|
+
* Walks the same-namespace and cross-namespace parent chain, stopping at the
|
|
24
|
+
* first unresolved parent or a cycle. Each ancestor is reported together with
|
|
25
|
+
* the namespace it was resolved through so callers can qualify its references.
|
|
26
|
+
*
|
|
27
|
+
* @param context - The module context
|
|
28
|
+
* @param klass - The class whose ancestors to visit
|
|
29
|
+
* @param visit - Callback invoked once per resolved ancestor
|
|
30
|
+
*/
|
|
31
|
+
export const forEachAncestor = (context, klass, visit) => {
|
|
32
|
+
const visited = new Set();
|
|
33
|
+
let current = klass.parent === undefined ? undefined : { name: klass.parent, defaultNamespace: context.namespace.name };
|
|
34
|
+
while (current !== undefined) {
|
|
35
|
+
const resolved = resolveQualifiedClass(context.repository, current.name, current.defaultNamespace);
|
|
36
|
+
if (resolved === undefined)
|
|
37
|
+
break;
|
|
38
|
+
const key = `${resolved.namespaceName}.${resolved.klass.name}`;
|
|
39
|
+
if (visited.has(key))
|
|
40
|
+
break;
|
|
41
|
+
visited.add(key);
|
|
42
|
+
visit(resolved);
|
|
43
|
+
current = resolved.klass.parent
|
|
44
|
+
? { name: resolved.klass.parent, defaultNamespace: resolved.namespaceName }
|
|
45
|
+
: undefined;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Collects the properties contributed by a class's directly-implemented
|
|
50
|
+
* interfaces that are not already declared on the class itself or inherited
|
|
51
|
+
* from an ancestor (or an ancestor-implemented interface).
|
|
52
|
+
*
|
|
53
|
+
* Each returned property carries its references re-rooted to the interface's
|
|
54
|
+
* namespace so the class writer can emit its accessor and constructor prop
|
|
55
|
+
* as if the property had been authored on the class.
|
|
56
|
+
*
|
|
57
|
+
* @param context - The module context
|
|
58
|
+
* @param klass - The implementing class
|
|
59
|
+
*/
|
|
60
|
+
export const collectInterfaceProperties = (context, klass) => {
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const property of klass.properties)
|
|
63
|
+
seen.add(toIdentifier(toCamelCase(property.name)));
|
|
64
|
+
forEachAncestor(context, klass, (ancestor) => {
|
|
65
|
+
for (const property of ancestor.klass.properties)
|
|
66
|
+
seen.add(toIdentifier(toCamelCase(property.name)));
|
|
67
|
+
for (const implementName of ancestor.klass.implements) {
|
|
68
|
+
const iface = resolveImplementedInterface(context, implementName, ancestor.namespaceName);
|
|
69
|
+
if (iface === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
for (const property of iface.klass.properties)
|
|
72
|
+
seen.add(toIdentifier(toCamelCase(property.name)));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const result = [];
|
|
76
|
+
for (const implementName of klass.implements) {
|
|
77
|
+
const iface = resolveImplementedInterface(context, implementName);
|
|
78
|
+
if (iface === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
for (const property of iface.klass.properties) {
|
|
81
|
+
const name = toIdentifier(toCamelCase(property.name));
|
|
82
|
+
if (seen.has(name))
|
|
83
|
+
continue;
|
|
84
|
+
seen.add(name);
|
|
85
|
+
result.push({ ...property, type: qualifyTypeRef(property.type, iface.namespaceName) });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=inheritance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance.js","sourceRoot":"","sources":["../../src/writers/inheritance.ts"],"names":[],"mappings":"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"}
|