@gtkx/codegen 1.2.1 → 1.3.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.
Files changed (213) hide show
  1. package/README.md +2 -1
  2. package/dist/analysis/descriptor-render.d.ts +7 -1
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +36 -15
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +4 -1
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +11 -2
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/param-capability.d.ts +5 -2
  11. package/dist/analysis/param-capability.d.ts.map +1 -1
  12. package/dist/analysis/param-capability.js +36 -4
  13. package/dist/analysis/param-capability.js.map +1 -1
  14. package/dist/analysis/param-structure.d.ts +1 -1
  15. package/dist/analysis/param-structure.d.ts.map +1 -1
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +1 -1
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +28 -10
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.js +1 -1
  22. package/dist/compile.js.map +1 -1
  23. package/dist/docs/api-reference.d.ts +6 -0
  24. package/dist/docs/api-reference.d.ts.map +1 -1
  25. package/dist/docs/api-reference.js +11 -2
  26. package/dist/docs/api-reference.js.map +1 -1
  27. package/dist/docs/pipeline.d.ts +3 -0
  28. package/dist/docs/pipeline.d.ts.map +1 -1
  29. package/dist/docs/pipeline.js +10 -1
  30. package/dist/docs/pipeline.js.map +1 -1
  31. package/dist/fingerprint.d.ts +5 -0
  32. package/dist/fingerprint.d.ts.map +1 -1
  33. package/dist/fingerprint.js +107 -15
  34. package/dist/fingerprint.js.map +1 -1
  35. package/dist/gi.d.ts +3 -0
  36. package/dist/gi.d.ts.map +1 -1
  37. package/dist/gi.js +29 -7
  38. package/dist/gi.js.map +1 -1
  39. package/dist/gir/external-namespaces.d.ts +8 -0
  40. package/dist/gir/external-namespaces.d.ts.map +1 -0
  41. package/dist/gir/external-namespaces.js +4 -0
  42. package/dist/gir/external-namespaces.js.map +1 -0
  43. package/dist/gir/finish-overrides.d.ts +3 -0
  44. package/dist/gir/finish-overrides.d.ts.map +1 -0
  45. package/dist/gir/finish-overrides.js +5 -0
  46. package/dist/gir/finish-overrides.js.map +1 -0
  47. package/dist/gir/function.d.ts +5 -2
  48. package/dist/gir/function.d.ts.map +1 -1
  49. package/dist/gir/function.js +34 -5
  50. package/dist/gir/function.js.map +1 -1
  51. package/dist/gir/hidden-symbols.d.ts +3 -0
  52. package/dist/gir/hidden-symbols.d.ts.map +1 -0
  53. package/dist/gir/hidden-symbols.js +39 -0
  54. package/dist/gir/hidden-symbols.js.map +1 -0
  55. package/dist/gir/library.d.ts +22 -2
  56. package/dist/gir/library.d.ts.map +1 -1
  57. package/dist/gir/library.js +21 -3
  58. package/dist/gir/library.js.map +1 -1
  59. package/dist/gir/ucs4-overrides.d.ts +3 -0
  60. package/dist/gir/ucs4-overrides.d.ts.map +1 -0
  61. package/dist/gir/ucs4-overrides.js +7 -0
  62. package/dist/gir/ucs4-overrides.js.map +1 -0
  63. package/dist/jsx.d.ts.map +1 -1
  64. package/dist/jsx.js +27 -8
  65. package/dist/jsx.js.map +1 -1
  66. package/dist/runner.d.ts +8 -0
  67. package/dist/runner.d.ts.map +1 -1
  68. package/dist/runner.js +9 -3
  69. package/dist/runner.js.map +1 -1
  70. package/dist/store/external-package-links.d.ts +6 -0
  71. package/dist/store/external-package-links.d.ts.map +1 -0
  72. package/dist/store/external-package-links.js +158 -0
  73. package/dist/store/external-package-links.js.map +1 -0
  74. package/dist/store/gi/callable-doc.d.ts.map +1 -1
  75. package/dist/store/gi/callable-doc.js +4 -4
  76. package/dist/store/gi/callable-doc.js.map +1 -1
  77. package/dist/store/gi/callables.d.ts +1 -1
  78. package/dist/store/gi/callables.d.ts.map +1 -1
  79. package/dist/store/gi/callables.js +4 -4
  80. package/dist/store/gi/callables.js.map +1 -1
  81. package/dist/store/gi/class.d.ts.map +1 -1
  82. package/dist/store/gi/class.js +25 -15
  83. package/dist/store/gi/class.js.map +1 -1
  84. package/dist/store/gi/constructor-props.js +1 -1
  85. package/dist/store/gi/constructor-props.js.map +1 -1
  86. package/dist/store/gi/function.d.ts.map +1 -1
  87. package/dist/store/gi/function.js +2 -1
  88. package/dist/store/gi/function.js.map +1 -1
  89. package/dist/store/gi/gtype-binding.d.ts +2 -2
  90. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  91. package/dist/store/gi/gtype-binding.js +6 -13
  92. package/dist/store/gi/gtype-binding.js.map +1 -1
  93. package/dist/store/gi/interface.js +2 -2
  94. package/dist/store/gi/interface.js.map +1 -1
  95. package/dist/store/gi/method.d.ts +7 -2
  96. package/dist/store/gi/method.d.ts.map +1 -1
  97. package/dist/store/gi/method.js +126 -30
  98. package/dist/store/gi/method.js.map +1 -1
  99. package/dist/store/gi/param-marshal.d.ts +8 -1
  100. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  101. package/dist/store/gi/param-marshal.js +52 -4
  102. package/dist/store/gi/param-marshal.js.map +1 -1
  103. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  104. package/dist/store/gi/record-constructor.js +2 -3
  105. package/dist/store/gi/record-constructor.js.map +1 -1
  106. package/dist/store/gi/record-field-accessor.d.ts +2 -1
  107. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  108. package/dist/store/gi/record-field-accessor.js +142 -16
  109. package/dist/store/gi/record-field-accessor.js.map +1 -1
  110. package/dist/store/gi/record-layout.d.ts +5 -2
  111. package/dist/store/gi/record-layout.d.ts.map +1 -1
  112. package/dist/store/gi/record-layout.js +2 -1
  113. package/dist/store/gi/record-layout.js.map +1 -1
  114. package/dist/store/gi/record.d.ts.map +1 -1
  115. package/dist/store/gi/record.js +9 -5
  116. package/dist/store/gi/record.js.map +1 -1
  117. package/dist/store/gi/runtime-override.js +1 -1
  118. package/dist/store/gi/runtime-override.js.map +1 -1
  119. package/dist/store/gi/signal.js +2 -2
  120. package/dist/store/gi/signal.js.map +1 -1
  121. package/dist/store/gi/vtable.d.ts.map +1 -1
  122. package/dist/store/gi/vtable.js +82 -12
  123. package/dist/store/gi/vtable.js.map +1 -1
  124. package/dist/store/gi-store.d.ts +7 -2
  125. package/dist/store/gi-store.d.ts.map +1 -1
  126. package/dist/store/gi-store.js +19 -4
  127. package/dist/store/gi-store.js.map +1 -1
  128. package/dist/store/jsx/jsx.d.ts.map +1 -1
  129. package/dist/store/jsx/jsx.js +3 -1
  130. package/dist/store/jsx/jsx.js.map +1 -1
  131. package/dist/store/jsx-store.d.ts +8 -1
  132. package/dist/store/jsx-store.d.ts.map +1 -1
  133. package/dist/store/jsx-store.js +9 -2
  134. package/dist/store/jsx-store.js.map +1 -1
  135. package/dist/store/resolve-store.d.ts +2 -1
  136. package/dist/store/resolve-store.d.ts.map +1 -1
  137. package/dist/store/resolve-store.js +2 -1
  138. package/dist/store/resolve-store.js.map +1 -1
  139. package/dist/store/store-fs.d.ts +2 -1
  140. package/dist/store/store-fs.d.ts.map +1 -1
  141. package/dist/store/store-fs.js +8 -3
  142. package/dist/store/store-fs.js.map +1 -1
  143. package/dist/writer/context.d.ts.map +1 -1
  144. package/dist/writer/context.js +8 -0
  145. package/dist/writer/context.js.map +1 -1
  146. package/dist/writer/gtk-doc.d.ts.map +1 -1
  147. package/dist/writer/gtk-doc.js +27 -1
  148. package/dist/writer/gtk-doc.js.map +1 -1
  149. package/overrides/gdk/rgba.ts.ejs +15 -1
  150. package/overrides/glib/index.ts.ejs +3 -0
  151. package/overrides/glib/regex.ts.ejs +66 -0
  152. package/overrides/gobject/index.ts.ejs +3 -0
  153. package/overrides/gobject/object-class.ts.ejs +27 -0
  154. package/overrides/gobject/param-spec-getters.ts.ejs +57 -0
  155. package/overrides/gobject/param-spec.ts.ejs +21 -0
  156. package/overrides/gobject/value.ts.ejs +6 -1
  157. package/overrides/graphene/structs.ts.ejs +38 -3
  158. package/overrides/gtk/index.ts.ejs +2 -0
  159. package/overrides/gtk/widget-class.ts.ejs +28 -0
  160. package/package.json +6 -5
  161. package/src/analysis/descriptor-render.ts +59 -16
  162. package/src/analysis/descriptor.ts +15 -3
  163. package/src/analysis/param-capability.ts +68 -5
  164. package/src/analysis/param-structure.ts +1 -1
  165. package/src/analysis/ts-type.ts +45 -11
  166. package/src/compile.ts +1 -1
  167. package/src/docs/api-reference.ts +20 -2
  168. package/src/docs/pipeline.ts +15 -1
  169. package/src/fingerprint.ts +144 -16
  170. package/src/gi.ts +44 -9
  171. package/src/gir/external-namespaces.ts +8 -0
  172. package/src/gir/finish-overrides.ts +5 -0
  173. package/src/gir/function.ts +52 -14
  174. package/src/gir/hidden-symbols.ts +39 -0
  175. package/src/gir/library.ts +36 -3
  176. package/src/gir/ucs4-overrides.ts +7 -0
  177. package/src/jsx.ts +33 -8
  178. package/src/runner.ts +17 -3
  179. package/src/store/external-package-links.ts +226 -0
  180. package/src/store/gi/callable-doc.ts +8 -4
  181. package/src/store/gi/callables.ts +5 -5
  182. package/src/store/gi/class.ts +42 -32
  183. package/src/store/gi/constructor-props.ts +1 -1
  184. package/src/store/gi/function.ts +2 -1
  185. package/src/store/gi/gtype-binding.ts +7 -15
  186. package/src/store/gi/interface.ts +2 -2
  187. package/src/store/gi/method.ts +189 -36
  188. package/src/store/gi/param-marshal.ts +67 -4
  189. package/src/store/gi/record-constructor.ts +8 -3
  190. package/src/store/gi/record-field-accessor.ts +209 -16
  191. package/src/store/gi/record-layout.ts +11 -1
  192. package/src/store/gi/record.ts +17 -13
  193. package/src/store/gi/runtime-override.ts +1 -1
  194. package/src/store/gi/signal.ts +2 -2
  195. package/src/store/gi/vtable.ts +118 -11
  196. package/src/store/gi-store.ts +33 -3
  197. package/src/store/jsx/jsx.ts +3 -1
  198. package/src/store/jsx-store.ts +23 -7
  199. package/src/store/resolve-store.ts +2 -1
  200. package/src/store/store-fs.ts +10 -2
  201. package/src/writer/context.ts +11 -0
  202. package/src/writer/gtk-doc.ts +38 -1
  203. package/overrides/cairo/context.ts.ejs +0 -1269
  204. package/overrides/cairo/font-face.ts.ejs +0 -151
  205. package/overrides/cairo/font-options.ts.ejs +0 -199
  206. package/overrides/cairo/image-surface.ts.ejs +0 -132
  207. package/overrides/cairo/index.ts.ejs +0 -22
  208. package/overrides/cairo/matrix.ts.ejs +0 -171
  209. package/overrides/cairo/pattern.ts.ejs +0 -476
  210. package/overrides/cairo/recording-surface.ts.ejs +0 -102
  211. package/overrides/cairo/region.ts.ejs +0 -237
  212. package/overrides/cairo/scaled-font.ts.ejs +0 -330
  213. package/overrides/cairo/surface.ts.ejs +0 -296
