@gtkx/codegen 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +59 -38
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +25 -10
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +37 -9
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +25 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +139 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts +3 -2
  24. package/dist/analysis/ts-type.d.ts.map +1 -1
  25. package/dist/analysis/ts-type.js +26 -26
  26. package/dist/analysis/ts-type.js.map +1 -1
  27. package/dist/analysis/type-key.d.ts +5 -0
  28. package/dist/analysis/type-key.d.ts.map +1 -0
  29. package/dist/analysis/type-key.js +9 -0
  30. package/dist/analysis/type-key.js.map +1 -0
  31. package/dist/analysis/type-shape.d.ts +3 -2
  32. package/dist/analysis/type-shape.d.ts.map +1 -1
  33. package/dist/analysis/type-shape.js +2 -1
  34. package/dist/analysis/type-shape.js.map +1 -1
  35. package/dist/compile.d.ts +14 -6
  36. package/dist/compile.d.ts.map +1 -1
  37. package/dist/compile.js +125 -24
  38. package/dist/compile.js.map +1 -1
  39. package/dist/docs/api-reference.d.ts +2 -0
  40. package/dist/docs/api-reference.d.ts.map +1 -1
  41. package/dist/docs/api-reference.js +11 -10
  42. package/dist/docs/api-reference.js.map +1 -1
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +5 -3
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/pipeline.d.ts +1 -0
  47. package/dist/docs/pipeline.d.ts.map +1 -1
  48. package/dist/docs/pipeline.js +93 -19
  49. package/dist/docs/pipeline.js.map +1 -1
  50. package/dist/docs/render.d.ts +2 -1
  51. package/dist/docs/render.d.ts.map +1 -1
  52. package/dist/docs/render.js +5 -4
  53. package/dist/docs/render.js.map +1 -1
  54. package/dist/docs/symbol-page.d.ts.map +1 -1
  55. package/dist/docs/symbol-page.js +10 -9
  56. package/dist/docs/symbol-page.js.map +1 -1
  57. package/dist/fingerprint.d.ts +20 -3
  58. package/dist/fingerprint.d.ts.map +1 -1
  59. package/dist/fingerprint.js +56 -37
  60. package/dist/fingerprint.js.map +1 -1
  61. package/dist/gi.d.ts +1 -0
  62. package/dist/gi.d.ts.map +1 -1
  63. package/dist/gi.js +8 -2
  64. package/dist/gi.js.map +1 -1
  65. package/dist/gir/ancestry.d.ts +7 -1
  66. package/dist/gir/ancestry.d.ts.map +1 -1
  67. package/dist/gir/ancestry.js +9 -1
  68. package/dist/gir/ancestry.js.map +1 -1
  69. package/dist/gir/annotations.d.ts +1 -2
  70. package/dist/gir/annotations.d.ts.map +1 -1
  71. package/dist/gir/annotations.js +1 -1
  72. package/dist/gir/annotations.js.map +1 -1
  73. package/dist/gir/cursor-overrides.d.ts +8 -0
  74. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  75. package/dist/gir/cursor-overrides.js +6 -0
  76. package/dist/gir/cursor-overrides.js.map +1 -0
  77. package/dist/gir/emittable.d.ts +7 -0
  78. package/dist/gir/emittable.d.ts.map +1 -0
  79. package/dist/gir/emittable.js +3 -0
  80. package/dist/gir/emittable.js.map +1 -0
  81. package/dist/gir/function.d.ts.map +1 -1
  82. package/dist/gir/function.js +28 -2
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/gir-path.d.ts +1 -1
  85. package/dist/gir/gir-path.js +1 -1
  86. package/dist/gir/gir-path.js.map +1 -1
  87. package/dist/gir/library.d.ts +5 -1
  88. package/dist/gir/library.d.ts.map +1 -1
  89. package/dist/gir/library.js +9 -2
  90. package/dist/gir/library.js.map +1 -1
  91. package/dist/gir/namespace.d.ts +5 -1
  92. package/dist/gir/namespace.d.ts.map +1 -1
  93. package/dist/gir/namespace.js +4 -2
  94. package/dist/gir/namespace.js.map +1 -1
  95. package/dist/gir/parameter.d.ts +13 -1
  96. package/dist/gir/parameter.d.ts.map +1 -1
  97. package/dist/gir/parameter.js +1 -0
  98. package/dist/gir/parameter.js.map +1 -1
  99. package/dist/gir/parse.d.ts.map +1 -1
  100. package/dist/gir/parse.js +6 -6
  101. package/dist/gir/parse.js.map +1 -1
  102. package/dist/gir/primitives.js +1 -1
  103. package/dist/gir/primitives.js.map +1 -1
  104. package/dist/guards.d.ts +16 -0
  105. package/dist/guards.d.ts.map +1 -0
  106. package/dist/guards.js +11 -0
  107. package/dist/guards.js.map +1 -0
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.js +2 -0
  111. package/dist/internal.js.map +1 -1
  112. package/dist/json.d.ts +3 -0
  113. package/dist/json.d.ts.map +1 -0
  114. package/dist/json.js +11 -0
  115. package/dist/json.js.map +1 -0
  116. package/dist/khronos/args.d.ts.map +1 -1
  117. package/dist/khronos/args.js +8 -6
  118. package/dist/khronos/args.js.map +1 -1
  119. package/dist/khronos/modules.d.ts.map +1 -1
  120. package/dist/khronos/modules.js +22 -7
  121. package/dist/khronos/modules.js.map +1 -1
  122. package/dist/khronos/parse.d.ts.map +1 -1
  123. package/dist/khronos/parse.js +3 -4
  124. package/dist/khronos/parse.js.map +1 -1
  125. package/dist/khronos/pipeline.d.ts +1 -1
  126. package/dist/khronos/pipeline.d.ts.map +1 -1
  127. package/dist/khronos/pipeline.js.map +1 -1
  128. package/dist/khronos/plan.d.ts +1 -7
  129. package/dist/khronos/plan.d.ts.map +1 -1
  130. package/dist/khronos/plan.js +1 -1
  131. package/dist/khronos/plan.js.map +1 -1
  132. package/dist/khronos/render.d.ts.map +1 -1
  133. package/dist/khronos/render.js +8 -4
  134. package/dist/khronos/render.js.map +1 -1
  135. package/dist/runner.d.ts +7 -1
  136. package/dist/runner.d.ts.map +1 -1
  137. package/dist/runner.js +21 -3
  138. package/dist/runner.js.map +1 -1
  139. package/dist/staging.d.ts +5 -0
  140. package/dist/staging.d.ts.map +1 -0
  141. package/dist/staging.js +57 -0
  142. package/dist/staging.js.map +1 -0
  143. package/dist/store/compile-store.d.ts +0 -1
  144. package/dist/store/compile-store.d.ts.map +1 -1
  145. package/dist/store/compile-store.js +7 -32
  146. package/dist/store/compile-store.js.map +1 -1
  147. package/dist/store/gi/callables.d.ts +6 -3
  148. package/dist/store/gi/callables.d.ts.map +1 -1
  149. package/dist/store/gi/callables.js +40 -30
  150. package/dist/store/gi/callables.js.map +1 -1
  151. package/dist/store/gi/callback.d.ts.map +1 -1
  152. package/dist/store/gi/callback.js +9 -5
  153. package/dist/store/gi/callback.js.map +1 -1
  154. package/dist/store/gi/class.d.ts.map +1 -1
  155. package/dist/store/gi/class.js +104 -44
  156. package/dist/store/gi/class.js.map +1 -1
  157. package/dist/store/gi/companion.d.ts.map +1 -1
  158. package/dist/store/gi/companion.js +6 -6
  159. package/dist/store/gi/companion.js.map +1 -1
  160. package/dist/store/gi/constant.d.ts.map +1 -1
  161. package/dist/store/gi/constant.js +11 -3
  162. package/dist/store/gi/constant.js.map +1 -1
  163. package/dist/store/gi/constructor-props.js +1 -1
  164. package/dist/store/gi/constructor-props.js.map +1 -1
  165. package/dist/store/gi/enum.d.ts.map +1 -1
  166. package/dist/store/gi/enum.js +29 -12
  167. package/dist/store/gi/enum.js.map +1 -1
  168. package/dist/store/gi/function.d.ts +1 -3
  169. package/dist/store/gi/function.d.ts.map +1 -1
  170. package/dist/store/gi/function.js +24 -18
  171. package/dist/store/gi/function.js.map +1 -1
  172. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  173. package/dist/store/gi/gtype-binding.js +4 -1
  174. package/dist/store/gi/gtype-binding.js.map +1 -1
  175. package/dist/store/gi/interface.d.ts.map +1 -1
  176. package/dist/store/gi/interface.js +34 -19
  177. package/dist/store/gi/interface.js.map +1 -1
  178. package/dist/store/gi/method.d.ts +7 -6
  179. package/dist/store/gi/method.d.ts.map +1 -1
  180. package/dist/store/gi/method.js +13 -24
  181. package/dist/store/gi/method.js.map +1 -1
  182. package/dist/store/gi/param-marshal.d.ts +3 -2
  183. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  184. package/dist/store/gi/param-marshal.js +50 -5
  185. package/dist/store/gi/param-marshal.js.map +1 -1
  186. package/dist/store/gi/pipeline.d.ts.map +1 -1
  187. package/dist/store/gi/pipeline.js +21 -10
  188. package/dist/store/gi/pipeline.js.map +1 -1
  189. package/dist/store/gi/properties.d.ts +2 -1
  190. package/dist/store/gi/properties.d.ts.map +1 -1
  191. package/dist/store/gi/properties.js +6 -3
  192. package/dist/store/gi/properties.js.map +1 -1
  193. package/dist/store/gi/property-accessor.d.ts +10 -8
  194. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  195. package/dist/store/gi/property-accessor.js +49 -91
  196. package/dist/store/gi/property-accessor.js.map +1 -1
  197. package/dist/store/gi/record-constructor.d.ts +8 -1
  198. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  199. package/dist/store/gi/record-constructor.js +34 -13
  200. package/dist/store/gi/record-constructor.js.map +1 -1
  201. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  202. package/dist/store/gi/record-field-accessor.js +20 -4
  203. package/dist/store/gi/record-field-accessor.js.map +1 -1
  204. package/dist/store/gi/record-layout.d.ts +6 -1
  205. package/dist/store/gi/record-layout.d.ts.map +1 -1
  206. package/dist/store/gi/record-layout.js +8 -1
  207. package/dist/store/gi/record-layout.js.map +1 -1
  208. package/dist/store/gi/record.d.ts.map +1 -1
  209. package/dist/store/gi/record.js +19 -8
  210. package/dist/store/gi/record.js.map +1 -1
  211. package/dist/store/gi/registration.js +2 -2
  212. package/dist/store/gi/registration.js.map +1 -1
  213. package/dist/store/gi/return-wrap.js +1 -1
  214. package/dist/store/gi/return-wrap.js.map +1 -1
  215. package/dist/store/gi/signal.d.ts +2 -1
  216. package/dist/store/gi/signal.d.ts.map +1 -1
  217. package/dist/store/gi/signal.js +55 -28
  218. package/dist/store/gi/signal.js.map +1 -1
  219. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  220. package/dist/store/gi/value-marshalable.js +2 -1
  221. package/dist/store/gi/value-marshalable.js.map +1 -1
  222. package/dist/store/gi/vtable.d.ts +4 -1
  223. package/dist/store/gi/vtable.d.ts.map +1 -1
  224. package/dist/store/gi/vtable.js +60 -17
  225. package/dist/store/gi/vtable.js.map +1 -1
  226. package/dist/store/gi-store.d.ts +1 -0
  227. package/dist/store/gi-store.d.ts.map +1 -1
  228. package/dist/store/gi-store.js +15 -20
  229. package/dist/store/gi-store.js.map +1 -1
  230. package/dist/store/jsx/generated-elements.d.ts +2 -1
  231. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  232. package/dist/store/jsx/generated-elements.js +13 -7
  233. package/dist/store/jsx/generated-elements.js.map +1 -1
  234. package/dist/store/jsx/jsx.js +3 -3
  235. package/dist/store/jsx/jsx.js.map +1 -1
  236. package/dist/store/jsx/metadata.d.ts.map +1 -1
  237. package/dist/store/jsx/metadata.js +3 -1
  238. package/dist/store/jsx/metadata.js.map +1 -1
  239. package/dist/store/jsx-store.d.ts.map +1 -1
  240. package/dist/store/jsx-store.js +3 -4
  241. package/dist/store/jsx-store.js.map +1 -1
  242. package/dist/store/resolve-store.d.ts +14 -3
  243. package/dist/store/resolve-store.d.ts.map +1 -1
  244. package/dist/store/resolve-store.js +98 -15
  245. package/dist/store/resolve-store.js.map +1 -1
  246. package/dist/store/store-fs.d.ts +9 -7
  247. package/dist/store/store-fs.d.ts.map +1 -1
  248. package/dist/store/store-fs.js +54 -25
  249. package/dist/store/store-fs.js.map +1 -1
  250. package/dist/store/store-links.d.ts +3 -0
  251. package/dist/store/store-links.d.ts.map +1 -0
  252. package/dist/store/store-links.js +39 -0
  253. package/dist/store/store-links.js.map +1 -0
  254. package/dist/writer/comparison-context.d.ts +4 -0
  255. package/dist/writer/comparison-context.d.ts.map +1 -0
  256. package/dist/writer/comparison-context.js +13 -0
  257. package/dist/writer/comparison-context.js.map +1 -0
  258. package/dist/writer/context.d.ts +3 -3
  259. package/dist/writer/context.d.ts.map +1 -1
  260. package/dist/writer/context.js +11 -6
  261. package/dist/writer/context.js.map +1 -1
  262. package/dist/writer/module.d.ts +13 -5
  263. package/dist/writer/module.d.ts.map +1 -1
  264. package/dist/writer/module.js +68 -11
  265. package/dist/writer/module.js.map +1 -1
  266. package/dist/xml.d.ts +8 -1
  267. package/dist/xml.d.ts.map +1 -1
  268. package/dist/xml.js +70 -1
  269. package/dist/xml.js.map +1 -1
  270. package/overrides/gobject/object.ts.ejs +2 -0
  271. package/package.json +14 -3
  272. package/src/analysis/descriptor-render.ts +106 -52
  273. package/src/analysis/descriptor.ts +76 -15
  274. package/src/analysis/inheritance.ts +134 -44
  275. package/src/analysis/interface-conflicts.ts +235 -0
  276. package/src/analysis/param-capability.ts +3 -6
  277. package/src/analysis/param-structure.ts +2 -2
  278. package/src/analysis/ts-type.ts +43 -28
  279. package/src/analysis/type-key.ts +14 -0
  280. package/src/analysis/type-shape.ts +5 -2
  281. package/src/compile.ts +192 -27
  282. package/src/docs/api-reference.ts +13 -10
  283. package/src/docs/element-page.ts +5 -2
  284. package/src/docs/pipeline.ts +140 -24
  285. package/src/docs/render.ts +7 -3
  286. package/src/docs/symbol-page.ts +12 -11
  287. package/src/fingerprint.ts +95 -47
  288. package/src/gi.ts +10 -2
  289. package/src/gir/ancestry.ts +17 -1
  290. package/src/gir/annotations.ts +1 -1
  291. package/src/gir/cursor-overrides.ts +12 -0
  292. package/src/gir/emittable.ts +8 -0
  293. package/src/gir/function.ts +45 -9
  294. package/src/gir/gir-path.ts +1 -1
  295. package/src/gir/library.ts +10 -2
  296. package/src/gir/namespace.ts +8 -2
  297. package/src/gir/parameter.ts +15 -0
  298. package/src/gir/parse.ts +10 -7
  299. package/src/gir/primitives.ts +1 -1
  300. package/src/guards.ts +23 -0
  301. package/src/internal.ts +2 -0
  302. package/src/json.ts +11 -0
  303. package/src/khronos/args.ts +9 -6
  304. package/src/khronos/modules.ts +25 -9
  305. package/src/khronos/parse.ts +3 -4
  306. package/src/khronos/pipeline.ts +1 -1
  307. package/src/khronos/plan.ts +0 -1
  308. package/src/khronos/render.ts +8 -6
  309. package/src/runner.ts +26 -4
  310. package/src/staging.ts +67 -0
  311. package/src/store/compile-store.ts +7 -38
  312. package/src/store/gi/callables.ts +60 -33
  313. package/src/store/gi/callback.ts +9 -9
  314. package/src/store/gi/class.ts +140 -53
  315. package/src/store/gi/companion.ts +7 -6
  316. package/src/store/gi/constant.ts +13 -3
  317. package/src/store/gi/constructor-props.ts +1 -1
  318. package/src/store/gi/enum.ts +36 -26
  319. package/src/store/gi/function.ts +30 -24
  320. package/src/store/gi/gtype-binding.ts +7 -2
  321. package/src/store/gi/interface.ts +39 -20
  322. package/src/store/gi/method.ts +26 -32
  323. package/src/store/gi/param-marshal.ts +77 -6
  324. package/src/store/gi/pipeline.ts +25 -15
  325. package/src/store/gi/properties.ts +8 -4
  326. package/src/store/gi/property-accessor.ts +73 -161
  327. package/src/store/gi/record-constructor.ts +53 -21
  328. package/src/store/gi/record-field-accessor.ts +26 -4
  329. package/src/store/gi/record-layout.ts +11 -1
  330. package/src/store/gi/record.ts +20 -12
  331. package/src/store/gi/registration.ts +2 -2
  332. package/src/store/gi/return-wrap.ts +1 -1
  333. package/src/store/gi/signal.ts +66 -42
  334. package/src/store/gi/value-marshalable.ts +3 -1
  335. package/src/store/gi/vtable.ts +97 -20
  336. package/src/store/gi-store.ts +26 -31
  337. package/src/store/jsx/generated-elements.ts +17 -8
  338. package/src/store/jsx/jsx.ts +3 -3
  339. package/src/store/jsx/metadata.ts +4 -1
  340. package/src/store/jsx-store.ts +3 -4
  341. package/src/store/resolve-store.ts +133 -18
  342. package/src/store/store-fs.ts +82 -35
  343. package/src/store/store-links.ts +49 -0
  344. package/src/writer/comparison-context.ts +18 -0
  345. package/src/writer/context.ts +12 -6
  346. package/src/writer/module.ts +101 -14
  347. package/src/xml.ts +103 -1
