@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,50 +1,132 @@
1
1
  import { sortStrings, sortStringsBy } from "@gtkx/utils";
2
- import type { GlEnum } from "./model.js";
2
+ import type { GlDocContext } from "./doc-context.js";
3
+ import type { GlEnum, GlType } from "./model.js";
3
4
  import type { RenderedCommand } from "./render.js";
5
+ import type { GlSymbolProvenance } from "./select.js";
4
6
  import { ModuleBuilder } from "../writer/module.js";
7
+ import { asSentence, backtick, backtickList, provenanceLines } from "./notes.js";
5
8
  import { GL_SCALARS } from "./plan.js";
6
9
 
7
- const LIB_CONSTANT = "export const LIB = \"libGL.so.1\";";
10
+ type EnumRow = {
11
+ token: GlEnum;
12
+ exportName: string;
13
+ literal: string;
14
+ provenance: GlSymbolProvenance;
15
+ };
8
16
 
9
- const GENERATED_HEADER = `/**
10
- * GENERATED FILE: do not edit.
11
- */`;
17
+ const LIB_CONSTANT =
18
+ "/** The shared library the generated OpenGL bindings are loaded from. */\n" +
19
+ "export const LIB = \"libGL.so.1\";";
12
20
 
21
+ const SYNC_SUMMARY = "An opaque `GLsync` fence handle";
13
22
  const TS_PRIMITIVES: Set<string> = new Set(["boolean", "string", "void", "number"]);
14
23
 
15
- const quotedGroupList = (groups: string[]): string => groups.map((group) => `\`${group}\``).join(", ");
24
+ const attributionLine = (line: string): string => (line.length === 0 ? " *" : ` * ${line}`);
16
25
 