@@ -1,5 +1,5 @@
1
1
  import { sanitizeTypeIdentifier } from "@gtkx/utils";
2
- import { isInoutParameter } from "../../gir/parameter.js";
2
+ import { isCallerAllocatedOut, isInoutParameter } from "../../gir/parameter.js";
3
3
  import { recordInlineSize } from "./record-layout.js";
4
4
  import { isConstructibleRecord } from "./value-marshalable.js";
5
5
  const isHandlePassedInPlace = (context, parameter) => {
@@ -64,6 +64,51 @@ const renderCallerOutInstance = (context, parameter) => {
64
64
  return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;
65
65
  };
66
66
  const isCollectibleCallerOut = (context, parameter) => callerOutAllocation(context, parameter) !== undefined;
67
+ const hasInlineElementStride = (context, array) => {
68
+ if (array.elementCType?.includes("*") === true) {
69
+ return false;
70
+ }
71
+ const element = underlyingType(context, array.element);
72
+ if (element === undefined) {
73
+ return false;
74
+ }
75
+ switch (element.kind) {
76
+ case "primitive": {
77
+ return (element.category !== "void" &&
78
+ element.category !== "string" &&
79
+ element.category !== "pointer" &&
80
+ element.category !== "unichar" &&
81
+ element.category !== "gtype");
82
+ }
83
+ case "enum": {
84
+ return true;
85
+ }
86
+ case "record": {
87
+ return recordInlineSize(context, element.value) !== undefined;
88
+ }
89
+ case "alias":
90
+ case "callback":
91
+ case "carray":
92
+ case "class":
93
+ case "hashtable":
94
+ case "interface":
95
+ case "list":
96
+ case "varargs": {
97
+ return false;
98
+ }
99
+ }
100
+ };
101
+ const isFixedArrayCallerOut = (context, parameter) => {
102
+ if (!isCallerAllocatedOut(parameter)) {
103
+ return false;
104
+ }
105
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
106
+ return (type?.kind === "carray" &&
107
+ type.fixedSize !== undefined &&
108
+ type.fixedSize > 0 &&
109
+ type.lengthParameterIndex === undefined &&
110
+ hasInlineElementStride(context, type));
111
+ };
67
112
  const isAllocatableCallerOut = (context, parameter) => underlyingParamKind(context, parameter) === "record" && isCollectibleCallerOut(context, parameter);
68
113
  const isRecordInout = (context, parameter) => isInoutParameter(parameter) && underlyingParamKind(context, parameter) === "record";
69
114
  const isHandlePassing = (context, ref) => {
@@ -91,9 +136,12 @@ const isHandlePassing = (context, ref) => {
91
136
  }
92
137
  }
93
138
  };
