@gtkx/codegen 1.0.0 → 1.1.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 (316) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +48 -31
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +16 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +15 -3
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +23 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +144 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts.map +1 -1
  24. package/dist/analysis/ts-type.js +10 -17
  25. package/dist/analysis/ts-type.js.map +1 -1
  26. package/dist/analysis/type-key.d.ts +5 -0
  27. package/dist/analysis/type-key.d.ts.map +1 -0
  28. package/dist/analysis/type-key.js +9 -0
  29. package/dist/analysis/type-key.js.map +1 -0
  30. package/dist/compile.d.ts +12 -3
  31. package/dist/compile.d.ts.map +1 -1
  32. package/dist/compile.js +73 -24
  33. package/dist/compile.js.map +1 -1
  34. package/dist/docs/api-reference.d.ts.map +1 -1
  35. package/dist/docs/api-reference.js +10 -9
  36. package/dist/docs/api-reference.js.map +1 -1
  37. package/dist/docs/element-page.d.ts.map +1 -1
  38. package/dist/docs/element-page.js +5 -3
  39. package/dist/docs/element-page.js.map +1 -1
  40. package/dist/docs/pipeline.d.ts.map +1 -1
  41. package/dist/docs/pipeline.js +85 -18
  42. package/dist/docs/pipeline.js.map +1 -1
  43. package/dist/docs/render.d.ts +2 -1
  44. package/dist/docs/render.d.ts.map +1 -1
  45. package/dist/docs/render.js +5 -4
  46. package/dist/docs/render.js.map +1 -1
  47. package/dist/docs/symbol-page.d.ts.map +1 -1
  48. package/dist/docs/symbol-page.js +9 -6
  49. package/dist/docs/symbol-page.js.map +1 -1
  50. package/dist/fingerprint.d.ts +12 -1
  51. package/dist/fingerprint.d.ts.map +1 -1
  52. package/dist/fingerprint.js +44 -28
  53. package/dist/fingerprint.js.map +1 -1
  54. package/dist/gi.d.ts.map +1 -1
  55. package/dist/gi.js +1 -0
  56. package/dist/gi.js.map +1 -1
  57. package/dist/gir/ancestry.d.ts +7 -1
  58. package/dist/gir/ancestry.d.ts.map +1 -1
  59. package/dist/gir/ancestry.js +9 -1
  60. package/dist/gir/ancestry.js.map +1 -1
  61. package/dist/gir/annotations.d.ts +1 -2
  62. package/dist/gir/annotations.d.ts.map +1 -1
  63. package/dist/gir/annotations.js +1 -1
  64. package/dist/gir/annotations.js.map +1 -1
  65. package/dist/gir/cursor-overrides.d.ts +8 -0
  66. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  67. package/dist/gir/cursor-overrides.js +6 -0
  68. package/dist/gir/cursor-overrides.js.map +1 -0
  69. package/dist/gir/emittable.d.ts +7 -0
  70. package/dist/gir/emittable.d.ts.map +1 -0
  71. package/dist/gir/emittable.js +3 -0
  72. package/dist/gir/emittable.js.map +1 -0
  73. package/dist/gir/function.d.ts.map +1 -1
  74. package/dist/gir/function.js +28 -2
  75. package/dist/gir/function.js.map +1 -1
  76. package/dist/gir/library.js +1 -1
  77. package/dist/gir/library.js.map +1 -1
  78. package/dist/gir/namespace.d.ts +5 -1
  79. package/dist/gir/namespace.d.ts.map +1 -1
  80. package/dist/gir/namespace.js +4 -2
  81. package/dist/gir/namespace.js.map +1 -1
  82. package/dist/gir/parameter.d.ts +13 -1
  83. package/dist/gir/parameter.d.ts.map +1 -1
  84. package/dist/gir/parameter.js +1 -0
  85. package/dist/gir/parameter.js.map +1 -1
  86. package/dist/gir/parse.d.ts.map +1 -1
  87. package/dist/gir/parse.js +3 -6
  88. package/dist/gir/parse.js.map +1 -1
  89. package/dist/guards.d.ts +16 -0
  90. package/dist/guards.d.ts.map +1 -0
  91. package/dist/guards.js +11 -0
  92. package/dist/guards.js.map +1 -0
  93. package/dist/internal.d.ts +2 -0
  94. package/dist/internal.d.ts.map +1 -1
  95. package/dist/internal.js +2 -0
  96. package/dist/internal.js.map +1 -1
  97. package/dist/json.d.ts +3 -0
  98. package/dist/json.d.ts.map +1 -0
  99. package/dist/json.js +11 -0
  100. package/dist/json.js.map +1 -0
  101. package/dist/khronos/modules.d.ts.map +1 -1
  102. package/dist/khronos/modules.js +22 -7
  103. package/dist/khronos/modules.js.map +1 -1
  104. package/dist/khronos/parse.d.ts.map +1 -1
  105. package/dist/khronos/parse.js +3 -4
  106. package/dist/khronos/parse.js.map +1 -1
  107. package/dist/khronos/pipeline.d.ts +1 -1
  108. package/dist/khronos/pipeline.d.ts.map +1 -1
  109. package/dist/khronos/pipeline.js.map +1 -1
  110. package/dist/khronos/plan.d.ts +1 -7
  111. package/dist/khronos/plan.d.ts.map +1 -1
  112. package/dist/khronos/plan.js +1 -1
  113. package/dist/khronos/plan.js.map +1 -1
  114. package/dist/runner.d.ts +5 -1
  115. package/dist/runner.d.ts.map +1 -1
  116. package/dist/runner.js +16 -0
  117. package/dist/runner.js.map +1 -1
  118. package/dist/staging.d.ts +5 -0
  119. package/dist/staging.d.ts.map +1 -0
  120. package/dist/staging.js +57 -0
  121. package/dist/staging.js.map +1 -0
  122. package/dist/store/compile-store.d.ts.map +1 -1
  123. package/dist/store/compile-store.js +4 -2
  124. package/dist/store/compile-store.js.map +1 -1
  125. package/dist/store/gi/callables.d.ts +7 -2
  126. package/dist/store/gi/callables.d.ts.map +1 -1
  127. package/dist/store/gi/callables.js +25 -30
  128. package/dist/store/gi/callables.js.map +1 -1
  129. package/dist/store/gi/callback.d.ts.map +1 -1
  130. package/dist/store/gi/callback.js +9 -5
  131. package/dist/store/gi/callback.js.map +1 -1
  132. package/dist/store/gi/class.d.ts.map +1 -1
  133. package/dist/store/gi/class.js +59 -38
  134. package/dist/store/gi/class.js.map +1 -1
  135. package/dist/store/gi/companion.d.ts.map +1 -1
  136. package/dist/store/gi/companion.js +6 -6
  137. package/dist/store/gi/companion.js.map +1 -1
  138. package/dist/store/gi/constant.d.ts.map +1 -1
  139. package/dist/store/gi/constant.js +10 -2
  140. package/dist/store/gi/constant.js.map +1 -1
  141. package/dist/store/gi/constructor-props.js +1 -1
  142. package/dist/store/gi/constructor-props.js.map +1 -1
  143. package/dist/store/gi/enum.d.ts.map +1 -1
  144. package/dist/store/gi/enum.js +28 -8
  145. package/dist/store/gi/enum.js.map +1 -1
  146. package/dist/store/gi/function.d.ts +1 -3
  147. package/dist/store/gi/function.d.ts.map +1 -1
  148. package/dist/store/gi/function.js +24 -18
  149. package/dist/store/gi/function.js.map +1 -1
  150. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  151. package/dist/store/gi/gtype-binding.js +4 -1
  152. package/dist/store/gi/gtype-binding.js.map +1 -1
  153. package/dist/store/gi/interface.d.ts.map +1 -1
  154. package/dist/store/gi/interface.js +32 -17
  155. package/dist/store/gi/interface.js.map +1 -1
  156. package/dist/store/gi/method.d.ts +7 -6
  157. package/dist/store/gi/method.d.ts.map +1 -1
  158. package/dist/store/gi/method.js +13 -21
  159. package/dist/store/gi/method.js.map +1 -1
  160. package/dist/store/gi/param-marshal.d.ts +3 -2
  161. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  162. package/dist/store/gi/param-marshal.js +50 -5
  163. package/dist/store/gi/param-marshal.js.map +1 -1
  164. package/dist/store/gi/pipeline.d.ts.map +1 -1
  165. package/dist/store/gi/pipeline.js +21 -10
  166. package/dist/store/gi/pipeline.js.map +1 -1
  167. package/dist/store/gi/properties.d.ts +2 -1
  168. package/dist/store/gi/properties.d.ts.map +1 -1
  169. package/dist/store/gi/properties.js +6 -3
  170. package/dist/store/gi/properties.js.map +1 -1
  171. package/dist/store/gi/property-accessor.d.ts +10 -5
  172. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  173. package/dist/store/gi/property-accessor.js +95 -44
  174. package/dist/store/gi/property-accessor.js.map +1 -1
  175. package/dist/store/gi/record-constructor.d.ts +8 -1
  176. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  177. package/dist/store/gi/record-constructor.js +31 -10
  178. package/dist/store/gi/record-constructor.js.map +1 -1
  179. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  180. package/dist/store/gi/record-field-accessor.js +5 -1
  181. package/dist/store/gi/record-field-accessor.js.map +1 -1
  182. package/dist/store/gi/record-layout.d.ts +6 -1
  183. package/dist/store/gi/record-layout.d.ts.map +1 -1
  184. package/dist/store/gi/record-layout.js +8 -1
  185. package/dist/store/gi/record-layout.js.map +1 -1
  186. package/dist/store/gi/record.d.ts.map +1 -1
  187. package/dist/store/gi/record.js +19 -8
  188. package/dist/store/gi/record.js.map +1 -1
  189. package/dist/store/gi/registration.js +2 -2
  190. package/dist/store/gi/registration.js.map +1 -1
  191. package/dist/store/gi/signal.d.ts +2 -1
  192. package/dist/store/gi/signal.d.ts.map +1 -1
  193. package/dist/store/gi/signal.js +30 -24
  194. package/dist/store/gi/signal.js.map +1 -1
  195. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  196. package/dist/store/gi/value-marshalable.js +2 -1
  197. package/dist/store/gi/value-marshalable.js.map +1 -1
  198. package/dist/store/gi/vtable.d.ts +4 -1
  199. package/dist/store/gi/vtable.d.ts.map +1 -1
  200. package/dist/store/gi/vtable.js +60 -17
  201. package/dist/store/gi/vtable.js.map +1 -1
  202. package/dist/store/gi-store.d.ts +1 -0
  203. package/dist/store/gi-store.d.ts.map +1 -1
  204. package/dist/store/gi-store.js +15 -20
  205. package/dist/store/gi-store.js.map +1 -1
  206. package/dist/store/jsx/generated-elements.d.ts +2 -1
  207. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  208. package/dist/store/jsx/generated-elements.js +13 -7
  209. package/dist/store/jsx/generated-elements.js.map +1 -1
  210. package/dist/store/jsx/jsx.js +3 -3
  211. package/dist/store/jsx/jsx.js.map +1 -1
  212. package/dist/store/jsx/metadata.d.ts.map +1 -1
  213. package/dist/store/jsx/metadata.js +3 -1
  214. package/dist/store/jsx/metadata.js.map +1 -1
  215. package/dist/store/jsx-store.d.ts.map +1 -1
  216. package/dist/store/jsx-store.js +3 -3
  217. package/dist/store/jsx-store.js.map +1 -1
  218. package/dist/store/resolve-store.d.ts +14 -3
  219. package/dist/store/resolve-store.d.ts.map +1 -1
  220. package/dist/store/resolve-store.js +98 -15
  221. package/dist/store/resolve-store.js.map +1 -1
  222. package/dist/store/store-fs.d.ts +9 -6
  223. package/dist/store/store-fs.d.ts.map +1 -1
  224. package/dist/store/store-fs.js +59 -25
  225. package/dist/store/store-fs.js.map +1 -1
  226. package/dist/store/store-links.d.ts +3 -0
  227. package/dist/store/store-links.d.ts.map +1 -0
  228. package/dist/store/store-links.js +39 -0
  229. package/dist/store/store-links.js.map +1 -0
  230. package/dist/writer/comparison-context.d.ts +4 -0
  231. package/dist/writer/comparison-context.d.ts.map +1 -0
  232. package/dist/writer/comparison-context.js +13 -0
  233. package/dist/writer/comparison-context.js.map +1 -0
  234. package/dist/writer/context.d.ts +3 -3
  235. package/dist/writer/context.d.ts.map +1 -1
  236. package/dist/writer/context.js +11 -6
  237. package/dist/writer/context.js.map +1 -1
  238. package/dist/writer/module.d.ts +13 -5
  239. package/dist/writer/module.d.ts.map +1 -1
  240. package/dist/writer/module.js +68 -11
  241. package/dist/writer/module.js.map +1 -1
  242. package/dist/xml.d.ts +7 -1
  243. package/dist/xml.d.ts.map +1 -1
  244. package/dist/xml.js +43 -1
  245. package/dist/xml.js.map +1 -1
  246. package/package.json +14 -3
  247. package/src/analysis/descriptor-render.ts +90 -45
  248. package/src/analysis/descriptor.ts +35 -8
  249. package/src/analysis/inheritance.ts +134 -44
  250. package/src/analysis/interface-conflicts.ts +237 -0
  251. package/src/analysis/param-capability.ts +3 -6
  252. package/src/analysis/param-structure.ts +2 -2
  253. package/src/analysis/ts-type.ts +13 -17
  254. package/src/analysis/type-key.ts +14 -0
  255. package/src/compile.ts +110 -26
  256. package/src/docs/api-reference.ts +10 -9
  257. package/src/docs/element-page.ts +5 -2
  258. package/src/docs/pipeline.ts +129 -19
  259. package/src/docs/render.ts +7 -3
  260. package/src/docs/symbol-page.ts +12 -7
  261. package/src/fingerprint.ts +86 -31
  262. package/src/gi.ts +1 -0
  263. package/src/gir/ancestry.ts +17 -1
  264. package/src/gir/annotations.ts +1 -1
  265. package/src/gir/cursor-overrides.ts +12 -0
  266. package/src/gir/emittable.ts +8 -0
  267. package/src/gir/function.ts +45 -9
  268. package/src/gir/library.ts +1 -1
  269. package/src/gir/namespace.ts +8 -2
  270. package/src/gir/parameter.ts +15 -0
  271. package/src/gir/parse.ts +5 -7
  272. package/src/guards.ts +23 -0
  273. package/src/internal.ts +2 -0
  274. package/src/json.ts +11 -0
  275. package/src/khronos/modules.ts +25 -9
  276. package/src/khronos/parse.ts +3 -4
  277. package/src/khronos/pipeline.ts +1 -1
  278. package/src/khronos/plan.ts +0 -1
  279. package/src/runner.ts +19 -1
  280. package/src/staging.ts +69 -0
  281. package/src/store/compile-store.ts +6 -4
  282. package/src/store/gi/callables.ts +41 -33
  283. package/src/store/gi/callback.ts +9 -9
  284. package/src/store/gi/class.ts +79 -48
  285. package/src/store/gi/companion.ts +7 -6
  286. package/src/store/gi/constant.ts +12 -2
  287. package/src/store/gi/constructor-props.ts +1 -1
  288. package/src/store/gi/enum.ts +35 -21
  289. package/src/store/gi/function.ts +30 -24
  290. package/src/store/gi/gtype-binding.ts +7 -2
  291. package/src/store/gi/interface.ts +37 -18
  292. package/src/store/gi/method.ts +28 -29
  293. package/src/store/gi/param-marshal.ts +77 -6
  294. package/src/store/gi/pipeline.ts +25 -15
  295. package/src/store/gi/properties.ts +8 -4
  296. package/src/store/gi/property-accessor.ts +156 -73
  297. package/src/store/gi/record-constructor.ts +50 -18
  298. package/src/store/gi/record-field-accessor.ts +8 -1
  299. package/src/store/gi/record-layout.ts +11 -1
  300. package/src/store/gi/record.ts +20 -12
  301. package/src/store/gi/registration.ts +2 -2
  302. package/src/store/gi/signal.ts +36 -38
  303. package/src/store/gi/value-marshalable.ts +3 -1
  304. package/src/store/gi/vtable.ts +97 -20
  305. package/src/store/gi-store.ts +26 -31
  306. package/src/store/jsx/generated-elements.ts +17 -8
  307. package/src/store/jsx/jsx.ts +3 -3
  308. package/src/store/jsx/metadata.ts +4 -1
  309. package/src/store/jsx-store.ts +3 -3
  310. package/src/store/resolve-store.ts +133 -18
  311. package/src/store/store-fs.ts +87 -34
  312. package/src/store/store-links.ts +49 -0
  313. package/src/writer/comparison-context.ts +18 -0
  314. package/src/writer/context.ts +12 -6
  315. package/src/writer/module.ts +101 -14
  316. package/src/xml.ts +61 -1