17
- const renderEnumsModule = (
18
- tokens: { token: GlEnum; exportName: string; literal: string; feature: string }[],
19
- ): string => {
20
- const builder = new ModuleBuilder();
26
+ const attributionLines = (registryComment: string | undefined): string[] =>
27
+ registryComment === undefined
28
+ ? []
29
+ : [" *", ...registryComment.split("\n").map((line) => attributionLine(line))];
30
+
31
+ const generatedHeader = (docs: GlDocContext): string =>
32
+ [
33
+ "/**",
34
+ " * GENERATED FILE: do not edit.",
35
+ " *",
36
+ " * Derived from the Khronos OpenGL registry (gl.xml).",
37
+ ...attributionLines(docs.registryComment),
38
+ " */",
39
+ ].join("\n");
40
+
41
+ const groupsLine = (groups: string[]): string[] => (groups.length === 0 ? [] : [` * Groups: ${backtickList(groups)}.`]);
21
42
 
22
- for (const { token, exportName, literal, feature } of tokens) {
23
- const groupNote = token.groups.length > 0 ? ` Groups: ${quotedGroupList(token.groups)}.` : "";
43
+ const rangePhrase = (vendor: string | undefined): string =>
44
+ vendor === undefined ? "Registry enumerant block" : `Allocated from the ${backtick(vendor)} enumerant range`;
24
45
 
25
- builder.appendDeclaration(
26
- `/** \`${token.name}\`, provided by \`${feature}\`.${groupNote} */\n` +
27
- `export const ${exportName} = ${literal};`,
28
- );
46
+ const rangeLine = ({ vendor, blockComment }: GlEnum): string[] => {
47
+ if (vendor === undefined && blockComment === undefined) {
48
+ return [];
29
49
  }
30
50
 
31
- return `${GENERATED_HEADER}\n\n${builder.toSource()}`;
51
+ const phrase = rangePhrase(vendor);
52
+ const text = blockComment === undefined ? phrase : `${phrase}: ${blockComment}`;
53
+
54
+ return [` * ${asSentence(text)}`];
32
55
  };
33
56
 
34
- const renderTypesModule = (groupAliases: Map<string, string>): string => {
57
+ const tokenNoteLines = (token: GlEnum): string[] => [
58
+ ...groupsLine(token.groups),
59
+ ...(token.comment === undefined ? [] : [` * Token note: ${asSentence(token.comment)}`]),
60
+ ...(token.alias === undefined ? [] : [` * Also known as ${backtick(token.alias)}.`]),
61
+ ...(token.valueType === undefined ? [] : [` * Tagged ${backtick(token.valueType)} in the registry.`]),
62
+ ...rangeLine(token),
63
+ ];
64
+
65
+ const enumJsDoc = ({ token, provenance }: EnumRow, docs: GlDocContext): string =>
66
+ [
67
+ "/**",
68
+ ` * ${backtick(token.name)}.`,
69
+ " *",
70
+ ...provenanceLines(provenance, docs.extensionEnums.get(token.name) ?? []),
71
+ ...tokenNoteLines(token),
72
+ " */",
73
+ ].join("\n");
74
+
75
+ const renderEnumsModule = (tokens: EnumRow[], docs: GlDocContext): string => {
35
76
  const builder = new ModuleBuilder();
36
- builder.imports.addNamed("@gtkx/native", "ExternalObject", true);
37
- builder.imports.addNamed("@gtkx/native", "Handle", true);
38
77
 
39
- builder.appendDeclaration(
40
- "/** An opaque `GLsync` fence handle. */\nexport type GLsync = ExternalObject<Handle>;",
41
- );
78
+ for (const row of tokens) {
79
+ builder.appendDeclaration(`${enumJsDoc(row, docs)}\nexport const ${row.exportName} = ${row.literal};`);
80
+ }
42
81
 
43
- builder.appendDeclaration(
44
- "/** An opaque native pointer handle (e.g. a `glMapBufferRange` mapping). */\n" +
45
- "export type GLpointer = ExternalObject<Handle>;",
46
- );
82
+ return `${generatedHeader(docs)}\n\n${builder.toSource()}`;
83
+ };
84
+
85
+ const scalarSentences = (alias: string, type: GlType): string[] => [
86
+ `The C ${backtick(alias)} scalar: ${backtick(type.declaration)}.`,
87
+ ...(type.requires === undefined ? [] : [`Requires the ${backtick(type.requires)} header.`]),
88
+ ...(type.comment === undefined ? [] : [`Registry note: ${asSentence(type.comment)}`]),
89
+ ];
90
+
91
+ const scalarJsDoc = (alias: string, docs: GlDocContext): string => {
92
+ const type = docs.types.get(alias);
93
+
94
+ if (type === undefined) {
95
+ return `/** The C ${backtick(alias)} scalar. */`;
96
+ }
47
97
 
98
+ return `/** ${scalarSentences(alias, type).join(" ")} */`;
99
+ };
100
+
101
+ const syncJsDoc = (docs: GlDocContext): string => {
102
+ const type = docs.types.get("GLsync");
103
+
104
+ if (type === undefined) {
105
+ return `/** ${SYNC_SUMMARY}. */`;
106
+ }
107
+
108
+ return `/** ${SYNC_SUMMARY}: ${backtick(type.declaration)}. */`;
109
+ };
110
+
111
+ const groupSummary = (group: string, isBitmask: boolean): string =>
112
+ isBitmask
113
+ ? `Registry enum group ${backtick(group)}, declared as a bitmask: members are combined with \`|\`.`
114
+ : `Registry enum group ${backtick(group)}.`;
115
+
116
+ const memberLines = (members: string[]): string[] =>
117
+ members.length === 0 ? [] : [" *", ` * Members: ${backtickList(members)}.`];
118
+
119
+ const groupAliasJsDoc = (group: string, base: string, docs: GlDocContext): string =>
120
+ [
121
+ "/**",
122
+ ` * ${groupSummary(group, docs.bitmaskGroups.has(group))}`,
123
+ " *",
124
+ ` * Open and documentation-only; any ${backtick(base)} value is accepted.`,
125
+ ...memberLines(docs.groupMembers.get(group) ?? []),
126
+ " */",
127
+ ].join("\n");
128
+
129
+ const appendScalarAliases = (builder: ModuleBuilder, docs: GlDocContext): void => {
48
130
  const seen: Set<string> = new Set();
49
131
 
50
132
  for (const scalar of GL_SCALARS.values()) {
@@ -53,22 +135,33 @@ const renderTypesModule = (groupAliases: Map<string, string>): string => {
53
135
  }
54
136
 
55
137
  seen.add(scalar.tsAlias);
56
-
57
- builder.appendDeclaration(
58
- `/** The C \`${scalar.tsAlias}\` scalar. */\nexport type ${scalar.tsAlias} = number;`,
59
- );
138
+ builder.appendDeclaration(`${scalarJsDoc(scalar.tsAlias, docs)}\nexport type ${scalar.tsAlias} = number;`);
60
139
  }
140
+ };
61
141
 
62
- const sortedAliases = sortStringsBy(groupAliases.entries(), ([key]) => key);
142
+ const appendGroupAliases = (builder: ModuleBuilder, groupAliases: Map<string, string>, docs: GlDocContext): void => {
143
+ const sorted = sortStringsBy(groupAliases.entries(), ([key]) => key);
63
144
 
64
- for (const [group, base] of sortedAliases) {
65
- builder.appendDeclaration(
66
- `/** Registry enum group \`${group}\`; open and documentation-only, ` +
67
- `any \`${base}\` value is accepted. */\nexport type ${group} = ${base};`,
68
- );
145
+ for (const [group, base] of sorted) {
146
+ builder.appendDeclaration(`${groupAliasJsDoc(group, base, docs)}\nexport type ${group} = ${base};`);
69
147
  }
148
+ };
149
+
150
+ const renderTypesModule = (groupAliases: Map<string, string>, docs: GlDocContext): string => {
151
+ const builder = new ModuleBuilder();
152
+ builder.imports.addNamed("@gtkx/native", "ExternalObject", true);
153
+ builder.imports.addNamed("@gtkx/native", "Handle", true);
154
+ builder.appendDeclaration(`${syncJsDoc(docs)}\nexport type GLsync = ExternalObject<Handle>;`);
155
+
156
+ builder.appendDeclaration(
157
+ "/** An opaque native pointer handle (e.g. a `glMapBufferRange` mapping). */\n" +
158
+ "export type GLpointer = ExternalObject<Handle>;",
159
+ );
160
+
161
+ appendScalarAliases(builder, docs);
162
+ appendGroupAliases(builder, groupAliases, docs);
70
163
 
71
- return `${GENERATED_HEADER}\n\n${builder.toSource()}`;
164
+ return `${generatedHeader(docs)}\n\n${builder.toSource()}`;
72
165
  };
73
166
 
74
167
  const appendTypeImports = (builder: ModuleBuilder, usedTypes: Set<string>): void => {
@@ -99,6 +192,7 @@ const renderCommandsModule = (
99
192
  rendered: RenderedCommand[],
100
193
  singulars: RenderedCommand[],
101
194
  usedTypes: Set<string>,
195
+ docs: GlDocContext,
102
196
  ): string => {
103
197
  const builder = new ModuleBuilder();
104
198
  builder.imports.addNamed("@gtkx/runtime", "t");
@@ -109,7 +203,7 @@ const renderCommandsModule = (
109
203
  appendCommandDeclarations(builder, rendered);
110
204
  appendCommandDeclarations(builder, singulars);
111
205
 
112
- return `${GENERATED_HEADER}\n\n${builder.toSource()}`;
206
+ return `${generatedHeader(docs)}\n\n${builder.toSource()}`;
113
207
  };
114
208
 
115
- export { renderEnumsModule, renderTypesModule, renderCommandsModule };
209
+ export { renderEnumsModule, renderTypesModule, renderCommandsModule, type EnumRow };
@@ -0,0 +1,74 @@
1
+ import { lowerFirst, toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GlExtensionAttribution } from "./extensions.js";
3
+ import type { GlRemoval, GlSymbolProvenance } from "./select.js";
4
+
5
+ type MetadataNotesOptions = {
6
+ type: string;
7
+ group?: string;
8
+ len?: string;
9
+ objectClass?: string;
10
+ kinds: string[];
11
+ note?: string;
12
+ };
13
+
14
+ const commandExportName = (name: string): string =>
15
+ toCamelIdentifier(name.startsWith("gl") ? lowerFirst(name.slice(2)) : name);
16
+
17
+ const backtick = (text: string): string => `\`${text}\``;
18
+ const backtickList = (values: string[]): string => values.map((value) => backtick(value)).join(", ");
19
+ const asSentence = (text: string): string => (text.endsWith(".") ? text : `${text}.`);
20
+
21
+ const removalPhrase = (removal: GlRemoval): string =>
22
+ removal.comment === undefined
23
+ ? backtick(removal.feature)
24
+ : `${backtick(removal.feature)} (${removal.comment})`;
25
+
26
+ const removalLine = (provenance: GlSymbolProvenance): string => {
27
+ const phrases = provenance.removals.map((removal) => removalPhrase(removal)).join(", ");
28
+
29
+ return ` * Removed from the core profile by ${phrases}, then restored by ${backtick(provenance.feature)}.`;
30
+ };
31
+
32
+ const extensionLine = (extensions: GlExtensionAttribution[]): string => {
33
+ const names = backtickList(extensions.map((extension) => extension.name));
34
+
35
+ return ` * Also provided by the ${names} extension${extensions.length === 1 ? "" : "s"}.`;
36
+ };
37
+
38
+ const extensionNoteLines = (extensions: GlExtensionAttribution[]): string[] =>
39
+ extensions.flatMap((extension) =>
40
+ extension.notes.map((note) => ` * ${backtick(extension.name)} note: ${asSentence(note)}`));
41
+
42
+ const extensionLines = (extensions: GlExtensionAttribution[]): string[] =>
43
+ extensions.length === 0 ? [] : [extensionLine(extensions), ...extensionNoteLines(extensions)];
44
+
45
+ const provenanceLines = (provenance: GlSymbolProvenance, extensions: GlExtensionAttribution[]): string[] => [
46
+ ` * Provided by ${backtick(provenance.feature)}.`,
47
+ ...(provenance.removals.length > 0 ? [removalLine(provenance)] : []),
48
+ ...(provenance.requireComment === undefined ? [] : [` * Registry note: ${provenance.requireComment}`]),
49
+ ...extensionLines(extensions),
50
+ ];
51
+
52
+ const metadataNotes = ({ type, group, len, objectClass, kinds, note }: MetadataNotesOptions): string =>
53
+ [
54
+ backtick(type),
55
+ ...(group === undefined ? [] : [`group ${backtick(group)}`]),
56
+ ...(len === undefined ? [] : [`length ${backtick(len)}`]),
57
+ ...(objectClass === undefined ? [] : [`object class ${backtick(objectClass)}`]),
58
+ ...kinds.map((kind) => `kind ${backtick(kind)}`),
59
+ ...(note === undefined ? [] : [note]),
60
+ ].join(", ");
61
+
62
+ const kindDescriptions = (kinds: string[], table: Map<string, string>): string =>
63
+ kinds.flatMap((kind) => table.get(kind) ?? []).join(" ");
64
+
65
+ export {
66
+ asSentence,
67
+ backtick,
68
+ backtickList,
69
+ commandExportName,
70
+ kindDescriptions,
71
+ metadataNotes,
72
+ type MetadataNotesOptions,
73
+ provenanceLines,
74
+ };
@@ -6,7 +6,7 @@ type ParamPair = {
6
6
  param: GlParam | undefined;
7
7
  };
8
8
 
9
- const paramPairAt = (plan: CommandPlan & { ok: true }, index: number): ParamPair => ({
9
+ const paramPairAt = (plan: CommandPlan & { isOk: true }, index: number): ParamPair => ({
10
10
  paramPlan: plan.params[index],
11
11
  param: plan.command.params[index],
12
12
  });
@@ -1,6 +1,8 @@
1
1
  import { sanitizeIdentifier, sortStrings, sortStringsBy } from "@gtkx/utils";
2
+ import { buildDocContext, type GlDocContext } from "./doc-context.js";
3
+ import { buildExtensionIndex } from "./extensions.js";
2
4
  import { type GlEnum, loadGlRegistry } from "./model.js";
3
- import { renderCommandsModule, renderEnumsModule, renderTypesModule } from "./modules.js";
5
+ import { type EnumRow, renderCommandsModule, renderEnumsModule, renderTypesModule } from "./modules.js";
4
6
  import { paramPairAt } from "./param-pair.js";
5
7
  import {
6
8
  type CommandPlan,
@@ -11,7 +13,7 @@ import {
11
13
  planCommand,
12
14
  } from "./plan.js";
13
15
  import { deriveDeleteSingular, deriveGenSingular, renderCommand, type RenderedCommand } from "./render.js";
14
- import { type GlSelection, resolveEnum, selectSubset } from "./select.js";
16
+ import { type GlSelection, type GlSubset, type GlSymbolProvenance, resolveEnum, selectSubset } from "./select.js";
15
17
 
16
18
  type GlExclusion = {
17
19
  command: string;
@@ -24,6 +26,8 @@ type GlGenerationReport = {
24
26
  emittedCommands: number;
25
27
  derivedSingulars: number;
26
28
  exclusions: GlExclusion[];
29
+ enumExclusions: string[];
30
+ coreRemovals: GlSubset["removed"];
27
31
  };
28
32
 
29
33
  type GlGenerationResult = {
@@ -31,26 +35,29 @@ type GlGenerationResult = {
31
35
  report: GlGenerationReport;
32
36
  };
33
37
 
34
- type GroupBearingParamPlan = Extract<ParamPlan, { kind: "scalar" | "array-in" | "ref-out" }>;
38
+ type GroupBearingParamPlan = Extract<ParamPlan, { kind: "scalar" | "array-in" | "ref-out" | "ref-array-out" }>;
35
39
 
36
40
  type GlGenerationOptions = {
37
41
  registryPath: string;
38
42
  overrideExports: Set<string>;
39
43
  };
40
44
 
41
- type OkPlan = CommandPlan & { ok: true };
45
+ type OkPlan = CommandPlan & { isOk: true };
42
46
 
43
47
  type PlannedSelection = {
44
48
  okPlans: OkPlan[];
45
- planFeatures: Map<string, string>;
49
+ planFeatures: Map<string, GlSymbolProvenance>;
46
50
  exclusions: GlExclusion[];
47
51
  };
48
52
 
49
- type EnumRow = {
50
- token: GlEnum;
51
- exportName: string;
52
- literal: string;
53
- feature: string;
53
+ type EnumSelection = {
54
+ rows: EnumRow[];
55
+ enumExclusions: string[];
56
+ };
57
+
58
+ type RenderedCommands = {
59
+ rendered: RenderedCommand[];
60
+ singulars: RenderedCommand[];
54
61
  };
55
62
 
56
63
  const BYTE_OFFSET_PARAMS: Set<string> = new Set([
@@ -103,7 +110,14 @@ const PLAN_POLICY: GlPlanPolicy = {
103
110
  };
104
111
 
105
112
  const MAX_SAFE = BigInt(Number.MAX_SAFE_INTEGER);
106
- const GROUP_BEARING_PARAM_KINDS: Set<ParamPlan["kind"]> = new Set(["scalar", "array-in", "ref-out"]);
113
+
114
+ const GROUP_BEARING_PARAM_KINDS: Set<ParamPlan["kind"]> = new Set([
115
+ "scalar",
116
+ "array-in",
117
+ "ref-out",
118
+ "ref-array-out",
119
+ ]);
120
+
107
121
  const GL_SELECTION: GlSelection = { api: "gl", version: 4.6, profile: "core" };
108
122
 
109
123
  const enumExportName = (name: string): string =>
@@ -204,7 +218,7 @@ const planSelectedCommand = (registry: ReturnType<typeof loadGlRegistry>, name:
204
218
 
205
219
  const plan = planCommand(command, PLAN_POLICY);
206
220
 
207
- if (!plan.ok) {
221
+ if (!plan.isOk) {
208
222
  return { command: name, reason: plan.reason };
209
223
  }
210
224
 
@@ -213,19 +227,19 @@ const planSelectedCommand = (registry: ReturnType<typeof loadGlRegistry>, name:
213
227
 
214
228
  const planSelectedCommands = (
215
229
  registry: ReturnType<typeof loadGlRegistry>,
216
- commandNames: Map<string, string>,
230
+ commandNames: Map<string, GlSymbolProvenance>,
217
231
  ): PlannedSelection => {
218
232
  const exclusions: GlExclusion[] = [];
219
233
  const okPlans: OkPlan[] = [];
220
- const planFeatures: Map<string, string> = new Map();
234
+ const planFeatures: Map<string, GlSymbolProvenance> = new Map();
221
235
  const sortedCommands = sortStringsBy(commandNames.entries(), ([key]) => key);
222
236
 
223
- for (const [name, feature] of sortedCommands) {
237
+ for (const [name, provenance] of sortedCommands) {
224
238
  const result = planSelectedCommand(registry, name);
225
239
 
226
- if ("ok" in result) {
240
+ if ("isOk" in result) {
227
241
  okPlans.push(result);
228
- planFeatures.set(name, feature);
242
+ planFeatures.set(name, provenance);
229
243
  } else {
230
244
  exclusions.push(result);
231
245
  }
@@ -234,22 +248,62 @@ const planSelectedCommands = (
234
248
  return { okPlans, planFeatures, exclusions };
235
249
  };
236
250
 
237
- const buildEnumRows = (registry: ReturnType<typeof loadGlRegistry>, enumNames: Map<string, string>): EnumRow[] => {
238
- const enumRows: EnumRow[] = [];
251
+ const buildEnumRows = (
252
+ registry: ReturnType<typeof loadGlRegistry>,
253
+ enumNames: Map<string, GlSymbolProvenance>,
254
+ selection: GlSelection,
255
+ ): EnumSelection => {
256
+ const rows: EnumRow[] = [];
257
+ const enumExclusions: string[] = [];
239
258
  const sortedEnums = sortStringsBy(enumNames.entries(), ([key]) => key);
240
259
 
241
- for (const [name, feature] of sortedEnums) {
242
- const token = resolveEnum(registry, name);
260
+ for (const [name, provenance] of sortedEnums) {
261
+ const token = resolveEnum(registry, name, selection.api);
243
262
  const literal = enumLiteral(token);
244
263
 
245
264
  if (literal === undefined) {
246
- continue;
265
+ enumExclusions.push(name);
266
+ } else {
267
+ rows.push({ token, exportName: enumExportName(name), literal, provenance });
247
268
  }
269
+ }
248
270
 
249
- enumRows.push({ token, exportName: enumExportName(name), literal, feature });
271
+ return { rows, enumExclusions };
272
+ };
273
+
274
+ const provenanceFor = (planFeatures: Map<string, GlSymbolProvenance>, name: string): GlSymbolProvenance => {
275
+ const found = planFeatures.get(name);
276
+
277
+ if (found === undefined) {
278
+ throw new Error(`Command ${name} was planned without a selection provenance`);
250
279
  }
251
280
 
252
- return enumRows;
281
+ return found;
282
+ };
283
+
284
+ const renderCommands = (
285
+ plans: OkPlan[],
286
+ planFeatures: Map<string, GlSymbolProvenance>,
287
+ usedTypes: Set<string>,
288
+ docs: GlDocContext,
289
+ ): RenderedCommands => {
290
+ const rendered: RenderedCommand[] = [];
291
+ const singulars: RenderedCommand[] = [];
292
+
293
+ for (const plan of plans) {
294
+ const provenance = provenanceFor(planFeatures, plan.command.name);
295
+ rendered.push(renderCommand(plan, provenance, usedTypes, docs));
296
+
297
+ const singular =
298
+ deriveGenSingular(plan, provenance, usedTypes, docs) ??
299
+ deriveDeleteSingular(plan, provenance, usedTypes, docs);
300
+
301
+ if (singular !== undefined) {
302
+ singulars.push(singular);
303
+ }
304
+ }
305
+
306
+ return { rendered, singulars };
253
307
  };
254
308
 
255
309
  const claimExportName = (exportNames: Map<string, string>, name: string, owner: string): void => {
@@ -299,27 +353,24 @@ const generateGlModules = (options: GlGenerationOptions): GlGenerationResult =>
299
353
  const registry = loadGlRegistry(options.registryPath);
300
354
  const subset = selectSubset(registry, selection);
301
355
  const { okPlans, planFeatures, exclusions } = planSelectedCommands(registry, subset.commands);
302
- const usedTypes: Set<string> = new Set();
303
- const rendered: RenderedCommand[] = [];
304
- const singulars: RenderedCommand[] = [];
356
+ const { rows, enumExclusions } = buildEnumRows(registry, subset.enums, selection);
357
+ const groupAliases = collectGroupAliases(okPlans);
305
358
 
306
- for (const plan of okPlans) {
307
- const feature = planFeatures.get(plan.command.name) ?? "unknown feature";
308
- rendered.push(renderCommand(plan, feature, usedTypes));
309
- const singular = deriveGenSingular(plan, feature, usedTypes) ?? deriveDeleteSingular(plan, feature, usedTypes);
310
-
311
- if (singular !== undefined) {
312
- singulars.push(singular);
313
- }
314
- }
359
+ const docs = buildDocContext({
360
+ registry,
361
+ extensions: buildExtensionIndex(registry, selection),
362
+ plans: okPlans,
363
+ enumRows: rows,
364
+ });
315
365
 
316
- const enumRows = buildEnumRows(registry, subset.enums);
317
- assertExportNamesDisjoint(rendered, singulars, enumRows, options.overrideExports);
366
+ const usedTypes: Set<string> = new Set();
367
+ const { rendered, singulars } = renderCommands(okPlans, planFeatures, usedTypes, docs);
368
+ assertExportNamesDisjoint(rendered, singulars, rows, options.overrideExports);
318
369
 
319
370
  const files: Map<string, string> = new Map([
320
- ["types.ts", renderTypesModule(collectGroupAliases(okPlans))],
321
- ["enums.ts", renderEnumsModule(enumRows)],
322
- ["commands.ts", renderCommandsModule(rendered, singulars, usedTypes)],
371
+ ["types.ts", renderTypesModule(groupAliases, docs)],
372
+ ["enums.ts", renderEnumsModule(rows, docs)],
373
+ ["commands.ts", renderCommandsModule(rendered, singulars, usedTypes, docs)],
323
374
  ]);
324
375
 
325
376
  return {
@@ -330,6 +381,8 @@ const generateGlModules = (options: GlGenerationOptions): GlGenerationResult =>
330
381
  emittedCommands: rendered.length,
331
382
  derivedSingulars: singulars.length,
332
383
  exclusions,
384
+ enumExclusions,
385
+ coreRemovals: subset.removed,
333
386
  },
334
387
  };
335
388
  };
@@ -51,12 +51,12 @@ type GlPlanPolicy = {
51
51
 
52
52
  type CommandPlan =
53
53
  | {
54
- ok: true;
54
+ isOk: true;
55
55
  command: GlCommand;
56
56
  params: ParamPlan[];
57
57
  returnPlan: ReturnPlan;
58
58
  } |
59
- { ok: false; command: GlCommand; reason: GlExclusionReason };
59
+ { isOk: false; command: GlCommand; reason: GlExclusionReason };
60
60
 
61
61
  type ParamOutcome = { plan: ParamPlan } | { reason: GlExclusionReason };
62
62
 
@@ -317,13 +317,13 @@ const planCommand = (command: GlCommand, policy: GlPlanPolicy): CommandPlan => {
317
317
  const outcome = planParam(command, param, policy);
318
318
 
319
319
  if ("reason" in outcome) {
320
- return { ok: false, command, reason: outcome.reason };
320
+ return { isOk: false, command, reason: outcome.reason };
321
321
  }
322
322
 
323
323
  params.push(outcome.plan);
324
324
  }
325
325
 
326
- return { ok: true, command, params, returnPlan: planReturn(command) };
326
+ return { isOk: true, command, params, returnPlan: planReturn(command) };
327
327
  };
328
328
 
329
329
  export {
@@ -331,7 +331,6 @@ export {
331
331
  parseCType,
332
332
  planCommand,
333
333
  type GlScalar,
334
- type ParsedCType,
335
334
  type ParamPlan,
336
335
  type ReturnPlan,
337
336
  type GlExclusionReason,