94
- const isClosureType = (context, ref) => {
139
+ const isGObjectTypeNamed = (context, ref, typeName) => {
95
140
  const name = context.library.nameFor(ref);
96
- return name?.namespaceName === "GObject" && name.typeName === "Closure";
141
+ return name?.namespaceName === "GObject" && name.typeName === typeName;
97
142
  };
98
- export { isAllocatableCallerOut, isClosureType, isHandlePassedInPlace, isCollectibleCallerOut, isRecordInout, isHandlePassing, renderCallerOutInstance, underlyingType, };
143
+ const isClosureType = (context, ref) => isGObjectTypeNamed(context, ref, "Closure");
144
+ const isValueType = (context, ref) => isGObjectTypeNamed(context, ref, "Value");
145
+ const isValueTypeName = (name) => name.namespaceName === "GObject" && name.typeName === "Value";
146
+ export { isAllocatableCallerOut, isClosureType, isValueType, isValueTypeName, isHandlePassedInPlace, isCollectibleCallerOut, isFixedArrayCallerOut, isRecordInout, isHandlePassing, renderCallerOutInstance, underlyingType, };
99
147
  //# sourceMappingURL=param-marshal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"param-marshal.js","sourceRoot":"","sources":["../../../src/store/gi/param-marshal.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeTypeIdentifier } from \"@gtkx/utils\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { type GirParameter, isInoutParameter } from \"../../gir/parameter.js\";\nimport { recordInlineSize } from \"./record-layout.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\ntype TypeName = { namespaceName: string; typeName: string };\ntype CallerOutAllocation = TypeName & ({ strategy: \"construct\" } | { strategy: \"allocate\"; size: number });\n\nconst isHandlePassedInPlace = (context: ModuleContext, parameter: GirParameter): boolean => {\n if (parameter.direction !== \"out\" && parameter.direction !== \"inout\") {\n return false;\n }\n\n return (\n (parameter.callerAllocates || parameter.direction === \"inout\") &&\n parameter.type !== undefined &&\n isHandlePassing(context, parameter.type)\n );\n};\n\nconst underlyingType = (context: ModuleContext, ref: TypeId): GirType | undefined => {\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"alias\") {\n return type;\n }\n\n return type.value.target === undefined ? undefined : underlyingType(context, type.value.target);\n};\n\nconst underlyingParamKind = (context: ModuleContext, parameter: GirParameter): GirType[\"kind\"] | undefined =>\n parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;\n\nconst resolvedTypeName = (context: ModuleContext, ref: TypeId | undefined): TypeName | undefined => {\n let current = ref;\n\n while (current !== undefined) {\n const resolved = context.library.typeFor(current);\n\n if (resolved?.kind === \"alias\" && resolved.value.target !== undefined) {\n current = resolved.value.target;\n continue;\n }\n\n return context.library.nameFor(current);\n }\n\n return undefined;\n};\n\nconst recordCallerOutAllocation = (\n context: ModuleContext,\n name: TypeName,\n type: Extract<GirType, { kind: \"record\" }>,\n): CallerOutAllocation | undefined => {\n const size = recordInlineSize(context, type.value);\n\n if (size === undefined) {\n return undefined;\n }\n\n return isConstructibleRecord(context, type.namespace.name, type.value)\n ? { ...name, strategy: \"construct\" }\n : { ...name, strategy: \"allocate\", size };\n};\n\nconst callerOutAllocation = (context: ModuleContext, parameter: GirParameter): CallerOutAllocation | undefined => {\n const name = resolvedTypeName(context, parameter.type);\n const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);\n\n if (name === undefined || type === undefined) {\n return undefined;\n }\n\n if (type.kind === \"class\") {\n return { ...name, strategy: \"construct\" };\n }\n\n return type.kind === \"record\" ? recordCallerOutAllocation(context, name, type) : undefined;\n};\n\nconst renderCallerOutInstance = (context: ModuleContext, parameter: GirParameter): string => {\n const allocation = callerOutAllocation(context, parameter);\n\n if (allocation === undefined) {\n throw new Error(\"renderCallerOutInstance: expected a caller-allocated out-parameter with a known layout\");\n }\n\n const classExpression = context.qualify(allocation.namespaceName, sanitizeTypeIdentifier(allocation.typeName));\n\n if (allocation.strategy === \"construct\") {\n return `new ${classExpression}()`;\n }\n\n context.addRuntimeImport(\"alloc\");\n context.addRuntimeImport(\"wrapHandle\");\n\n return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;\n};\n\nconst isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n callerOutAllocation(context, parameter) !== undefined;\n\nconst isAllocatableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n underlyingParamKind(context, parameter) === \"record\" && isCollectibleCallerOut(context, parameter);\n\nconst isRecordInout = (context: ModuleContext, parameter: GirParameter): boolean =>\n isInoutParameter(parameter) && underlyingParamKind(context, parameter) === \"record\";\n\nconst isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return true;\n }\n\n switch (type.kind) {\n case \"class\":\n case \"interface\":\n case \"record\": {\n return true;\n }\n case \"alias\": {\n return type.value.target !== undefined && isHandlePassing(context, type.value.target);\n }\n case \"callback\":\n case \"carray\":\n case \"enum\":\n case \"hashtable\":\n case \"list\":\n case \"primitive\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isClosureType = (context: ModuleContext, ref: TypeId): boolean => {\n const name = context.library.nameFor(ref);\n\n return name?.namespaceName === \"GObject\" && name.typeName === \"Closure\";\n};\n\nexport {\n isAllocatableCallerOut,\n isClosureType,\n isHandlePassedInPlace,\n isCollectibleCallerOut,\n isRecordInout,\n isHandlePassing,\n renderCallerOutInstance,\n underlyingType,\n};\n"]}
1
+ {"version":3,"file":"param-marshal.js","sourceRoot":"","sources":["../../../src/store/gi/param-marshal.ts"],"names":[],"mappings":"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","sourcesContent":["import { sanitizeTypeIdentifier } from \"@gtkx/utils\";\nimport type { CArrayType, TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { type GirParameter, isCallerAllocatedOut, isInoutParameter } from \"../../gir/parameter.js\";\nimport { recordInlineSize } from \"./record-layout.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\ntype TypeName = { namespaceName: string; typeName: string };\ntype CallerOutAllocation = TypeName & ({ strategy: \"construct\" } | { strategy: \"allocate\"; size: number });\n\nconst isHandlePassedInPlace = (context: ModuleContext, parameter: GirParameter): boolean => {\n if (parameter.direction !== \"out\" && parameter.direction !== \"inout\") {\n return false;\n }\n\n return (\n (parameter.callerAllocates || parameter.direction === \"inout\") &&\n parameter.type !== undefined &&\n isHandlePassing(context, parameter.type)\n );\n};\n\nconst underlyingType = (context: ModuleContext, ref: TypeId): GirType | undefined => {\n const type = context.library.typeFor(ref);\n\n if (type?.kind !== \"alias\") {\n return type;\n }\n\n return type.value.target === undefined ? undefined : underlyingType(context, type.value.target);\n};\n\nconst underlyingParamKind = (context: ModuleContext, parameter: GirParameter): GirType[\"kind\"] | undefined =>\n parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;\n\nconst resolvedTypeName = (context: ModuleContext, ref: TypeId | undefined): TypeName | undefined => {\n let current = ref;\n\n while (current !== undefined) {\n const resolved = context.library.typeFor(current);\n\n if (resolved?.kind === \"alias\" && resolved.value.target !== undefined) {\n current = resolved.value.target;\n continue;\n }\n\n return context.library.nameFor(current);\n }\n\n return undefined;\n};\n\nconst recordCallerOutAllocation = (\n context: ModuleContext,\n name: TypeName,\n type: Extract<GirType, { kind: \"record\" }>,\n): CallerOutAllocation | undefined => {\n const size = recordInlineSize(context, type.value);\n\n if (size === undefined) {\n return undefined;\n }\n\n return isConstructibleRecord(context, type.namespace.name, type.value)\n ? { ...name, strategy: \"construct\" }\n : { ...name, strategy: \"allocate\", size };\n};\n\nconst callerOutAllocation = (context: ModuleContext, parameter: GirParameter): CallerOutAllocation | undefined => {\n const name = resolvedTypeName(context, parameter.type);\n const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);\n\n if (name === undefined || type === undefined) {\n return undefined;\n }\n\n if (type.kind === \"class\") {\n return { ...name, strategy: \"construct\" };\n }\n\n return type.kind === \"record\" ? recordCallerOutAllocation(context, name, type) : undefined;\n};\n\nconst renderCallerOutInstance = (context: ModuleContext, parameter: GirParameter): string => {\n const allocation = callerOutAllocation(context, parameter);\n\n if (allocation === undefined) {\n throw new Error(\"renderCallerOutInstance: expected a caller-allocated out-parameter with a known layout\");\n }\n\n const classExpression = context.qualify(allocation.namespaceName, sanitizeTypeIdentifier(allocation.typeName));\n\n if (allocation.strategy === \"construct\") {\n return `new ${classExpression}()`;\n }\n\n context.addRuntimeImport(\"alloc\");\n context.addRuntimeImport(\"wrapHandle\");\n\n return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;\n};\n\nconst isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n callerOutAllocation(context, parameter) !== undefined;\n\nconst hasInlineElementStride = (context: ModuleContext, array: CArrayType): boolean => {\n if (array.elementCType?.includes(\"*\") === true) {\n return false;\n }\n\n const element = underlyingType(context, array.element);\n\n if (element === undefined) {\n return false;\n }\n\n switch (element.kind) {\n case \"primitive\": {\n return (\n element.category !== \"void\" &&\n element.category !== \"string\" &&\n element.category !== \"pointer\" &&\n element.category !== \"unichar\" &&\n element.category !== \"gtype\"\n );\n }\n case \"enum\": {\n return true;\n }\n case \"record\": {\n return recordInlineSize(context, element.value) !== undefined;\n }\n case \"alias\":\n case \"callback\":\n case \"carray\":\n case \"class\":\n case \"hashtable\":\n case \"interface\":\n case \"list\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isFixedArrayCallerOut = (context: ModuleContext, parameter: GirParameter): boolean => {\n if (!isCallerAllocatedOut(parameter)) {\n return false;\n }\n\n const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);\n\n return (\n type?.kind === \"carray\" &&\n type.fixedSize !== undefined &&\n type.fixedSize > 0 &&\n type.lengthParameterIndex === undefined &&\n hasInlineElementStride(context, type)\n );\n};\n\nconst isAllocatableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>\n underlyingParamKind(context, parameter) === \"record\" && isCollectibleCallerOut(context, parameter);\n\nconst isRecordInout = (context: ModuleContext, parameter: GirParameter): boolean =>\n isInoutParameter(parameter) && underlyingParamKind(context, parameter) === \"record\";\n\nconst isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return true;\n }\n\n switch (type.kind) {\n case \"class\":\n case \"interface\":\n case \"record\": {\n return true;\n }\n case \"alias\": {\n return type.value.target !== undefined && isHandlePassing(context, type.value.target);\n }\n case \"callback\":\n case \"carray\":\n case \"enum\":\n case \"hashtable\":\n case \"list\":\n case \"primitive\":\n case \"varargs\": {\n return false;\n }\n }\n};\n\nconst isGObjectTypeNamed = (context: ModuleContext, ref: TypeId, typeName: string): boolean => {\n const name = context.library.nameFor(ref);\n\n return name?.namespaceName === \"GObject\" && name.typeName === typeName;\n};\n\nconst isClosureType = (context: ModuleContext, ref: TypeId): boolean => isGObjectTypeNamed(context, ref, \"Closure\");\nconst isValueType = (context: ModuleContext, ref: TypeId): boolean => isGObjectTypeNamed(context, ref, \"Value\");\nconst isValueTypeName = (name: TypeName): boolean => name.namespaceName === \"GObject\" && name.typeName === \"Value\";\n\nexport {\n isAllocatableCallerOut,\n isClosureType,\n isValueType,\n isValueTypeName,\n isHandlePassedInPlace,\n isCollectibleCallerOut,\n isFixedArrayCallerOut,\n isRecordInout,\n isHandlePassing,\n renderCallerOutInstance,\n underlyingType,\n};\n"]}
@@ -1 +1 @@
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;AAOF,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
+ {"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;AAI7D,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAe/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;AAOF,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,12 +1,11 @@
1
1
  import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
2
2
  import { renderDescriptor } from "../../analysis/descriptor-render.js";
3
3
  import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
4
- import { renderTsType } from "../../analysis/ts-type.js";
5
4
  import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
6
5
  import { staticMembers } from "./callables.js";
7
6
  import { getDoc } from "./doc-spec.js";
8
7
  import { renderSourceGtype } from "./gtype-binding.js";
9
- import { emitFieldWrite, isEmittableField, isInlineField, isStorableFieldType } from "./record-field-accessor.js";
8
+ import { emitFieldWrite, fieldTsType, isEmittableField, isInlineField, isStorableFieldType, } from "./record-field-accessor.js";
10
9
  import { computeRecordFieldSlots } from "./record-layout.js";
11
10
  import { isConstructibleRecord } from "./value-marshalable.js";
12
11
  const isWritableFieldSlot = (context, entry) => entry.field.writable &&
@@ -18,7 +17,7 @@ const renderRecordConstructorPropsInterface = (context, record, className) => {
18
17
  const lines = slots
19
18
  .filter((entry) => isWritableFieldSlot(context, entry))
20
19
  .map((entry) => `${getDoc(entry.field)}${toCamelIdentifier(entry.field.name)}?: ` +
21
- `${renderTsType(context, entry.field.type, true)};`);
20
+ `${fieldTsType(context, entry.field.type, true)};`);
22
21
  return renderBracedOrEmpty(head, lines.join("\n"));
23
22
  };
24
23
  const isSelfReturning = (context, record, callable) => {
@@ -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 { 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, isStorableFieldType } 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 &&\n isEmittableField(context, entry.field) &&\n isStorableFieldType(context, entry.field.type);\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
+ {"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 { 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 {\n emitFieldWrite,\n fieldTsType,\n isEmittableField,\n isInlineField,\n isStorableFieldType,\n} 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 &&\n isEmittableField(context, entry.field) &&\n isStorableFieldType(context, entry.field.type);\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 `${fieldTsType(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"]}
@@ -23,7 +23,8 @@ declare const isEmittableField: (context: ModuleContext, field: GirField) => fie
23
23
  declare const emitFieldWrite: (context: ModuleContext, spec: FieldWriteSpec) => string;
24
24
  declare const isStorableFieldType: (context: ModuleContext, ref: TypeId) => boolean;
25
25
  declare const resolveRecordFieldEntry: (context: ModuleContext, slot: RecordFieldSlot, claimedNames: Set<string>, siblingFields: GirField[]) => RecordFieldEntry | undefined;
26
+ declare const fieldTsType: (context: ModuleContext, ref: TypeId | undefined, isNullable?: boolean) => string;
26
27
  declare const renderRecordFieldAccessor: (context: ModuleContext, slot: RecordFieldSlot, claimedNames: Set<string>, siblingFields: GirField[]) => string | undefined;
27
28
  declare const isInlineField: (context: ModuleContext, field: GirField) => boolean;
28
- export { isEmittableField, isInlineField, isStorableFieldType, emitFieldWrite, resolveRecordFieldEntry, renderRecordFieldAccessor, };
29
+ export { fieldTsType, isEmittableField, isInlineField, isStorableFieldType, emitFieldWrite, resolveRecordFieldEntry, renderRecordFieldAccessor, };
29
30
  //# sourceMappingURL=record-field-accessor.d.ts.map
@@ -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;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;AAO7D,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;AAWF,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;AAuCF,QAAA,MAAM,mBAAmB,GAAI,SAAS,aAAa,EAAE,KAAK,MAAM,KAAG,OAIlE,CAAC;AAuBF,QAAA,MAAM,uBAAuB,GACzB,SAAS,aAAa,EACtB,MAAM,eAAe,EACrB,cAAc,GAAG,CAAC,MAAM,CAAC,EACzB,eAAe,QAAQ,EAAE,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,SAqCX,CAAC;AAkCF,QAAA,MAAM,aAAa,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,OACwC,CAAC;AA6X1G,OAAO,EACH,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,yBAAyB,GAC5B,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;AAGnD,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;AAO7D,OAAO,EAKH,KAAK,eAAe,EACvB,MAAM,oBAAoB,CAAC;AAI5B,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;AAWF,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;AA2FF,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;AAuCF,QAAA,MAAM,mBAAmB,GAAI,SAAS,aAAa,EAAE,KAAK,MAAM,KAAG,OAIlE,CAAC;AA0BF,QAAA,MAAM,uBAAuB,GACzB,SAAS,aAAa,EACtB,MAAM,eAAe,EACrB,cAAc,GAAG,CAAC,MAAM,CAAC,EACzB,eAAe,QAAQ,EAAE,KAC1B,gBAAgB,GAAG,SAcrB,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,SAAS,aAAa,EAAE,KAAK,MAAM,GAAG,SAAS,EAAE,oBAAkB,KAAG,MAM1F,CAAC;AAEF,QAAA,MAAM,yBAAyB,GAC3B,SAAS,aAAa,EACtB,MAAM,eAAe,EACrB,cAAc,GAAG,CAAC,MAAM,CAAC,EACzB,eAAe,QAAQ,EAAE,KAC1B,MAAM,GAAG,SAsCX,CAAC;AAkCF,QAAA,MAAM,aAAa,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,OACwC,CAAC;AA0hB1G,OAAO,EACH,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,uBAAuB,EACvB,yBAAyB,GAC5B,CAAC"}
@@ -2,10 +2,10 @@ import { toCamelIdentifier } from "@gtkx/utils";
2
2
  import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
3
3
  import { tStruct } from "../../analysis/descriptor.js";
4
4
  import { renderTsType } from "../../analysis/ts-type.js";
5
- import { isUnboundedArray } from "../../analysis/type-shape.js";
5
+ import { isByteSequence, isUnboundedArray } from "../../analysis/type-shape.js";
6
6
  import { indent, renderBlock } from "../../writer/emit.js";
7
7
  import { getDoc } from "./doc-spec.js";
8
- import { bitMask, computeRecordFieldSlots, mergeBitfield } from "./record-layout.js";
8
+ import { bitMask, computeRecordFieldSlots, inlineArrayStride, mergeBitfield, } from "./record-layout.js";
9
9
  import { wrapReturnValue } from "./return-wrap.js";
10
10
  import { isValueMarshalable } from "./value-marshalable.js";
11
11
  const isMarshalableField = (context, field) => {
@@ -60,6 +60,7 @@ const isStorableFieldType = (context, ref) => {
60
60
  const kind = context.library.typeFor(ref)?.kind;
61
61
  return kind !== "carray" && kind !== "list" && kind !== "hashtable";
62
62
  };
63
+ const hasArrayAccessor = (context, target) => resolveInlineArray(context, target) !== undefined || resolveStructArray(context, target) !== undefined;
63
64
  const admitAccessibleField = (context, slot, claimedNames, siblingFields) => {
64
65
  const admitted = admitField(context, slot, claimedNames);
65
66
  if (admitted === undefined) {
@@ -67,9 +68,9 @@ const admitAccessibleField = (context, slot, claimedNames, siblingFields) => {
67
68
  }
68
69
  const { field, jsName } = admitted;
69
70
  const target = { field, jsName, slot: slot.slot, siblingFields };
70
- const hasStructArray = resolveStructArray(context, target) !== undefined;
71
- const hasAccessor = hasStructArray || isAccessibleFieldType(context, field.type);
72
- const isSettable = field.writable && (hasStructArray || isStorableFieldType(context, field.type));
71
+ const hasArray = hasArrayAccessor(context, target);
72
+ const hasAccessor = hasArray || isAccessibleFieldType(context, field.type);
73
+ const isSettable = field.writable && (hasArray || isStorableFieldType(context, field.type));
73
74
  return hasAccessor ? { ...admitted, isSettable } : undefined;
74
75
  };
75
76
  const resolveRecordFieldEntry = (context, slot, claimedNames, siblingFields) => {
@@ -79,12 +80,18 @@ const resolveRecordFieldEntry = (context, slot, claimedNames, siblingFields) =>
79
80
  }
80
81
  return {
81
82
  jsName: admitted.jsName,
82
- tsType: renderTsType(context, admitted.field.type, false),
83
+ tsType: fieldTsType(context, admitted.field.type),
83
84
  isWritable: admitted.isSettable,
84
85
  doc: admitted.field.doc,
85
86
  annotations: admitted.field.annotations,
86
87
  };
87
88
  };
89
+ const fieldTsType = (context, ref, isNullable = false) => {
90
+ if (ref !== undefined && context.library.typeFor(ref)?.kind === "callback") {
91
+ return isNullable ? "bigint | null" : "bigint";
92
+ }
93
+ return renderTsType(context, ref, isNullable);
94
+ };
88
95
  const renderRecordFieldAccessor = (context, slot, claimedNames, siblingFields) => {
89
96
  const admitted = admitAccessibleField(context, slot, claimedNames, siblingFields);
90
97
  if (admitted === undefined) {
@@ -92,12 +99,13 @@ const renderRecordFieldAccessor = (context, slot, claimedNames, siblingFields) =
92
99
  }
93
100
  const { field, jsName } = admitted;
94
101
  const doc = getDoc(field);
95
- const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
96
- if (structArray !== undefined) {
97
- return `${doc}${structArray}`;
102
+ const target = { field, jsName, slot: slot.slot, siblingFields };
103
+ const arrayAccessor = renderInlineArrayAccessor(context, target) ?? renderStructArrayAccessor(context, target);
104
+ if (arrayAccessor !== undefined) {
105
+ return `${doc}${arrayAccessor}`;
98
106
  }
99
107
  const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, "none", { isInline: isInlineField(context, field) }));
100
- const tsType = renderTsType(context, field.type, false);
108
+ const tsType = fieldTsType(context, field.type);
101
109
  const accessorOptions = {
102
110
  context,
103
111
  jsName,
@@ -132,7 +140,7 @@ const isAccessorEligibleType = (context, ref) => {
132
140
  return context.library.nameFor(ref) !== undefined;
133
141
  }
134
142
  case "carray": {
135
- return type.fixedSize !== undefined;
143
+ return type.fixedSize !== undefined && type.arrayCType?.endsWith("*") === true;
136
144
  }
137
145
  case "list":
138
146
  case "hashtable":
@@ -161,11 +169,72 @@ const resolveInlineStructFields = (context, ref, occurrenceCType) => {
161
169
  }
162
170
  return type.value.fields;
163
171
  };
164
- const arrayLengthExpression = (arrayRef, siblingFields) => {
165
- if (arrayRef.fixedSize !== undefined) {
166
- return String(arrayRef.fixedSize);
172
+ const isInlineScalarCategory = (category, isBehindPointer) => {
173
+ if (category === "pointer") {
174
+ return true;
175
+ }
176
+ return !isBehindPointer && category !== "void" && category !== "unichar" && category !== "string";
177
+ };
178
+ const isInlineArrayElement = (context, ref, cType) => {
179
+ const type = ref === undefined ? undefined : context.library.typeFor(ref);
180
+ if (type === undefined) {
181
+ return false;
182
+ }
183
+ const isBehindPointer = cType?.endsWith("*") === true;
184
+ switch (type.kind) {
185
+ case "primitive": {
186
+ return isInlineScalarCategory(type.category, isBehindPointer);
187
+ }
188
+ case "enum": {
189
+ return !isBehindPointer;
190
+ }
191
+ case "record": {
192
+ return (resolveInlineStructFields(context, ref, cType) !== undefined &&
193
+ isValueMarshalable(context, type.namespace.name, type.value));
194
+ }
195
+ case "alias": {
196
+ return isInlineArrayElement(context, type.value.target, cType ?? type.value.targetCType);
197
+ }
198
+ case "callback":
199
+ case "carray":
200
+ case "class":
201
+ case "hashtable":
202
+ case "interface":
203
+ case "list":
204
+ case "varargs": {
205
+ return false;
206
+ }
207
+ }
208
+ };
209
+ const inlineArrayType = (context, target) => {
210
+ const { field, slot } = target;
211
+ if (field.type === undefined || slot.bitWidth !== undefined) {
212
+ return undefined;
167
213
  }
168
- if (arrayRef.lengthParameterIndex === undefined) {
214
+ const type = context.library.typeFor(field.type);
215
+ if (type?.kind !== "carray" || type.fixedSize === undefined) {
216
+ return undefined;
217
+ }
218
+ return type.arrayCType?.endsWith("*") === true ? undefined : type;
219
+ };
220
+ const resolveInlineArray = (context, target) => {
221
+ const type = inlineArrayType(context, target);
222
+ if (type?.fixedSize === undefined || !isInlineArrayElement(context, type.element, type.elementCType)) {
223
+ return undefined;
224
+ }
225
+ const stride = inlineArrayStride(context, type);
226
+ if (stride === 0) {
227
+ return undefined;
228
+ }
229
+ return {
230
+ element: type.element,
231
+ count: type.fixedSize,
232
+ stride,
233
+ isTypedByteArray: context.library.isByteArrayTyped && isByteSequence(context.library, type),
234
+ };
235
+ };
236
+ const arrayLengthExpression = (arrayRef, siblingFields) => {
237
+ if (arrayRef.fixedSize !== undefined || arrayRef.lengthParameterIndex === undefined) {
169
238
  return undefined;
170
239
  }
171
240
  const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];
@@ -342,6 +411,63 @@ const resolveStructArray = (context, target) => {
342
411
  elementSize: shape.elementSize,
343
412
  };
344
413
  };
414
+ const inlineArrayElementOffset = (options) => `${String(options.offset)} + __index * ${String(options.resolution.stride)}`;
415
+ const inlineArrayGetterBlock = (options) => {
416
+ const { context, jsName, tsType, descriptor, resolution } = options;
417
+ const container = resolution.isTypedByteArray ? `new ${tsType}(${String(resolution.count)})` : "[]";
418
+ const element = wrapReturnValue(context, {
419
+ ref: resolution.element,
420
+ isNullable: false,
421
+ valueExpression: `read(getHandle(this), ${descriptor}, ${inlineArrayElementOffset(options)})`,
422
+ });
423
+ const body = [
424
+ `const __result: ${tsType} = ${container};`,
425
+ `for (let __index = 0; __index < ${String(resolution.count)}; __index++) {`,
426
+ indent(`__result[__index] = ${element};`, 1),
427
+ "}",
428
+ "return __result;",
429
+ ].join("\n");
430
+ return renderBlock(`get ${jsName}(): ${tsType}`, body);
431
+ };
432
+ const inlineArraySetterBlock = (options) => {
433
+ const { jsName, tsType, descriptor, resolution } = options;
434
+ const write = `write(getHandle(this), ${descriptor}, ${inlineArrayElementOffset(options)}, ` +
435
+ `toNative(${descriptor}, __element));`;
436
+ const body = [
437
+ "for (const [__index, __element] of __value.entries()) {",
438
+ indent(`if (__index >= ${String(resolution.count)}) {\n break;\n}\n\n${write}`, 1),
439
+ "}",
440
+ ].join("\n");
441
+ return renderBlock(`set ${jsName}(__value: ${tsType})`, body);
442
+ };
443
+ const renderInlineArrayAccessor = (context, target) => {
444
+ const resolution = resolveInlineArray(context, target);
445
+ if (resolution === undefined) {
446
+ return undefined;
447
+ }
448
+ const { field, jsName, slot } = target;
449
+ context.addRuntimeImport("read");
450
+ context.addRuntimeImport("getHandle");
451
+ context.addRuntimeImport("t");
452
+ const options = {
453
+ context,
454
+ jsName,
455
+ tsType: renderTsType(context, field.type, false),
456
+ descriptor: context.hoistDescriptor(renderDescriptor(context, resolution.element, "none", { isInline: true })),
457
+ offset: slot.byteOffset,
458
+ resolution,
459
+ };
460
+ const blocks = [];
461
+ if (field.readable) {
462
+ blocks.push(inlineArrayGetterBlock(options));
463
+ }
464
+ if (field.writable) {
465
+ context.addRuntimeImport("write");
466
+ context.addRuntimeImport("toNative");
467
+ blocks.push(inlineArraySetterBlock(options));
468
+ }
469
+ return blocks.length === 0 ? undefined : blocks.join("\n\n");
470
+ };
345
471
  const renderStructArrayAccessor = (context, target) => {
346
472
  const resolution = resolveStructArray(context, target);
347
473
  if (resolution === undefined) {
@@ -401,5 +527,5 @@ const setterBody = (context, descriptor, slot) => {
401
527
  return emitFieldWrite(context, { descriptor, slot, targetExpr: "getHandle(this)", valueExpr: "value" });
402
528
  };
403
529
  const setterBlock = (options) => renderBlock(`set ${options.jsName}(value: ${options.tsType})`, setterBody(options.context, options.descriptor, options.slot));
404
- export { isEmittableField, isInlineField, isStorableFieldType, emitFieldWrite, resolveRecordFieldEntry, renderRecordFieldAccessor, };
530
+ export { fieldTsType, isEmittableField, isInlineField, isStorableFieldType, emitFieldWrite, resolveRecordFieldEntry, renderRecordFieldAccessor, };
405
531
  //# sourceMappingURL=record-field-accessor.js.map