@gtkx/codegen 1.0.0-rc.4 → 1.0.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 (410) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +8 -1
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +37 -24
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +1 -1
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +1 -2
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +25 -22
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  14. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  15. package/dist/analysis/nul-terminated-bytes.js +18 -0
  16. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  17. package/dist/analysis/param-capability.d.ts +5 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -0
  19. package/dist/analysis/param-capability.js +130 -0
  20. package/dist/analysis/param-capability.js.map +1 -0
  21. package/dist/analysis/param-structure.d.ts +11 -4
  22. package/dist/analysis/param-structure.d.ts.map +1 -1
  23. package/dist/analysis/param-structure.js +40 -14
  24. package/dist/analysis/param-structure.js.map +1 -1
  25. package/dist/analysis/type-shape.d.ts +8 -0
  26. package/dist/analysis/type-shape.d.ts.map +1 -0
  27. package/dist/analysis/type-shape.js +12 -0
  28. package/dist/analysis/type-shape.js.map +1 -0
  29. package/dist/compile.d.ts +1 -1
  30. package/dist/compile.d.ts.map +1 -1
  31. package/dist/compile.js.map +1 -1
  32. package/dist/docs/api-reference.d.ts +2 -2
  33. package/dist/docs/api-reference.d.ts.map +1 -1
  34. package/dist/docs/api-reference.js +7 -14
  35. package/dist/docs/api-reference.js.map +1 -1
  36. package/dist/docs/element-page.d.ts +4 -4
  37. package/dist/docs/element-page.d.ts.map +1 -1
  38. package/dist/docs/element-page.js +32 -20
  39. package/dist/docs/element-page.js.map +1 -1
  40. package/dist/docs/handwritten-props.d.ts +9 -0
  41. package/dist/docs/handwritten-props.d.ts.map +1 -0
  42. package/dist/docs/handwritten-props.js +149 -0
  43. package/dist/docs/handwritten-props.js.map +1 -0
  44. package/dist/docs/pipeline.js +2 -2
  45. package/dist/docs/pipeline.js.map +1 -1
  46. package/dist/docs/render.d.ts +25 -5
  47. package/dist/docs/render.d.ts.map +1 -1
  48. package/dist/docs/render.js +84 -22
  49. package/dist/docs/render.js.map +1 -1
  50. package/dist/docs/symbol-page.d.ts +17 -0
  51. package/dist/docs/symbol-page.d.ts.map +1 -1
  52. package/dist/docs/symbol-page.js +128 -43
  53. package/dist/docs/symbol-page.js.map +1 -1
  54. package/dist/fingerprint.d.ts +1 -1
  55. package/dist/fingerprint.d.ts.map +1 -1
  56. package/dist/fingerprint.js.map +1 -1
  57. package/dist/gir/ancestry.d.ts +2 -2
  58. package/dist/gir/ancestry.d.ts.map +1 -1
  59. package/dist/gir/ancestry.js +11 -1
  60. package/dist/gir/ancestry.js.map +1 -1
  61. package/dist/gir/annotations.d.ts +22 -0
  62. package/dist/gir/annotations.d.ts.map +1 -0
  63. package/dist/gir/annotations.js +15 -0
  64. package/dist/gir/annotations.js.map +1 -0
  65. package/dist/gir/callback.d.ts +1 -0
  66. package/dist/gir/callback.d.ts.map +1 -1
  67. package/dist/gir/callback.js +1 -0
  68. package/dist/gir/callback.js.map +1 -1
  69. package/dist/gir/class.d.ts +32 -1
  70. package/dist/gir/class.d.ts.map +1 -1
  71. package/dist/gir/class.js +8 -3
  72. package/dist/gir/class.js.map +1 -1
  73. package/dist/gir/enum.d.ts +21 -1
  74. package/dist/gir/enum.d.ts.map +1 -1
  75. package/dist/gir/enum.js +9 -9
  76. package/dist/gir/enum.js.map +1 -1
  77. package/dist/gir/field.d.ts +19 -3
  78. package/dist/gir/field.d.ts.map +1 -1
  79. package/dist/gir/field.js +7 -8
  80. package/dist/gir/field.js.map +1 -1
  81. package/dist/gir/function.d.ts +15 -0
  82. package/dist/gir/function.d.ts.map +1 -1
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/libraries.d.ts +1 -3
  85. package/dist/gir/libraries.d.ts.map +1 -1
  86. package/dist/gir/libraries.js +0 -1
  87. package/dist/gir/libraries.js.map +1 -1
  88. package/dist/gir/library.d.ts +36 -0
  89. package/dist/gir/library.d.ts.map +1 -1
  90. package/dist/gir/library.js +34 -0
  91. package/dist/gir/library.js.map +1 -1
  92. package/dist/gir/namespace.d.ts +38 -0
  93. package/dist/gir/namespace.d.ts.map +1 -1
  94. package/dist/gir/namespace.js +4 -5
  95. package/dist/gir/namespace.js.map +1 -1
  96. package/dist/gir/parameter.d.ts +39 -0
  97. package/dist/gir/parameter.d.ts.map +1 -1
  98. package/dist/gir/parameter.js +7 -3
  99. package/dist/gir/parameter.js.map +1 -1
  100. package/dist/gir/parse.d.ts +3 -1
  101. package/dist/gir/parse.d.ts.map +1 -1
  102. package/dist/gir/parse.js +6 -3
  103. package/dist/gir/parse.js.map +1 -1
  104. package/dist/gir/primitives.d.ts +1 -0
  105. package/dist/gir/primitives.d.ts.map +1 -1
  106. package/dist/gir/primitives.js.map +1 -1
  107. package/dist/gir/property.d.ts +16 -0
  108. package/dist/gir/property.d.ts.map +1 -1
  109. package/dist/gir/property.js +3 -3
  110. package/dist/gir/property.js.map +1 -1
  111. package/dist/gir/record.d.ts +22 -0
  112. package/dist/gir/record.d.ts.map +1 -1
  113. package/dist/gir/record.js +3 -2
  114. package/dist/gir/record.js.map +1 -1
  115. package/dist/gir/size.d.ts +5 -4
  116. package/dist/gir/size.d.ts.map +1 -1
  117. package/dist/gir/size.js.map +1 -1
  118. package/dist/gir/type-id.d.ts +35 -0
  119. package/dist/gir/type-id.d.ts.map +1 -1
  120. package/dist/gir/type-id.js +1 -0
  121. package/dist/gir/type-id.js.map +1 -1
  122. package/dist/gir/type-ref.d.ts.map +1 -1
  123. package/dist/gir/type-ref.js +1 -0
  124. package/dist/gir/type-ref.js.map +1 -1
  125. package/dist/gir/type.d.ts +20 -0
  126. package/dist/gir/type.d.ts.map +1 -1
  127. package/dist/gir/type.js.map +1 -1
  128. package/dist/khronos/args.d.ts +7 -6
  129. package/dist/khronos/args.d.ts.map +1 -1
  130. package/dist/khronos/args.js +28 -6
  131. package/dist/khronos/args.js.map +1 -1
  132. package/dist/khronos/doc-context.d.ts +29 -0
  133. package/dist/khronos/doc-context.d.ts.map +1 -0
  134. package/dist/khronos/doc-context.js +29 -0
  135. package/dist/khronos/doc-context.js.map +1 -0
  136. package/dist/khronos/extensions.d.ts +13 -0
  137. package/dist/khronos/extensions.d.ts.map +1 -0
  138. package/dist/khronos/extensions.js +49 -0
  139. package/dist/khronos/extensions.js.map +1 -0
  140. package/dist/khronos/jsdoc.d.ts +17 -11
  141. package/dist/khronos/jsdoc.d.ts.map +1 -1
  142. package/dist/khronos/jsdoc.js +104 -46
  143. package/dist/khronos/jsdoc.js.map +1 -1
  144. package/dist/khronos/model.d.ts +42 -3
  145. package/dist/khronos/model.d.ts.map +1 -1
  146. package/dist/khronos/model.js +218 -63
  147. package/dist/khronos/model.js.map +1 -1
  148. package/dist/khronos/modules.d.ts +9 -6
  149. package/dist/khronos/modules.d.ts.map +1 -1
  150. package/dist/khronos/modules.js +96 -26
  151. package/dist/khronos/modules.js.map +1 -1
  152. package/dist/khronos/notes.d.ts +19 -0
  153. package/dist/khronos/notes.d.ts.map +1 -0
  154. package/dist/khronos/notes.js +35 -0
  155. package/dist/khronos/notes.js.map +1 -0
  156. package/dist/khronos/param-pair.d.ts +1 -1
  157. package/dist/khronos/param-pair.d.ts.map +1 -1
  158. package/dist/khronos/param-pair.js.map +1 -1
  159. package/dist/khronos/pipeline.d.ts +3 -1
  160. package/dist/khronos/pipeline.d.ts.map +1 -1
  161. package/dist/khronos/pipeline.js +58 -27
  162. package/dist/khronos/pipeline.js.map +1 -1
  163. package/dist/khronos/plan.d.ts +3 -3
  164. package/dist/khronos/plan.d.ts.map +1 -1
  165. package/dist/khronos/plan.js +2 -2
  166. package/dist/khronos/plan.js.map +1 -1
  167. package/dist/khronos/render.d.ts +8 -6
  168. package/dist/khronos/render.d.ts.map +1 -1
  169. package/dist/khronos/render.js +35 -26
  170. package/dist/khronos/render.js.map +1 -1
  171. package/dist/khronos/select.d.ts +21 -4
  172. package/dist/khronos/select.d.ts.map +1 -1
  173. package/dist/khronos/select.js +47 -34
  174. package/dist/khronos/select.js.map +1 -1
  175. package/dist/react/element-config.d.ts +2 -2
  176. package/dist/react/element-config.d.ts.map +1 -1
  177. package/dist/react/element-config.js.map +1 -1
  178. package/dist/runner.d.ts +1 -7
  179. package/dist/runner.d.ts.map +1 -1
  180. package/dist/runner.js.map +1 -1
  181. package/dist/store/compile-store.d.ts +1 -1
  182. package/dist/store/compile-store.d.ts.map +1 -1
  183. package/dist/store/compile-store.js.map +1 -1
  184. package/dist/store/gi/callable-doc.d.ts +11 -0
  185. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  186. package/dist/store/gi/callable-doc.js +62 -0
  187. package/dist/store/gi/callable-doc.js.map +1 -0
  188. package/dist/store/gi/callables.d.ts +3 -1
  189. package/dist/store/gi/callables.d.ts.map +1 -1
  190. package/dist/store/gi/callables.js +12 -12
  191. package/dist/store/gi/callables.js.map +1 -1
  192. package/dist/store/gi/callback.d.ts.map +1 -1
  193. package/dist/store/gi/callback.js +2 -2
  194. package/dist/store/gi/callback.js.map +1 -1
  195. package/dist/store/gi/class.d.ts.map +1 -1
  196. package/dist/store/gi/class.js +5 -3
  197. package/dist/store/gi/class.js.map +1 -1
  198. package/dist/store/gi/closure-invocation.d.ts +4 -0
  199. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  200. package/dist/store/gi/closure-invocation.js +22 -0
  201. package/dist/store/gi/closure-invocation.js.map +1 -0
  202. package/dist/store/gi/constant.d.ts.map +1 -1
  203. package/dist/store/gi/constant.js +3 -2
  204. package/dist/store/gi/constant.js.map +1 -1
  205. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  206. package/dist/store/gi/constructor-props.js +18 -20
  207. package/dist/store/gi/constructor-props.js.map +1 -1
  208. package/dist/store/gi/doc-spec.d.ts +14 -0
  209. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  210. package/dist/store/gi/doc-spec.js +23 -0
  211. package/dist/store/gi/doc-spec.js.map +1 -0
  212. package/dist/store/gi/enum.d.ts.map +1 -1
  213. package/dist/store/gi/enum.js +29 -16
  214. package/dist/store/gi/enum.js.map +1 -1
  215. package/dist/store/gi/function.d.ts.map +1 -1
  216. package/dist/store/gi/function.js +27 -12
  217. package/dist/store/gi/function.js.map +1 -1
  218. package/dist/store/gi/interface.d.ts.map +1 -1
  219. package/dist/store/gi/interface.js +130 -16
  220. package/dist/store/gi/interface.js.map +1 -1
  221. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  222. package/dist/store/gi/item-comparators.js +3 -5
  223. package/dist/store/gi/item-comparators.js.map +1 -1
  224. package/dist/store/gi/method.d.ts +9 -1
  225. package/dist/store/gi/method.d.ts.map +1 -1
  226. package/dist/store/gi/method.js +69 -26
  227. package/dist/store/gi/method.js.map +1 -1
  228. package/dist/store/gi/param-marshal.d.ts +4 -1
  229. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  230. package/dist/store/gi/param-marshal.js +5 -1
  231. package/dist/store/gi/param-marshal.js.map +1 -1
  232. package/dist/store/gi/pipeline.d.ts.map +1 -1
  233. package/dist/store/gi/pipeline.js +3 -2
  234. package/dist/store/gi/pipeline.js.map +1 -1
  235. package/dist/store/gi/properties.d.ts.map +1 -1
  236. package/dist/store/gi/properties.js +2 -2
  237. package/dist/store/gi/properties.js.map +1 -1
  238. package/dist/store/gi/property-accessor.d.ts +3 -1
  239. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  240. package/dist/store/gi/property-accessor.js +6 -5
  241. package/dist/store/gi/property-accessor.js.map +1 -1
  242. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  243. package/dist/store/gi/record-constructor.js +3 -1
  244. package/dist/store/gi/record-constructor.js.map +1 -1
  245. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  246. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  247. package/dist/store/gi/record-field-accessor.js +3 -2
  248. package/dist/store/gi/record-field-accessor.js.map +1 -1
  249. package/dist/store/gi/record-layout.js +1 -1
  250. package/dist/store/gi/record-layout.js.map +1 -1
  251. package/dist/store/gi/record.d.ts.map +1 -1
  252. package/dist/store/gi/record.js +3 -2
  253. package/dist/store/gi/record.js.map +1 -1
  254. package/dist/store/gi/registration.d.ts +1 -1
  255. package/dist/store/gi/registration.js +2 -2
  256. package/dist/store/gi/registration.js.map +1 -1
  257. package/dist/store/gi/runtime-override.d.ts +2 -1
  258. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  259. package/dist/store/gi/runtime-override.js +8 -5
  260. package/dist/store/gi/runtime-override.js.map +1 -1
  261. package/dist/store/gi/signal.d.ts.map +1 -1
  262. package/dist/store/gi/signal.js +14 -15
  263. package/dist/store/gi/signal.js.map +1 -1
  264. package/dist/store/gi/value-marshalable.d.ts +1 -2
  265. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  266. package/dist/store/gi/value-marshalable.js +1 -1
  267. package/dist/store/gi/value-marshalable.js.map +1 -1
  268. package/dist/store/gi/vtable.d.ts +16 -1
  269. package/dist/store/gi/vtable.d.ts.map +1 -1
  270. package/dist/store/gi/vtable.js +214 -51
  271. package/dist/store/gi/vtable.js.map +1 -1
  272. package/dist/store/jsx/element-components.d.ts +1 -1
  273. package/dist/store/jsx/element-components.d.ts.map +1 -1
  274. package/dist/store/jsx/element-components.js +6 -4
  275. package/dist/store/jsx/element-components.js.map +1 -1
  276. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  277. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  278. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  279. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  280. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  281. package/dist/store/jsx/element-prop-types.js +7 -1
  282. package/dist/store/jsx/element-prop-types.js.map +1 -1
  283. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  284. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  285. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  286. package/dist/store/jsx/jsx.d.ts.map +1 -1
  287. package/dist/store/jsx/jsx.js +7 -6
  288. package/dist/store/jsx/jsx.js.map +1 -1
  289. package/dist/store/jsx/metadata.js +2 -2
  290. package/dist/store/jsx/metadata.js.map +1 -1
  291. package/dist/store/jsx/pipeline.d.ts +1 -1
  292. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  293. package/dist/store/jsx/pipeline.js.map +1 -1
  294. package/dist/store/jsx/props.d.ts +1 -7
  295. package/dist/store/jsx/props.d.ts.map +1 -1
  296. package/dist/store/jsx/props.js +14 -6
  297. package/dist/store/jsx/props.js.map +1 -1
  298. package/dist/writer/context.d.ts +2 -1
  299. package/dist/writer/context.d.ts.map +1 -1
  300. package/dist/writer/context.js +3 -0
  301. package/dist/writer/context.js.map +1 -1
  302. package/dist/writer/doc-tags.d.ts +21 -0
  303. package/dist/writer/doc-tags.d.ts.map +1 -0
  304. package/dist/writer/doc-tags.js +38 -0
  305. package/dist/writer/doc-tags.js.map +1 -0
  306. package/dist/writer/doc.d.ts +3 -1
  307. package/dist/writer/doc.d.ts.map +1 -1
  308. package/dist/writer/doc.js +19 -6
  309. package/dist/writer/doc.js.map +1 -1
  310. package/dist/writer/gtk-doc.d.ts +1 -1
  311. package/dist/writer/gtk-doc.d.ts.map +1 -1
  312. package/dist/writer/gtk-doc.js +64 -15
  313. package/dist/writer/gtk-doc.js.map +1 -1
  314. package/dist/writer/module.d.ts +8 -2
  315. package/dist/writer/module.d.ts.map +1 -1
  316. package/dist/writer/module.js +13 -1
  317. package/dist/writer/module.js.map +1 -1
  318. package/overrides/gdk/rgba.ts.ejs +26 -0
  319. package/overrides/gobject/object.ts.ejs +48 -3
  320. package/overrides/gobject/value.ts.ejs +7 -0
  321. package/overrides/graphene/structs.ts.ejs +55 -0
  322. package/package.json +4 -4
  323. package/src/analysis/descriptor-render.ts +47 -28
  324. package/src/analysis/descriptor.ts +0 -3
  325. package/src/analysis/inheritance.ts +35 -34
  326. package/src/analysis/nul-terminated-bytes.ts +31 -0
  327. package/src/analysis/param-capability.ts +172 -0
  328. package/src/analysis/param-structure.ts +83 -23
  329. package/src/analysis/type-shape.ts +24 -0
  330. package/src/compile.ts +1 -1
  331. package/src/docs/api-reference.ts +36 -25
  332. package/src/docs/element-page.ts +53 -47
  333. package/src/docs/handwritten-props.ts +230 -0
  334. package/src/docs/pipeline.ts +2 -2
  335. package/src/docs/render.ts +146 -32
  336. package/src/docs/symbol-page.ts +224 -79
  337. package/src/fingerprint.ts +0 -1
  338. package/src/gir/ancestry.ts +15 -1
  339. package/src/gir/annotations.ts +37 -0
  340. package/src/gir/callback.ts +2 -0
  341. package/src/gir/class.ts +42 -4
  342. package/src/gir/enum.ts +30 -10
  343. package/src/gir/field.ts +24 -9
  344. package/src/gir/function.ts +15 -0
  345. package/src/gir/libraries.ts +11 -3
  346. package/src/gir/library.ts +51 -2
  347. package/src/gir/namespace.ts +41 -5
  348. package/src/gir/parameter.ts +47 -3
  349. package/src/gir/parse.ts +8 -2
  350. package/src/gir/primitives.ts +1 -0
  351. package/src/gir/property.ts +18 -3
  352. package/src/gir/record.ts +24 -2
  353. package/src/gir/size.ts +8 -3
  354. package/src/gir/type-id.ts +49 -3
  355. package/src/gir/type-ref.ts +1 -0
  356. package/src/gir/type.ts +50 -6
  357. package/src/khronos/args.ts +36 -13
  358. package/src/khronos/doc-context.ts +62 -0
  359. package/src/khronos/extensions.ts +85 -0
  360. package/src/khronos/jsdoc.ts +152 -56
  361. package/src/khronos/model.ts +314 -69
  362. package/src/khronos/modules.ts +134 -40
  363. package/src/khronos/notes.ts +74 -0
  364. package/src/khronos/param-pair.ts +1 -1
  365. package/src/khronos/pipeline.ts +94 -41
  366. package/src/khronos/plan.ts +4 -5
  367. package/src/khronos/render.ts +62 -50
  368. package/src/khronos/select.ts +91 -50
  369. package/src/react/element-config.ts +2 -2
  370. package/src/runner.ts +1 -8
  371. package/src/store/compile-store.ts +1 -1
  372. package/src/store/gi/callable-doc.ts +102 -0
  373. package/src/store/gi/callables.ts +18 -12
  374. package/src/store/gi/callback.ts +3 -2
  375. package/src/store/gi/class.ts +6 -3
  376. package/src/store/gi/closure-invocation.ts +26 -0
  377. package/src/store/gi/constant.ts +3 -4
  378. package/src/store/gi/constructor-props.ts +19 -23
  379. package/src/store/gi/doc-spec.ts +38 -0
  380. package/src/store/gi/enum.ts +55 -20
  381. package/src/store/gi/function.ts +43 -21
  382. package/src/store/gi/interface.ts +214 -26
  383. package/src/store/gi/item-comparators.ts +3 -5
  384. package/src/store/gi/method.ts +98 -42
  385. package/src/store/gi/param-marshal.ts +15 -1
  386. package/src/store/gi/pipeline.ts +7 -2
  387. package/src/store/gi/properties.ts +3 -2
  388. package/src/store/gi/property-accessor.ts +9 -4
  389. package/src/store/gi/record-constructor.ts +6 -1
  390. package/src/store/gi/record-field-accessor.ts +5 -3
  391. package/src/store/gi/record-layout.ts +1 -1
  392. package/src/store/gi/record.ts +8 -2
  393. package/src/store/gi/registration.ts +3 -3
  394. package/src/store/gi/runtime-override.ts +13 -6
  395. package/src/store/gi/signal.ts +19 -20
  396. package/src/store/gi/value-marshalable.ts +1 -1
  397. package/src/store/gi/vtable.ts +361 -60
  398. package/src/store/jsx/element-components.ts +8 -5
  399. package/src/store/jsx/element-prop-imports.ts +1 -3
  400. package/src/store/jsx/element-prop-types.ts +10 -1
  401. package/src/store/jsx/intrinsic-elements.ts +4 -0
  402. package/src/store/jsx/jsx.ts +8 -6
  403. package/src/store/jsx/metadata.ts +2 -2
  404. package/src/store/jsx/pipeline.ts +1 -1
  405. package/src/store/jsx/props.ts +20 -7
  406. package/src/writer/context.ts +5 -1
  407. package/src/writer/doc-tags.ts +70 -0
  408. package/src/writer/doc.ts +29 -6
  409. package/src/writer/gtk-doc.ts +82 -15
  410. package/src/writer/module.ts +25 -2