@@ -3,10 +3,12 @@ import { renderDescriptor } from "../../analysis/descriptor-render.js";
3
3
  import { inputParameters } from "../../analysis/param-structure.js";
4
4
  import { renderTsType } from "../../analysis/ts-type.js";
5
5
  import { isConstructableProperty } from "../../gir/property.js";
6
+ import { comparisonContextFor } from "../../writer/comparison-context.js";
6
7
  import { renderBlock } from "../../writer/emit.js";
7
8
  import { isEmittableCallable } from "./callables.js";
8
9
  import { getDoc } from "./doc-spec.js";
9
10
  import { methodExportName, renderMethodReturnType } from "./method.js";
11
+ const NULLABLE_SUFFIX = " | null";
10
12
  const isNullablePropertyType = (context, type) => {
11
13
  if (type === undefined) {
12
14
  return false;
@@ -28,8 +30,10 @@ const isNullablePropertyType = (context, type) => {
28
30
  };
29
31
  const resolveDelegate = (args, attribute, member, isDelegatable) => {
30
32
  const method = member !== undefined && attribute !== undefined ? args.methodByName.get(attribute) : undefined;
31
- const canDelegate = method === undefined || isDelegatable(method);
32
- return canDelegate ? { member, method } : { member: undefined, method: undefined };
33
+ if (member === undefined || method === undefined || !isDelegatable(method)) {
34
+ return undefined;
35
+ }
36
+ return { member, method };
33
37
  };
34
38
  const resolveGetterDelegate = (args, jsName) => {
35
39
  const { context, property, claimedNames } = args;
@@ -42,34 +46,77 @@ const resolveSetterDelegate = (args, jsName, isWritable) => {
42
46
  const member = isWritable ? delegateMember(property.setter, jsName, claimedNames) : undefined;
43
47
  return resolveDelegate(args, property.setter, member, (method) => inputParameters(context.library, method).length === 1);
44
48
  };
45
- const resolveOwnType = (context, property, getterMethod, setterMethod) => {
46
- const setterParam = setterMethod?.parameters[0];
47
- if (setterParam !== undefined) {
48
- return renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional);
49
+ const baseTypeName = (type) => type.endsWith(NULLABLE_SUFFIX) ? type.slice(0, -NULLABLE_SUFFIX.length) : type;
50
+ const areDelegateBaseTypesAgreeing = (context, getter, setter) => {
51
+ const setterParam = setter?.method.parameters[0];
52
+ if (setterParam === undefined || getter === undefined) {
53
+ return true;
49
54
  }
50
- if (getterMethod !== undefined) {
51
- return renderMethodReturnType(context, getterMethod);
55
+ const scratch = comparisonContextFor(context);
56
+ const read = baseTypeName(renderMethodReturnType(scratch, getter.method));
57
+ const written = baseTypeName(renderTsType(scratch, setterParam.type, false));
58
+ return read === written;
59
+ };
60
+ const resolveDelegates = (args, jsName, isWritable) => {
61
+ const getter = resolveGetterDelegate(args, jsName);
62
+ const setter = resolveSetterDelegate(args, jsName, isWritable);
63
+ if (areDelegateBaseTypesAgreeing(args.context, getter, setter)) {
64
+ return { getter, setter };
52
65
  }
53
- return renderTsType(context, property.type, isNullablePropertyType(context, property.type));
66
+ return { getter, setter: undefined };
67
+ };
68
+ const declaredPropertyType = (context, property) => renderTsType(context, property.type, isNullablePropertyType(context, property.type));
69
+ const resolveOwnTypes = (context, property, delegates) => {
70
+ const getterMethod = delegates.getter?.method;
71
+ const setterParam = delegates.setter?.method.parameters[0];
72
+ return {
73
+ readType: getterMethod === undefined
74
+ ? declaredPropertyType(context, property)
75
+ : renderMethodReturnType(context, getterMethod),
76
+ writeType: setterParam === undefined
77
+ ? declaredPropertyType(context, property)
78
+ : renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional),
79
+ };
54
80
  };
55
- const isSkippedAccessor = (property, jsName, claimedNames) => !property.introspectable || claimedNames.has(jsName) || jsName === "constructor";
56
- const resolveTsType = (inheritedType, ownType) => inheritedType !== undefined && inheritedType !== ownType ? inheritedType : ownType;
81
+ const isAssignableType = (source, target) => source === target || baseTypeName(target) === source;
82
+ const agreeingDelegates = (delegates, ownTypes, declaredTypes) => ({
83
+ getter: isAssignableType(ownTypes.readType, declaredTypes.readType) ? delegates.getter : undefined,
84
+ setter: isAssignableType(declaredTypes.writeType, ownTypes.writeType) ? delegates.setter : undefined,
85
+ });
86
+ const resolveTypedDelegates = (args, resolved) => {
87
+ const ownTypes = resolveOwnTypes(args.context, args.property, resolved);
88
+ const types = {
89
+ readType: args.inheritedTypes?.readType ?? ownTypes.readType,
90
+ writeType: args.inheritedTypes?.writeType ?? ownTypes.writeType,
91
+ };
92
+ return { types, delegates: agreeingDelegates(resolved, ownTypes, types) };
93
+ };
94
+ const isSkippedAccessor = (args, jsName) => !args.property.introspectable ||
95
+ args.claimedNames.has(jsName) ||
96
+ args.inheritedNames?.has(jsName) === true ||
97
+ jsName === "constructor";
57
98
  const resolveAccessor = (args) => {
58
- const { context, property, claimedNames } = args;
99
+ const { property } = args;
59
100
  const jsName = toCamelIdentifier(property.name);
60
- if (isSkippedAccessor(property, jsName, claimedNames)) {
101
+ if (isSkippedAccessor(args, jsName)) {
61
102
  return undefined;
62
103
  }
63
104
  const isWritable = isConstructableProperty(property) && !property.constructOnly;
64
- const { member: getterMember, method: getterMethod } = resolveGetterDelegate(args, jsName);
65
- const { member: setterMember, method: setterMethod } = resolveSetterDelegate(args, jsName, isWritable);
66
- const hasGetter = property.readable || getterMember !== undefined;
105
+ const { types, delegates } = resolveTypedDelegates(args, resolveDelegates(args, jsName, isWritable));
106
+ const hasGetter = property.readable || delegates.getter !== undefined;
67
107
  if (!hasGetter && !isWritable) {
68
108
  return undefined;
69
109
  }
70
- const ownType = resolveOwnType(context, property, getterMethod, setterMethod);
71
- const tsType = resolveTsType(args.inheritedType, ownType);
72
- return { property, jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember };
110
+ return {
111
+ property,
112
+ jsName,
113
+ readType: types.readType,
114
+ writeType: types.writeType,
115
+ hasGetter,
116
+ isWritable,
117
+ getterMember: delegates.getter?.member,
118
+ setterMember: delegates.setter?.member,
119
+ };
73
120
  };
74
121
  const resolveOwnerAccessor = (context, property, methods) => {
75
122
  const methodByName = new Map();
@@ -83,7 +130,16 @@ const resolveOwnerAccessor = (context, property, methods) => {
83
130
  }
84
131
  return resolveAccessor({ context, property, claimedNames, methodByName });
85
132
  };
86
- const resolveAccessorType = (context, property, methods) => resolveOwnerAccessor(context, property, methods)?.tsType;
133
+ const resolveAccessorTypes = (context, property, methods) => {
134
+ const accessor = resolveOwnerAccessor(context, property, methods);
135
+ if (accessor === undefined) {
136
+ return undefined;
137
+ }
138
+ return {
139
+ readType: accessor.hasGetter ? accessor.readType : undefined,
140
+ writeType: accessor.isWritable ? accessor.writeType : undefined,
141
+ };
142
+ };
87
143
  const withAccessor = (args, render) => {
88
144
  const accessor = resolveAccessor(args);
89
145
  if (accessor === undefined) {
@@ -92,30 +148,33 @@ const withAccessor = (args, render) => {
92
148
  return render(accessor);
93
149
  };
94
150
  const renderResolvedPropertyAccessor = (context, property, accessor) => {
95
- const { jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember } = accessor;
151
+ const { jsName, readType, writeType, hasGetter, isWritable, setterMember } = accessor;
96
152
  const blocks = [];
97
153
  if (hasGetter) {
98
- const getterBody = renderGetterBody({ context, property, getterMember, getterMethod, tsType });
99
- blocks.push(renderBlock(`get ${jsName}(): ${tsType}`, getterBody));
154
+ blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGetterBody(context, property, accessor)));
100
155
  }
101
156
  if (isWritable) {
102
157
  const setterBody = setterMember === undefined ? renderGenericSetBody(context, property) : `this.${setterMember}(value);`;
103
- blocks.push(renderBlock(`set ${jsName}(value: ${tsType})`, setterBody));
158
+ blocks.push(renderBlock(`set ${jsName}(value: ${writeType})`, setterBody));
104
159
  }
105
160
  return `${propertyDoc(property)}${blocks.join("\n\n")}`;
106
161
  };
107
162
  const propertyDoc = (property) => getDoc(property);
108
163
  const renderPropertyAccessor = (args) => withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));
109
- const renderPropertyAccessorSignature = (args) => withAccessor(args, ({ jsName, tsType, hasGetter, isWritable }) => {
110
- const doc = propertyDoc(args.property);
111
- if (hasGetter && isWritable) {
112
- return `${doc}${jsName}: ${tsType};`;
164
+ const renderAccessorPairSignature = (accessor) => {
165
+ const { jsName, readType, writeType, hasGetter, isWritable } = accessor;
166
+ if (!hasGetter) {
167
+ return `set ${jsName}(value: ${writeType});`;
113
168
  }
114
- if (hasGetter) {
115
- return `${doc}get ${jsName}(): ${tsType};`;
169
+ if (!isWritable) {
170
+ return `get ${jsName}(): ${readType};`;
116
171
  }
117
- return `${doc}set ${jsName}(value: ${tsType});`;
118
- });
172
+ if (readType === writeType) {
173
+ return `${jsName}: ${readType};`;
174
+ }
175
+ return `get ${jsName}(): ${readType};\nset ${jsName}(value: ${writeType});`;
176
+ };
177
+ const renderPropertyAccessorSignature = (args) => withAccessor(args, (accessor) => `${propertyDoc(args.property)}${renderAccessorPairSignature(accessor)}`);
119
178
  const renderPropertyDescriptor = (context, property) => renderDescriptor(context, property.type, property.transferOwnership);
120
179
  const renderGenericGetBody = (context, property, tsType) => {
121
180
  context.addRuntimeImport("getObjectProperty");
@@ -129,17 +188,9 @@ const renderGenericSetBody = (context, property) => {
129
188
  const descriptor = renderPropertyDescriptor(context, property);
130
189
  return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;
131
190
  };
132
- const renderGetterBody = (options) => {
133
- const { context, property, getterMember, getterMethod, tsType } = options;
134
- if (getterMember === undefined) {
135
- return renderGenericGetBody(context, property, tsType);
136
- }
137
- if (getterMethod === undefined) {
138
- return `return this.${getterMember}() as ${tsType};`;
139
- }
140
- const getterType = renderMethodReturnType(context, getterMethod);
141
- return getterType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;
142
- };
191
+ const renderGetterBody = (context, property, accessor) => accessor.getterMember === undefined
192
+ ? renderGenericGetBody(context, property, accessor.readType)
193
+ : `return this.${accessor.getterMember}();`;
143
194
  const delegateMember = (attribute, accessorName, claimedNames) => {
144
195
  if (attribute === undefined) {
145
196
  return undefined;
@@ -153,5 +204,5 @@ const delegateMember = (attribute, accessorName, claimedNames) => {
153
204
  }
154
205
  return member;
155
206
  };
156
- export { propertyDoc, resolveAccessor, resolveOwnerAccessor, resolveAccessorType, renderResolvedPropertyAccessor, renderPropertyAccessor, renderPropertyAccessorSignature, };
207
+ export { propertyDoc, resolveAccessor, resolveOwnerAccessor, resolveAccessorTypes, renderResolvedPropertyAccessor, renderPropertyAccessor, renderPropertyAccessorSignature, };
157
208
  //# sourceMappingURL=property-accessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"property-accessor.js","sourceRoot":"","sources":["../../../src/store/gi/property-accessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAoB,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AA+BvE,MAAM,sBAAsB,GAAG,CAAC,OAAsB,EAAE,IAAwB,EAAW,EAAE;IACzF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,IAA0B,EAC1B,SAA6B,EAC7B,MAA0B,EAC1B,aAA+C,EAC/B,EAAE;IAClB,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAElE,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,IAA0B,EAAE,MAAc,EAAoB,EAAE;IAC3F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAErE,OAAO,eAAe,CAClB,IAAI,EACJ,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,CAAC,MAAM,EAAE,EAAE,CACP,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QACrD,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAC/D,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,IAA0B,EAAE,MAAc,EAAE,UAAmB,EAAoB,EAAE;IAChH,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9F,OAAO,eAAe,CAClB,IAAI,EACJ,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CACpE,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,OAAsB,EACtB,QAAqB,EACrB,YAAqC,EACrC,YAAqC,EAC/B,EAAE;IACR,MAAM,WAAW,GAAG,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAEhD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAqB,EAAE,MAAc,EAAE,YAAyB,EAAW,EAAE,CACpG,CAAC,QAAQ,CAAC,cAAc,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,aAAa,CAAC;AAErF,MAAM,aAAa,GAAG,CAAC,aAAiC,EAAE,OAAe,EAAU,EAAE,CACjF,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;AAEvF,MAAM,eAAe,GAAG,CAAC,IAA0B,EAAgC,EAAE;IACjF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IAChF,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3F,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACvG,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,IAAI,YAAY,KAAK,SAAS,CAAC;IAElE,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACzG,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CACzB,OAAsB,EACtB,QAAqB,EACrB,OAAsB,EACM,EAAE;IAC9B,MAAM,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IACzD,MAAM,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACxC,SAAS;QACb,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CACxB,OAAsB,EACtB,QAAqB,EACrB,OAAsB,EACJ,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC;AAElF,MAAM,YAAY,GAAG,CACjB,IAA0B,EAC1B,MAA8C,EAC5B,EAAE;IACpB,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,CACnC,OAAsB,EACtB,QAAqB,EACrB,QAA0B,EACpB,EAAE;IACR,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IACrG,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,SAAS,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,MAAM,OAAO,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,UAAU,GACZ,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,YAAY,UAAU,CAAC;QAE1G,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,MAAM,WAAW,MAAM,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAAqB,EAAU,EAAE,CAClD,MAAM,CAAC,QAAQ,CAAC,CAAC;AAErB,MAAM,sBAAsB,GAAG,CAAC,IAA0B,EAAsB,EAAE,CAC9E,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,8BAA8B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE5G,MAAM,+BAA+B,GAAG,CAAC,IAA0B,EAAsB,EAAE,CACvF,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;IAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QAC1B,OAAO,GAAG,GAAG,GAAG,MAAM,KAAK,MAAM,GAAG,CAAC;IACzC,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,GAAG,GAAG,OAAO,MAAM,OAAO,MAAM,GAAG,CAAC;IAC/C,CAAC;IAED,OAAO,GAAG,GAAG,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC;AACpD,CAAC,CAAC,CAAC;AAEP,MAAM,wBAAwB,GAAG,CAAC,OAAsB,EAAE,QAAqB,EAAU,EAAE,CACvF,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAEzE,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAE,QAAqB,EAAE,MAAc,EAAU,EAAE;IACnG,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC9C,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO,kCAAkC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,QAAQ,MAAM,GAAG,CAAC;AAChH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAE,QAAqB,EAAU,EAAE;IACnF,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAC9C,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO,2BAA2B,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,UAAU,WAAW,CAAC;AACnG,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAA0B,EAAU,EAAE;IAC5D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE1E,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,eAAe,YAAY,SAAS,MAAM,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEjE,OAAO,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,YAAY,SAAS,MAAM,GAAG,CAAC;AACpH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACnB,SAA6B,EAC7B,YAAoB,EACpB,YAAyB,EACP,EAAE;IACpB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,EACH,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,8BAA8B,EAC9B,sBAAsB,EACtB,+BAA+B,GAGlC,CAAC","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 { 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 { comparisonContextFor } from \"../../writer/comparison-context.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 AccessorTypes = {\n readType: string;\n writeType: string;\n};\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 getterMember: string | 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 inheritedTypes?: InheritedAccessorTypes | undefined;\n inheritedNames?: Set<string> | undefined;\n};\n\ntype AccessorDelegate = { member: string; method: GirFunction };\ntype AccessorDelegates = { getter: AccessorDelegate | undefined; setter: AccessorDelegate | undefined };\ntype TypedDelegates = { types: AccessorTypes; delegates: AccessorDelegates };\n\nconst NULLABLE_SUFFIX = \" | null\";\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 | undefined => {\n const method = member !== undefined && attribute !== undefined ? args.methodByName.get(attribute) : undefined;\n\n if (member === undefined || method === undefined || !isDelegatable(method)) {\n return undefined;\n }\n\n return { member, method };\n};\n\nconst resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate | undefined => {\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 = (\n args: PropertyAccessorArgs,\n jsName: string,\n isWritable: boolean,\n): AccessorDelegate | undefined => {\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 baseTypeName = (type: string): string =>\n type.endsWith(NULLABLE_SUFFIX) ? type.slice(0, -NULLABLE_SUFFIX.length) : type;\n\nconst areDelegateBaseTypesAgreeing = (\n context: ModuleContext,\n getter: AccessorDelegate | undefined,\n setter: AccessorDelegate | undefined,\n): boolean => {\n const setterParam = setter?.method.parameters[0];\n\n if (setterParam === undefined || getter === undefined) {\n return true;\n }\n\n const scratch = comparisonContextFor(context);\n const read = baseTypeName(renderMethodReturnType(scratch, getter.method));\n const written = baseTypeName(renderTsType(scratch, setterParam.type, false));\n\n return read === written;\n};\n\nconst resolveDelegates = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): AccessorDelegates => {\n const getter = resolveGetterDelegate(args, jsName);\n const setter = resolveSetterDelegate(args, jsName, isWritable);\n\n if (areDelegateBaseTypesAgreeing(args.context, getter, setter)) {\n return { getter, setter };\n }\n\n return { getter, setter: undefined };\n};\n\nconst declaredPropertyType = (context: ModuleContext, property: GirProperty): string =>\n renderTsType(context, property.type, isNullablePropertyType(context, property.type));\n\nconst resolveOwnTypes = (\n context: ModuleContext,\n property: GirProperty,\n delegates: AccessorDelegates,\n): AccessorTypes => {\n const getterMethod = delegates.getter?.method;\n const setterParam = delegates.setter?.method.parameters[0];\n\n return {\n readType: getterMethod === undefined\n ? declaredPropertyType(context, property)\n : renderMethodReturnType(context, getterMethod),\n writeType: setterParam === undefined\n ? declaredPropertyType(context, property)\n : renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional),\n };\n};\n\nconst isAssignableType = (source: string, target: string): boolean =>\n source === target || baseTypeName(target) === source;\n\nconst agreeingDelegates = (\n delegates: AccessorDelegates,\n ownTypes: AccessorTypes,\n declaredTypes: AccessorTypes,\n): AccessorDelegates => ({\n getter: isAssignableType(ownTypes.readType, declaredTypes.readType) ? delegates.getter : undefined,\n setter: isAssignableType(declaredTypes.writeType, ownTypes.writeType) ? delegates.setter : undefined,\n});\n\nconst resolveTypedDelegates = (args: PropertyAccessorArgs, resolved: AccessorDelegates): TypedDelegates => {\n const ownTypes = resolveOwnTypes(args.context, args.property, resolved);\n\n const types = {\n readType: args.inheritedTypes?.readType ?? ownTypes.readType,\n writeType: args.inheritedTypes?.writeType ?? ownTypes.writeType,\n };\n\n return { types, delegates: agreeingDelegates(resolved, ownTypes, types) };\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 resolveAccessor = (args: PropertyAccessorArgs): ResolvedAccessor | undefined => {\n const { property } = args;\n const jsName = toCamelIdentifier(property.name);\n\n if (isSkippedAccessor(args, jsName)) {\n return undefined;\n }\n\n const isWritable = isConstructableProperty(property) && !property.constructOnly;\n const { types, delegates } = resolveTypedDelegates(args, resolveDelegates(args, jsName, isWritable));\n const hasGetter = property.readable || delegates.getter !== undefined;\n\n if (!hasGetter && !isWritable) {\n return undefined;\n }\n\n return {\n property,\n jsName,\n readType: types.readType,\n writeType: types.writeType,\n hasGetter,\n isWritable,\n getterMember: delegates.getter?.member,\n setterMember: delegates.setter?.member,\n };\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 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, setterMember } = accessor;\n const blocks: string[] = [];\n\n if (hasGetter) {\n blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGetterBody(context, property, accessor)));\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: ${writeType})`, 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 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\nconst renderGetterBody = (context: ModuleContext, property: GirProperty, accessor: ResolvedAccessor): string =>\n accessor.getterMember === undefined\n ? renderGenericGetBody(context, property, accessor.readType)\n : `return this.${accessor.getterMember}();`;\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 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, record: GirRecord, className: string, isErrorSubclass?: boolean) => string;
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":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAiB7D,QAAA,MAAM,qCAAqC,GACvC,SAAS,aAAa,EACtB,QAAQ,SAAS,EACjB,WAAW,MAAM,KAClB,MAkBF,CAAC;AAyBF,QAAA,MAAM,uBAAuB,GACzB,SAAS,aAAa,EACtB,QAAQ,SAAS,EACjB,WAAW,MAAM,EACjB,yBAAuB,KACxB,MAwBF,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;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 renderOpaqueConstructor = (className, superCall) => {
25
- const message = sourceStringLiteral(`Cannot construct ${className}: opaque boxed type with no known layout`);
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, record, className, isErrorSubclass = false) => {
41
- const superCall = isErrorSubclass ? ["super();"] : [];
42
- if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {
43
- return renderOpaqueConstructor(className, superCall);
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);
@@ -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;AACnD,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;AAwW1G,OAAO,EACH,gBAAgB,EAChB,aAAa,EACb,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;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;AA8W1G,OAAO,EACH,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,yBAAyB,GAC5B,CAAC"}
@@ -262,13 +262,17 @@ const structArraySetterStatements = (context, options) => {
262
262
  ].join("\n");
263
263
  };
264
264
  const structArraySetterBlock = (options) => renderBlock(`set ${options.jsName}(__value: ${options.tsType})`, structArraySetterStatements(options.context, options));
265
+ const isPlainDataRecord = (record) => record.glibGetType === undefined &&
266
+ record.constructors.length === 0 &&
267
+ record.functions.length === 0 &&
268
+ record.methods.length === 0;
265
269
  const resolveStructArrayElements = (context, fieldType) => {
266
270
  const arrayType = context.library.typeFor(fieldType);
267
271
  if (arrayType?.kind !== "carray") {
268
272
  return undefined;
269
273
  }
270
274
  const elementType = context.library.typeFor(arrayType.element);
271
- if (elementType?.kind === "record" && elementType.value.glibGetType !== undefined) {
275
+ if (elementType?.kind === "record" && !isPlainDataRecord(elementType.value)) {
272
276
  return undefined;
273
277
  }
274
278
  const elementFields = resolveInlineStructFields(context, arrayType.element, arrayType.elementCType);