@gtkx/codegen 1.0.0 → 1.2.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/README.md +1 -1
- package/dist/analysis/descriptor-render.d.ts +12 -15
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +59 -38
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +25 -10
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +37 -9
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +4 -2
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +80 -38
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/interface-conflicts.d.ts +25 -0
- package/dist/analysis/interface-conflicts.d.ts.map +1 -0
- package/dist/analysis/interface-conflicts.js +139 -0
- package/dist/analysis/interface-conflicts.js.map +1 -0
- package/dist/analysis/param-capability.d.ts.map +1 -1
- package/dist/analysis/param-capability.js +3 -4
- package/dist/analysis/param-capability.js.map +1 -1
- package/dist/analysis/param-structure.js +2 -2
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts +3 -2
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +26 -26
- package/dist/analysis/ts-type.js.map +1 -1
- package/dist/analysis/type-key.d.ts +5 -0
- package/dist/analysis/type-key.d.ts.map +1 -0
- package/dist/analysis/type-key.js +9 -0
- package/dist/analysis/type-key.js.map +1 -0
- package/dist/analysis/type-shape.d.ts +3 -2
- package/dist/analysis/type-shape.d.ts.map +1 -1
- package/dist/analysis/type-shape.js +2 -1
- package/dist/analysis/type-shape.js.map +1 -1
- package/dist/compile.d.ts +14 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +125 -24
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +2 -0
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +11 -10
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +5 -3
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/pipeline.d.ts +1 -0
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +93 -19
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +2 -1
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +5 -4
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +10 -9
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +20 -3
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +56 -37
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts +1 -0
- package/dist/gi.d.ts.map +1 -1
- package/dist/gi.js +8 -2
- package/dist/gi.js.map +1 -1
- package/dist/gir/ancestry.d.ts +7 -1
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +9 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +1 -2
- package/dist/gir/annotations.d.ts.map +1 -1
- package/dist/gir/annotations.js +1 -1
- package/dist/gir/annotations.js.map +1 -1
- package/dist/gir/cursor-overrides.d.ts +8 -0
- package/dist/gir/cursor-overrides.d.ts.map +1 -0
- package/dist/gir/cursor-overrides.js +6 -0
- package/dist/gir/cursor-overrides.js.map +1 -0
- package/dist/gir/emittable.d.ts +7 -0
- package/dist/gir/emittable.d.ts.map +1 -0
- package/dist/gir/emittable.js +3 -0
- package/dist/gir/emittable.js.map +1 -0
- package/dist/gir/function.d.ts.map +1 -1
- package/dist/gir/function.js +28 -2
- package/dist/gir/function.js.map +1 -1
- package/dist/gir/gir-path.d.ts +1 -1
- package/dist/gir/gir-path.js +1 -1
- package/dist/gir/gir-path.js.map +1 -1
- package/dist/gir/library.d.ts +5 -1
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +9 -2
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +5 -1
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +4 -2
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +13 -1
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +1 -0
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +6 -6
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.js +1 -1
- package/dist/gir/primitives.js.map +1 -1
- package/dist/guards.d.ts +16 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +11 -0
- package/dist/guards.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -1
- package/dist/json.d.ts +3 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +11 -0
- package/dist/json.js.map +1 -0
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +8 -6
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +22 -7
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/parse.d.ts.map +1 -1
- package/dist/khronos/parse.js +3 -4
- package/dist/khronos/parse.js.map +1 -1
- package/dist/khronos/pipeline.d.ts +1 -1
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +1 -7
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +1 -1
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +8 -4
- package/dist/khronos/render.js.map +1 -1
- package/dist/runner.d.ts +7 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +21 -3
- package/dist/runner.js.map +1 -1
- package/dist/staging.d.ts +5 -0
- package/dist/staging.d.ts.map +1 -0
- package/dist/staging.js +57 -0
- package/dist/staging.js.map +1 -0
- package/dist/store/compile-store.d.ts +0 -1
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +7 -32
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/callables.d.ts +6 -3
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +40 -30
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/callback.d.ts.map +1 -1
- package/dist/store/gi/callback.js +9 -5
- package/dist/store/gi/callback.js.map +1 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +104 -44
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/companion.d.ts.map +1 -1
- package/dist/store/gi/companion.js +6 -6
- package/dist/store/gi/companion.js.map +1 -1
- package/dist/store/gi/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +11 -3
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.js +1 -1
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +29 -12
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts +1 -3
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +24 -18
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/gtype-binding.d.ts.map +1 -1
- package/dist/store/gi/gtype-binding.js +4 -1
- package/dist/store/gi/gtype-binding.js.map +1 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +34 -19
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/method.d.ts +7 -6
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +13 -24
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +3 -2
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +50 -5
- package/dist/store/gi/param-marshal.js.map +1 -1
- package/dist/store/gi/pipeline.d.ts.map +1 -1
- package/dist/store/gi/pipeline.js +21 -10
- package/dist/store/gi/pipeline.js.map +1 -1
- package/dist/store/gi/properties.d.ts +2 -1
- package/dist/store/gi/properties.d.ts.map +1 -1
- package/dist/store/gi/properties.js +6 -3
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +10 -8
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +49 -91
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts +8 -1
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +34 -13
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +20 -4
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts +6 -1
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +8 -1
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +19 -8
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.js +2 -2
- package/dist/store/gi/registration.js.map +1 -1
- package/dist/store/gi/return-wrap.js +1 -1
- package/dist/store/gi/return-wrap.js.map +1 -1
- package/dist/store/gi/signal.d.ts +2 -1
- package/dist/store/gi/signal.d.ts.map +1 -1
- package/dist/store/gi/signal.js +55 -28
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts.map +1 -1
- package/dist/store/gi/value-marshalable.js +2 -1
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +4 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +60 -17
- package/dist/store/gi/vtable.js.map +1 -1
- package/dist/store/gi-store.d.ts +1 -0
- package/dist/store/gi-store.d.ts.map +1 -1
- package/dist/store/gi-store.js +15 -20
- package/dist/store/gi-store.js.map +1 -1
- package/dist/store/jsx/generated-elements.d.ts +2 -1
- package/dist/store/jsx/generated-elements.d.ts.map +1 -1
- package/dist/store/jsx/generated-elements.js +13 -7
- package/dist/store/jsx/generated-elements.js.map +1 -1
- package/dist/store/jsx/jsx.js +3 -3
- package/dist/store/jsx/jsx.js.map +1 -1
- package/dist/store/jsx/metadata.d.ts.map +1 -1
- package/dist/store/jsx/metadata.js +3 -1
- package/dist/store/jsx/metadata.js.map +1 -1
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +3 -4
- package/dist/store/jsx-store.js.map +1 -1
- package/dist/store/resolve-store.d.ts +14 -3
- package/dist/store/resolve-store.d.ts.map +1 -1
- package/dist/store/resolve-store.js +98 -15
- package/dist/store/resolve-store.js.map +1 -1
- package/dist/store/store-fs.d.ts +9 -7
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +54 -25
- package/dist/store/store-fs.js.map +1 -1
- package/dist/store/store-links.d.ts +3 -0
- package/dist/store/store-links.d.ts.map +1 -0
- package/dist/store/store-links.js +39 -0
- package/dist/store/store-links.js.map +1 -0
- package/dist/writer/comparison-context.d.ts +4 -0
- package/dist/writer/comparison-context.d.ts.map +1 -0
- package/dist/writer/comparison-context.js +13 -0
- package/dist/writer/comparison-context.js.map +1 -0
- package/dist/writer/context.d.ts +3 -3
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +11 -6
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/module.d.ts +13 -5
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +68 -11
- package/dist/writer/module.js.map +1 -1
- package/dist/xml.d.ts +8 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +70 -1
- package/dist/xml.js.map +1 -1
- package/overrides/gobject/object.ts.ejs +2 -0
- package/package.json +14 -3
- package/src/analysis/descriptor-render.ts +106 -52
- package/src/analysis/descriptor.ts +76 -15
- package/src/analysis/inheritance.ts +134 -44
- package/src/analysis/interface-conflicts.ts +235 -0
- package/src/analysis/param-capability.ts +3 -6
- package/src/analysis/param-structure.ts +2 -2
- package/src/analysis/ts-type.ts +43 -28
- package/src/analysis/type-key.ts +14 -0
- package/src/analysis/type-shape.ts +5 -2
- package/src/compile.ts +192 -27
- package/src/docs/api-reference.ts +13 -10
- package/src/docs/element-page.ts +5 -2
- package/src/docs/pipeline.ts +140 -24
- package/src/docs/render.ts +7 -3
- package/src/docs/symbol-page.ts +12 -11
- package/src/fingerprint.ts +95 -47
- package/src/gi.ts +10 -2
- package/src/gir/ancestry.ts +17 -1
- package/src/gir/annotations.ts +1 -1
- package/src/gir/cursor-overrides.ts +12 -0
- package/src/gir/emittable.ts +8 -0
- package/src/gir/function.ts +45 -9
- package/src/gir/gir-path.ts +1 -1
- package/src/gir/library.ts +10 -2
- package/src/gir/namespace.ts +8 -2
- package/src/gir/parameter.ts +15 -0
- package/src/gir/parse.ts +10 -7
- package/src/gir/primitives.ts +1 -1
- package/src/guards.ts +23 -0
- package/src/internal.ts +2 -0
- package/src/json.ts +11 -0
- package/src/khronos/args.ts +9 -6
- package/src/khronos/modules.ts +25 -9
- package/src/khronos/parse.ts +3 -4
- package/src/khronos/pipeline.ts +1 -1
- package/src/khronos/plan.ts +0 -1
- package/src/khronos/render.ts +8 -6
- package/src/runner.ts +26 -4
- package/src/staging.ts +67 -0
- package/src/store/compile-store.ts +7 -38
- package/src/store/gi/callables.ts +60 -33
- package/src/store/gi/callback.ts +9 -9
- package/src/store/gi/class.ts +140 -53
- package/src/store/gi/companion.ts +7 -6
- package/src/store/gi/constant.ts +13 -3
- package/src/store/gi/constructor-props.ts +1 -1
- package/src/store/gi/enum.ts +36 -26
- package/src/store/gi/function.ts +30 -24
- package/src/store/gi/gtype-binding.ts +7 -2
- package/src/store/gi/interface.ts +39 -20
- package/src/store/gi/method.ts +26 -32
- package/src/store/gi/param-marshal.ts +77 -6
- package/src/store/gi/pipeline.ts +25 -15
- package/src/store/gi/properties.ts +8 -4
- package/src/store/gi/property-accessor.ts +73 -161
- package/src/store/gi/record-constructor.ts +53 -21
- package/src/store/gi/record-field-accessor.ts +26 -4
- package/src/store/gi/record-layout.ts +11 -1
- package/src/store/gi/record.ts +20 -12
- package/src/store/gi/registration.ts +2 -2
- package/src/store/gi/return-wrap.ts +1 -1
- package/src/store/gi/signal.ts +66 -42
- package/src/store/gi/value-marshalable.ts +3 -1
- package/src/store/gi/vtable.ts +97 -20
- package/src/store/gi-store.ts +26 -31
- package/src/store/jsx/generated-elements.ts +17 -8
- package/src/store/jsx/jsx.ts +3 -3
- package/src/store/jsx/metadata.ts +4 -1
- package/src/store/jsx-store.ts +3 -4
- package/src/store/resolve-store.ts +133 -18
- package/src/store/store-fs.ts +82 -35
- package/src/store/store-links.ts +49 -0
- package/src/writer/comparison-context.ts +18 -0
- package/src/writer/context.ts +12 -6
- package/src/writer/module.ts +101 -14
- package/src/xml.ts +103 -1
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { sanitizeTypeIdentifier } from "@gtkx/utils";
|
|
1
2
|
import { isInoutParameter } from "../../gir/parameter.js";
|
|
3
|
+
import { recordInlineSize } from "./record-layout.js";
|
|
4
|
+
import { isConstructibleRecord } from "./value-marshalable.js";
|
|
2
5
|
const isHandlePassedInPlace = (context, parameter) => {
|
|
3
6
|
if (parameter.direction !== "out" && parameter.direction !== "inout") {
|
|
4
7
|
return false;
|
|
@@ -15,11 +18,53 @@ const underlyingType = (context, ref) => {
|
|
|
15
18
|
return type.value.target === undefined ? undefined : underlyingType(context, type.value.target);
|
|
16
19
|
};
|
|
17
20
|
const underlyingParamKind = (context, parameter) => parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
const resolvedTypeName = (context, ref) => {
|
|
22
|
+
let current = ref;
|
|
23
|
+
while (current !== undefined) {
|
|
24
|
+
const resolved = context.library.typeFor(current);
|
|
25
|
+
if (resolved?.kind === "alias" && resolved.value.target !== undefined) {
|
|
26
|
+
current = resolved.value.target;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
return context.library.nameFor(current);
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
};
|
|
33
|
+
const recordCallerOutAllocation = (context, name, type) => {
|
|
34
|
+
const size = recordInlineSize(context, type.value);
|
|
35
|
+
if (size === undefined) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return isConstructibleRecord(context, type.namespace.name, type.value)
|
|
39
|
+
? { ...name, strategy: "construct" }
|
|
40
|
+
: { ...name, strategy: "allocate", size };
|
|
41
|
+
};
|
|
42
|
+
const callerOutAllocation = (context, parameter) => {
|
|
43
|
+
const name = resolvedTypeName(context, parameter.type);
|
|
44
|
+
const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
|
|
45
|
+
if (name === undefined || type === undefined) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
if (type.kind === "class") {
|
|
49
|
+
return { ...name, strategy: "construct" };
|
|
50
|
+
}
|
|
51
|
+
return type.kind === "record" ? recordCallerOutAllocation(context, name, type) : undefined;
|
|
52
|
+
};
|
|
53
|
+
const renderCallerOutInstance = (context, parameter) => {
|
|
54
|
+
const allocation = callerOutAllocation(context, parameter);
|
|
55
|
+
if (allocation === undefined) {
|
|
56
|
+
throw new Error("renderCallerOutInstance: expected a caller-allocated out-parameter with a known layout");
|
|
57
|
+
}
|
|
58
|
+
const classExpression = context.qualify(allocation.namespaceName, sanitizeTypeIdentifier(allocation.typeName));
|
|
59
|
+
if (allocation.strategy === "construct") {
|
|
60
|
+
return `new ${classExpression}()`;
|
|
61
|
+
}
|
|
62
|
+
context.addRuntimeImport("alloc");
|
|
63
|
+
context.addRuntimeImport("wrapHandle");
|
|
64
|
+
return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;
|
|
21
65
|
};
|
|
22
|
-
const
|
|
66
|
+
const isCollectibleCallerOut = (context, parameter) => callerOutAllocation(context, parameter) !== undefined;
|
|
67
|
+
const isAllocatableCallerOut = (context, parameter) => underlyingParamKind(context, parameter) === "record" && isCollectibleCallerOut(context, parameter);
|
|
23
68
|
const isRecordInout = (context, parameter) => isInoutParameter(parameter) && underlyingParamKind(context, parameter) === "record";
|
|
24
69
|
const isHandlePassing = (context, ref) => {
|
|
25
70
|
const type = context.library.typeFor(ref);
|
|
@@ -50,5 +95,5 @@ const isClosureType = (context, ref) => {
|
|
|
50
95
|
const name = context.library.nameFor(ref);
|
|
51
96
|
return name?.namespaceName === "GObject" && name.typeName === "Closure";
|
|
52
97
|
};
|
|
53
|
-
export { isClosureType, isHandlePassedInPlace, isCollectibleCallerOut,
|
|
98
|
+
export { isAllocatableCallerOut, isClosureType, isHandlePassedInPlace, isCollectibleCallerOut, isRecordInout, isHandlePassing, renderCallerOutInstance, underlyingType, };
|
|
54
99
|
//# sourceMappingURL=param-marshal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param-marshal.js","sourceRoot":"","sources":["../../../src/store/gi/param-marshal.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE7E,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAE,SAAuB,EAAW,EAAE;IACvF,IAAI,SAAS,CAAC,SAAS,KAAK,KAAK,IAAI,SAAS,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,CACH,CAAC,SAAS,CAAC,eAAe,IAAI,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC;QAC9D,SAAS,CAAC,IAAI,KAAK,SAAS;QAC5B,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAC3C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,GAAW,EAAuB,EAAE;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAE,SAAuB,EAA+B,EAAE,CACzG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AAE7F,MAAM,sBAAsB,GAAG,CAAC,OAAsB,EAAE,SAAuB,EAAW,EAAE;IACxF,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAErD,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAsB,EAAE,SAAuB,EAAW,EAAE,CACnF,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC;AAEzD,MAAM,aAAa,GAAG,CAAC,OAAsB,EAAE,SAAuB,EAAW,EAAE,CAC/E,gBAAgB,CAAC,SAAS,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC;AAExF,MAAM,eAAe,GAAG,CAAC,OAAsB,EAAE,GAAW,EAAW,EAAE;IACrE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,CAAC;YACb,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAsB,EAAE,GAAW,EAAW,EAAE;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO,IAAI,EAAE,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;AAC5E,CAAC,CAAC;AAEF,OAAO,EACH,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,cAAc,GACjB,CAAC","sourcesContent":["import type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { type GirParameter, isInoutParameter } from \"../../gir/parameter.js\";\n\nconst isHandlePassedInPlace = (context: ModuleContext, parameter: GirParameter): boolean => {\n if (parameter.direction !== \"out\" && parameter.direction !== \"inout\") {\n return false;\n }\n\n return (\n (parameter.callerAllocates || parameter.direction === \"inout\") &&\n parameter.type !== undefined &&\n isHandlePassing(context, parameter.type)\n );\n};\n\nconst underlyingType = (context: ModuleContext, ref: TypeId): GirType | undefined => {\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"alias\") {\n return type;\n }\n\n return type.value.target === undefined ? undefined : underlyingType(context, type.value.target);\n};\n\nconst underlyingParamKind = (context: ModuleContext, parameter: GirParameter): GirType[\"kind\"] | undefined =>\n parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;\n\nconst isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean => {\n const kind = underlyingParamKind(context, parameter);\n\n return kind === \"record\" || kind === \"class\";\n};\n\nconst isRecordCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n underlyingParamKind(context, parameter) === \"record\";\n\nconst isRecordInout = (context: ModuleContext, parameter: GirParameter): boolean =>\n isInoutParameter(parameter) && underlyingParamKind(context, parameter) === \"record\";\n\nconst isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return true;\n }\n\n switch (type.kind) {\n case \"class\":\n case \"interface\":\n case \"record\": {\n return true;\n }\n case \"alias\": {\n return type.value.target !== undefined && isHandlePassing(context, type.value.target);\n }\n case \"callback\":\n case \"carray\":\n case \"enum\":\n case \"hashtable\":\n case \"list\":\n case \"primitive\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isClosureType = (context: ModuleContext, ref: TypeId): boolean => {\n const name = context.library.nameFor(ref);\n\n return name?.namespaceName === \"GObject\" && name.typeName === \"Closure\";\n};\n\nexport {\n isClosureType,\n isHandlePassedInPlace,\n isCollectibleCallerOut,\n isRecordCallerOut,\n isRecordInout,\n isHandlePassing,\n underlyingType,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"param-marshal.js","sourceRoot":"","sources":["../../../src/store/gi/param-marshal.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeTypeIdentifier } from \"@gtkx/utils\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { type GirParameter, isInoutParameter } from \"../../gir/parameter.js\";\nimport { recordInlineSize } from \"./record-layout.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\ntype TypeName = { namespaceName: string; typeName: string };\ntype CallerOutAllocation = TypeName & ({ strategy: \"construct\" } | { strategy: \"allocate\"; size: number });\n\nconst isHandlePassedInPlace = (context: ModuleContext, parameter: GirParameter): boolean => {\n if (parameter.direction !== \"out\" && parameter.direction !== \"inout\") {\n return false;\n }\n\n return (\n (parameter.callerAllocates || parameter.direction === \"inout\") &&\n parameter.type !== undefined &&\n isHandlePassing(context, parameter.type)\n );\n};\n\nconst underlyingType = (context: ModuleContext, ref: TypeId): GirType | undefined => {\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"alias\") {\n return type;\n }\n\n return type.value.target === undefined ? undefined : underlyingType(context, type.value.target);\n};\n\nconst underlyingParamKind = (context: ModuleContext, parameter: GirParameter): GirType[\"kind\"] | undefined =>\n parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;\n\nconst resolvedTypeName = (context: ModuleContext, ref: TypeId | undefined): TypeName | undefined => {\n let current = ref;\n\n while (current !== undefined) {\n const resolved = context.library.typeFor(current);\n\n if (resolved?.kind === \"alias\" && resolved.value.target !== undefined) {\n current = resolved.value.target;\n continue;\n }\n\n return context.library.nameFor(current);\n }\n\n return undefined;\n};\n\nconst recordCallerOutAllocation = (\n context: ModuleContext,\n name: TypeName,\n type: Extract<GirType, { kind: \"record\" }>,\n): CallerOutAllocation | undefined => {\n const size = recordInlineSize(context, type.value);\n\n if (size === undefined) {\n return undefined;\n }\n\n return isConstructibleRecord(context, type.namespace.name, type.value)\n ? { ...name, strategy: \"construct\" }\n : { ...name, strategy: \"allocate\", size };\n};\n\nconst callerOutAllocation = (context: ModuleContext, parameter: GirParameter): CallerOutAllocation | undefined => {\n const name = resolvedTypeName(context, parameter.type);\n const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);\n\n if (name === undefined || type === undefined) {\n return undefined;\n }\n\n if (type.kind === \"class\") {\n return { ...name, strategy: \"construct\" };\n }\n\n return type.kind === \"record\" ? recordCallerOutAllocation(context, name, type) : undefined;\n};\n\nconst renderCallerOutInstance = (context: ModuleContext, parameter: GirParameter): string => {\n const allocation = callerOutAllocation(context, parameter);\n\n if (allocation === undefined) {\n throw new Error(\"renderCallerOutInstance: expected a caller-allocated out-parameter with a known layout\");\n }\n\n const classExpression = context.qualify(allocation.namespaceName, sanitizeTypeIdentifier(allocation.typeName));\n\n if (allocation.strategy === \"construct\") {\n return `new ${classExpression}()`;\n }\n\n context.addRuntimeImport(\"alloc\");\n context.addRuntimeImport(\"wrapHandle\");\n\n return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;\n};\n\nconst isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n callerOutAllocation(context, parameter) !== undefined;\n\nconst isAllocatableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n underlyingParamKind(context, parameter) === \"record\" && isCollectibleCallerOut(context, parameter);\n\nconst isRecordInout = (context: ModuleContext, parameter: GirParameter): boolean =>\n isInoutParameter(parameter) && underlyingParamKind(context, parameter) === \"record\";\n\nconst isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return true;\n }\n\n switch (type.kind) {\n case \"class\":\n case \"interface\":\n case \"record\": {\n return true;\n }\n case \"alias\": {\n return type.value.target !== undefined && isHandlePassing(context, type.value.target);\n }\n case \"callback\":\n case \"carray\":\n case \"enum\":\n case \"hashtable\":\n case \"list\":\n case \"primitive\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isClosureType = (context: ModuleContext, ref: TypeId): boolean => {\n const name = context.library.nameFor(ref);\n\n return name?.namespaceName === \"GObject\" && name.typeName === \"Closure\";\n};\n\nexport {\n isAllocatableCallerOut,\n isClosureType,\n isHandlePassedInPlace,\n isCollectibleCallerOut,\n isRecordInout,\n isHandlePassing,\n renderCallerOutInstance,\n underlyingType,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/store/gi/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/store/gi/pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAuBrE,QAAA,MAAM,uBAAuB,GAAI,WAAW,YAAY,EAAE,SAAS,OAAO,KAAG,MAe5E,CAAC;AA4GF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
+
import { sanitizeTypeIdentifier } from "@gtkx/utils";
|
|
1
2
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
3
|
+
import { getParentRef } from "../../gir/ancestry.js";
|
|
4
|
+
import { isEmittableEntity } from "../../gir/emittable.js";
|
|
2
5
|
import { PRIMITIVE_TS_TYPE, primitiveCategory } from "../../gir/primitives.js";
|
|
3
|
-
import { splitOptionalNamespace } from "../../gir/type-ref.js";
|
|
4
6
|
import { ModuleContext } from "../../writer/context.js";
|
|
5
7
|
import { generateCallback } from "./callback.js";
|
|
6
8
|
import { generateClass } from "./class.js";
|
|
7
9
|
import { generateConstant } from "./constant.js";
|
|
8
10
|
import { getDoc } from "./doc-spec.js";
|
|
9
11
|
import { generateEnum } from "./enum.js";
|
|
10
|
-
import {
|
|
12
|
+
import { generateNamespaceFunction } from "./function.js";
|
|
11
13
|
import { generateInterface } from "./interface.js";
|
|
12
14
|
import { generateRecord } from "./record.js";
|
|
13
15
|
const generateNamespaceModule = (namespace, library) => {
|
|
@@ -15,6 +17,11 @@ const generateNamespaceModule = (namespace, library) => {
|
|
|
15
17
|
context.addGObjectBootstrapImports();
|
|
16
18
|
generateNamespaceTypes(context, namespace);
|
|
17
19
|
generateNamespaceMembers(context, namespace);
|
|
20
|
+
if (!context.module.hasExports()) {
|
|
21
|
+
throw new Error(`GIR file at ${namespace.girFile} has nothing to generate: its ${namespace.name} namespace produces a ` +
|
|
22
|
+
"module with no exports, so the file is empty, truncated, or declares only entries GIR marks as not " +
|
|
23
|
+
"introspectable");
|
|
24
|
+
}
|
|
18
25
|
return context.module.toSource();
|
|
19
26
|
};
|
|
20
27
|
const generateNamespaceTypes = (context, namespace) => {
|
|
@@ -38,7 +45,6 @@ const generateNamespaceMembers = (context, namespace) => {
|
|
|
38
45
|
for (const fn of namespace.functions) {
|
|
39
46
|
generateNamespaceFunction(context, fn);
|
|
40
47
|
}
|
|
41
|
-
generateNamespaceBootstrap(context, namespace);
|
|
42
48
|
for (const constant of namespace.constants) {
|
|
43
49
|
generateConstant(context, constant);
|
|
44
50
|
}
|
|
@@ -47,10 +53,18 @@ const generateNamespaceMembers = (context, namespace) => {
|
|
|
47
53
|
}
|
|
48
54
|
};
|
|
49
55
|
const generateAlias = (context, alias) => {
|
|
56
|
+
if (!isEmittableEntity(alias)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
50
59
|
const category = alias.cType === undefined ? undefined : primitiveCategory(alias.cType);
|
|
51
60
|
const targetType = category === "gtype" ? PRIMITIVE_TS_TYPE.gtype : renderTsType(context, alias.target);
|
|
52
61
|
const doc = getDoc(alias);
|
|
53
|
-
|
|
62
|
+
const name = sanitizeTypeIdentifier(alias.name);
|
|
63
|
+
context.declare({
|
|
64
|
+
name,
|
|
65
|
+
code: `${doc}export type ${name} = ${targetType};`,
|
|
66
|
+
owner: alias.name,
|
|
67
|
+
});
|
|
54
68
|
};
|
|
55
69
|
const visitClass = (state, klass) => {
|
|
56
70
|
if (state.placed.has(klass) || state.visiting.has(klass)) {
|
|
@@ -83,14 +97,11 @@ const topologicalClassOrder = (classes, namespaceName) => {
|
|
|
83
97
|
return state.result;
|
|
84
98
|
};
|
|
85
99
|
const sameNamespaceParent = (klass, namespaceName, byLocalName) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
const [parentNamespace, typeName] = splitOptionalNamespace(klass.parent);
|
|
90
|
-
if (parentNamespace !== undefined && parentNamespace !== namespaceName) {
|
|
100
|
+
const parent = getParentRef(klass);
|
|
101
|
+
if (parent === undefined || (parent.namespaceName !== undefined && parent.namespaceName !== namespaceName)) {
|
|
91
102
|
return undefined;
|
|
92
103
|
}
|
|
93
|
-
return byLocalName.get(typeName);
|
|
104
|
+
return byLocalName.get(parent.typeName);
|
|
94
105
|
};
|
|
95
106
|
export { generateNamespaceModule };
|
|
96
107
|
//# sourceMappingURL=pipeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/store/gi/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/store/gi/pipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeTypeIdentifier } from \"@gtkx/utils\";\nimport type { GirClass } from \"../../gir/class.js\";\nimport type { Library } from \"../../gir/library.js\";\nimport type { GirAlias, GirNamespace } from \"../../gir/namespace.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { getParentRef } from \"../../gir/ancestry.js\";\nimport { isEmittableEntity } from \"../../gir/emittable.js\";\nimport { PRIMITIVE_TS_TYPE, primitiveCategory } from \"../../gir/primitives.js\";\nimport { ModuleContext } from \"../../writer/context.js\";\nimport { generateCallback } from \"./callback.js\";\nimport { generateClass } from \"./class.js\";\nimport { generateConstant } from \"./constant.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { generateEnum } from \"./enum.js\";\nimport { generateNamespaceFunction } from \"./function.js\";\nimport { generateInterface } from \"./interface.js\";\nimport { generateRecord } from \"./record.js\";\n\ntype TopologicalState = {\n namespaceName: string;\n byLocalName: Map<string, GirClass>;\n placed: Set<GirClass>;\n visiting: Set<GirClass>;\n result: GirClass[];\n};\n\nconst generateNamespaceModule = (namespace: GirNamespace, library: Library): string => {\n const context = new ModuleContext(namespace, library);\n context.addGObjectBootstrapImports();\n generateNamespaceTypes(context, namespace);\n generateNamespaceMembers(context, namespace);\n\n if (!context.module.hasExports()) {\n throw new Error(\n `GIR file at ${namespace.girFile} has nothing to generate: its ${namespace.name} namespace produces a ` +\n \"module with no exports, so the file is empty, truncated, or declares only entries GIR marks as not \" +\n \"introspectable\",\n );\n }\n\n return context.module.toSource();\n};\n\nconst generateNamespaceTypes = (context: ModuleContext, namespace: GirNamespace): void => {\n for (const enumeration of namespace.enums) {\n generateEnum(context, enumeration);\n }\n\n for (const record of namespace.records) {\n generateRecord(context, record);\n }\n\n for (const klass of topologicalClassOrder(namespace.classes, namespace.name)) {\n generateClass(context, klass);\n }\n\n for (const iface of namespace.interfaces) {\n generateInterface(context, iface);\n }\n};\n\nconst generateNamespaceMembers = (context: ModuleContext, namespace: GirNamespace): void => {\n for (const callback of namespace.callbacks) {\n generateCallback(context, callback);\n }\n\n for (const fn of namespace.functions) {\n generateNamespaceFunction(context, fn);\n }\n\n for (const constant of namespace.constants) {\n generateConstant(context, constant);\n }\n\n for (const alias of namespace.aliases) {\n generateAlias(context, alias);\n }\n};\n\nconst generateAlias = (context: ModuleContext, alias: GirAlias): void => {\n if (!isEmittableEntity(alias)) {\n return;\n }\n\n const category = alias.cType === undefined ? undefined : primitiveCategory(alias.cType);\n const targetType = category === \"gtype\" ? PRIMITIVE_TS_TYPE.gtype : renderTsType(context, alias.target);\n const doc = getDoc(alias);\n const name = sanitizeTypeIdentifier(alias.name);\n\n context.declare({\n name,\n code: `${doc}export type ${name} = ${targetType};`,\n owner: alias.name,\n });\n};\n\nconst visitClass = (state: TopologicalState, klass: GirClass): void => {\n if (state.placed.has(klass) || state.visiting.has(klass)) {\n return;\n }\n\n state.visiting.add(klass);\n const parent = sameNamespaceParent(klass, state.namespaceName, state.byLocalName);\n\n if (parent !== undefined) {\n visitClass(state, parent);\n }\n\n state.visiting.delete(klass);\n state.placed.add(klass);\n state.result.push(klass);\n};\n\nconst topologicalClassOrder = (classes: GirClass[], namespaceName: string): GirClass[] => {\n const byLocalName: Map<string, GirClass> = new Map();\n\n for (const klass of classes) {\n byLocalName.set(klass.name, klass);\n }\n\n const state: TopologicalState = {\n namespaceName,\n byLocalName,\n placed: new Set<GirClass>(),\n visiting: new Set<GirClass>(),\n result: [],\n };\n\n for (const klass of classes) {\n visitClass(state, klass);\n }\n\n return state.result;\n};\n\nconst sameNamespaceParent = (\n klass: GirClass,\n namespaceName: string,\n byLocalName: Map<string, GirClass>,\n): GirClass | undefined => {\n const parent = getParentRef(klass);\n\n if (parent === undefined || (parent.namespaceName !== undefined && parent.namespaceName !== namespaceName)) {\n return undefined;\n }\n\n return byLocalName.get(parent.typeName);\n};\n\nexport { generateNamespaceModule };\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { GirClass } from "../../gir/class.js";
|
|
2
2
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
|
+
import type { Declaration } from "../../writer/module.js";
|
|
3
4
|
import { type ResolvedAccessor } from "./property-accessor.js";
|
|
4
|
-
declare const renderPropertyDeclarations: (context: ModuleContext, klass: GirClass, className: string, accessors: ResolvedAccessor[]) =>
|
|
5
|
+
declare const renderPropertyDeclarations: (context: ModuleContext, klass: GirClass, className: string, accessors: ResolvedAccessor[]) => Declaration[];
|
|
5
6
|
export { renderPropertyDeclarations };
|
|
6
7
|
//# sourceMappingURL=properties.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/store/gi/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/store/gi/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,EAAe,KAAK,gBAAgB,EAAwB,MAAM,wBAAwB,CAAC;AAuBlG,QAAA,MAAM,0BAA0B,GAC5B,SAAS,aAAa,EACtB,OAAO,QAAQ,EACf,WAAW,MAAM,EACjB,WAAW,gBAAgB,EAAE,KAC9B,WAAW,EAkBb,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { renderBracedOrEmpty } from "../../writer/emit.js";
|
|
|
3
3
|
import { parentCompanionRef } from "./companion.js";
|
|
4
4
|
import { propertyDoc, resolveOwnerAccessor } from "./property-accessor.js";
|
|
5
5
|
const PROPERTIES_SUFFIX = "Properties";
|
|
6
|
-
const propertyEntry = (accessor) => `${propertyDoc(accessor.property)}${accessor.jsName}: ${accessor.
|
|
6
|
+
const propertyEntry = (accessor) => `${propertyDoc(accessor.property)}${accessor.jsName}: ${accessor.readType};`;
|
|
7
7
|
const interfaceEntries = (context, klass) => {
|
|
8
8
|
const entries = [];
|
|
9
9
|
for (const { owner, property } of collectInterfaceProperties(context, klass)) {
|
|
@@ -24,8 +24,11 @@ const renderPropertyDeclarations = (context, klass, className, accessors) => {
|
|
|
24
24
|
];
|
|
25
25
|
const map = `${className}${PROPERTIES_SUFFIX}`;
|
|
26
26
|
return [
|
|
27
|
-
renderBracedOrEmpty(`export interface ${map}${extendsClause}`, entries.join("\n")),
|
|
28
|
-
|
|
27
|
+
{ name: map, code: renderBracedOrEmpty(`export interface ${map}${extendsClause}`, entries.join("\n")) },
|
|
28
|
+
{
|
|
29
|
+
name: className,
|
|
30
|
+
code: renderBracedOrEmpty(`export interface ${className}`, `__properties__: ${map};`),
|
|
31
|
+
},
|
|
29
32
|
];
|
|
30
33
|
};
|
|
31
34
|
export { renderPropertyDeclarations };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../src/store/gi/properties.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../src/store/gi/properties.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAyB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAElG,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAEvC,MAAM,aAAa,GAAG,CAAC,QAA0B,EAAU,EAAE,CACzD,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,GAAG,CAAC;AAEjF,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAY,EAAE;IAC3E,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAExE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAC/B,OAAsB,EACtB,KAAe,EACf,SAAiB,EACjB,SAA6B,EAChB,EAAE;IACf,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,SAAS,EAAE,CAAC;IAE7E,MAAM,OAAO,GAAG;QACZ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChG,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;KACtC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,iBAAiB,EAAE,CAAC;IAE/C,OAAO;QACH,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,CAAC,oBAAoB,GAAG,GAAG,aAAa,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;QACvG;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,mBAAmB,CAAC,oBAAoB,SAAS,EAAE,EAAE,mBAAmB,GAAG,GAAG,CAAC;SACxF;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,0BAA0B,EAAE,CAAC","sourcesContent":["import type { GirClass } from \"../../gir/class.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport type { Declaration } from \"../../writer/module.js\";\nimport { collectInterfaceProperties } from \"../../analysis/inheritance.js\";\nimport { renderBracedOrEmpty } from \"../../writer/emit.js\";\nimport { parentCompanionRef } from \"./companion.js\";\nimport { propertyDoc, type ResolvedAccessor, resolveOwnerAccessor } from \"./property-accessor.js\";\n\nconst PROPERTIES_SUFFIX = \"Properties\";\n\nconst propertyEntry = (accessor: ResolvedAccessor): string =>\n `${propertyDoc(accessor.property)}${accessor.jsName}: ${accessor.readType};`;\n\nconst interfaceEntries = (context: ModuleContext, klass: GirClass): string[] => {\n const entries: string[] = [];\n\n for (const { owner, property } of collectInterfaceProperties(context, klass)) {\n const accessor = resolveOwnerAccessor(context, property, owner.methods);\n\n if (!accessor?.hasGetter) {\n continue;\n }\n\n entries.push(propertyEntry(accessor));\n }\n\n return entries;\n};\n\nconst renderPropertyDeclarations = (\n context: ModuleContext,\n klass: GirClass,\n className: string,\n accessors: ResolvedAccessor[],\n): Declaration[] => {\n const parentRef = parentCompanionRef(context, klass, PROPERTIES_SUFFIX);\n const extendsClause = parentRef === undefined ? \"\" : ` extends ${parentRef}`;\n\n const entries = [\n ...accessors.filter((accessor) => accessor.hasGetter).map((accessor) => propertyEntry(accessor)),\n ...interfaceEntries(context, klass),\n ];\n\n const map = `${className}${PROPERTIES_SUFFIX}`;\n\n return [\n { name: map, code: renderBracedOrEmpty(`export interface ${map}${extendsClause}`, entries.join(\"\\n\")) },\n {\n name: className,\n code: renderBracedOrEmpty(`export interface ${className}`, `__properties__: ${map};`),\n },\n ];\n};\n\nexport { renderPropertyDeclarations };\n"]}
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
import type { GirFunction } from "../../gir/function.js";
|
|
2
2
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
3
|
import { type GirProperty } from "../../gir/property.js";
|
|
4
|
+
type InheritedAccessorTypes = {
|
|
5
|
+
readType: string | undefined;
|
|
6
|
+
writeType: string | undefined;
|
|
7
|
+
};
|
|
4
8
|
type ResolvedAccessor = {
|
|
5
9
|
property: GirProperty;
|
|
6
10
|
jsName: string;
|
|
7
|
-
|
|
11
|
+
readType: string;
|
|
12
|
+
writeType: string;
|
|
8
13
|
hasGetter: boolean;
|
|
9
14
|
isWritable: boolean;
|
|
10
|
-
getterMember: string | undefined;
|
|
11
|
-
getterMethod: GirFunction | undefined;
|
|
12
|
-
setterMember: string | undefined;
|
|
13
15
|
};
|
|
14
16
|
type PropertyAccessorArgs = {
|
|
15
17
|
context: ModuleContext;
|
|
16
18
|
property: GirProperty;
|
|
17
19
|
claimedNames: Set<string>;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
inheritedTypes?: InheritedAccessorTypes | undefined;
|
|
21
|
+
inheritedNames?: Set<string> | undefined;
|
|
20
22
|
};
|
|
21
23
|
declare const resolveAccessor: (args: PropertyAccessorArgs) => ResolvedAccessor | undefined;
|
|
22
24
|
declare const resolveOwnerAccessor: (context: ModuleContext, property: GirProperty, methods: GirFunction[]) => ResolvedAccessor | undefined;
|
|
23
|
-
declare const
|
|
25
|
+
declare const resolveAccessorTypes: (context: ModuleContext, property: GirProperty, methods: GirFunction[]) => InheritedAccessorTypes | undefined;
|
|
24
26
|
declare const renderResolvedPropertyAccessor: (context: ModuleContext, property: GirProperty, accessor: ResolvedAccessor) => string;
|
|
25
27
|
declare const propertyDoc: (property: GirProperty) => string;
|
|
26
28
|
declare const renderPropertyAccessor: (args: PropertyAccessorArgs) => string | undefined;
|
|
27
29
|
declare const renderPropertyAccessorSignature: (args: PropertyAccessorArgs) => string | undefined;
|
|
28
|
-
export { propertyDoc, resolveAccessor, resolveOwnerAccessor,
|
|
30
|
+
export { propertyDoc, resolveAccessor, resolveOwnerAccessor, resolveAccessorTypes, renderResolvedPropertyAccessor, renderPropertyAccessor, renderPropertyAccessorSignature, type InheritedAccessorTypes, type ResolvedAccessor, type PropertyAccessorArgs, };
|
|
29
31
|
//# sourceMappingURL=property-accessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-accessor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/property-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"property-accessor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/property-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,KAAK,WAAW,EAA2B,MAAM,uBAAuB,CAAC;AAMlF,KAAK,sBAAsB,GAAG;IAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,KAAK,oBAAoB,GAAG;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,cAAc,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACpD,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;CAC5C,CAAC;AAsCF,QAAA,MAAM,eAAe,GAAI,MAAM,oBAAoB,KAAG,gBAAgB,GAAG,SAoBxE,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,aAAa,EACtB,UAAU,WAAW,EACrB,SAAS,WAAW,EAAE,KACvB,gBAAgB,GAAG,SAYrB,CAAC;AAEF,QAAA,MAAM,oBAAoB,GACtB,SAAS,aAAa,EACtB,UAAU,WAAW,EACrB,SAAS,WAAW,EAAE,KACvB,sBAAsB,GAAG,SAW3B,CAAC;AAeF,QAAA,MAAM,8BAA8B,GAChC,SAAS,aAAa,EACtB,UAAU,WAAW,EACrB,UAAU,gBAAgB,KAC3B,MAaF,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,UAAU,WAAW,KAAG,MACzB,CAAC;AAErB,QAAA,MAAM,sBAAsB,GAAI,MAAM,oBAAoB,KAAG,MAAM,GAAG,SACqC,CAAC;AAoB5G,QAAA,MAAM,+BAA+B,GAAI,MAAM,oBAAoB,KAAG,MAAM,GAAG,SAC8B,CAAC;AAqB9G,OAAO,EACH,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,8BAA8B,EAC9B,sBAAsB,EACtB,+BAA+B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC5B,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
|
|
2
2
|
import { renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
3
|
-
import { inputParameters } from "../../analysis/param-structure.js";
|
|
4
3
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
5
4
|
import { isConstructableProperty } from "../../gir/property.js";
|
|
6
5
|
import { renderBlock } from "../../writer/emit.js";
|
|
7
6
|
import { isEmittableCallable } from "./callables.js";
|
|
8
7
|
import { getDoc } from "./doc-spec.js";
|
|
9
|
-
import { methodExportName
|
|
8
|
+
import { methodExportName } from "./method.js";
|
|
9
|
+
const NON_NULLABLE_KINDS = new Set(["primitive", "enum"]);
|
|
10
10
|
const isNullablePropertyType = (context, type) => {
|
|
11
11
|
if (type === undefined) {
|
|
12
12
|
return false;
|
|
@@ -15,75 +15,55 @@ const isNullablePropertyType = (context, type) => {
|
|
|
15
15
|
if (resolved === undefined) {
|
|
16
16
|
return true;
|
|
17
17
|
}
|
|
18
|
-
if (resolved.kind === "primitive") {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
if (resolved.kind === "enum") {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
18
|
if (resolved.kind === "alias") {
|
|
25
19
|
return isNullablePropertyType(context, resolved.value.target);
|
|
26
20
|
}
|
|
27
|
-
return
|
|
21
|
+
return !NON_NULLABLE_KINDS.has(resolved.kind);
|
|
28
22
|
};
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
const { context, property, claimedNames } = args;
|
|
36
|
-
const member = delegateMember(property.getter, jsName, claimedNames);
|
|
37
|
-
return resolveDelegate(args, property.getter, member, (method) => inputParameters(context.library, method).length === 0 &&
|
|
38
|
-
!renderMethodReturnType(context, method).startsWith("["));
|
|
39
|
-
};
|
|
40
|
-
const resolveSetterDelegate = (args, jsName, isWritable) => {
|
|
41
|
-
const { context, property, claimedNames } = args;
|
|
42
|
-
const member = isWritable ? delegateMember(property.setter, jsName, claimedNames) : undefined;
|
|
43
|
-
return resolveDelegate(args, property.setter, member, (method) => inputParameters(context.library, method).length === 1);
|
|
44
|
-
};
|
|
45
|
-
const resolveOwnType = (context, property, getterMethod, setterMethod) => {
|
|
46
|
-
const setterParam = setterMethod?.parameters[0];
|
|
47
|
-
if (setterParam !== undefined) {
|
|
48
|
-
return renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional);
|
|
49
|
-
}
|
|
50
|
-
if (getterMethod !== undefined) {
|
|
51
|
-
return renderMethodReturnType(context, getterMethod);
|
|
52
|
-
}
|
|
53
|
-
return renderTsType(context, property.type, isNullablePropertyType(context, property.type));
|
|
54
|
-
};
|
|
55
|
-
const isSkippedAccessor = (property, jsName, claimedNames) => !property.introspectable || claimedNames.has(jsName) || jsName === "constructor";
|
|
56
|
-
const resolveTsType = (inheritedType, ownType) => inheritedType !== undefined && inheritedType !== ownType ? inheritedType : ownType;
|
|
23
|
+
const declaredPropertyType = (context, property) => renderTsType(context, property.type, property.defaultValue === "NULL" || isNullablePropertyType(context, property.type));
|
|
24
|
+
const isSkippedAccessor = (args, jsName) => !args.property.introspectable ||
|
|
25
|
+
args.claimedNames.has(jsName) ||
|
|
26
|
+
args.inheritedNames?.has(jsName) === true ||
|
|
27
|
+
jsName === "constructor";
|
|
28
|
+
const isAccessorEmittable = (args, jsName, isWritable) => !isSkippedAccessor(args, jsName) && (args.property.readable || isWritable);
|
|
57
29
|
const resolveAccessor = (args) => {
|
|
58
|
-
const {
|
|
30
|
+
const { property } = args;
|
|
59
31
|
const jsName = toCamelIdentifier(property.name);
|
|
60
|
-
if (isSkippedAccessor(property, jsName, claimedNames)) {
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
32
|
const isWritable = isConstructableProperty(property) && !property.constructOnly;
|
|
64
|
-
|
|
65
|
-
const { member: setterMember, method: setterMethod } = resolveSetterDelegate(args, jsName, isWritable);
|
|
66
|
-
const hasGetter = property.readable || getterMember !== undefined;
|
|
67
|
-
if (!hasGetter && !isWritable) {
|
|
33
|
+
if (!isAccessorEmittable(args, jsName, isWritable)) {
|
|
68
34
|
return undefined;
|
|
69
35
|
}
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
return {
|
|
36
|
+
const declared = declaredPropertyType(args.context, property);
|
|
37
|
+
const hasGetter = property.readable;
|
|
38
|
+
return {
|
|
39
|
+
property,
|
|
40
|
+
jsName,
|
|
41
|
+
readType: args.inheritedTypes?.readType ?? declared,
|
|
42
|
+
writeType: args.inheritedTypes?.writeType ?? declared,
|
|
43
|
+
hasGetter,
|
|
44
|
+
isWritable,
|
|
45
|
+
};
|
|
73
46
|
};
|
|
74
47
|
const resolveOwnerAccessor = (context, property, methods) => {
|
|
75
|
-
const methodByName = new Map();
|
|
76
48
|
const claimedNames = new Set();
|
|
77
49
|
for (const method of methods) {
|
|
78
50
|
if (!isEmittableCallable(context, method)) {
|
|
79
51
|
continue;
|
|
80
52
|
}
|
|
81
|
-
methodByName.set(method.name, method);
|
|
82
53
|
claimedNames.add(methodExportName(method));
|
|
83
54
|
}
|
|
84
|
-
return resolveAccessor({ context, property, claimedNames
|
|
55
|
+
return resolveAccessor({ context, property, claimedNames });
|
|
56
|
+
};
|
|
57
|
+
const resolveAccessorTypes = (context, property, methods) => {
|
|
58
|
+
const accessor = resolveOwnerAccessor(context, property, methods);
|
|
59
|
+
if (accessor === undefined) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
readType: accessor.hasGetter ? accessor.readType : undefined,
|
|
64
|
+
writeType: accessor.isWritable ? accessor.writeType : undefined,
|
|
65
|
+
};
|
|
85
66
|
};
|
|
86
|
-
const resolveAccessorType = (context, property, methods) => resolveOwnerAccessor(context, property, methods)?.tsType;
|
|
87
67
|
const withAccessor = (args, render) => {
|
|
88
68
|
const accessor = resolveAccessor(args);
|
|
89
69
|
if (accessor === undefined) {
|
|
@@ -92,30 +72,32 @@ const withAccessor = (args, render) => {
|
|
|
92
72
|
return render(accessor);
|
|
93
73
|
};
|
|
94
74
|
const renderResolvedPropertyAccessor = (context, property, accessor) => {
|
|
95
|
-
const { jsName,
|
|
75
|
+
const { jsName, readType, writeType, hasGetter, isWritable } = accessor;
|
|
96
76
|
const blocks = [];
|
|
97
77
|
if (hasGetter) {
|
|
98
|
-
|
|
99
|
-
blocks.push(renderBlock(`get ${jsName}(): ${tsType}`, getterBody));
|
|
78
|
+
blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGenericGetBody(context, property, readType)));
|
|
100
79
|
}
|
|
101
80
|
if (isWritable) {
|
|
102
|
-
|
|
103
|
-
blocks.push(renderBlock(`set ${jsName}(value: ${tsType})`, setterBody));
|
|
81
|
+
blocks.push(renderBlock(`set ${jsName}(value: ${writeType})`, renderGenericSetBody(context, property)));
|
|
104
82
|
}
|
|
105
83
|
return `${propertyDoc(property)}${blocks.join("\n\n")}`;
|
|
106
84
|
};
|
|
107
85
|
const propertyDoc = (property) => getDoc(property);
|
|
108
86
|
const renderPropertyAccessor = (args) => withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
if (hasGetter
|
|
112
|
-
return
|
|
87
|
+
const renderAccessorPairSignature = (accessor) => {
|
|
88
|
+
const { jsName, readType, writeType, hasGetter, isWritable } = accessor;
|
|
89
|
+
if (!hasGetter) {
|
|
90
|
+
return `set ${jsName}(value: ${writeType});`;
|
|
113
91
|
}
|
|
114
|
-
if (
|
|
115
|
-
return
|
|
92
|
+
if (!isWritable) {
|
|
93
|
+
return `get ${jsName}(): ${readType};`;
|
|
116
94
|
}
|
|
117
|
-
|
|
118
|
-
}
|
|
95
|
+
if (readType === writeType) {
|
|
96
|
+
return `${jsName}: ${readType};`;
|
|
97
|
+
}
|
|
98
|
+
return `get ${jsName}(): ${readType};\nset ${jsName}(value: ${writeType});`;
|
|
99
|
+
};
|
|
100
|
+
const renderPropertyAccessorSignature = (args) => withAccessor(args, (accessor) => `${propertyDoc(args.property)}${renderAccessorPairSignature(accessor)}`);
|
|
119
101
|
const renderPropertyDescriptor = (context, property) => renderDescriptor(context, property.type, property.transferOwnership);
|
|
120
102
|
const renderGenericGetBody = (context, property, tsType) => {
|
|
121
103
|
context.addRuntimeImport("getObjectProperty");
|
|
@@ -129,29 +111,5 @@ const renderGenericSetBody = (context, property) => {
|
|
|
129
111
|
const descriptor = renderPropertyDescriptor(context, property);
|
|
130
112
|
return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;
|
|
131
113
|
};
|
|
132
|
-
|
|
133
|
-
const { context, property, getterMember, getterMethod, tsType } = options;
|
|
134
|
-
if (getterMember === undefined) {
|
|
135
|
-
return renderGenericGetBody(context, property, tsType);
|
|
136
|
-
}
|
|
137
|
-
if (getterMethod === undefined) {
|
|
138
|
-
return `return this.${getterMember}() as ${tsType};`;
|
|
139
|
-
}
|
|
140
|
-
const getterType = renderMethodReturnType(context, getterMethod);
|
|
141
|
-
return getterType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;
|
|
142
|
-
};
|
|
143
|
-
const delegateMember = (attribute, accessorName, claimedNames) => {
|
|
144
|
-
if (attribute === undefined) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
const member = camelCase(attribute);
|
|
148
|
-
if (member === accessorName) {
|
|
149
|
-
return undefined;
|
|
150
|
-
}
|
|
151
|
-
if (!claimedNames.has(member)) {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
return member;
|
|
155
|
-
};
|
|
156
|
-
export { propertyDoc, resolveAccessor, resolveOwnerAccessor, resolveAccessorType, renderResolvedPropertyAccessor, renderPropertyAccessor, renderPropertyAccessorSignature, };
|
|
114
|
+
export { propertyDoc, resolveAccessor, resolveOwnerAccessor, resolveAccessorTypes, renderResolvedPropertyAccessor, renderPropertyAccessor, renderPropertyAccessorSignature, };
|
|
157
115
|
//# sourceMappingURL=property-accessor.js.map
|