@@ -1,8 +1,11 @@
1
- import { lowerFirst, sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
1
+ import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GlDocContext } from "./doc-context.js";
2
3
  import type { CommandPlan, GlScalar, ReturnPlan } from "./plan.js";
4
+ import type { GlSymbolProvenance } from "./select.js";
3
5
  import { tBind, tInlineStruct, tRef, tString, tUint8, tVoid } from "../analysis/descriptor.js";
4
- import { type OutArg, planArgs, scalarAliasOrGroup, scalarPrefixArgs, trackInto } from "./args.js";
5
- import { commandJsDoc, inParamDocLine, singularJsDoc } from "./jsdoc.js";
6
+ import { type InArg, type OutArg, planArgs, returnPlanTsType, scalarPrefixArgs, trackInto } from "./args.js";
7
+ import { commandJsDoc, derivedJsDoc, inParamDocLine } from "./jsdoc.js";
8
+ import { commandExportName } from "./notes.js";
6
9
 
7
10
  type RenderedCommand = {
8
11
  exportName: string;
@@ -10,6 +13,12 @@ type RenderedCommand = {
10
13
  declaration: string;
11
14
  };
12
15
 
16
+ type SingularContext = {
17
+ plan: CommandPlan & { isOk: true };
18
+ provenance: GlSymbolProvenance;
19
+ docs: GlDocContext;
20
+ };
21
+
13
22
  type EmittedReturn = {
14
23
  tsType: string;
15
24
  descriptor: string;
@@ -34,9 +43,6 @@ const glBind = (name: string, argList: string, returnType: string): string =>
34
43
  returnType,
35
44
  });