@@ -1,50 +1,19 @@
1
- import { rmSync, writeFileSync } from "node:fs";
1
+ import { rmSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { compileProject, type SourceModule } from "../compile.js";
3
+ import { emitModules, type SourceModule } from "../compile.js";
4
4
 
5
5
  type CompileStoreParams = {
6
6
  storeDir: string;
7
7
  files: SourceModule[];
8
8
  packageName: string;
9
- requiresEnvReference?: boolean;
10
- };
11
-
12
- const EMIT_OPTIONS = {
13
- declaration: true,
14
- removeComments: false,
15
- sourceMap: false,
16
- declarationMap: false,
17
- rootDir: ".",
18
- outDir: ".",
19
- };
20
-
21
- const ENV_REFERENCE_FILE = "__gtkx-env__.d.ts";
22
-
23
- const writeEnvReference = (storeDir: string): (() => void) => {
24
- writeFileSync(join(storeDir, ENV_REFERENCE_FILE), "/// <reference types=\"@gtkx/react/env\" />\n");
25
-
26
- return () => {
27
- rmSync(join(storeDir, ENV_REFERENCE_FILE), { force: true });
28
- };
29
9
  };
30
10
 
31
11
  const compileStore = (params: CompileStoreParams): void => {
32
- const fileNames = params.files.map((file) => file.fileName);
33
-
34
- const removeEnvReference = params.requiresEnvReference === true
35
- ? writeEnvReference(params.storeDir)
36
- : (): void => undefined;
37
-
38
- try {
39
- compileProject({
40
- projectDir: params.storeDir,
41
- fileNames: params.requiresEnvReference === true ? [ENV_REFERENCE_FILE, ...fileNames] : fileNames,
42
- compilerOptions: EMIT_OPTIONS,
43
- label: `the generated ${params.packageName} store`,
44
- });
45
- } finally {
46
- removeEnvReference();
47
- }
12
+ emitModules({
13
+ projectDir: params.storeDir,
14
+ files: params.files,
15
+ label: `the generated ${params.packageName} store`,
16
+ });
48
17
 
49
18
  for (const file of params.files) {
50
19
  rmSync(join(params.storeDir, file.fileName), { force: true });
@@ -1,4 +1,4 @@
1
- import { camelCase, toCamelIdentifier, uniqBy } from "@gtkx/utils";
1
+ import { toCamelIdentifier, uniqBy } from "@gtkx/utils";
2
2
  import type { GirFunction } from "../../gir/function.js";
3
3
  import type { ModuleContext } from "../../writer/context.js";
4
4
  import type { JsDocSpec } from "../../writer/doc.js";
@@ -10,6 +10,7 @@ import { renderFnExpression } from "./function.js";
10
10
  import { gtypeMemberDeclaration } from "./gtype-binding.js";
11
11
  import {
12
12
  finishCallExpression,
13
+ memberName,
13
14
  methodExportName,
14
15
  renderMethodBody,
15
16
  renderMethodReturnType,
@@ -49,6 +50,11 @@ type ResolvedInstanceMember = {
49
50
  finishFn: GirFunction | undefined;
50
51
  };
51
52
 
53
+ type StaticMember = {
54
+ callable: GirFunction;
55
+ name: string;
56
+ };
57
+
52
58
  type InstanceMemberRenderer = (
53
59
  context: ModuleContext,
54
60
  callable: GirFunction,
@@ -63,6 +69,15 @@ type PlainTypeMembersOptions = {
63
69
  hasGtype: boolean;
64
70
  };
65
71
 
72
+ const RUNTIME_OWNED_LIFETIME_METHODS: Set<string> = new Set([
73
+ "force_floating",
74
+ "free",
75
+ "ref",
76
+ "ref_sink",
77
+ "take_ref",
78
+ "unref",
79
+ ]);
80
+
66
81
  const renderInstanceMethodSignature: InstanceMemberRenderer = instanceMemberRenderer(
67
82
  (context, callable, { name, finishFn }) =>
68
83
  `${memberDoc(context, callable, finishFn)}${memberSignatureText(context, callable, name, { finishFn })};`,
@@ -99,15 +114,14 @@ const dedupeCallables = (callables: GirFunction[]): GirFunction[] =>
99
114
  (callable) => callable.cIdentifier,
100
115
  );
101
116
 
117
+ const getEmittableCIdentifier = (context: ModuleContext, callable: GirFunction): string | undefined =>
118
+ isEmittableCallable(context, callable) ? callable.cIdentifier : undefined;
119
+
102
120
  const renderBinding = (
103
121
  context: ModuleContext,
104
122
  callable: GirFunction,
105
123
  ): { text: string; cIdentifier: string } | undefined => {
106
- if (!isEmittableCallable(context, callable)) {
107
- return undefined;
108
- }
109
-
110
- const cIdentifier = callable.cIdentifier;
124
+ const cIdentifier = getEmittableCIdentifier(context, callable);
111
125
 
112
126
  if (cIdentifier === undefined) {
113
127
  return undefined;
@@ -139,11 +153,7 @@ const resolveCallableMember = (
139
153
  callable: GirFunction,
140
154
  resolveName: (callable: GirFunction) => string | undefined,
141
155
  ): { cIdentifier: string; name: string } | undefined => {
142
- if (!isEmittableCallable(context, callable)) {
143
- return undefined;
144
- }
145
-
146
- const cIdentifier = callable.cIdentifier;
156
+ const cIdentifier = getEmittableCIdentifier(context, callable);
147
157
 
148
158
  if (cIdentifier === undefined) {
149
159
  return undefined;
@@ -151,7 +161,7 @@ const resolveCallableMember = (
151
161
 
152
162
  const name = resolveName(callable);
153
163
 
154
- if (name === undefined || name === "constructor") {
164
+ if (name === undefined || !isEmittableMemberName(name)) {
155
165
  return undefined;
156
166
  }
157
167
 
@@ -218,7 +228,7 @@ const renderStaticEntry = (
218
228
  if (finishFn !== undefined) {
219
229
  const name = options.resolveName(callable);
220
230
 
221
- if (name === undefined || name === "constructor") {
231
+ if (name === undefined || !isEmittableMemberName(name)) {
222
232
  return undefined;
223
233
  }
224
234
 
@@ -247,6 +257,8 @@ const renderInstanceMethod = (
247
257
  canUseRuntimeOverride: true,
248
258
  });
249
259
 
260
+ const isEmittableMemberName = (name: string): boolean => name !== "constructor" && name.length > 0;
261
+
250
262
  const resolveInstanceMember = (
251
263
  context: ModuleContext,
252
264
  callable: GirFunction,
@@ -259,7 +271,7 @@ const resolveInstanceMember = (
259
271
 
260
272
  const name = nameOverride ?? methodExportName(callable);
261
273
 
262
- if (name === "constructor") {
274
+ if (!isEmittableMemberName(name)) {
263
275
  return undefined;
264
276
  }
265
277
 
@@ -370,16 +382,13 @@ const isEmittableCallable = (context: ModuleContext, callable: GirFunction): boo
370
382
  callable.introspectable &&
371
383
  callable.shadowedBy === undefined &&
372
384
  callable.cIdentifier !== undefined &&
385
+ !RUNTIME_OWNED_LIFETIME_METHODS.has(callable.name) &&
373
386
  !hasUnmarshalableParam(context, callable);
374
387
 
375
388
  const constructorMemberName = (girName: string): string | undefined => {
376
- const camel = camelCase(girName);
377
-
378
- if (camel === "constructor") {
379
- return undefined;
380
- }
389
+ const camel = memberName(girName);
381
390
 
382
- return camel;
391
+ return isEmittableMemberName(camel) ? camel : undefined;
383
392
  };
384
393
 
385
394
  const renderStaticSignature = (
@@ -409,24 +418,43 @@ const renderStaticSignature = (
409
418
  };
410
419
  };
411
420
 
412
- const classConstructorMemberNames = (context: ModuleContext, callables: Callables): string[] => {
413
- const names: string[] = [];
421
+ const staticMemberName = (
422
+ context: ModuleContext,
423
+ callable: GirFunction,
424
+ resolveName: (girName: string) => string | undefined,
425
+ ): string | undefined => {
426
+ if (!isEmittableCallable(context, callable)) {
427
+ return undefined;
428
+ }
414
429
 
415
- for (const callable of callables.constructors) {
416
- if (!isEmittableCallable(context, callable)) {
417
- continue;
418
- }
430
+ const name = resolveName(callable.name);
431
+
432
+ return name !== undefined && isEmittableMemberName(name) ? name : undefined;
433
+ };
434
+
435
+ const collectStaticMembers = (
436
+ context: ModuleContext,
437
+ group: GirFunction[],
438
+ resolveName: (girName: string) => string | undefined,
439
+ ): StaticMember[] => {
440
+ const members: StaticMember[] = [];
419
441
 
420
- const member = constructorMemberName(callable.name);
442
+ for (const callable of group) {
443
+ const name = staticMemberName(context, callable, resolveName);
421
444
 
422
- if (member !== undefined) {
423
- names.push(member);
445
+ if (name !== undefined) {
446
+ members.push({ callable, name });
424
447
  }
425
448
  }
426
449
 
427
- return names;
450
+ return members;
428
451
  };
429
452
 
453
+ const staticMembers = (context: ModuleContext, callables: Callables): StaticMember[] => [
454
+ ...collectStaticMembers(context, callables.constructors, memberName),
455
+ ...collectStaticMembers(context, callables.functions, memberName),
456
+ ];
457
+
430
458
  const collectStaticEntries = (
431
459
  context: ModuleContext,
432
460
  group: GirFunction[],
@@ -456,7 +484,7 @@ const renderStaticHead = (context: ModuleContext, callables: Callables, ownerCla
456
484
  returnTypeOverride: ownerClassName,
457
485
  }),
458
486
  ...collectStaticEntries(context, callables.functions, siblings, {
459
- resolveName: (member) => camelCase(member.name),
487
+ resolveName: (member) => memberName(member.name),
460
488
  ownerName: ownerClassName,
461
489
  }),
462
490
  ];
@@ -506,12 +534,11 @@ export {
506
534
  dedupeCallables,
507
535
  generateBindings,
508
536
  matchStaticFinishFunction,
509
- indexMethodsByName,
510
537
  isEmittableCallable,
511
538
  renderStaticSignature,
512
- classConstructorMemberNames,
513
539
  renderStaticHead,
514
540
  renderPlainTypeMembers,
541
+ staticMembers,
515
542
  type Callables,
516
543
  type InstanceMemberRenderer,
517
544
  type InstanceScope,
@@ -1,25 +1,25 @@
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
1
2
  import type { ModuleContext } from "../../writer/context.js";
2
3
  import { callbackAsFunction, type GirCallback } from "../../gir/callback.js";
4
+ import { isEmittableEntity } from "../../gir/emittable.js";
3
5
  import { callableDoc } from "./callable-doc.js";
4
6
  import { renderMethodReturnType, renderMethodSignature } from "./method.js";
5
7
 
6
8
  const generateCallback = (context: ModuleContext, callback: GirCallback): void => {
7
- if (!callback.introspectable) {
8
- return;
9
- }
10
-
11
- if (callback.name.length === 0) {
9
+ if (!isEmittableEntity(callback)) {
12
10
  return;
13
11
  }
14
12
 
15
13
  const fn = callbackAsFunction(callback);
16
14
  const signature = renderMethodSignature(context, fn);
17
15
  const returnType = renderMethodReturnType(context, fn);
16
+ const name = sanitizeTypeIdentifier(callback.name);
18
17
 
19
- context.module.appendDeclaration(
20
- `${callableDoc(context, fn)}export type ${callback.name} = (${signature}) => ${returnType};`,
21
- context.declaredType(callback.name),
22
- );
18
+ context.declare({
19
+ name,
20
+ code: `${callableDoc(context, fn)}export type ${name} = (${signature}) => ${returnType};`,
21
+ owner: callback.name,
22
+ });
23
23
  };
24
24
 
25
25
  export { generateCallback };
@@ -1,26 +1,36 @@
1
- import { pascalCase, toCamelIdentifier } from "@gtkx/utils";
1
+ import { sanitizeTypeIdentifier, toCamelIdentifier } from "@gtkx/utils";
2
2
  import type { GirClass } from "../../gir/class.js";
3
3
  import type { GirFunction } from "../../gir/function.js";
4
4
  import type { ModuleContext } from "../../writer/context.js";
5
5
  import {
6
+ ancestorClassMethodNames,
6
7
  collectInheritedMethods,
7
8
  collectInheritedPropertyTypes,
8
9
  collectInterfaceMergeOmissions,
9
10
  conflictRename,
10
11
  type InheritedMethods,
11
12
  } from "../../analysis/inheritance.js";
12
- import { ancestorChain, type ResolvedAncestor } from "../../gir/ancestry.js";
13
- import { splitOptionalNamespace } from "../../gir/type-ref.js";
13
+ import {
14
+ areCallablesAssignable,
15
+ type ClaimedMembers,
16
+ claimInterfaceMembers,
17
+ inheritedMembers,
18
+ interfaceConflicts,
19
+ omittedKeys,
20
+ omittedTypeRef,
21
+ } from "../../analysis/interface-conflicts.js";
22
+ import { ancestorChain, getParentRef, type ResolvedAncestor } from "../../gir/ancestry.js";
23
+ import { isEmittableEntity } from "../../gir/emittable.js";
14
24
  import { indentMembers } from "../../writer/emit.js";
15
25
  import {
16
26
  type Callables,
17
- classConstructorMemberNames,
18
27
  dedupeCallables,
19
28
  generateBindings,
20
29
  type InstanceScope,
21
30
  instanceScope,
22
31
  renderClassInstanceMember,
23
32
  renderStaticHead,
33
+ staticMembers,
24
34
  } from "./callables.js";
25
35
  import { renderClassConstructor, renderConstructorPropsInterface } from "./constructor-props.js";
26
36
  import { getDoc } from "./doc-spec.js";
@@ -37,6 +47,7 @@ type ImplementedRef = {
37
47
  makerRef: string;
38
48
  interfaceKlass: GirClass;
39
49
  interfaceNamespace: string;
50
+ conflicts: string[];
40
51
  };
41
52
 
42
53
  type MemberDeclarationsOptions = {
@@ -49,6 +60,14 @@ type MemberDeclarationsOptions = {
49
60
 
50
61
  type ClassMembers = { members: string[]; accessors: ResolvedAccessor[] };
51
62
 
63
+ type ImplementedRefOptions = {
64
+ context: ModuleContext;
65
+ klass: GirClass;
66
+ name: string;
67
+ inherited: Set<string>;
68
+ claimed: ClaimedMembers;
69
+ };
70
+
52
71
  type AppendInstanceMethodsOptions = {
53
72
  context: ModuleContext;
54
73
  methods: GirFunction[];
@@ -60,15 +79,11 @@ type AppendInstanceMethodsOptions = {
60
79
  };
61
80
 
62
81
  const generateClass = (context: ModuleContext, klass: GirClass): void => {
63
- if (!klass.introspectable) {
82
+ if (!isEmittableEntity(klass)) {
64
83
  return;
65
84
  }
66
85
 
67
- if (klass.name.length === 0) {
68
- return;
69
- }
70
-
71
- const className = pascalCase(klass.name);
86
+ const className = sanitizeTypeIdentifier(klass.name);
72
87
 
73
88
  const callables: Callables = {
74
89
  constructors: dedupeCallables(klass.constructors),
@@ -78,20 +93,26 @@ const generateClass = (context: ModuleContext, klass: GirClass): void => {
78
93
 
79
94
  generateBindings(context, callables);
80
95
  const parentExpression = resolveParent(context, klass);
81
- const extendsClause = renderExtendsClause(context, parentExpression, callables);
96
+ const extendsClause = renderExtendsClause(context, parentExpression, klass, callables);
82
97
  const implemented = resolveImplementedRefs(context, klass);
83
- const typeRefs = implemented.map((ref) => ref.typeRef);
98
+ const typeRefs = implemented.map((ref) => omittedTypeRef(ref.typeRef, ref.conflicts));
84
99
  const implementsClause = typeRefs.length === 0 ? "" : ` implements ${typeRefs.join(", ")}`;
85
100
  const { members, accessors } = renderClassMembers(context, klass, callables, parentExpression !== undefined);
86
101
  const body = indentMembers(members);
87
102
  const doc = getDoc(klass);
103
+ const modifier = klass.isAbstract ? "abstract " : "";
104
+
105
+ context.declare({
106
+ name: className,
107
+ code: `${doc}export ${modifier}class ${className}${extendsClause}${implementsClause} {\n${body}\n}`,
108
+ owner: klass.name,
109
+ });
88
110
 
89
- context.module.appendDeclaration(
90
- `${doc}export class ${className}${extendsClause}${implementsClause} {\n${body}\n}`,
91
- context.declaredType(className),
92
- );
111
+ context.declare({
112
+ name: `${className}ConstructorProps`,
113
+ code: renderConstructorPropsInterface(context, klass, className),
114
+ });
93
115
 
94
- context.module.appendDeclaration(renderConstructorPropsInterface(context, klass, className));
95
116
  appendMemberDeclarations({ context, klass, className, accessors, implemented });
96
117
  appendInstallMixins(context, className, implemented);
97
118
  appendClassRegistrations(context, klass, className);
@@ -101,11 +122,11 @@ const appendMemberDeclarations = (options: MemberDeclarationsOptions): void => {
101
122
  const { context, klass, className, accessors, implemented } = options;
102
123
 
103
124
  for (const declaration of renderPropertyDeclarations(context, klass, className, accessors)) {
104
- context.module.appendDeclaration(declaration);
125
+ context.declare(declaration);
105
126
  }
106
127
 
107
128
  for (const declaration of renderSignalDeclarations(context, klass, className, false)) {
108
- context.module.appendDeclaration(declaration);
129
+ context.declare(declaration);
109
130
  }
110
131
 
111
132
  appendInterfaceMerge(context, klass, className, implemented);
@@ -122,7 +143,11 @@ const appendInterfaceMerge = (
122
143
  }
123
144
 
124
145
  const mergeRefs = implemented.map((ref) => interfaceMergeRef(context, klass, ref));
125
- context.module.appendDeclaration(`export interface ${className} extends ${mergeRefs.join(", ")} {}`);
146
+
147
+ context.declare({
148
+ name: className,
149
+ code: `export interface ${className} extends ${mergeRefs.join(", ")} {}`,
150
+ });
126
151
  };
127
152
 
128
153
  const renderClassMembers = (
@@ -131,7 +156,7 @@ const renderClassMembers = (
131
156
  callables: Callables,
132
157
  hasParent: boolean,
133
158
  ): ClassMembers => {
134
- const className = pascalCase(klass.name);
159
+ const className = sanitizeTypeIdentifier(klass.name);
135
160
  const members: string[] = [gtypeMemberDeclaration(context)];
136
161
  const constructorBlock = renderClassConstructor(context, klass, className, hasParent);
137
162
 
@@ -156,17 +181,18 @@ const renderClassMembers = (
156
181
 
157
182
  members.push(...renderVfuncMembers({ context, klass, mode: "implementation" }));
158
183
  const inheritedPropertyTypes = collectInheritedPropertyTypes(context, klass);
184
+ const inheritedNames = ancestorClassMethodNames(context, klass);
159
185
  const accessors: ResolvedAccessor[] = [];
160
186
 
161
187
  for (const property of klass.properties) {
162
- const inheritedType = inheritedPropertyTypes.get(toCamelIdentifier(property.name));
188
+ const inheritedTypes = inheritedPropertyTypes.get(toCamelIdentifier(property.name));
163
189
 
164
190
  const accessor = resolveAccessor({
165
191
  context,
166
192
  property,
167
193
  claimedNames,
168
- methodByName: scope.methodByName,
169
- inheritedType,
194
+ inheritedTypes,
195
+ inheritedNames,
170
196
  });
171
197
 
172
198
  if (accessor === undefined) {
@@ -204,8 +230,13 @@ const appendInstallMixins = (context: ModuleContext, className: string, implemen
204
230
  }
205
231
 
206
232
  context.addRuntimeImport("installMixins");
207
- const makers = implemented.map((ref) => ref.makerRef).join(", ");
208
- context.module.appendRegistration(`installMixins(${className}, [${makers}]);`);
233
+ const makerRefs = implemented.map((ref) => ref.makerRef);
234
+ const localRefs = makerRefs.filter((ref) => !ref.includes("."));
235
+
236
+ context.module.appendRegistration(`installMixins(${className}, [${makerRefs.join(", ")}]);`, [
237
+ className,
238
+ ...localRefs,
239
+ ]);
209
240
  };
210
241
 
211
242
  const appendClassRegistrations = (context: ModuleContext, klass: GirClass, className: string): void => {
@@ -254,23 +285,14 @@ const interfaceMergeRef = (context: ModuleContext, klass: GirClass, ref: Impleme
254
285
  namespaceName: ref.interfaceNamespace,
255
286
  });
256
287
 
257
- if (omissions.length === 0) {
258
- return ref.typeRef;
259
- }
260
-
261
- const keys = omissions.map((name) => JSON.stringify(name)).join(" | ");
262
-
263
- return `Omit<${ref.typeRef}, ${keys}>`;
288
+ return omittedTypeRef(ref.typeRef, [...omissions, ...ref.conflicts]);
264
289
  };
265
290
 
266
- const implementedRefFor = (
267
- context: ModuleContext,
268
- name: string,
269
- inherited: Set<string>,
270
- ): ImplementedRef | undefined => {
291
+ const implementedRefFor = (options: ImplementedRefOptions): ImplementedRef | undefined => {
292
+ const { context, klass, name, inherited } = options;
271
293
  const resolved = context.library.resolveType(context.namespace.name, name);
272
294
 
273
- if (resolved?.kind !== "interface") {
295
+ if (resolved?.kind !== "interface" || !isEmittableEntity(resolved.value)) {
274
296
  return undefined;
275
297
  }
276
298
 
@@ -278,22 +300,34 @@ const implementedRefFor = (
278
300
  return undefined;
279
301
  }
280
302
 
281
- const pascal = pascalCase(resolved.value.name);
303
+ const typeName = sanitizeTypeIdentifier(resolved.value.name);
304
+
305
+ const conflictOptions = {
306
+ context,
307
+ klass,
308
+ iface: resolved.value,
309
+ ifaceNamespace: resolved.namespace.name,
310
+ };
311
+
312
+ const conflicts = interfaceConflicts(conflictOptions, options.claimed);
313
+ claimInterfaceMembers(conflictOptions, options.claimed);
282
314
 
283
315
  return {
284
- typeRef: context.qualify(resolved.namespace.name, pascal),
285
- makerRef: context.qualify(resolved.namespace.name, `make${pascal}`),
316
+ typeRef: context.qualify(resolved.namespace.name, typeName),
317
+ makerRef: context.qualify(resolved.namespace.name, `make${typeName}`),
286
318
  interfaceKlass: resolved.value,
287
319
  interfaceNamespace: resolved.namespace.name,
320
+ conflicts,
288
321
  };
289
322
  };
290
323
 
291
324
  const resolveImplementedRefs = (context: ModuleContext, klass: GirClass): ImplementedRef[] => {
292
325
  const inherited = inheritedInterfaceKeys(context, klass);
326
+ const claimed = inheritedMembers(context, klass);
293
327
  const refs: ImplementedRef[] = [];
294
328
 
295
329
  for (const name of klass.implements) {
296
- const ref = implementedRefFor(context, name, inherited);
330
+ const ref = implementedRefFor({ context, klass, name, inherited, claimed });
297
331
 
298
332
  if (ref !== undefined) {
299
333
  refs.push(ref);
@@ -303,35 +337,88 @@ const resolveImplementedRefs = (context: ModuleContext, klass: GirClass): Implem
303
337
  return refs;
304
338
  };
305
339
 
340
+ const classCallables = (klass: GirClass): Callables => ({
341
+ constructors: klass.constructors,
342
+ functions: klass.functions,
343
+ methods: klass.methods,
344
+ });
345
+
346
+ const resolveParentClass = (context: ModuleContext, klass: GirClass): ResolvedAncestor | undefined => {
347
+ const parent = getParentRef(klass);
348
+
349
+ if (parent === undefined) {
350
+ return undefined;
351
+ }
352
+
353
+ const resolved = context.library.resolveType(parent.namespaceName ?? context.namespace.name, parent.typeName);
354
+
355
+ return resolved?.kind === "class" ? { klass: resolved.value, namespaceName: resolved.namespace.name } : undefined;
356
+ };
357
+
358
+ const addAncestorStatics = (context: ModuleContext, klass: GirClass, table: Map<string, GirFunction>): void => {
359
+ const members = staticMembers(context, classCallables(klass));
360
+
361
+ for (const member of members) {
362
+ if (!table.has(member.name)) {
363
+ table.set(member.name, member.callable);
364
+ }
365
+ }
366
+ };
367
+
368
+ const inheritedStatics = (context: ModuleContext, klass: GirClass): Map<string, GirFunction> => {
369
+ const table: Map<string, GirFunction> = new Map();
370
+ const parent = resolveParentClass(context, klass);
371
+
372
+ if (parent === undefined) {
373
+ return table;
374
+ }
375
+
376
+ for (const ancestor of ancestorChain(context.library, parent.klass, parent.namespaceName)) {
377
+ addAncestorStatics(context, ancestor.klass, table);
378
+ }
379
+
380
+ return table;
381
+ };
382
+
383
+ const shadowedStaticNames = (context: ModuleContext, klass: GirClass, callables: Callables): string[] => {
384
+ const inherited = inheritedStatics(context, klass);
385
+
386
+ return staticMembers(context, callables)
387
+ .filter((member) => {
388
+ const shadowed = inherited.get(member.name);
389
+
390
+ return shadowed !== undefined && !areCallablesAssignable(context.library, member.callable, shadowed);
391
+ })
392
+ .map((member) => member.name);
393
+ };
394
+
306
395
  const renderExtendsClause = (
307
396
  context: ModuleContext,
308
397
  parentExpression: string | undefined,
398
+ klass: GirClass,
309
399
  callables: Callables,
310
400
  ): string => {
311
401
  if (parentExpression === undefined) {
312
402
  return "";
313
403
  }
314
404
 
315
- const constructorNames = classConstructorMemberNames(context, callables);
405
+ const staticNames = shadowedStaticNames(context, klass, callables);
316
406
 
317
- if (constructorNames.length === 0) {
407
+ if (staticNames.length === 0) {
318
408
  return ` extends ${parentExpression}`;
319
409
  }
320
410
 
321
411
  context.addRuntimeTypeImport("StaticBase");
322
- const omitted = constructorNames.map((name) => JSON.stringify(name)).join(" | ");
323
412
 
324
- return ` extends (${parentExpression} as StaticBase<typeof ${parentExpression}, ${omitted}>)`;
413
+ return ` extends (${parentExpression} as StaticBase<typeof ${parentExpression}, ${omittedKeys(staticNames)}>)`;
325
414
  };
326
415
 
327
416
  const resolveParent = (context: ModuleContext, klass: GirClass): string | undefined => {
328
- if (klass.parent === undefined) {
329
- return undefined;
330
- }
331
-
332
- const [namespace, typeName] = splitOptionalNamespace(klass.parent);
417
+ const parent = getParentRef(klass);
333
418
 
334
- return context.qualify(namespace ?? context.namespace.name, pascalCase(typeName));
419
+ return parent === undefined
420
+ ? undefined
421
+ : context.qualify(parent.namespaceName ?? context.namespace.name, sanitizeTypeIdentifier(parent.typeName));
335
422
  };
336
423
 
337
424
  export { generateClass };
@@ -1,16 +1,17 @@
1
- import { pascalCase } from "@gtkx/utils";
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
2
2
  import type { GirClass } from "../../gir/class.js";
3
3
  import type { ModuleContext } from "../../writer/context.js";
4
- import { splitOptionalNamespace } from "../../gir/type-ref.js";
4
+ import { getParentRef } from "../../gir/ancestry.js";
5
5
 
6
6
  const parentCompanionRef = (context: ModuleContext, klass: GirClass, suffix: string): string | undefined => {
7
- if (klass.parent === undefined) {
7
+ const parent = getParentRef(klass);
8
+
9
+ if (parent === undefined) {
8
10
  return undefined;
9
11
  }
10
12
 
11
- const [parentNamespace, typeName] = splitOptionalNamespace(klass.parent);
12
- const namespaceName = parentNamespace ?? context.namespace.name;
13
- const name = `${pascalCase(typeName)}${suffix}`;
13
+ const namespaceName = parent.namespaceName ?? context.namespace.name;
14
+ const name = `${sanitizeTypeIdentifier(parent.typeName)}${suffix}`;
14
15
 
15
16
  if (namespaceName === context.namespace.name) {
16
17
  return name;