@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-accessor.js","sourceRoot":"","sources":["../../../src/store/gi/property-accessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelCase, sourceStringLiteral, toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirFunction } from \"../../gir/function.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { inputParameters } from \"../../analysis/param-structure.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { type GirProperty, isConstructableProperty } from \"../../gir/property.js\";\nimport { renderBlock } from \"../../writer/emit.js\";\nimport { isEmittableCallable } from \"./callables.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { methodExportName, renderMethodReturnType } from \"./method.js\";\n\ntype ResolvedAccessor = {\n property: GirProperty;\n jsName: string;\n tsType: string;\n hasGetter: boolean;\n isWritable: boolean;\n getterMember: string | undefined;\n getterMethod: GirFunction | undefined;\n setterMember: string | undefined;\n};\n\ntype PropertyAccessorArgs = {\n context: ModuleContext;\n property: GirProperty;\n claimedNames: Set<string>;\n methodByName: Map<string, GirFunction>;\n inheritedType?: string | undefined;\n};\n\ntype AccessorDelegate = { member: string | undefined; method: GirFunction | undefined };\n\ntype GetterBodyOptions = {\n context: ModuleContext;\n property: GirProperty;\n getterMember: string | undefined;\n getterMethod: GirFunction | undefined;\n tsType: string;\n};\n\nconst isNullablePropertyType = (context: ModuleContext, type: TypeId | undefined): boolean => {\n if (type === undefined) {\n return false;\n }\n\n const resolved = context.library.typeFor(type);\n\n if (resolved === undefined) {\n return true;\n }\n\n if (resolved.kind === \"primitive\") {\n return false;\n }\n\n if (resolved.kind === \"enum\") {\n return false;\n }\n\n if (resolved.kind === \"alias\") {\n return isNullablePropertyType(context, resolved.value.target);\n }\n\n return true;\n};\n\nconst resolveDelegate = (\n args: PropertyAccessorArgs,\n attribute: string | undefined,\n member: string | undefined,\n isDelegatable: (method: GirFunction) => boolean,\n): AccessorDelegate => {\n const method = member !== undefined && attribute !== undefined ? args.methodByName.get(attribute) : undefined;\n const canDelegate = method === undefined || isDelegatable(method);\n\n return canDelegate ? { member, method } : { member: undefined, method: undefined };\n};\n\nconst resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate => {\n const { context, property, claimedNames } = args;\n const member = delegateMember(property.getter, jsName, claimedNames);\n\n return resolveDelegate(\n args,\n property.getter,\n member,\n (method) =>\n inputParameters(context.library, method).length === 0 &&\n !renderMethodReturnType(context, method).startsWith(\"[\"),\n );\n};\n\nconst resolveSetterDelegate = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): AccessorDelegate => {\n const { context, property, claimedNames } = args;\n const member = isWritable ? delegateMember(property.setter, jsName, claimedNames) : undefined;\n\n return resolveDelegate(\n args,\n property.setter,\n member,\n (method) => inputParameters(context.library, method).length === 1,\n );\n};\n\nconst resolveOwnType = (\n context: ModuleContext,\n property: GirProperty,\n getterMethod: GirFunction | undefined,\n setterMethod: GirFunction | undefined,\n): string => {\n const setterParam = setterMethod?.parameters[0];\n\n if (setterParam !== undefined) {\n return renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional);\n }\n\n if (getterMethod !== undefined) {\n return renderMethodReturnType(context, getterMethod);\n }\n\n return renderTsType(context, property.type, isNullablePropertyType(context, property.type));\n};\n\nconst isSkippedAccessor = (property: GirProperty, jsName: string, claimedNames: Set<string>): boolean =>\n !property.introspectable || claimedNames.has(jsName) || jsName === \"constructor\";\n\nconst resolveTsType = (inheritedType: string | undefined, ownType: string): string =>\n inheritedType !== undefined && inheritedType !== ownType ? inheritedType : ownType;\n\nconst resolveAccessor = (args: PropertyAccessorArgs): ResolvedAccessor | undefined => {\n const { context, property, claimedNames } = args;\n const jsName = toCamelIdentifier(property.name);\n\n if (isSkippedAccessor(property, jsName, claimedNames)) {\n return undefined;\n }\n\n const isWritable = isConstructableProperty(property) && !property.constructOnly;\n const { member: getterMember, method: getterMethod } = resolveGetterDelegate(args, jsName);\n const { member: setterMember, method: setterMethod } = resolveSetterDelegate(args, jsName, isWritable);\n const hasGetter = property.readable || getterMember !== undefined;\n\n if (!hasGetter && !isWritable) {\n return undefined;\n }\n\n const ownType = resolveOwnType(context, property, getterMethod, setterMethod);\n const tsType = resolveTsType(args.inheritedType, ownType);\n\n return { property, jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember };\n};\n\nconst resolveOwnerAccessor = (\n context: ModuleContext,\n property: GirProperty,\n methods: GirFunction[],\n): ResolvedAccessor | undefined => {\n const methodByName: Map<string, GirFunction> = new Map();\n const claimedNames: Set<string> = new Set();\n\n for (const method of methods) {\n if (!isEmittableCallable(context, method)) {\n continue;\n }\n\n methodByName.set(method.name, method);\n claimedNames.add(methodExportName(method));\n }\n\n return resolveAccessor({ context, property, claimedNames, methodByName });\n};\n\nconst resolveAccessorType = (\n context: ModuleContext,\n property: GirProperty,\n methods: GirFunction[],\n): string | undefined => resolveOwnerAccessor(context, property, methods)?.tsType;\n\nconst withAccessor = (\n args: PropertyAccessorArgs,\n render: (accessor: ResolvedAccessor) => string,\n): string | undefined => {\n const accessor = resolveAccessor(args);\n\n if (accessor === undefined) {\n return undefined;\n }\n\n return render(accessor);\n};\n\nconst renderResolvedPropertyAccessor = (\n context: ModuleContext,\n property: GirProperty,\n accessor: ResolvedAccessor,\n): string => {\n const { jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember } = accessor;\n const blocks: string[] = [];\n\n if (hasGetter) {\n const getterBody = renderGetterBody({ context, property, getterMember, getterMethod, tsType });\n blocks.push(renderBlock(`get ${jsName}(): ${tsType}`, getterBody));\n }\n\n if (isWritable) {\n const setterBody =\n setterMember === undefined ? renderGenericSetBody(context, property) : `this.${setterMember}(value);`;\n\n blocks.push(renderBlock(`set ${jsName}(value: ${tsType})`, setterBody));\n }\n\n return `${propertyDoc(property)}${blocks.join(\"\\n\\n\")}`;\n};\n\nconst propertyDoc = (property: GirProperty): string =>\n getDoc(property);\n\nconst renderPropertyAccessor = (args: PropertyAccessorArgs): string | undefined =>\n withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));\n\nconst renderPropertyAccessorSignature = (args: PropertyAccessorArgs): string | undefined =>\n withAccessor(args, ({ jsName, tsType, hasGetter, isWritable }) => {\n const doc = propertyDoc(args.property);\n\n if (hasGetter && isWritable) {\n return `${doc}${jsName}: ${tsType};`;\n }\n\n if (hasGetter) {\n return `${doc}get ${jsName}(): ${tsType};`;\n }\n\n return `${doc}set ${jsName}(value: ${tsType});`;\n });\n\nconst renderPropertyDescriptor = (context: ModuleContext, property: GirProperty): string =>\n renderDescriptor(context, property.type, property.transferOwnership);\n\nconst renderGenericGetBody = (context: ModuleContext, property: GirProperty, tsType: string): string => {\n context.addRuntimeImport(\"getObjectProperty\");\n context.addRuntimeImport(\"t\");\n const descriptor = renderPropertyDescriptor(context, property);\n\n return `return getObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}) as ${tsType};`;\n};\n\nconst renderGenericSetBody = (context: ModuleContext, property: GirProperty): string => {\n context.addRuntimeImport(\"setObjectProperty\");\n context.addRuntimeImport(\"t\");\n const descriptor = renderPropertyDescriptor(context, property);\n\n return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;\n};\n\nconst renderGetterBody = (options: GetterBodyOptions): string => {\n const { context, property, getterMember, getterMethod, tsType } = options;\n\n if (getterMember === undefined) {\n return renderGenericGetBody(context, property, tsType);\n }\n\n if (getterMethod === undefined) {\n return `return this.${getterMember}() as ${tsType};`;\n }\n\n const getterType = renderMethodReturnType(context, getterMethod);\n\n return getterType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;\n};\n\nconst delegateMember = (\n attribute: string | undefined,\n accessorName: string,\n claimedNames: Set<string>,\n): string | undefined => {\n if (attribute === undefined) {\n return undefined;\n }\n\n const member = camelCase(attribute);\n\n if (member === accessorName) {\n return undefined;\n }\n\n if (!claimedNames.has(member)) {\n return undefined;\n }\n\n return member;\n};\n\nexport {\n propertyDoc,\n resolveAccessor,\n resolveOwnerAccessor,\n resolveAccessorType,\n renderResolvedPropertyAccessor,\n renderPropertyAccessor,\n renderPropertyAccessorSignature,\n type ResolvedAccessor,\n type PropertyAccessorArgs,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"property-accessor.js","sourceRoot":"","sources":["../../../src/store/gi/property-accessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { sourceStringLiteral, toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirFunction } from \"../../gir/function.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { type GirProperty, isConstructableProperty } from \"../../gir/property.js\";\nimport { renderBlock } from \"../../writer/emit.js\";\nimport { isEmittableCallable } from \"./callables.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { methodExportName } from \"./method.js\";\n\ntype InheritedAccessorTypes = {\n readType: string | undefined;\n writeType: string | undefined;\n};\n\ntype ResolvedAccessor = {\n property: GirProperty;\n jsName: string;\n readType: string;\n writeType: string;\n hasGetter: boolean;\n isWritable: boolean;\n};\n\ntype PropertyAccessorArgs = {\n context: ModuleContext;\n property: GirProperty;\n claimedNames: Set<string>;\n inheritedTypes?: InheritedAccessorTypes | undefined;\n inheritedNames?: Set<string> | undefined;\n};\n\nconst NON_NULLABLE_KINDS: Set<string> = new Set([\"primitive\", \"enum\"]);\n\nconst isNullablePropertyType = (context: ModuleContext, type: TypeId | undefined): boolean => {\n if (type === undefined) {\n return false;\n }\n\n const resolved = context.library.typeFor(type);\n\n if (resolved === undefined) {\n return true;\n }\n\n if (resolved.kind === \"alias\") {\n return isNullablePropertyType(context, resolved.value.target);\n }\n\n return !NON_NULLABLE_KINDS.has(resolved.kind);\n};\n\nconst declaredPropertyType = (context: ModuleContext, property: GirProperty): string =>\n renderTsType(\n context,\n property.type,\n property.defaultValue === \"NULL\" || isNullablePropertyType(context, property.type),\n );\n\nconst isSkippedAccessor = (args: PropertyAccessorArgs, jsName: string): boolean =>\n !args.property.introspectable ||\n args.claimedNames.has(jsName) ||\n args.inheritedNames?.has(jsName) === true ||\n jsName === \"constructor\";\n\nconst isAccessorEmittable = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): boolean =>\n !isSkippedAccessor(args, jsName) && (args.property.readable || isWritable);\n\nconst resolveAccessor = (args: PropertyAccessorArgs): ResolvedAccessor | undefined => {\n const { property } = args;\n const jsName = toCamelIdentifier(property.name);\n const isWritable = isConstructableProperty(property) && !property.constructOnly;\n\n if (!isAccessorEmittable(args, jsName, isWritable)) {\n return undefined;\n }\n\n const declared = declaredPropertyType(args.context, property);\n const hasGetter = property.readable;\n\n return {\n property,\n jsName,\n readType: args.inheritedTypes?.readType ?? declared,\n writeType: args.inheritedTypes?.writeType ?? declared,\n hasGetter,\n isWritable,\n };\n};\n\nconst resolveOwnerAccessor = (\n context: ModuleContext,\n property: GirProperty,\n methods: GirFunction[],\n): ResolvedAccessor | undefined => {\n const claimedNames: Set<string> = new Set();\n\n for (const method of methods) {\n if (!isEmittableCallable(context, method)) {\n continue;\n }\n\n claimedNames.add(methodExportName(method));\n }\n\n return resolveAccessor({ context, property, claimedNames });\n};\n\nconst resolveAccessorTypes = (\n context: ModuleContext,\n property: GirProperty,\n methods: GirFunction[],\n): InheritedAccessorTypes | undefined => {\n const accessor = resolveOwnerAccessor(context, property, methods);\n\n if (accessor === undefined) {\n return undefined;\n }\n\n return {\n readType: accessor.hasGetter ? accessor.readType : undefined,\n writeType: accessor.isWritable ? accessor.writeType : undefined,\n };\n};\n\nconst withAccessor = (\n args: PropertyAccessorArgs,\n render: (accessor: ResolvedAccessor) => string,\n): string | undefined => {\n const accessor = resolveAccessor(args);\n\n if (accessor === undefined) {\n return undefined;\n }\n\n return render(accessor);\n};\n\nconst renderResolvedPropertyAccessor = (\n context: ModuleContext,\n property: GirProperty,\n accessor: ResolvedAccessor,\n): string => {\n const { jsName, readType, writeType, hasGetter, isWritable } = accessor;\n const blocks: string[] = [];\n\n if (hasGetter) {\n blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGenericGetBody(context, property, readType)));\n }\n\n if (isWritable) {\n blocks.push(renderBlock(`set ${jsName}(value: ${writeType})`, renderGenericSetBody(context, property)));\n }\n\n return `${propertyDoc(property)}${blocks.join(\"\\n\\n\")}`;\n};\n\nconst propertyDoc = (property: GirProperty): string =>\n getDoc(property);\n\nconst renderPropertyAccessor = (args: PropertyAccessorArgs): string | undefined =>\n withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));\n\nconst renderAccessorPairSignature = (accessor: ResolvedAccessor): string => {\n const { jsName, readType, writeType, hasGetter, isWritable } = accessor;\n\n if (!hasGetter) {\n return `set ${jsName}(value: ${writeType});`;\n }\n\n if (!isWritable) {\n return `get ${jsName}(): ${readType};`;\n }\n\n if (readType === writeType) {\n return `${jsName}: ${readType};`;\n }\n\n return `get ${jsName}(): ${readType};\\nset ${jsName}(value: ${writeType});`;\n};\n\nconst renderPropertyAccessorSignature = (args: PropertyAccessorArgs): string | undefined =>\n withAccessor(args, (accessor) => `${propertyDoc(args.property)}${renderAccessorPairSignature(accessor)}`);\n\nconst renderPropertyDescriptor = (context: ModuleContext, property: GirProperty): string =>\n renderDescriptor(context, property.type, property.transferOwnership);\n\nconst renderGenericGetBody = (context: ModuleContext, property: GirProperty, tsType: string): string => {\n context.addRuntimeImport(\"getObjectProperty\");\n context.addRuntimeImport(\"t\");\n const descriptor = renderPropertyDescriptor(context, property);\n\n return `return getObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}) as ${tsType};`;\n};\n\nconst renderGenericSetBody = (context: ModuleContext, property: GirProperty): string => {\n context.addRuntimeImport(\"setObjectProperty\");\n context.addRuntimeImport(\"t\");\n const descriptor = renderPropertyDescriptor(context, property);\n\n return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;\n};\n\nexport {\n propertyDoc,\n resolveAccessor,\n resolveOwnerAccessor,\n resolveAccessorTypes,\n renderResolvedPropertyAccessor,\n renderPropertyAccessor,\n renderPropertyAccessorSignature,\n type InheritedAccessorTypes,\n type ResolvedAccessor,\n type PropertyAccessorArgs,\n};\n"]}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type { GirRecord } from "../../gir/record.js";
|
|
2
2
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
|
+
import { type Callables } from "./callables.js";
|
|
4
|
+
type RecordConstructorSpec = {
|
|
5
|
+
record: GirRecord;
|
|
6
|
+
className: string;
|
|
7
|
+
callables: Callables;
|
|
8
|
+
isErrorSubclass: boolean;
|
|
9
|
+
};
|
|
3
10
|
declare const renderRecordConstructorPropsInterface: (context: ModuleContext, record: GirRecord, className: string) => string;
|
|
4
|
-
declare const renderRecordConstructor: (context: ModuleContext,
|
|
11
|
+
declare const renderRecordConstructor: (context: ModuleContext, spec: RecordConstructorSpec) => string;
|
|
5
12
|
export { renderRecordConstructorPropsInterface, renderRecordConstructor };
|
|
6
13
|
//# sourceMappingURL=record-constructor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-constructor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-constructor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"record-constructor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-constructor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAS/D,KAAK,qBAAqB,GAAG;IACzB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC5B,CAAC;AAKF,QAAA,MAAM,qCAAqC,GACvC,SAAS,aAAa,EACtB,QAAQ,SAAS,EACjB,WAAW,MAAM,KAClB,MAaF,CAAC;AA0DF,QAAA,MAAM,uBAAuB,GAAI,SAAS,aAAa,EAAE,MAAM,qBAAqB,KAAG,MAyBtF,CAAC;AA+BF,OAAO,EAAE,qCAAqC,EAAE,uBAAuB,EAAE,CAAC"}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
|
|
2
2
|
import { renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
3
|
+
import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
|
|
3
4
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
4
5
|
import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
|
|
6
|
+
import { staticMembers } from "./callables.js";
|
|
5
7
|
import { getDoc } from "./doc-spec.js";
|
|
6
8
|
import { renderSourceGtype } from "./gtype-binding.js";
|
|
7
9
|
import { emitFieldWrite, isEmittableField, isInlineField } from "./record-field-accessor.js";
|
|
8
10
|
import { computeRecordFieldSlots } from "./record-layout.js";
|
|
9
11
|
import { isConstructibleRecord } from "./value-marshalable.js";
|
|
10
12
|
const isWritableFieldSlot = (context, entry) => entry.field.writable && isEmittableField(context, entry.field);
|
|
11
|
-
const isOpaque = (record) => record.opaque || record.disguised;
|
|
12
13
|
const renderRecordConstructorPropsInterface = (context, record, className) => {
|
|
13
14
|
const head = `export interface ${className}ConstructorProps`;
|
|
14
|
-
if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {
|
|
15
|
-
return renderBracedOrEmpty(head, "");
|
|
16
|
-
}
|
|
17
15
|
const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
18
16
|
const lines = slots
|
|
19
17
|
.filter((entry) => isWritableFieldSlot(context, entry))
|
|
@@ -21,8 +19,30 @@ const renderRecordConstructorPropsInterface = (context, record, className) => {
|
|
|
21
19
|
`${renderTsType(context, entry.field.type, true)};`);
|
|
22
20
|
return renderBracedOrEmpty(head, lines.join("\n"));
|
|
23
21
|
};
|
|
24
|
-
const
|
|
25
|
-
const
|
|
22
|
+
const isSelfReturning = (context, record, callable) => {
|
|
23
|
+
const ref = callable.returnValue.type;
|
|
24
|
+
const name = ref === undefined ? undefined : context.library.nameFor(ref);
|
|
25
|
+
return name?.namespaceName === context.namespace.name && name.typeName === record.name;
|
|
26
|
+
};
|
|
27
|
+
const renderStaticCall = (context, callable, name) => {
|
|
28
|
+
const args = inputParameters(context.library, callable).map(({ parameter, index }) => parameterIdentifier(parameter, index));
|
|
29
|
+
return `${name}(${args.join(", ")})`;
|
|
30
|
+
};
|
|
31
|
+
const constructionHint = (context, spec) => {
|
|
32
|
+
const candidates = staticMembers(context, spec.callables).filter(({ callable }) => isSelfReturning(context, spec.record, callable));
|
|
33
|
+
const candidate = candidates.find(({ name }) => name === "new") ?? candidates[0];
|
|
34
|
+
return candidate === undefined ? undefined : renderStaticCall(context, candidate.callable, candidate.name);
|
|
35
|
+
};
|
|
36
|
+
const unconstructibleMessage = (context, spec) => {
|
|
37
|
+
const qualified = `${context.namespace.name}.${spec.className}`;
|
|
38
|
+
const hint = constructionHint(context, spec);
|
|
39
|
+
return hint === undefined
|
|
40
|
+
? `Cannot construct ${qualified} with new: its instances come from the functions that return them.`
|
|
41
|
+
: `Cannot construct ${qualified} with new: use ${qualified}.${hint} instead.`;
|
|
42
|
+
};
|
|
43
|
+
const renderUnconstructibleGuard = (context, spec) => {
|
|
44
|
+
const superCall = spec.isErrorSubclass ? ["super();"] : [];
|
|
45
|
+
const message = sourceStringLiteral(unconstructibleMessage(context, spec));
|
|
26
46
|
return renderBlock("constructor()", [...superCall, `throw new globalThis.Error(${message});`].join("\n"));
|
|
27
47
|
};
|
|
28
48
|
const renderEmptyConstructor = (className, isErrorSubclass) => isErrorSubclass
|
|
@@ -37,11 +57,12 @@ const renderFieldWrites = (context, slots) => {
|
|
|
37
57
|
}
|
|
38
58
|
return statements;
|
|
39
59
|
};
|
|
40
|
-
const renderRecordConstructor = (context,
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
43
|
-
return
|
|
60
|
+
const renderRecordConstructor = (context, spec) => {
|
|
61
|
+
const { record, className, isErrorSubclass } = spec;
|
|
62
|
+
if (!isConstructibleRecord(context, context.namespace.name, record)) {
|
|
63
|
+
return renderUnconstructibleGuard(context, spec);
|
|
44
64
|
}
|
|
65
|
+
const superCall = isErrorSubclass ? ["super();"] : [];
|
|
45
66
|
const { slots, size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
46
67
|
if (size === 0) {
|
|
47
68
|
return renderEmptyConstructor(className, isErrorSubclass);
|
|
@@ -50,9 +71,9 @@ const renderRecordConstructor = (context, record, className, isErrorSubclass = f
|
|
|
50
71
|
context.addRuntimeImport("setHandle");
|
|
51
72
|
const statements = [
|
|
52
73
|
...superCall,
|
|
53
|
-
`const
|
|
74
|
+
`const __handle = alloc(${allocArgs(context, record, size).join(", ")});`,
|
|
54
75
|
...renderFieldWrites(context, slots),
|
|
55
|
-
"setHandle(this,
|
|
76
|
+
"setHandle(this, __handle);",
|
|
56
77
|
];
|
|
57
78
|
return renderBlock(`constructor(props: ${className}ConstructorProps = {})`, statements.join("\n"));
|
|
58
79
|
};
|
|
@@ -70,7 +91,7 @@ const renderFieldWrite = (context, entry) => {
|
|
|
70
91
|
const write = emitFieldWrite(context, {
|
|
71
92
|
descriptor,
|
|
72
93
|
slot: entry.slot,
|
|
73
|
-
targetExpr: "
|
|
94
|
+
targetExpr: "__handle",
|
|
74
95
|
valueExpr: `props.${name}`,
|
|
75
96
|
});
|
|
76
97
|
return `if (props.${name} !== undefined) ${write}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-constructor.js","sourceRoot":"","sources":["../../../src/store/gi/record-constructor.ts"],"names":[],"mappings":"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","sourcesContent":["import { sourceStringLiteral, toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { renderBlock, renderBracedOrEmpty } from \"../../writer/emit.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { renderSourceGtype } from \"./gtype-binding.js\";\nimport { emitFieldWrite, isEmittableField, isInlineField } from \"./record-field-accessor.js\";\nimport { computeRecordFieldSlots, type RecordFieldSlot } from \"./record-layout.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\ntype WritableFieldSlot = RecordFieldSlot & { field: GirField & { type: TypeId } };\n\nconst isWritableFieldSlot = (context: ModuleContext, entry: RecordFieldSlot): entry is WritableFieldSlot =>\n entry.field.writable && isEmittableField(context, entry.field);\n\nconst isOpaque = (record: GirRecord): boolean => record.opaque || record.disguised;\n\nconst renderRecordConstructorPropsInterface = (\n context: ModuleContext,\n record: GirRecord,\n className: string,\n): string => {\n const head = `export interface ${className}ConstructorProps`;\n\n if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {\n return renderBracedOrEmpty(head, \"\");\n }\n\n const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n const lines = slots\n .filter((entry): entry is WritableFieldSlot => isWritableFieldSlot(context, entry))\n .map(\n (entry) =>\n `${getDoc(entry.field)}${toCamelIdentifier(entry.field.name)}?: ` +\n `${renderTsType(context, entry.field.type, true)};`,\n );\n\n return renderBracedOrEmpty(head, lines.join(\"\\n\"));\n};\n\nconst renderOpaqueConstructor = (className: string, superCall: string[]): string => {\n const message = sourceStringLiteral(`Cannot construct ${className}: opaque boxed type with no known layout`);\n\n return renderBlock(\"constructor()\", [...superCall, `throw new globalThis.Error(${message});`].join(\"\\n\"));\n};\n\nconst renderEmptyConstructor = (className: string, isErrorSubclass: boolean): string =>\n isErrorSubclass\n ? renderBlock(`constructor(props: ${className}ConstructorProps = {})`, \"super();\")\n : `constructor(props: ${className}ConstructorProps = {}) {}`;\n\nconst renderFieldWrites = (context: ModuleContext, slots: RecordFieldSlot[]): string[] => {\n const statements: string[] = [];\n\n for (const entry of slots) {\n if (isWritableFieldSlot(context, entry)) {\n statements.push(renderFieldWrite(context, entry));\n }\n }\n\n return statements;\n};\n\nconst renderRecordConstructor = (\n context: ModuleContext,\n record: GirRecord,\n className: string,\n isErrorSubclass = false,\n): string => {\n const superCall = isErrorSubclass ? [\"super();\"] : [];\n\n if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {\n return renderOpaqueConstructor(className, superCall);\n }\n\n const { slots, size } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n if (size === 0) {\n return renderEmptyConstructor(className, isErrorSubclass);\n }\n\n context.addRuntimeImport(\"alloc\");\n context.addRuntimeImport(\"setHandle\");\n\n const statements = [\n ...superCall,\n `const handle = alloc(${allocArgs(context, record, size).join(\", \")});`,\n ...renderFieldWrites(context, slots),\n \"setHandle(this, handle);\",\n ];\n\n return renderBlock(`constructor(props: ${className}ConstructorProps = {})`, statements.join(\"\\n\"));\n};\n\nconst allocArgs = (context: ModuleContext, record: GirRecord, size: number): string[] => {\n const args = [String(size)];\n\n if (renderSourceGtype(context, record) !== undefined) {\n args.push(\"this.__type__\");\n }\n\n return args;\n};\n\nconst renderFieldWrite = (context: ModuleContext, entry: WritableFieldSlot): string => {\n context.addRuntimeImport(\"t\");\n\n const descriptor = context.hoistDescriptor(\n renderDescriptor(context, entry.field.type, \"none\", { isInline: isInlineField(context, entry.field) }),\n );\n\n const name = toCamelIdentifier(entry.field.name);\n\n const write = emitFieldWrite(context, {\n descriptor,\n slot: entry.slot,\n targetExpr: \"handle\",\n valueExpr: `props.${name}`,\n });\n\n return `if (props.${name} !== undefined) ${write}`;\n};\n\nexport { renderRecordConstructorPropsInterface, renderRecordConstructor };\n"]}
|
|
1
|
+
{"version":3,"file":"record-constructor.js","sourceRoot":"","sources":["../../../src/store/gi/record-constructor.ts"],"names":[],"mappings":"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","sourcesContent":["import { sourceStringLiteral, toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { GirFunction } from \"../../gir/function.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { inputParameters, parameterIdentifier } from \"../../analysis/param-structure.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { renderBlock, renderBracedOrEmpty } from \"../../writer/emit.js\";\nimport { type Callables, staticMembers } from \"./callables.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { renderSourceGtype } from \"./gtype-binding.js\";\nimport { emitFieldWrite, isEmittableField, isInlineField } from \"./record-field-accessor.js\";\nimport { computeRecordFieldSlots, type RecordFieldSlot } from \"./record-layout.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\ntype WritableFieldSlot = RecordFieldSlot & { field: GirField & { type: TypeId } };\n\ntype RecordConstructorSpec = {\n record: GirRecord;\n className: string;\n callables: Callables;\n isErrorSubclass: boolean;\n};\n\nconst isWritableFieldSlot = (context: ModuleContext, entry: RecordFieldSlot): entry is WritableFieldSlot =>\n entry.field.writable && isEmittableField(context, entry.field);\n\nconst renderRecordConstructorPropsInterface = (\n context: ModuleContext,\n record: GirRecord,\n className: string,\n): string => {\n const head = `export interface ${className}ConstructorProps`;\n const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n const lines = slots\n .filter((entry): entry is WritableFieldSlot => isWritableFieldSlot(context, entry))\n .map(\n (entry) =>\n `${getDoc(entry.field)}${toCamelIdentifier(entry.field.name)}?: ` +\n `${renderTsType(context, entry.field.type, true)};`,\n );\n\n return renderBracedOrEmpty(head, lines.join(\"\\n\"));\n};\n\nconst isSelfReturning = (context: ModuleContext, record: GirRecord, callable: GirFunction): boolean => {\n const ref = callable.returnValue.type;\n const name = ref === undefined ? undefined : context.library.nameFor(ref);\n\n return name?.namespaceName === context.namespace.name && name.typeName === record.name;\n};\n\nconst renderStaticCall = (context: ModuleContext, callable: GirFunction, name: string): string => {\n const args = inputParameters(context.library, callable).map(({ parameter, index }) =>\n parameterIdentifier(parameter, index));\n\n return `${name}(${args.join(\", \")})`;\n};\n\nconst constructionHint = (context: ModuleContext, spec: RecordConstructorSpec): string | undefined => {\n const candidates = staticMembers(context, spec.callables).filter(({ callable }) =>\n isSelfReturning(context, spec.record, callable));\n\n const candidate = candidates.find(({ name }) => name === \"new\") ?? candidates[0];\n\n return candidate === undefined ? undefined : renderStaticCall(context, candidate.callable, candidate.name);\n};\n\nconst unconstructibleMessage = (context: ModuleContext, spec: RecordConstructorSpec): string => {\n const qualified = `${context.namespace.name}.${spec.className}`;\n const hint = constructionHint(context, spec);\n\n return hint === undefined\n ? `Cannot construct ${qualified} with new: its instances come from the functions that return them.`\n : `Cannot construct ${qualified} with new: use ${qualified}.${hint} instead.`;\n};\n\nconst renderUnconstructibleGuard = (context: ModuleContext, spec: RecordConstructorSpec): string => {\n const superCall = spec.isErrorSubclass ? [\"super();\"] : [];\n const message = sourceStringLiteral(unconstructibleMessage(context, spec));\n\n return renderBlock(\"constructor()\", [...superCall, `throw new globalThis.Error(${message});`].join(\"\\n\"));\n};\n\nconst renderEmptyConstructor = (className: string, isErrorSubclass: boolean): string =>\n isErrorSubclass\n ? renderBlock(`constructor(props: ${className}ConstructorProps = {})`, \"super();\")\n : `constructor(props: ${className}ConstructorProps = {}) {}`;\n\nconst renderFieldWrites = (context: ModuleContext, slots: RecordFieldSlot[]): string[] => {\n const statements: string[] = [];\n\n for (const entry of slots) {\n if (isWritableFieldSlot(context, entry)) {\n statements.push(renderFieldWrite(context, entry));\n }\n }\n\n return statements;\n};\n\nconst renderRecordConstructor = (context: ModuleContext, spec: RecordConstructorSpec): string => {\n const { record, className, isErrorSubclass } = spec;\n\n if (!isConstructibleRecord(context, context.namespace.name, record)) {\n return renderUnconstructibleGuard(context, spec);\n }\n\n const superCall = isErrorSubclass ? [\"super();\"] : [];\n const { slots, size } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n if (size === 0) {\n return renderEmptyConstructor(className, isErrorSubclass);\n }\n\n context.addRuntimeImport(\"alloc\");\n context.addRuntimeImport(\"setHandle\");\n\n const statements = [\n ...superCall,\n `const __handle = alloc(${allocArgs(context, record, size).join(\", \")});`,\n ...renderFieldWrites(context, slots),\n \"setHandle(this, __handle);\",\n ];\n\n return renderBlock(`constructor(props: ${className}ConstructorProps = {})`, statements.join(\"\\n\"));\n};\n\nconst allocArgs = (context: ModuleContext, record: GirRecord, size: number): string[] => {\n const args = [String(size)];\n\n if (renderSourceGtype(context, record) !== undefined) {\n args.push(\"this.__type__\");\n }\n\n return args;\n};\n\nconst renderFieldWrite = (context: ModuleContext, entry: WritableFieldSlot): string => {\n context.addRuntimeImport(\"t\");\n\n const descriptor = context.hoistDescriptor(\n renderDescriptor(context, entry.field.type, \"none\", { isInline: isInlineField(context, entry.field) }),\n );\n\n const name = toCamelIdentifier(entry.field.name);\n\n const write = emitFieldWrite(context, {\n descriptor,\n slot: entry.slot,\n targetExpr: \"__handle\",\n valueExpr: `props.${name}`,\n });\n\n return `if (props.${name} !== undefined) ${write}`;\n};\n\nexport { renderRecordConstructorPropsInterface, renderRecordConstructor };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-field-accessor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-field-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"record-field-accessor.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-field-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D,OAAO,EAAmD,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI3G,KAAK,cAAc,GAAG;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAOF,KAAK,gBAAgB,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AA2EF,QAAA,MAAM,gBAAgB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,KAAK,IAAI,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAIhE,CAAC;AAEvC,QAAA,MAAM,cAAc,GAAI,SAAS,aAAa,EAAE,MAAM,cAAc,KAAG,MAuBtE,CAAC;AA8BF,QAAA,MAAM,uBAAuB,GACzB,SAAS,aAAa,EACtB,MAAM,eAAe,EACrB,cAAc,GAAG,CAAC,MAAM,CAAC,KAC1B,gBAAgB,GAAG,SAcrB,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAC3B,SAAS,aAAa,EACtB,MAAM,eAAe,EACrB,cAAc,GAAG,CAAC,MAAM,CAAC,EACzB,eAAe,QAAQ,EAAE,KAC1B,MAAM,GAAG,SA2CX,CAAC;AAkCF,QAAA,MAAM,aAAa,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,OACwC,CAAC;AA6X1G,OAAO,EACH,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,yBAAyB,GAC5B,CAAC"}
|
|
@@ -180,6 +180,18 @@ const visitInlineStructFields = (context, fields, baseOffset, visitors) => {
|
|
|
180
180
|
visitInlineStructSlot(context, entry, baseOffset, visitors);
|
|
181
181
|
}
|
|
182
182
|
};
|
|
183
|
+
const inlineLeafCount = (context, fields) => {
|
|
184
|
+
let count = 0;
|
|
185
|
+
visitInlineStructFields(context, fields, 0, {
|
|
186
|
+
leaf: () => {
|
|
187
|
+
count += 1;
|
|
188
|
+
},
|
|
189
|
+
nested: (_jsName, nested) => {
|
|
190
|
+
count += inlineLeafCount(context, nested);
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
return count;
|
|
194
|
+
};
|
|
183
195
|
const elementAccessExpr = (descriptor, offset) => `read(__array, ${descriptor}, __base + ${String(offset)})`;
|
|
184
196
|
const renderElementReadEntry = (context, visit) => {
|
|
185
197
|
const { jsName, descriptor, offset, slot, type } = visit;
|
|
@@ -243,7 +255,7 @@ const structArrayGetterBlock = (options) => {
|
|
|
243
255
|
return renderBlock(`get ${jsName}(): ${tsType}`, body);
|
|
244
256
|
};
|
|
245
257
|
const structArraySetterStatements = (context, options) => {
|
|
246
|
-
const { elementDescriptor, offset, elementSize, elementFields } = options;
|
|
258
|
+
const { elementDescriptor, offset, elementSize, elementFields, lengthExpr } = options;
|
|
247
259
|
const writes = [];
|
|
248
260
|
appendElementWriteStatements(context, {
|
|
249
261
|
fields: elementFields,
|
|
@@ -256,19 +268,23 @@ const structArraySetterStatements = (context, options) => {
|
|
|
256
268
|
`const __descriptor = ${elementDescriptor};`,
|
|
257
269
|
`const __array = read(getHandle(this), __descriptor, ${String(offset)}) as ReturnType<typeof getHandle>;`,
|
|
258
270
|
"for (const [__index, __element] of __value.entries()) {",
|
|
259
|
-
indent(loop
|
|
271
|
+
indent(`if (__index >= ${lengthExpr}) {\n break;\n}\n\n${loop}`, 1),
|
|
260
272
|
"}",
|
|
261
273
|
`write(getHandle(this), __descriptor, ${String(offset)}, __array);`,
|
|
262
274
|
].join("\n");
|
|
263
275
|
};
|
|
264
276
|
const structArraySetterBlock = (options) => renderBlock(`set ${options.jsName}(__value: ${options.tsType})`, structArraySetterStatements(options.context, options));
|
|
277
|
+
const isPlainDataRecord = (record) => record.glibGetType === undefined &&
|
|
278
|
+
record.constructors.length === 0 &&
|
|
279
|
+
record.functions.length === 0 &&
|
|
280
|
+
record.methods.length === 0;
|
|
265
281
|
const resolveStructArrayElements = (context, fieldType) => {
|
|
266
282
|
const arrayType = context.library.typeFor(fieldType);
|
|
267
283
|
if (arrayType?.kind !== "carray") {
|
|
268
284
|
return undefined;
|
|
269
285
|
}
|
|
270
286
|
const elementType = context.library.typeFor(arrayType.element);
|
|
271
|
-
if (elementType?.kind === "record" && elementType.value
|
|
287
|
+
if (elementType?.kind === "record" && !isPlainDataRecord(elementType.value)) {
|
|
272
288
|
return undefined;
|
|
273
289
|
}
|
|
274
290
|
const elementFields = resolveInlineStructFields(context, arrayType.element, arrayType.elementCType);
|
|
@@ -298,7 +314,7 @@ const resolveStructArray = (context, target) => {
|
|
|
298
314
|
return undefined;
|
|
299
315
|
}
|
|
300
316
|
const shape = resolveStructArrayShape(context, elements, siblingFields);
|
|
301
|
-
if (shape === undefined) {
|
|
317
|
+
if (shape === undefined || inlineLeafCount(context, elements.elementFields) === 0) {
|
|
302
318
|
return undefined;
|
|
303
319
|
}
|
|
304
320
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-field-accessor.js","sourceRoot":"","sources":["../../../src/store/gi/record-field-accessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirAnnotations } from \"../../gir/annotations.js\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { FieldSlot } from \"../../gir/size.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { isInlineCallbackRef, renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { tStruct } from \"../../analysis/descriptor.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { indent, renderBlock } from \"../../writer/emit.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { bitMask, computeRecordFieldSlots, mergeBitfield, type RecordFieldSlot } from \"./record-layout.js\";\nimport { wrapReturnValue } from \"./return-wrap.js\";\nimport { isValueMarshalable } from \"./value-marshalable.js\";\n\ntype FieldWriteSpec = {\n descriptor: string;\n slot: FieldSlot;\n targetExpr: string;\n valueExpr: string;\n};\n\ntype AdmittedField = {\n field: GirField & { type: TypeId };\n jsName: string;\n};\n\ntype RecordFieldEntry = {\n jsName: string;\n tsType: string;\n isWritable: boolean;\n doc: string | undefined;\n annotations: GirAnnotations;\n};\n\ntype InlineFieldVisit = {\n jsName: string;\n descriptor: string;\n offset: number;\n slot: FieldSlot;\n type: TypeId;\n};\n\ntype InlineFieldVisitors = {\n leaf: (visit: InlineFieldVisit) => void;\n nested: (jsName: string, nested: GirField[], offset: number) => void;\n};\n\ntype ElementWriteOptions = {\n fields: GirField[];\n baseOffset: number;\n valuePath: string;\n out: string[];\n};\n\ntype StructArrayTarget = {\n field: GirField;\n jsName: string;\n slot: FieldSlot;\n siblingFields: GirField[];\n};\n\ntype StructArrayAccessorOptions = {\n context: ModuleContext;\n jsName: string;\n tsType: string;\n elementDescriptor: string;\n offset: number;\n lengthExpr: string;\n elementSize: number;\n elementFields: GirField[];\n};\n\ntype StructArrayResolution = {\n fieldType: TypeId;\n elementFields: GirField[];\n lengthExpr: string;\n elementSize: number;\n};\n\ntype StructArrayElements = {\n arrayType: Extract<GirType, { kind: \"carray\" }>;\n elementFields: GirField[];\n};\n\ntype AccessorOptions = {\n context: ModuleContext;\n jsName: string;\n tsType: string;\n descriptor: string;\n slot: FieldSlot;\n fieldType: TypeId;\n};\n\nconst isMarshalableField = (context: ModuleContext, field: GirField): boolean => {\n if (field.cType?.endsWith(\"*\") === true) {\n return true;\n }\n\n const type = field.type === undefined ? undefined : context.library.typeFor(field.type);\n\n if (type?.kind !== \"record\") {\n return true;\n }\n\n return isValueMarshalable(context, type.namespace.name, type.value);\n};\n\nconst isEmittableField = (context: ModuleContext, field: GirField): field is GirField & { type: TypeId } =>\n !field.private &&\n field.type !== undefined &&\n !isInlineCallbackRef(context.library, field.type) &&\n isMarshalableField(context, field);\n\nconst emitFieldWrite = (context: ModuleContext, spec: FieldWriteSpec): string => {\n const { descriptor, slot, targetExpr, valueExpr } = spec;\n context.addRuntimeImport(\"write\");\n\n if (slot.bitWidth === undefined) {\n context.addRuntimeImport(\"toNative\");\n\n return (\n `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ` +\n `toNative(${descriptor}, ${valueExpr}));`\n );\n }\n\n context.addRuntimeImport(\"read\");\n\n const merged = mergeBitfield(\n `(read(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}) as number)`,\n valueExpr,\n bitMask(slot.bitWidth),\n slot.bitOffset ?? 0,\n );\n\n return `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ${merged});`;\n};\n\nconst admitField = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n): AdmittedField | undefined => {\n const { field } = slot;\n\n if (!field.readable && !field.writable) {\n return undefined;\n }\n\n if (!isEmittableField(context, field)) {\n return undefined;\n }\n\n const jsName = toCamelIdentifier(field.name);\n\n if (claimedNames.has(jsName)) {\n return undefined;\n }\n\n if (jsName === \"constructor\") {\n return undefined;\n }\n\n return { field, jsName };\n};\n\nconst resolveRecordFieldEntry = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n): RecordFieldEntry | undefined => {\n const admitted = admitField(context, slot, claimedNames);\n\n if (admitted === undefined) {\n return undefined;\n }\n\n return {\n jsName: admitted.jsName,\n tsType: renderTsType(context, admitted.field.type, false),\n isWritable: admitted.field.writable,\n doc: admitted.field.doc,\n annotations: admitted.field.annotations,\n };\n};\n\nconst renderRecordFieldAccessor = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n siblingFields: GirField[],\n): string | undefined => {\n const admitted = admitField(context, slot, claimedNames);\n\n if (admitted === undefined) {\n return undefined;\n }\n\n const { field, jsName } = admitted;\n const doc = getDoc(field);\n const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });\n\n if (structArray !== undefined) {\n return `${doc}${structArray}`;\n }\n\n if (!isAccessorEligibleType(context, field.type)) {\n const tsType = renderTsType(context, field.type, false);\n\n return `${doc}declare ${jsName}: ${tsType};`;\n }\n\n const descriptor = context.hoistDescriptor(\n renderDescriptor(context, field.type, \"none\", { isInline: isInlineField(context, field) }),\n );\n\n const tsType = renderTsType(context, field.type, false);\n\n const accessorOptions: AccessorOptions = {\n context,\n jsName,\n tsType,\n descriptor,\n slot: slot.slot,\n fieldType: field.type,\n };\n\n const blocks: string[] = [getterBlock(accessorOptions)];\n\n if (field.writable) {\n blocks.push(setterBlock(accessorOptions));\n }\n\n return `${doc}${blocks.join(\"\\n\\n\")}`;\n};\n\nconst isAccessorEligibleType = (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 \"primitive\": {\n return type.category !== \"void\" && type.category !== \"unichar\";\n }\n case \"class\":\n case \"interface\":\n case \"record\":\n case \"enum\":\n case \"alias\": {\n return true;\n }\n case \"callback\": {\n return context.library.nameFor(ref) !== undefined;\n }\n case \"carray\": {\n return type.fixedSize !== undefined;\n }\n case \"list\":\n case \"hashtable\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isInlineField = (context: ModuleContext, field: GirField): boolean =>\n field.type !== undefined && resolveInlineStructFields(context, field.type, field.cType) !== undefined;\n\nconst resolveInlineStructFields = (\n context: ModuleContext,\n ref: TypeId | undefined,\n occurrenceCType: string | undefined,\n): GirField[] | undefined => {\n if (ref === undefined) {\n return undefined;\n }\n\n if (occurrenceCType?.endsWith(\"*\") === true) {\n return undefined;\n }\n\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"record\") {\n return undefined;\n }\n\n if (type.value.cType?.endsWith(\"*\") === true) {\n return undefined;\n }\n\n if (type.value.fields.length === 0) {\n return undefined;\n }\n\n return type.value.fields;\n};\n\nconst arrayLengthExpression = (\n arrayRef: Extract<GirType, { kind: \"carray\" }>,\n siblingFields: GirField[],\n): string | undefined => {\n if (arrayRef.fixedSize !== undefined) {\n return String(arrayRef.fixedSize);\n }\n\n if (arrayRef.lengthParameterIndex === undefined) {\n return undefined;\n }\n\n const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];\n\n if (lengthField === undefined) {\n return undefined;\n }\n\n return `this.${toCamelIdentifier(lengthField.name)}`;\n};\n\nconst visitInlineStructSlot = (\n context: ModuleContext,\n entry: RecordFieldSlot,\n baseOffset: number,\n visitors: InlineFieldVisitors,\n): void => {\n const { field, slot } = entry;\n\n if (field.private || field.type === undefined || isInlineCallbackRef(context.library, field.type)) {\n return;\n }\n\n const jsName = toCamelIdentifier(field.name);\n const offset = baseOffset + slot.byteOffset;\n const nested = resolveInlineStructFields(context, field.type, field.cType);\n\n if (nested !== undefined) {\n visitors.nested(jsName, nested, offset);\n\n return;\n }\n\n if (!isAccessorEligibleType(context, field.type)) {\n return;\n }\n\n const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, \"none\"));\n visitors.leaf({ jsName, descriptor, offset, slot, type: field.type });\n};\n\nconst visitInlineStructFields = (\n context: ModuleContext,\n fields: GirField[],\n baseOffset: number,\n visitors: InlineFieldVisitors,\n): void => {\n const { slots } = computeRecordFieldSlots(context, fields);\n\n for (const entry of slots) {\n visitInlineStructSlot(context, entry, baseOffset, visitors);\n }\n};\n\nconst elementAccessExpr = (descriptor: string, offset: number): string =>\n `read(__array, ${descriptor}, __base + ${String(offset)})`;\n\nconst renderElementReadEntry = (context: ModuleContext, visit: InlineFieldVisit): string => {\n const { jsName, descriptor, offset, slot, type } = visit;\n const access = elementAccessExpr(descriptor, offset);\n\n if (slot.bitWidth === undefined) {\n return `${jsName}: ${access} as ${renderTsType(context, type, false)}`;\n }\n\n const shift = slot.bitOffset ?? 0;\n\n return `${jsName}: (((${access} as number) >>> ${String(shift)}) & ${String(bitMask(slot.bitWidth))})`;\n};\n\nconst renderElementReadObject = (context: ModuleContext, fields: GirField[], baseOffset: number): string => {\n const entries: string[] = [];\n\n visitInlineStructFields(context, fields, baseOffset, {\n leaf: (visit) => {\n entries.push(renderElementReadEntry(context, visit));\n },\n nested: (jsName, nested, offset) => {\n entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);\n },\n });\n\n return `{ ${entries.join(\", \")} }`;\n};\n\nconst renderElementWriteStatement = (visit: InlineFieldVisit, valuePath: string): string => {\n const { jsName, descriptor, offset, slot } = visit;\n const valueExpr = `${valuePath}.${jsName}`;\n\n if (slot.bitWidth === undefined) {\n return `write(__array, ${descriptor}, __base + ${String(offset)}, ${valueExpr});`;\n }\n\n const merged = mergeBitfield(\n `(${elementAccessExpr(descriptor, offset)} as number)`,\n valueExpr,\n bitMask(slot.bitWidth),\n slot.bitOffset ?? 0,\n );\n\n return `write(__array, ${descriptor}, __base + ${String(offset)}, ${merged});`;\n};\n\nconst appendElementWriteStatements = (context: ModuleContext, options: ElementWriteOptions): void => {\n const { fields, baseOffset, valuePath, out } = options;\n\n visitInlineStructFields(context, fields, baseOffset, {\n leaf: (visit) => {\n out.push(renderElementWriteStatement(visit, valuePath));\n },\n nested: (jsName, nested, offset) => {\n appendElementWriteStatements(context, {\n fields: nested,\n baseOffset: offset,\n valuePath: `${valuePath}.${jsName}`,\n out,\n });\n },\n });\n};\n\nconst structArrayGetterBlock = (options: StructArrayAccessorOptions): string => {\n const { context, jsName, tsType, elementDescriptor, offset, lengthExpr, elementSize, elementFields } = options;\n const element = renderElementReadObject(context, elementFields, 0);\n const loop = [`const __base = __index * ${String(elementSize)};`, `__result.push(${element});`].join(\"\\n\");\n const handleType = \"ReturnType<typeof getHandle>\";\n\n const body = [\n `const __array = read(getHandle(this), ${elementDescriptor}, ${String(offset)}) as ${handleType};`,\n `const __result: ${tsType} = [];`,\n `for (let __index = 0; __index < ${lengthExpr}; __index++) {`,\n indent(loop, 1),\n \"}\",\n \"return __result;\",\n ].join(\"\\n\");\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n};\n\nconst structArraySetterStatements = (context: ModuleContext, options: StructArrayAccessorOptions): string => {\n const { elementDescriptor, offset, elementSize, elementFields } = options;\n const writes: string[] = [];\n\n appendElementWriteStatements(context, {\n fields: elementFields,\n baseOffset: 0,\n valuePath: \"__element\",\n out: writes,\n });\n\n const loop = [`const __base = __index * ${String(elementSize)};`, ...writes].join(\"\\n\");\n\n return [\n `const __descriptor = ${elementDescriptor};`,\n `const __array = read(getHandle(this), __descriptor, ${String(offset)}) as ReturnType<typeof getHandle>;`,\n \"for (const [__index, __element] of __value.entries()) {\",\n indent(loop, 1),\n \"}\",\n `write(getHandle(this), __descriptor, ${String(offset)}, __array);`,\n ].join(\"\\n\");\n};\n\nconst structArraySetterBlock = (options: StructArrayAccessorOptions): string =>\n renderBlock(\n `set ${options.jsName}(__value: ${options.tsType})`,\n structArraySetterStatements(options.context, options),\n );\n\nconst resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId): StructArrayElements | undefined => {\n const arrayType = context.library.typeFor(fieldType);\n\n if (arrayType?.kind !== \"carray\") {\n return undefined;\n }\n\n const elementType = context.library.typeFor(arrayType.element);\n\n if (elementType?.kind === \"record\" && elementType.value.glibGetType !== undefined) {\n return undefined;\n }\n\n const elementFields = resolveInlineStructFields(context, arrayType.element, arrayType.elementCType);\n\n if (elementFields === undefined) {\n return undefined;\n }\n\n return { arrayType, elementFields };\n};\n\nconst resolveStructArrayShape = (\n context: ModuleContext,\n elements: StructArrayElements,\n siblingFields: GirField[],\n): { lengthExpr: string; elementSize: number } | undefined => {\n const lengthExpr = arrayLengthExpression(elements.arrayType, siblingFields);\n\n if (lengthExpr === undefined) {\n return undefined;\n }\n\n const elementSize = computeRecordFieldSlots(context, elements.elementFields).size;\n\n if (elementSize === 0) {\n return undefined;\n }\n\n return { lengthExpr, elementSize };\n};\n\nconst resolveStructArray = (context: ModuleContext, target: StructArrayTarget): StructArrayResolution | undefined => {\n const { field, slot, siblingFields } = target;\n\n if (field.type === undefined || slot.bitWidth !== undefined) {\n return undefined;\n }\n\n const elements = resolveStructArrayElements(context, field.type);\n\n if (elements === undefined) {\n return undefined;\n }\n\n const shape = resolveStructArrayShape(context, elements, siblingFields);\n\n if (shape === undefined) {\n return undefined;\n }\n\n return {\n fieldType: field.type,\n elementFields: elements.elementFields,\n lengthExpr: shape.lengthExpr,\n elementSize: shape.elementSize,\n };\n};\n\nconst renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {\n const resolution = resolveStructArray(context, target);\n\n if (resolution === undefined) {\n return undefined;\n }\n\n const { field, jsName, slot } = target;\n const { fieldType, elementFields, lengthExpr, elementSize } = resolution;\n context.addRuntimeImport(\"read\");\n context.addRuntimeImport(\"getHandle\");\n context.addRuntimeImport(\"t\");\n\n const options: StructArrayAccessorOptions = {\n context,\n jsName,\n tsType: renderTsType(context, fieldType, false),\n elementDescriptor: tStruct(\"borrowed\", {\n size: `${lengthExpr} * ${String(elementSize)}`,\n wrapperClass: undefined,\n isCallerAllocated: false,\n }),\n offset: slot.byteOffset,\n lengthExpr,\n elementSize,\n elementFields,\n };\n\n const blocks: string[] = [];\n\n if (field.readable) {\n blocks.push(structArrayGetterBlock(options));\n }\n\n if (field.writable) {\n context.addRuntimeImport(\"write\");\n blocks.push(structArraySetterBlock(options));\n }\n\n return blocks.length === 0 ? undefined : blocks.join(\"\\n\\n\");\n};\n\nconst getterBlock = (options: AccessorOptions): string => {\n const { context, jsName, tsType, descriptor, slot, fieldType } = options;\n context.addRuntimeImport(\"read\");\n context.addRuntimeImport(\"getHandle\");\n\n if (slot.bitWidth === undefined) {\n const valueExpression = `read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)})`;\n\n const wrapped = wrapReturnValue(context, {\n ref: fieldType,\n isNullable: false,\n valueExpression,\n });\n\n const body = `return ${wrapped};`;\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n }\n\n const mask = bitMask(slot.bitWidth);\n const shift = slot.bitOffset ?? 0;\n const readUnit = `const __unit = read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)}) as number;`;\n const body = `${readUnit}\\nreturn (((__unit >>> ${String(shift)}) & ${String(mask)}) >>> 0) as ${tsType};`;\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n};\n\nconst setterBody = (context: ModuleContext, descriptor: string, slot: FieldSlot): string => {\n context.addRuntimeImport(\"getHandle\");\n\n return emitFieldWrite(context, { descriptor, slot, targetExpr: \"getHandle(this)\", valueExpr: \"value\" });\n};\n\nconst setterBlock = (options: AccessorOptions): string =>\n renderBlock(\n `set ${options.jsName}(value: ${options.tsType})`,\n setterBody(options.context, options.descriptor, options.slot),\n );\n\nexport {\n isEmittableField,\n isInlineField,\n emitFieldWrite,\n resolveRecordFieldEntry,\n renderRecordFieldAccessor,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"record-field-accessor.js","sourceRoot":"","sources":["../../../src/store/gi/record-field-accessor.ts"],"names":[],"mappings":"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","sourcesContent":["import { toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirAnnotations } from \"../../gir/annotations.js\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { FieldSlot } from \"../../gir/size.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { isInlineCallbackRef, renderDescriptor } from \"../../analysis/descriptor-render.js\";\nimport { tStruct } from \"../../analysis/descriptor.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { indent, renderBlock } from \"../../writer/emit.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { bitMask, computeRecordFieldSlots, mergeBitfield, type RecordFieldSlot } from \"./record-layout.js\";\nimport { wrapReturnValue } from \"./return-wrap.js\";\nimport { isValueMarshalable } from \"./value-marshalable.js\";\n\ntype FieldWriteSpec = {\n descriptor: string;\n slot: FieldSlot;\n targetExpr: string;\n valueExpr: string;\n};\n\ntype AdmittedField = {\n field: GirField & { type: TypeId };\n jsName: string;\n};\n\ntype RecordFieldEntry = {\n jsName: string;\n tsType: string;\n isWritable: boolean;\n doc: string | undefined;\n annotations: GirAnnotations;\n};\n\ntype InlineFieldVisit = {\n jsName: string;\n descriptor: string;\n offset: number;\n slot: FieldSlot;\n type: TypeId;\n};\n\ntype InlineFieldVisitors = {\n leaf: (visit: InlineFieldVisit) => void;\n nested: (jsName: string, nested: GirField[], offset: number) => void;\n};\n\ntype ElementWriteOptions = {\n fields: GirField[];\n baseOffset: number;\n valuePath: string;\n out: string[];\n};\n\ntype StructArrayTarget = {\n field: GirField;\n jsName: string;\n slot: FieldSlot;\n siblingFields: GirField[];\n};\n\ntype StructArrayAccessorOptions = {\n context: ModuleContext;\n jsName: string;\n tsType: string;\n elementDescriptor: string;\n offset: number;\n lengthExpr: string;\n elementSize: number;\n elementFields: GirField[];\n};\n\ntype StructArrayResolution = {\n fieldType: TypeId;\n elementFields: GirField[];\n lengthExpr: string;\n elementSize: number;\n};\n\ntype StructArrayElements = {\n arrayType: Extract<GirType, { kind: \"carray\" }>;\n elementFields: GirField[];\n};\n\ntype AccessorOptions = {\n context: ModuleContext;\n jsName: string;\n tsType: string;\n descriptor: string;\n slot: FieldSlot;\n fieldType: TypeId;\n};\n\nconst isMarshalableField = (context: ModuleContext, field: GirField): boolean => {\n if (field.cType?.endsWith(\"*\") === true) {\n return true;\n }\n\n const type = field.type === undefined ? undefined : context.library.typeFor(field.type);\n\n if (type?.kind !== \"record\") {\n return true;\n }\n\n return isValueMarshalable(context, type.namespace.name, type.value);\n};\n\nconst isEmittableField = (context: ModuleContext, field: GirField): field is GirField & { type: TypeId } =>\n !field.private &&\n field.type !== undefined &&\n !isInlineCallbackRef(context.library, field.type) &&\n isMarshalableField(context, field);\n\nconst emitFieldWrite = (context: ModuleContext, spec: FieldWriteSpec): string => {\n const { descriptor, slot, targetExpr, valueExpr } = spec;\n context.addRuntimeImport(\"write\");\n\n if (slot.bitWidth === undefined) {\n context.addRuntimeImport(\"toNative\");\n\n return (\n `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ` +\n `toNative(${descriptor}, ${valueExpr}));`\n );\n }\n\n context.addRuntimeImport(\"read\");\n\n const merged = mergeBitfield(\n `(read(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}) as number)`,\n valueExpr,\n bitMask(slot.bitWidth),\n slot.bitOffset ?? 0,\n );\n\n return `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ${merged});`;\n};\n\nconst admitField = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n): AdmittedField | undefined => {\n const { field } = slot;\n\n if (!field.readable && !field.writable) {\n return undefined;\n }\n\n if (!isEmittableField(context, field)) {\n return undefined;\n }\n\n const jsName = toCamelIdentifier(field.name);\n\n if (claimedNames.has(jsName)) {\n return undefined;\n }\n\n if (jsName === \"constructor\") {\n return undefined;\n }\n\n return { field, jsName };\n};\n\nconst resolveRecordFieldEntry = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n): RecordFieldEntry | undefined => {\n const admitted = admitField(context, slot, claimedNames);\n\n if (admitted === undefined) {\n return undefined;\n }\n\n return {\n jsName: admitted.jsName,\n tsType: renderTsType(context, admitted.field.type, false),\n isWritable: admitted.field.writable,\n doc: admitted.field.doc,\n annotations: admitted.field.annotations,\n };\n};\n\nconst renderRecordFieldAccessor = (\n context: ModuleContext,\n slot: RecordFieldSlot,\n claimedNames: Set<string>,\n siblingFields: GirField[],\n): string | undefined => {\n const admitted = admitField(context, slot, claimedNames);\n\n if (admitted === undefined) {\n return undefined;\n }\n\n const { field, jsName } = admitted;\n const doc = getDoc(field);\n const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });\n\n if (structArray !== undefined) {\n return `${doc}${structArray}`;\n }\n\n if (!isAccessorEligibleType(context, field.type)) {\n const tsType = renderTsType(context, field.type, false);\n\n return `${doc}declare ${jsName}: ${tsType};`;\n }\n\n const descriptor = context.hoistDescriptor(\n renderDescriptor(context, field.type, \"none\", { isInline: isInlineField(context, field) }),\n );\n\n const tsType = renderTsType(context, field.type, false);\n\n const accessorOptions: AccessorOptions = {\n context,\n jsName,\n tsType,\n descriptor,\n slot: slot.slot,\n fieldType: field.type,\n };\n\n const blocks: string[] = [getterBlock(accessorOptions)];\n\n if (field.writable) {\n blocks.push(setterBlock(accessorOptions));\n }\n\n return `${doc}${blocks.join(\"\\n\\n\")}`;\n};\n\nconst isAccessorEligibleType = (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 \"primitive\": {\n return type.category !== \"void\" && type.category !== \"unichar\";\n }\n case \"class\":\n case \"interface\":\n case \"record\":\n case \"enum\":\n case \"alias\": {\n return true;\n }\n case \"callback\": {\n return context.library.nameFor(ref) !== undefined;\n }\n case \"carray\": {\n return type.fixedSize !== undefined;\n }\n case \"list\":\n case \"hashtable\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isInlineField = (context: ModuleContext, field: GirField): boolean =>\n field.type !== undefined && resolveInlineStructFields(context, field.type, field.cType) !== undefined;\n\nconst resolveInlineStructFields = (\n context: ModuleContext,\n ref: TypeId | undefined,\n occurrenceCType: string | undefined,\n): GirField[] | undefined => {\n if (ref === undefined) {\n return undefined;\n }\n\n if (occurrenceCType?.endsWith(\"*\") === true) {\n return undefined;\n }\n\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"record\") {\n return undefined;\n }\n\n if (type.value.cType?.endsWith(\"*\") === true) {\n return undefined;\n }\n\n if (type.value.fields.length === 0) {\n return undefined;\n }\n\n return type.value.fields;\n};\n\nconst arrayLengthExpression = (\n arrayRef: Extract<GirType, { kind: \"carray\" }>,\n siblingFields: GirField[],\n): string | undefined => {\n if (arrayRef.fixedSize !== undefined) {\n return String(arrayRef.fixedSize);\n }\n\n if (arrayRef.lengthParameterIndex === undefined) {\n return undefined;\n }\n\n const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];\n\n if (lengthField === undefined) {\n return undefined;\n }\n\n return `this.${toCamelIdentifier(lengthField.name)}`;\n};\n\nconst visitInlineStructSlot = (\n context: ModuleContext,\n entry: RecordFieldSlot,\n baseOffset: number,\n visitors: InlineFieldVisitors,\n): void => {\n const { field, slot } = entry;\n\n if (field.private || field.type === undefined || isInlineCallbackRef(context.library, field.type)) {\n return;\n }\n\n const jsName = toCamelIdentifier(field.name);\n const offset = baseOffset + slot.byteOffset;\n const nested = resolveInlineStructFields(context, field.type, field.cType);\n\n if (nested !== undefined) {\n visitors.nested(jsName, nested, offset);\n\n return;\n }\n\n if (!isAccessorEligibleType(context, field.type)) {\n return;\n }\n\n const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, \"none\"));\n visitors.leaf({ jsName, descriptor, offset, slot, type: field.type });\n};\n\nconst visitInlineStructFields = (\n context: ModuleContext,\n fields: GirField[],\n baseOffset: number,\n visitors: InlineFieldVisitors,\n): void => {\n const { slots } = computeRecordFieldSlots(context, fields);\n\n for (const entry of slots) {\n visitInlineStructSlot(context, entry, baseOffset, visitors);\n }\n};\n\nconst inlineLeafCount = (context: ModuleContext, fields: GirField[]): number => {\n let count = 0;\n\n visitInlineStructFields(context, fields, 0, {\n leaf: () => {\n count += 1;\n },\n nested: (_jsName, nested) => {\n count += inlineLeafCount(context, nested);\n },\n });\n\n return count;\n};\n\nconst elementAccessExpr = (descriptor: string, offset: number): string =>\n `read(__array, ${descriptor}, __base + ${String(offset)})`;\n\nconst renderElementReadEntry = (context: ModuleContext, visit: InlineFieldVisit): string => {\n const { jsName, descriptor, offset, slot, type } = visit;\n const access = elementAccessExpr(descriptor, offset);\n\n if (slot.bitWidth === undefined) {\n return `${jsName}: ${access} as ${renderTsType(context, type, false)}`;\n }\n\n const shift = slot.bitOffset ?? 0;\n\n return `${jsName}: (((${access} as number) >>> ${String(shift)}) & ${String(bitMask(slot.bitWidth))})`;\n};\n\nconst renderElementReadObject = (context: ModuleContext, fields: GirField[], baseOffset: number): string => {\n const entries: string[] = [];\n\n visitInlineStructFields(context, fields, baseOffset, {\n leaf: (visit) => {\n entries.push(renderElementReadEntry(context, visit));\n },\n nested: (jsName, nested, offset) => {\n entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);\n },\n });\n\n return `{ ${entries.join(\", \")} }`;\n};\n\nconst renderElementWriteStatement = (visit: InlineFieldVisit, valuePath: string): string => {\n const { jsName, descriptor, offset, slot } = visit;\n const valueExpr = `${valuePath}.${jsName}`;\n\n if (slot.bitWidth === undefined) {\n return `write(__array, ${descriptor}, __base + ${String(offset)}, ${valueExpr});`;\n }\n\n const merged = mergeBitfield(\n `(${elementAccessExpr(descriptor, offset)} as number)`,\n valueExpr,\n bitMask(slot.bitWidth),\n slot.bitOffset ?? 0,\n );\n\n return `write(__array, ${descriptor}, __base + ${String(offset)}, ${merged});`;\n};\n\nconst appendElementWriteStatements = (context: ModuleContext, options: ElementWriteOptions): void => {\n const { fields, baseOffset, valuePath, out } = options;\n\n visitInlineStructFields(context, fields, baseOffset, {\n leaf: (visit) => {\n out.push(renderElementWriteStatement(visit, valuePath));\n },\n nested: (jsName, nested, offset) => {\n appendElementWriteStatements(context, {\n fields: nested,\n baseOffset: offset,\n valuePath: `${valuePath}.${jsName}`,\n out,\n });\n },\n });\n};\n\nconst structArrayGetterBlock = (options: StructArrayAccessorOptions): string => {\n const { context, jsName, tsType, elementDescriptor, offset, lengthExpr, elementSize, elementFields } = options;\n const element = renderElementReadObject(context, elementFields, 0);\n const loop = [`const __base = __index * ${String(elementSize)};`, `__result.push(${element});`].join(\"\\n\");\n const handleType = \"ReturnType<typeof getHandle>\";\n\n const body = [\n `const __array = read(getHandle(this), ${elementDescriptor}, ${String(offset)}) as ${handleType};`,\n `const __result: ${tsType} = [];`,\n `for (let __index = 0; __index < ${lengthExpr}; __index++) {`,\n indent(loop, 1),\n \"}\",\n \"return __result;\",\n ].join(\"\\n\");\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n};\n\nconst structArraySetterStatements = (context: ModuleContext, options: StructArrayAccessorOptions): string => {\n const { elementDescriptor, offset, elementSize, elementFields, lengthExpr } = options;\n const writes: string[] = [];\n\n appendElementWriteStatements(context, {\n fields: elementFields,\n baseOffset: 0,\n valuePath: \"__element\",\n out: writes,\n });\n\n const loop = [`const __base = __index * ${String(elementSize)};`, ...writes].join(\"\\n\");\n\n return [\n `const __descriptor = ${elementDescriptor};`,\n `const __array = read(getHandle(this), __descriptor, ${String(offset)}) as ReturnType<typeof getHandle>;`,\n \"for (const [__index, __element] of __value.entries()) {\",\n indent(`if (__index >= ${lengthExpr}) {\\n break;\\n}\\n\\n${loop}`, 1),\n \"}\",\n `write(getHandle(this), __descriptor, ${String(offset)}, __array);`,\n ].join(\"\\n\");\n};\n\nconst structArraySetterBlock = (options: StructArrayAccessorOptions): string =>\n renderBlock(\n `set ${options.jsName}(__value: ${options.tsType})`,\n structArraySetterStatements(options.context, options),\n );\n\nconst isPlainDataRecord = (record: GirRecord): boolean =>\n record.glibGetType === undefined &&\n record.constructors.length === 0 &&\n record.functions.length === 0 &&\n record.methods.length === 0;\n\nconst resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId): StructArrayElements | undefined => {\n const arrayType = context.library.typeFor(fieldType);\n\n if (arrayType?.kind !== \"carray\") {\n return undefined;\n }\n\n const elementType = context.library.typeFor(arrayType.element);\n\n if (elementType?.kind === \"record\" && !isPlainDataRecord(elementType.value)) {\n return undefined;\n }\n\n const elementFields = resolveInlineStructFields(context, arrayType.element, arrayType.elementCType);\n\n if (elementFields === undefined) {\n return undefined;\n }\n\n return { arrayType, elementFields };\n};\n\nconst resolveStructArrayShape = (\n context: ModuleContext,\n elements: StructArrayElements,\n siblingFields: GirField[],\n): { lengthExpr: string; elementSize: number } | undefined => {\n const lengthExpr = arrayLengthExpression(elements.arrayType, siblingFields);\n\n if (lengthExpr === undefined) {\n return undefined;\n }\n\n const elementSize = computeRecordFieldSlots(context, elements.elementFields).size;\n\n if (elementSize === 0) {\n return undefined;\n }\n\n return { lengthExpr, elementSize };\n};\n\nconst resolveStructArray = (context: ModuleContext, target: StructArrayTarget): StructArrayResolution | undefined => {\n const { field, slot, siblingFields } = target;\n\n if (field.type === undefined || slot.bitWidth !== undefined) {\n return undefined;\n }\n\n const elements = resolveStructArrayElements(context, field.type);\n\n if (elements === undefined) {\n return undefined;\n }\n\n const shape = resolveStructArrayShape(context, elements, siblingFields);\n\n if (shape === undefined || inlineLeafCount(context, elements.elementFields) === 0) {\n return undefined;\n }\n\n return {\n fieldType: field.type,\n elementFields: elements.elementFields,\n lengthExpr: shape.lengthExpr,\n elementSize: shape.elementSize,\n };\n};\n\nconst renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {\n const resolution = resolveStructArray(context, target);\n\n if (resolution === undefined) {\n return undefined;\n }\n\n const { field, jsName, slot } = target;\n const { fieldType, elementFields, lengthExpr, elementSize } = resolution;\n context.addRuntimeImport(\"read\");\n context.addRuntimeImport(\"getHandle\");\n context.addRuntimeImport(\"t\");\n\n const options: StructArrayAccessorOptions = {\n context,\n jsName,\n tsType: renderTsType(context, fieldType, false),\n elementDescriptor: tStruct(\"borrowed\", {\n size: `${lengthExpr} * ${String(elementSize)}`,\n wrapperClass: undefined,\n isCallerAllocated: false,\n }),\n offset: slot.byteOffset,\n lengthExpr,\n elementSize,\n elementFields,\n };\n\n const blocks: string[] = [];\n\n if (field.readable) {\n blocks.push(structArrayGetterBlock(options));\n }\n\n if (field.writable) {\n context.addRuntimeImport(\"write\");\n blocks.push(structArraySetterBlock(options));\n }\n\n return blocks.length === 0 ? undefined : blocks.join(\"\\n\\n\");\n};\n\nconst getterBlock = (options: AccessorOptions): string => {\n const { context, jsName, tsType, descriptor, slot, fieldType } = options;\n context.addRuntimeImport(\"read\");\n context.addRuntimeImport(\"getHandle\");\n\n if (slot.bitWidth === undefined) {\n const valueExpression = `read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)})`;\n\n const wrapped = wrapReturnValue(context, {\n ref: fieldType,\n isNullable: false,\n valueExpression,\n });\n\n const body = `return ${wrapped};`;\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n }\n\n const mask = bitMask(slot.bitWidth);\n const shift = slot.bitOffset ?? 0;\n const readUnit = `const __unit = read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)}) as number;`;\n const body = `${readUnit}\\nreturn (((__unit >>> ${String(shift)}) & ${String(mask)}) >>> 0) as ${tsType};`;\n\n return renderBlock(`get ${jsName}(): ${tsType}`, body);\n};\n\nconst setterBody = (context: ModuleContext, descriptor: string, slot: FieldSlot): string => {\n context.addRuntimeImport(\"getHandle\");\n\n return emitFieldWrite(context, { descriptor, slot, targetExpr: \"getHandle(this)\", valueExpr: \"value\" });\n};\n\nconst setterBlock = (options: AccessorOptions): string =>\n renderBlock(\n `set ${options.jsName}(value: ${options.tsType})`,\n setterBody(options.context, options.descriptor, options.slot),\n );\n\nexport {\n isEmittableField,\n isInlineField,\n emitFieldWrite,\n resolveRecordFieldEntry,\n renderRecordFieldAccessor,\n};\n"]}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { GirField } from "../../gir/field.js";
|
|
2
|
+
import type { EntityType } from "../../gir/type.js";
|
|
2
3
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
4
|
import { type FieldSlot } from "../../gir/size.js";
|
|
5
|
+
type ResolvedRecordValue = Extract<EntityType, {
|
|
6
|
+
kind: "record";
|
|
7
|
+
}>["value"];
|
|
4
8
|
type RecordFieldSlot = {
|
|
5
9
|
field: GirField;
|
|
6
10
|
slot: FieldSlot;
|
|
@@ -9,7 +13,8 @@ declare const computeRecordFieldSlots: (context: ModuleContext, fields: GirField
|
|
|
9
13
|
slots: RecordFieldSlot[];
|
|
10
14
|
size: number;
|
|
11
15
|
};
|
|
16
|
+
declare const recordInlineSize: (context: ModuleContext, record: ResolvedRecordValue) => number | undefined;
|
|
12
17
|
declare const bitMask: (width: number) => number;
|
|
13
18
|
declare const mergeBitfield: (readExpr: string, valueExpr: string, mask: number, shift: number) => string;
|
|
14
|
-
export { computeRecordFieldSlots, bitMask, mergeBitfield, type RecordFieldSlot };
|
|
19
|
+
export { computeRecordFieldSlots, recordInlineSize, bitMask, mergeBitfield, type RecordFieldSlot };
|
|
15
20
|
//# sourceMappingURL=record-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-layout.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"record-layout.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAIH,KAAK,SAAS,EAEjB,MAAM,mBAAmB,CAAC;AAE3B,KAAK,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAE5E,KAAK,eAAe,GAAG;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;CACnB,CAAC;AAUF,QAAA,MAAM,uBAAuB,GACzB,SAAS,aAAa,EACtB,QAAQ,QAAQ,EAAE,EAClB,iBAAe,KAChB;IAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAe1C,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,SAAS,aAAa,EAAE,QAAQ,mBAAmB,KAAG,MAAM,GAAG,SAQxF,CAAC;AAEF,QAAA,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MAMhC,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,MAQzF,CAAC;AAwJF,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,CAAC"}
|
|
@@ -17,6 +17,13 @@ const computeRecordFieldSlots = (context, fields, isUnion = false) => {
|
|
|
17
17
|
});
|
|
18
18
|
return { slots, size: result.size };
|
|
19
19
|
};
|
|
20
|
+
const recordInlineSize = (context, record) => {
|
|
21
|
+
if (record.opaque || record.disguised || record.fields.length === 0) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
25
|
+
return size > 0 ? size : undefined;
|
|
26
|
+
};
|
|
20
27
|
const bitMask = (width) => {
|
|
21
28
|
if (width >= 32) {
|
|
22
29
|
return 0xFF_FF_FF_FF;
|
|
@@ -124,5 +131,5 @@ const resolveAliasLayout = (context, resolved, visited) => {
|
|
|
124
131
|
}
|
|
125
132
|
return layoutOfType(context, ref, resolved.value.targetCType, visited);
|
|
126
133
|
};
|
|
127
|
-
export { computeRecordFieldSlots, bitMask, mergeBitfield };
|
|
134
|
+
export { computeRecordFieldSlots, recordInlineSize, bitMask, mergeBitfield };
|
|
128
135
|
//# sourceMappingURL=record-layout.js.map
|