36
45
 
37
- const commandExportName = (name: string): string =>
38
- toCamelIdentifier(name.startsWith("gl") ? lowerFirst(name.slice(2)) : name);
39
-
40
46
  const singularize = (plural: string): string =>
41
47
  plural.endsWith("ies") ? `${plural.slice(0, -3)}y` : plural.replace(/s$/, "");
42
48
 
@@ -48,32 +54,27 @@ const buildEmittedReturn = (
48
54
  returnGroup: string | undefined,
49
55
  usedTypes: Set<string>,
50
56
  ): EmittedReturn => {
51
- const track = trackInto(usedTypes);
57
+ const tsType = trackInto(usedTypes)(returnPlanTsType(plan, returnGroup));
58
+ const cast = (call: string): string => `${call} as ${tsType}`;
52
59
 
53
60
  switch (plan.kind) {
54
61
  case "void": {
55
- return { tsType: "void", descriptor: tVoid };
62
+ return { tsType, descriptor: tVoid };
56
63
  }
57
64
  case "scalar": {
58
- const alias = track(scalarAliasOrGroup(plan.scalar, returnGroup));
59
-
60
- return { tsType: alias, descriptor: plan.scalar.descriptor, expr: (call) => `${call} as ${alias}` };
65
+ return { tsType, descriptor: plan.scalar.descriptor, expr: cast };
61
66
  }
62
67
  case "boolean": {
63
- return { tsType: "boolean", descriptor: tUint8, expr: (call) => `(${call} as number) !== 0` };
68
+ return { tsType, descriptor: tUint8, expr: (call) => `(${call} as number) !== 0` };
64
69
  }
65
70
  case "string": {
66
- return { tsType: "string", descriptor: tString("borrowed"), expr: (call) => `${call} as string` };
71
+ return { tsType, descriptor: tString("borrowed"), expr: cast };
67
72
  }
68
73
  case "sync": {
69
- return { tsType: track("GLsync"), descriptor: tInlineStruct(), expr: (call) => `${call} as GLsync` };
74
+ return { tsType, descriptor: tInlineStruct(), expr: cast };
70
75
  }
71
76
  case "opaque-pointer": {
72
- return {
73
- tsType: track("GLpointer"),
74
- descriptor: tInlineStruct(),
75
- expr: (call) => `${call} as GLpointer`,
76
- };
77
+ return { tsType, descriptor: tInlineStruct(), expr: cast };
77
78
  }
78
79
  }
79
80
  };
@@ -117,19 +118,20 @@ const returnStatements = (call: string, returned: EmittedReturn, outs: OutArg[])
117
118
  };
118
119
 
119
120
  const renderCommand = (
120
- plan: CommandPlan & { ok: true },
121
- feature: string,
121
+ plan: CommandPlan & { isOk: true },
122
+ provenance: GlSymbolProvenance,
122
123
  usedTypes: Set<string>,
124
+ docs: GlDocContext,
123
125
  ): RenderedCommand => {
124
126
  const { command } = plan;
125
127
  const exportName = commandExportName(command.name);
126
128
  const { args, ins, outs } = planArgs(plan, usedTypes);
127
129
  const returned = buildEmittedReturn(plan.returnPlan, command.returnGroup, usedTypes);
128
130
  const signature = ins.map((arg) => `${arg.name}: ${arg.tsType}`).join(", ");
129
- const argNames = args.map((arg) => (arg.out ? arg.cellName : arg.name)).join(", ");
131
+ const argNames = args.map((arg) => (arg.isOut ? arg.cellName : arg.name)).join(", ");
130
132
  const descriptors = renderDescriptorList(args.map((arg) => arg.descriptor));
131
133
  const tsReturn = returnTsType(returned, outs);
132
- const jsDoc = commandJsDoc({ command, feature, ins, outs, returnPlan: plan.returnPlan });
134
+ const jsDoc = commandJsDoc({ plan, provenance, ins, outs, docs });
133
135
  const seeds = outs.map((out) => out.seed);
134
136
  const bindExpression = glBind(command.name, descriptors, returned.descriptor);
135
137
  const isInline = plan.params.some((paramPlan) => paramPlan.kind === "string-out");
@@ -150,15 +152,17 @@ const renderCommand = (
150
152
  };
151
153
  };
152
154
 
153
- const singularCommandJsDoc = (
154
- plan: CommandPlan & { ok: true },
155
- feature: string,
156
- summary: string,
157
- body: string[],
158
- ): string => singularJsDoc({ commandName: plan.command.name, feature, summary, body });
155
+ const singularCommandJsDoc = (context: SingularContext, summary: string, body: string[]): string =>
156
+ derivedJsDoc({
157
+ command: context.plan.command,
158
+ provenance: context.provenance,
159
+ docs: context.docs,
160
+ summary,
161
+ body,
162
+ });
159
163
 
160
164
  const genSingularScalars = (
161
- plan: CommandPlan & { ok: true },
165
+ plan: CommandPlan & { isOk: true },
162
166
  ): { countScalar: GlScalar; outScalar: GlScalar; lenParamName: string } | undefined => {
163
167
  const countPlan = plan.params.at(-2);
164
168
 
@@ -175,7 +179,7 @@ const genSingularScalars = (
175
179
  return { countScalar: countPlan.scalar, outScalar: outPlan.scalar, lenParamName: outPlan.lenParamName };
176
180
  };
177
181
 
178
- const genSingularObjectClass = (plan: CommandPlan & { ok: true }, lenParamName: string): string | undefined => {
182
+ const genSingularObjectClass = (plan: CommandPlan & { isOk: true }, lenParamName: string): string | undefined => {
179
183
  const countParam = plan.command.params[plan.params.length - 2];
180
184
  const outParam = plan.command.params[plan.params.length - 1];
181
185
 
@@ -190,7 +194,7 @@ const genSingularObjectClass = (plan: CommandPlan & { ok: true }, lenParamName:
190
194
  return outParam.objectClass;
191
195
  };
192
196
 
193
- const genSingularShape = (plan: CommandPlan & { ok: true }): GenSingularShape | undefined => {
197
+ const genSingularShape = (plan: CommandPlan & { isOk: true }): GenSingularShape | undefined => {
194
198
  const scalars = genSingularScalars(plan);
195
199
 
196
200
  if (scalars === undefined) {
@@ -206,10 +210,25 @@ const genSingularShape = (plan: CommandPlan & { ok: true }): GenSingularShape |
206
210
  return { countScalar: scalars.countScalar, outScalar: scalars.outScalar, objectClass };
207
211
  };
208
212
 
213
+ const genSingularJsDoc = (context: SingularContext, prefix: InArg[], shape: GenSingularShape): string => {
214
+ const { command } = context.plan;
215
+
216
+ return singularCommandJsDoc(
217
+ context,
218
+ `Returns one ${shape.objectClass} object name via ` +
219
+ `\`${command.name}(${prefix.length > 0 ? "..., " : ""}1, ...)\`.`,
220
+ [
221
+ ...prefix.map((arg) => inParamDocLine(context.plan, arg, context.docs)),
222
+ ` * @returns \`${shape.outScalar.tsAlias}\`, object class \`${shape.objectClass}\``,
223
+ ],
224
+ );
225
+ };
226
+
209
227
  const deriveGenSingular = (
210
- plan: CommandPlan & { ok: true },
211
- feature: string,
228
+ plan: CommandPlan & { isOk: true },
229
+ provenance: GlSymbolProvenance,
212
230
  usedTypes: Set<string>,
231
+ docs: GlDocContext,
213
232
  ): RenderedCommand | undefined => {
214
233
  if (!GEN_FAMILY.test(plan.command.name)) {
215
234
  return undefined;
@@ -227,21 +246,14 @@ const deriveGenSingular = (
227
246
  return undefined;
228
247
  }
229
248
 
230
- const { countScalar, outScalar, objectClass } = shape;
249
+ const { countScalar, outScalar } = shape;
231
250
  const exportName = singularize(commandExportName(plan.command.name));
232
251
  const bindingName = `${plan.command.name}Single`;
233
252
  const descriptors = [...prefix.map((arg) => arg.descriptor), countScalar.descriptor, tRef(outScalar.descriptor)];
234
253
  usedTypes.add(outScalar.tsAlias);
235
254
  const signature = prefix.map((arg) => `${arg.name}: ${arg.tsType}`).join(", ");
236
255
  const callArgs = [...prefix.map((arg) => arg.name), "1", "out"].join(", ");
237
-
238
- const jsDoc = singularCommandJsDoc(
239
- plan,
240
- feature,
241
- `Returns one ${objectClass} object name via ` +
242
- `\`${plan.command.name}(${prefix.length > 0 ? "..., " : ""}1, ...)\`.`,
243
- [...prefix.map((arg) => inParamDocLine(plan.command, arg)), ` * @returns The new ${objectClass} object name`],
244
- );
256
+ const jsDoc = genSingularJsDoc({ plan, provenance, docs }, prefix, shape);
245
257
 
246
258
  const body = [" const out = { value: 0 };", ` ${bindingName}(${callArgs});`, " return out.value;"].join(
247
259
  "\n",
@@ -256,7 +268,7 @@ const deriveGenSingular = (
256
268
  };
257
269
  };
258
270
 
259
- const deleteSingularAlias = (plan: CommandPlan & { ok: true }): string | undefined => {
271
+ const deleteSingularAlias = (plan: CommandPlan & { isOk: true }): string | undefined => {
260
272
  if (plan.params.length !== 2) {
261
273
  return undefined;
262
274
  }
@@ -274,7 +286,7 @@ const deleteSingularAlias = (plan: CommandPlan & { ok: true }): string | undefin
274
286
  return arrayPlan.scalar.tsAlias;
275
287
  };
276
288
 
277
- const deleteSingularObjectClass = (plan: CommandPlan & { ok: true }): string | undefined => {
289
+ const deleteSingularObjectClass = (plan: CommandPlan & { isOk: true }): string | undefined => {
278
290
  const [countParam, arrayParam] = plan.command.params;
279
291
 
280
292
  if (countParam === undefined || arrayParam === undefined) {
@@ -289,9 +301,10 @@ const deleteSingularObjectClass = (plan: CommandPlan & { ok: true }): string | u
289
301
  };
290
302
 
291
303
  const deriveDeleteSingular = (
292
- plan: CommandPlan & { ok: true },
293
- feature: string,
304
+ plan: CommandPlan & { isOk: true },
305
+ provenance: GlSymbolProvenance,
294
306
  usedTypes: Set<string>,
307
+ docs: GlDocContext,
295
308
  ): RenderedCommand | undefined => {
296
309
  if (!DELETE_FAMILY.test(plan.command.name)) {
297
310
  return undefined;
@@ -313,10 +326,9 @@ const deriveDeleteSingular = (
313
326
  const exportName = singularize(commandExportName(plan.command.name));
314
327
 
315
328
  const jsDoc = singularCommandJsDoc(
316
- plan,
317
- feature,
329
+ { plan, provenance, docs },
318
330
  `Deletes one ${objectClass} object name via \`${plan.command.name}(1, ...)\`.`,
319
- [` * @param name - The ${objectClass} object name to delete`],
331
+ [` * @param name - \`${scalarAlias}\`, object class \`${objectClass}\``],
320
332
  );
321
333
 
322
334
  return {
@@ -1,3 +1,4 @@
1
+ import { sortStringsBy } from "@gtkx/utils";
1
2
  import type { GlEnum, GlFeature, GlInterfaceBlock, GlRegistry } from "./model.js";
2
3
 
3
4
  type GlProfile = "core";
@@ -8,60 +9,94 @@ type GlSelection = {
8
9
  profile: GlProfile;
9
10
  };
10
11
 
12
+ type GlSymbolKind = "command" | "enum";
13
+
14
+ type GlRemoval = {
15
+ feature: string;
16
+ comment?: string;
17
+ };
18
+
19
+ type GlSymbolProvenance = {
20
+ feature: string;
21
+ requireComment?: string;
22
+ removals: GlRemoval[];
23
+ };
24
+
25
+ type GlRemovedSymbol = {
26
+ name: string;
27
+ kind: GlSymbolKind;
28
+ feature: string;
29
+ comment?: string;
30
+ };
31
+
11
32
  type GlSubset = {
12
- commands: Map<string, string>;
13
- enums: Map<string, string>;
33
+ commands: Map<string, GlSymbolProvenance>;
34
+ enums: Map<string, GlSymbolProvenance>;
35
+ removed: GlRemovedSymbol[];
14
36
  };
15
37
 
16
- const isBlockApplicable = (block: GlInterfaceBlock, selection: GlSelection): boolean =>
17
- block.profile === undefined || block.profile === selection.profile;
38
+ type SelectionState = GlSubset & {
39
+ history: Map<string, GlRemoval[]>;
40
+ };
18
41
 
19
- const addMissing = (target: Map<string, string>, names: string[], value: string): void => {
20
- for (const name of names) {
21
- if (!target.has(name)) {
22
- target.set(name, value);
23
- }
24
- }
42
+ type MemberContext = {
43
+ feature: GlFeature;
44
+ block: GlInterfaceBlock;
45
+ kind: GlSymbolKind;
25
46
  };
26
47
 
27
- const applyRequires = (
28
- feature: GlFeature,
29
- selection: GlSelection,
30
- commands: Map<string, string>,
31
- enums: Map<string, string>,
32
- ): void => {
33
- for (const block of feature.requires) {
34
- if (!isBlockApplicable(block, selection)) {
35
- continue;
36
- }
48
+ const isBlockApplicable = (block: GlInterfaceBlock, selection: GlSelection): boolean =>
49
+ (block.profile === undefined || block.profile === selection.profile) &&
50
+ (block.api === undefined || block.api === selection.api);
51
+
52
+ const targetFor = (state: SelectionState, kind: GlSymbolKind): Map<string, GlSymbolProvenance> =>
53
+ kind === "command" ? state.commands : state.enums;
37
54
 
38
- addMissing(commands, block.commands, feature.name);
39
- addMissing(enums, block.enums, feature.name);
55
+ const commentEntry = (comment: string | undefined): { comment?: string } =>
56
+ comment === undefined ? {} : { comment };
57
+
58
+ const requireMember = (state: SelectionState, name: string, context: MemberContext): void => {
59
+ const target = targetFor(state, context.kind);
60
+
61
+ if (target.has(name)) {
62
+ return;
40
63
  }
64
+
65
+ const { block, feature } = context;
66
+
67
+ target.set(name, {
68
+ feature: feature.name,
69
+ ...(block.comment !== undefined && { requireComment: block.comment }),
70
+ removals: [...(state.history.get(name) ?? [])],
71
+ });
41
72
  };
42
73
 
43
- const removeBlock = (block: GlInterfaceBlock, commands: Map<string, string>, enums: Map<string, string>): void => {
44
- for (const name of block.commands) {
45
- commands.delete(name);
46
- }
74
+ const removeMember = (state: SelectionState, name: string, context: MemberContext): void => {
75
+ const { block, feature, kind } = context;
76
+ const removal: GlRemoval = { feature: feature.name, ...commentEntry(block.comment) };
77
+ targetFor(state, kind).delete(name);
78
+ state.history.set(name, [...(state.history.get(name) ?? []), removal]);
79
+ state.removed.push({ name, kind, ...removal });
80
+ };
81
+
82
+ const applyMembers = (state: SelectionState, names: string[], context: MemberContext): void => {
83
+ const apply = context.block.kind === "require" ? requireMember : removeMember;
47
84
 
48
- for (const name of block.enums) {
49
- enums.delete(name);
85
+ for (const name of names) {
86
+ apply(state, name, context);
50
87
  }
51
88
  };
52
89
 
53
- const applyRemoves = (
54
- feature: GlFeature,
55
- selection: GlSelection,
56
- commands: Map<string, string>,
57
- enums: Map<string, string>,
58
- ): void => {
59
- for (const block of feature.removes) {
60
- if (!isBlockApplicable(block, selection)) {
61
- continue;
62
- }
90
+ const applyBlock = (state: SelectionState, feature: GlFeature, block: GlInterfaceBlock): void => {
91
+ applyMembers(state, block.commands, { feature, block, kind: "command" });
92
+ applyMembers(state, block.enums, { feature, block, kind: "enum" });
93
+ };
63
94
 
64
- removeBlock(block, commands, enums);
95
+ const applyFeature = (state: SelectionState, feature: GlFeature, selection: GlSelection): void => {
96
+ for (const block of feature.blocks) {
97
+ if (isBlockApplicable(block, selection)) {
98
+ applyBlock(state, feature, block);
99
+ }
65
100
  }
66
101
  };
67
102
 
@@ -70,22 +105,28 @@ const selectSubset = (registry: GlRegistry, selection: GlSelection): GlSubset =>
70
105
  .filter((feature) => feature.api === selection.api && feature.number <= selection.version)
71
106
  .toSorted((a, b) => a.number - b.number);
72
107
 
73
- const commands: Map<string, string> = new Map();
74
- const enums: Map<string, string> = new Map();
75
-
76
- for (const feature of features) {
77
- applyRequires(feature, selection, commands, enums);
78
- }
108
+ const state: SelectionState = {
109
+ commands: new Map(),
110
+ enums: new Map(),
111
+ removed: [],
112
+ history: new Map(),
113
+ };
79
114
 
80
115
  for (const feature of features) {
81
- applyRemoves(feature, selection, commands, enums);
116
+ applyFeature(state, feature, selection);
82
117
  }
83
118
 
84
- return { commands, enums };
119
+ return {
120
+ commands: state.commands,
121
+ enums: state.enums,
122
+ removed: sortStringsBy(state.removed, (entry) => entry.name),
123
+ };
85
124
  };
86
125
 
87
- const resolveEnum = (registry: GlRegistry, name: string): GlEnum => {
88
- const found = registry.enums.find((candidate) => candidate.name === name);
126
+ const resolveEnum = (registry: GlRegistry, name: string, api: string): GlEnum => {
127
+ const found = registry.enums.find(
128
+ (candidate) => candidate.name === name && (candidate.api === undefined || candidate.api === api),
129
+ );
89
130
 
90
131
  if (found === undefined) {
91
132
  throw new Error(`Enum token ${name} has no definition in the registry`);
@@ -94,4 +135,4 @@ const resolveEnum = (registry: GlRegistry, name: string): GlEnum => {
94
135
  return found;
95
136
  };
96
137
 
97
- export { selectSubset, resolveEnum, type GlSelection };
138
+ export { selectSubset, resolveEnum, type GlRemoval, type GlSelection, type GlSubset, type GlSymbolProvenance };
@@ -1,4 +1,4 @@
1
- import type { ModuleExport } from "@gtkx/react/internal";
1
+ import type { ModuleExport } from "@gtkx/react/config";
2
2
  import { readdirSync } from "node:fs";
3
3
  import type { OmittedProps } from "../store/jsx/omitted-props.js";
4
4
 
@@ -96,5 +96,5 @@ const readBuiltinElements = async (reactSubexports: string[], giStoreDir: string
96
96
  return result;
97
97
  };
98
98
 
99
- export type { ModuleExport } from "@gtkx/react/internal";
99
+ export type { ModuleExport } from "@gtkx/react/config";
100
100
  export { readBuiltinElements, type BuiltinElements };
package/src/runner.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import type { ModuleExport } from "./react/element-config.js";
3
4
  import type { OmittedProps } from "./store/jsx/omitted-props.js";
4
5
  import type { StoreOptions } from "./store/store-fs.js";
5
6
  import { checkModules } from "./compile.js";
@@ -8,14 +9,6 @@ import { runGiCodegen } from "./gi.js";
8
9
  import { Library } from "./gir/library.js";
9
10
  import { generateGlModules, type GlGenerationReport } from "./khronos/pipeline.js";
10
11
 
11
- /** A named export in a module, referenced as plain data (the module is never imported at runtime). */
12
- type ModuleExport = {
13
- /** Specifier the export is imported from. */
14
- module: string;
15
- /** Identifier the module exports it under. */
16
- export: string;
17
- };
18
-
19
12
  type GlCodegenOptions = {
20
13
  registryPath: string;
21
14
  overrideExports: Set<string>;
@@ -51,4 +51,4 @@ const compileStore = (params: CompileStoreParams): void => {
51
51
  }
52
52
  };
53
53
 
54
- export { compileStore, type CompileStoreParams };
54
+ export { compileStore };
@@ -0,0 +1,102 @@
1
+ import type { GirFunction } from "../../gir/function.js";
2
+ import type { GirCallable } from "../../gir/parameter.js";
3
+ import type { ModuleContext } from "../../writer/context.js";
4
+ import type { JsDocSpec } from "../../writer/doc.js";
5
+ import { shouldOmitPrimaryReturn } from "../../analysis/descriptor-render.js";
6
+ import { nulTerminatedByteParams } from "../../analysis/nul-terminated-bytes.js";
7
+ import {
8
+ documentedParameters,
9
+ type InputParameter,
10
+ parameterIdentifier,
11
+ renamesWithInstance,
12
+ } from "../../analysis/param-structure.js";
13
+ import { renderJsDoc } from "../../writer/doc.js";
14
+ import { annotationSpec, THROWS_TEXT } from "./doc-spec.js";
15
+ import { isCallbackParameter, returnedOutParameters } from "./method.js";
16
+
17
+ type CallableDocOptions = {
18
+ finishFn?: GirFunction | undefined;
19
+ renames?: Map<string, string> | undefined;
20
+ };
21
+
22
+ const WHITESPACE_RUN_PATTERN = /\s+/g;
23
+
24
+ const nulTerminatedNote = (context: ModuleContext, callable: GirCallable): string | undefined => {
25
+ const parameters = nulTerminatedByteParams(context.library, callable);
26
+
27
+ if (parameters.length === 0) {
28
+ return undefined;
29
+ }
30
+
31
+ const names = parameters.map((parameter) => `\`${parameter.name}\``).join(", ");
32
+
33
+ return [
34
+ `The C function reads ${names} as a NUL-terminated string, so it stops at the`,
35
+ "first zero byte and drops every byte after it without reporting an error.",
36
+ "Pass binary data through a `GLib.Bytes` route such as `GLib.Variant.newFromBytes`",
37
+ "instead.",
38
+ ].join("\n");
39
+ };
40
+
41
+ const tupleBullet = (name: string, doc: string | undefined): string | undefined => {
42
+ const text = (doc ?? "").replaceAll(WHITESPACE_RUN_PATTERN, " ").trim();
43
+
44
+ return text.length === 0 ? undefined : `- \`${name}\`: ${text}`;
45
+ };
46
+
47
+ const tupleReturnsText = (primary: string | undefined, outs: InputParameter[]): string | undefined => {
48
+ const bullets = [
49
+ tupleBullet("result", primary),
50
+ ...outs.map(({ parameter, index }) => tupleBullet(parameterIdentifier(parameter, index), parameter.doc)),
51
+ ].filter((bullet) => bullet !== undefined);
52
+
53
+ return bullets.length === 0 ? undefined : `Tuple of:\n\n${bullets.join("\n")}`;
54
+ };
55
+
56
+ const returnsText = (context: ModuleContext, fn: GirFunction): string | undefined => {
57
+ const outs = returnedOutParameters(context, fn);
58
+ const isPrimaryOmitted = shouldOmitPrimaryReturn(context.library, fn.returnValue);
59
+ const primary = isPrimaryOmitted ? undefined : fn.returnValue.doc;
60
+
61
+ if (outs.length === 0) {
62
+ return primary;
63
+ }
64
+
65
+ if (isPrimaryOmitted && outs.length === 1) {
66
+ return outs[0]?.parameter.doc;
67
+ }
68
+
69
+ return tupleReturnsText(primary, outs);
70
+ };
71
+
72
+ const docIdentifiers = (callable: GirFunction, renames: Map<string, string> | undefined): Map<string, string> => {
73
+ const identifiers = renamesWithInstance(callable.parameters, callable.instance);
74
+ const overrides = renames ?? new Map<string, string>();
75
+
76
+ for (const [girName, declaredName] of overrides) {
77
+ identifiers.set(girName, declaredName);
78
+ }
79
+
80
+ return identifiers;
81
+ };
82
+
83
+ const canCallableThrow = (callable: GirFunction, finishFn: GirFunction | undefined): boolean =>
84
+ callable.throws || finishFn?.throws === true;
85
+
86
+ const callableSpec = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions): JsDocSpec => ({
87
+ ...annotationSpec(callable.annotations),
88
+ identifiers: docIdentifiers(callable, options.renames),
89
+ params: documentedParameters(
90
+ context.library,
91
+ callable,
92
+ (parameter) => options.finishFn !== undefined && isCallbackParameter(context, parameter),
93
+ options.renames,
94
+ ),
95
+ returns: returnsText(context, options.finishFn ?? callable),
96
+ throws: canCallableThrow(callable, options.finishFn) ? THROWS_TEXT : undefined,
97
+ });
98
+
99
+ const callableDoc = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions = {}): string =>
100
+ renderJsDoc(callable.doc, nulTerminatedNote(context, callable), callableSpec(context, callable, options));
101
+
102
+ export { callableDoc, callableSpec };
@@ -1,10 +1,11 @@
1
1
  import { camelCase, toCamelIdentifier, uniqBy } from "@gtkx/utils";
2
2
  import type { GirFunction } from "../../gir/function.js";
3
3
  import type { ModuleContext } from "../../writer/context.js";
4
- import { hasCallerAllocatedArrayLength } from "../../analysis/param-structure.js";
5
- import { renderJsDoc } from "../../writer/doc.js";
4
+ import type { JsDocSpec } from "../../writer/doc.js";
5
+ import { hasUnmarshalableParam } from "../../analysis/param-capability.js";
6
6
  import { renderBlock } from "../../writer/emit.js";
7
7
  import { matchAsyncFinish } from "./async.js";
8
+ import { callableDoc, callableSpec } from "./callable-doc.js";
8
9
  import { renderFnExpression } from "./function.js";
9
10
  import { gtypeMemberDeclaration } from "./gtype-binding.js";
10
11
  import {
@@ -16,7 +17,7 @@ import {
16
17
  renderPromisifiedBody,
17
18
  renderPromisifiedSignature,
18
19
  } from "./method.js";
19
- import { renderRuntimeOverride } from "./runtime-override.js";
20
+ import { renderRuntimeOverride, runtimeOverrideRenames } from "./runtime-override.js";
20
21
 
21
22
  type Callables = {
22
23
  constructors: GirFunction[];
@@ -64,7 +65,7 @@ type PlainTypeMembersOptions = {
64
65
 
65
66
  const renderInstanceMethodSignature: InstanceMemberRenderer = instanceMemberRenderer(
66
67
  (context, callable, { name, finishFn }) =>
67
- `${renderJsDoc(callable.doc)}${memberSignatureText(context, callable, name, { finishFn })};`,
68
+ `${memberDoc(context, callable, finishFn)}${memberSignatureText(context, callable, name, { finishFn })};`,
68
69
  );
69
70
 
70
71
  const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer(
@@ -78,6 +79,12 @@ const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer
78
79
  }),
79
80
  );
80
81
 
82
+ const memberDoc = (context: ModuleContext, callable: GirFunction, finishFn: GirFunction | undefined): string =>
83
+ callableDoc(context, callable, { finishFn });
84
+
85
+ const instanceMemberSpec = (context: ModuleContext, callable: GirFunction, scope: InstanceScope): JsDocSpec =>
86
+ callableSpec(context, callable, { finishFn: matchFinishFunction(context, callable, scope) });
87
+
81
88
  const instanceScope = (ownerName: string, callables: Callables): InstanceScope => ({
82
89
  ownerName,
83
90
  methodByName: indexMethodsByName(callables.methods),
@@ -96,11 +103,7 @@ const renderBinding = (
96
103
  context: ModuleContext,
97
104
  callable: GirFunction,
98
105
  ): { text: string; cIdentifier: string } | undefined => {
99
- if (!callable.introspectable) {
100
- return undefined;
101
- }
102
-
103
- if (callable.shadowedBy !== undefined) {
106
+ if (!isEmittableCallable(context, callable)) {
104
107
  return undefined;
105
108
  }
106
109
 
@@ -182,7 +185,8 @@ const renderCallableMember = (
182
185
  }
183
186
 
184
187
  const { cIdentifier, name } = resolved;
185
- const doc = renderJsDoc(callable.doc);
188
+ const renames = options.canUseRuntimeOverride === true ? runtimeOverrideRenames(callable) : undefined;
189
+ const doc = callableDoc(context, callable, { renames });
186
190
  const override = runtimeOverrideMember(callable, name, doc, options.canUseRuntimeOverride);
187
191
 
188
192
  if (override !== undefined) {
@@ -349,7 +353,7 @@ const renderPromisifiedCallable = (
349
353
  const prefix = member.isStatic ? "static " : "";
350
354
  const header = `${prefix}${member.name}(${signature}): ${returnType}`;
351
355
 
352
- return `${renderJsDoc(callable.doc)}${renderBlock(header, body)}`;
356
+ return `${memberDoc(context, callable, finishFn)}${renderBlock(header, body)}`;
353
357
  };
354
358
 
355
359
  const indexMethodsByName = (methods: GirFunction[]): Map<string, GirFunction> => {
@@ -366,7 +370,7 @@ const isEmittableCallable = (context: ModuleContext, callable: GirFunction): boo
366
370
  callable.introspectable &&
367
371
  callable.shadowedBy === undefined &&
368
372
  callable.cIdentifier !== undefined &&
369
- !hasCallerAllocatedArrayLength(context.library, callable);
373
+ !hasUnmarshalableParam(context, callable);
370
374
 
371
375
  const constructorMemberName = (girName: string): string | undefined => {
372
376
  const camel = camelCase(girName);
@@ -497,6 +501,7 @@ const renderPlainTypeMembers = (
497
501
  export {
498
502
  renderInstanceMethodSignature,
499
503
  renderClassInstanceMember,
504
+ instanceMemberSpec,
500
505
  instanceScope,
501
506
  dedupeCallables,
502
507
  generateBindings,
@@ -508,5 +513,6 @@ export {
508
513
  renderStaticHead,
509
514
  renderPlainTypeMembers,
510
515
  type Callables,
516
+ type InstanceMemberRenderer,
511
517
  type InstanceScope,
512
518
  };