@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.
- package/README.md +1 -1
- package/dist/analysis/descriptor-render.d.ts +12 -15
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +59 -38
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +25 -10
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +37 -9
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +4 -2
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +80 -38
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/interface-conflicts.d.ts +25 -0
- package/dist/analysis/interface-conflicts.d.ts.map +1 -0
- package/dist/analysis/interface-conflicts.js +139 -0
- package/dist/analysis/interface-conflicts.js.map +1 -0
- package/dist/analysis/param-capability.d.ts.map +1 -1
- package/dist/analysis/param-capability.js +3 -4
- package/dist/analysis/param-capability.js.map +1 -1
- package/dist/analysis/param-structure.js +2 -2
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts +3 -2
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +26 -26
- package/dist/analysis/ts-type.js.map +1 -1
- package/dist/analysis/type-key.d.ts +5 -0
- package/dist/analysis/type-key.d.ts.map +1 -0
- package/dist/analysis/type-key.js +9 -0
- package/dist/analysis/type-key.js.map +1 -0
- package/dist/analysis/type-shape.d.ts +3 -2
- package/dist/analysis/type-shape.d.ts.map +1 -1
- package/dist/analysis/type-shape.js +2 -1
- package/dist/analysis/type-shape.js.map +1 -1
- package/dist/compile.d.ts +14 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +125 -24
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +2 -0
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +11 -10
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +5 -3
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/pipeline.d.ts +1 -0
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +93 -19
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +2 -1
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +5 -4
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +10 -9
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +20 -3
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +56 -37
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts +1 -0
- package/dist/gi.d.ts.map +1 -1
- package/dist/gi.js +8 -2
- package/dist/gi.js.map +1 -1
- package/dist/gir/ancestry.d.ts +7 -1
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +9 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +1 -2
- package/dist/gir/annotations.d.ts.map +1 -1
- package/dist/gir/annotations.js +1 -1
- package/dist/gir/annotations.js.map +1 -1
- package/dist/gir/cursor-overrides.d.ts +8 -0
- package/dist/gir/cursor-overrides.d.ts.map +1 -0
- package/dist/gir/cursor-overrides.js +6 -0
- package/dist/gir/cursor-overrides.js.map +1 -0
- package/dist/gir/emittable.d.ts +7 -0
- package/dist/gir/emittable.d.ts.map +1 -0
- package/dist/gir/emittable.js +3 -0
- package/dist/gir/emittable.js.map +1 -0
- package/dist/gir/function.d.ts.map +1 -1
- package/dist/gir/function.js +28 -2
- package/dist/gir/function.js.map +1 -1
- package/dist/gir/gir-path.d.ts +1 -1
- package/dist/gir/gir-path.js +1 -1
- package/dist/gir/gir-path.js.map +1 -1
- package/dist/gir/library.d.ts +5 -1
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +9 -2
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +5 -1
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +4 -2
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +13 -1
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +1 -0
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +6 -6
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.js +1 -1
- package/dist/gir/primitives.js.map +1 -1
- package/dist/guards.d.ts +16 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +11 -0
- package/dist/guards.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -1
- package/dist/json.d.ts +3 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +11 -0
- package/dist/json.js.map +1 -0
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +8 -6
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +22 -7
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/parse.d.ts.map +1 -1
- package/dist/khronos/parse.js +3 -4
- package/dist/khronos/parse.js.map +1 -1
- package/dist/khronos/pipeline.d.ts +1 -1
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +1 -7
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +1 -1
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +8 -4
- package/dist/khronos/render.js.map +1 -1
- package/dist/runner.d.ts +7 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +21 -3
- package/dist/runner.js.map +1 -1
- package/dist/staging.d.ts +5 -0
- package/dist/staging.d.ts.map +1 -0
- package/dist/staging.js +57 -0
- package/dist/staging.js.map +1 -0
- package/dist/store/compile-store.d.ts +0 -1
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +7 -32
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/callables.d.ts +6 -3
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +40 -30
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/callback.d.ts.map +1 -1
- package/dist/store/gi/callback.js +9 -5
- package/dist/store/gi/callback.js.map +1 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +104 -44
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/companion.d.ts.map +1 -1
- package/dist/store/gi/companion.js +6 -6
- package/dist/store/gi/companion.js.map +1 -1
- package/dist/store/gi/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +11 -3
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.js +1 -1
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +29 -12
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts +1 -3
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +24 -18
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/gtype-binding.d.ts.map +1 -1
- package/dist/store/gi/gtype-binding.js +4 -1
- package/dist/store/gi/gtype-binding.js.map +1 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +34 -19
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/method.d.ts +7 -6
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +13 -24
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +3 -2
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +50 -5
- package/dist/store/gi/param-marshal.js.map +1 -1
- package/dist/store/gi/pipeline.d.ts.map +1 -1
- package/dist/store/gi/pipeline.js +21 -10
- package/dist/store/gi/pipeline.js.map +1 -1
- package/dist/store/gi/properties.d.ts +2 -1
- package/dist/store/gi/properties.d.ts.map +1 -1
- package/dist/store/gi/properties.js +6 -3
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +10 -8
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +49 -91
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts +8 -1
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +34 -13
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +20 -4
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts +6 -1
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +8 -1
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +19 -8
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.js +2 -2
- package/dist/store/gi/registration.js.map +1 -1
- package/dist/store/gi/return-wrap.js +1 -1
- package/dist/store/gi/return-wrap.js.map +1 -1
- package/dist/store/gi/signal.d.ts +2 -1
- package/dist/store/gi/signal.d.ts.map +1 -1
- package/dist/store/gi/signal.js +55 -28
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts.map +1 -1
- package/dist/store/gi/value-marshalable.js +2 -1
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +4 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +60 -17
- package/dist/store/gi/vtable.js.map +1 -1
- package/dist/store/gi-store.d.ts +1 -0
- package/dist/store/gi-store.d.ts.map +1 -1
- package/dist/store/gi-store.js +15 -20
- package/dist/store/gi-store.js.map +1 -1
- package/dist/store/jsx/generated-elements.d.ts +2 -1
- package/dist/store/jsx/generated-elements.d.ts.map +1 -1
- package/dist/store/jsx/generated-elements.js +13 -7
- package/dist/store/jsx/generated-elements.js.map +1 -1
- package/dist/store/jsx/jsx.js +3 -3
- package/dist/store/jsx/jsx.js.map +1 -1
- package/dist/store/jsx/metadata.d.ts.map +1 -1
- package/dist/store/jsx/metadata.js +3 -1
- package/dist/store/jsx/metadata.js.map +1 -1
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +3 -4
- package/dist/store/jsx-store.js.map +1 -1
- package/dist/store/resolve-store.d.ts +14 -3
- package/dist/store/resolve-store.d.ts.map +1 -1
- package/dist/store/resolve-store.js +98 -15
- package/dist/store/resolve-store.js.map +1 -1
- package/dist/store/store-fs.d.ts +9 -7
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +54 -25
- package/dist/store/store-fs.js.map +1 -1
- package/dist/store/store-links.d.ts +3 -0
- package/dist/store/store-links.d.ts.map +1 -0
- package/dist/store/store-links.js +39 -0
- package/dist/store/store-links.js.map +1 -0
- package/dist/writer/comparison-context.d.ts +4 -0
- package/dist/writer/comparison-context.d.ts.map +1 -0
- package/dist/writer/comparison-context.js +13 -0
- package/dist/writer/comparison-context.js.map +1 -0
- package/dist/writer/context.d.ts +3 -3
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +11 -6
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/module.d.ts +13 -5
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +68 -11
- package/dist/writer/module.js.map +1 -1
- package/dist/xml.d.ts +8 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +70 -1
- package/dist/xml.js.map +1 -1
- package/overrides/gobject/object.ts.ejs +2 -0
- package/package.json +14 -3
- package/src/analysis/descriptor-render.ts +106 -52
- package/src/analysis/descriptor.ts +76 -15
- package/src/analysis/inheritance.ts +134 -44
- package/src/analysis/interface-conflicts.ts +235 -0
- package/src/analysis/param-capability.ts +3 -6
- package/src/analysis/param-structure.ts +2 -2
- package/src/analysis/ts-type.ts +43 -28
- package/src/analysis/type-key.ts +14 -0
- package/src/analysis/type-shape.ts +5 -2
- package/src/compile.ts +192 -27
- package/src/docs/api-reference.ts +13 -10
- package/src/docs/element-page.ts +5 -2
- package/src/docs/pipeline.ts +140 -24
- package/src/docs/render.ts +7 -3
- package/src/docs/symbol-page.ts +12 -11
- package/src/fingerprint.ts +95 -47
- package/src/gi.ts +10 -2
- package/src/gir/ancestry.ts +17 -1
- package/src/gir/annotations.ts +1 -1
- package/src/gir/cursor-overrides.ts +12 -0
- package/src/gir/emittable.ts +8 -0
- package/src/gir/function.ts +45 -9
- package/src/gir/gir-path.ts +1 -1
- package/src/gir/library.ts +10 -2
- package/src/gir/namespace.ts +8 -2
- package/src/gir/parameter.ts +15 -0
- package/src/gir/parse.ts +10 -7
- package/src/gir/primitives.ts +1 -1
- package/src/guards.ts +23 -0
- package/src/internal.ts +2 -0
- package/src/json.ts +11 -0
- package/src/khronos/args.ts +9 -6
- package/src/khronos/modules.ts +25 -9
- package/src/khronos/parse.ts +3 -4
- package/src/khronos/pipeline.ts +1 -1
- package/src/khronos/plan.ts +0 -1
- package/src/khronos/render.ts +8 -6
- package/src/runner.ts +26 -4
- package/src/staging.ts +67 -0
- package/src/store/compile-store.ts +7 -38
- package/src/store/gi/callables.ts +60 -33
- package/src/store/gi/callback.ts +9 -9
- package/src/store/gi/class.ts +140 -53
- package/src/store/gi/companion.ts +7 -6
- package/src/store/gi/constant.ts +13 -3
- package/src/store/gi/constructor-props.ts +1 -1
- package/src/store/gi/enum.ts +36 -26
- package/src/store/gi/function.ts +30 -24
- package/src/store/gi/gtype-binding.ts +7 -2
- package/src/store/gi/interface.ts +39 -20
- package/src/store/gi/method.ts +26 -32
- package/src/store/gi/param-marshal.ts +77 -6
- package/src/store/gi/pipeline.ts +25 -15
- package/src/store/gi/properties.ts +8 -4
- package/src/store/gi/property-accessor.ts +73 -161
- package/src/store/gi/record-constructor.ts +53 -21
- package/src/store/gi/record-field-accessor.ts +26 -4
- package/src/store/gi/record-layout.ts +11 -1
- package/src/store/gi/record.ts +20 -12
- package/src/store/gi/registration.ts +2 -2
- package/src/store/gi/return-wrap.ts +1 -1
- package/src/store/gi/signal.ts +66 -42
- package/src/store/gi/value-marshalable.ts +3 -1
- package/src/store/gi/vtable.ts +97 -20
- package/src/store/gi-store.ts +26 -31
- package/src/store/jsx/generated-elements.ts +17 -8
- package/src/store/jsx/jsx.ts +3 -3
- package/src/store/jsx/metadata.ts +4 -1
- package/src/store/jsx-store.ts +3 -4
- package/src/store/resolve-store.ts +133 -18
- package/src/store/store-fs.ts +82 -35
- package/src/store/store-links.ts +49 -0
- package/src/writer/comparison-context.ts +18 -0
- package/src/writer/context.ts +12 -6
- package/src/writer/module.ts +101 -14
- package/src/xml.ts +103 -1
|
@@ -1,50 +1,19 @@
|
|
|
1
|
-
import { rmSync
|
|
1
|
+
import { rmSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
413
|
-
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
442
|
+
for (const callable of group) {
|
|
443
|
+
const name = staticMemberName(context, callable, resolveName);
|
|
421
444
|
|
|
422
|
-
if (
|
|
423
|
-
|
|
445
|
+
if (name !== undefined) {
|
|
446
|
+
members.push({ callable, name });
|
|
424
447
|
}
|
|
425
448
|
}
|
|
426
449
|
|
|
427
|
-
return
|
|
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) =>
|
|
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,
|
package/src/store/gi/callback.ts
CHANGED
|
@@ -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
|
|
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.
|
|
20
|
-
|
|
21
|
-
context
|
|
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 };
|
package/src/store/gi/class.ts
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
13
|
-
|
|
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
|
|
82
|
+
if (!isEmittableEntity(klass)) {
|
|
64
83
|
return;
|
|
65
84
|
}
|
|
66
85
|
|
|
67
|
-
|
|
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.
|
|
90
|
-
`${
|
|
91
|
-
context
|
|
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.
|
|
125
|
+
context.declare(declaration);
|
|
105
126
|
}
|
|
106
127
|
|
|
107
128
|
for (const declaration of renderSignalDeclarations(context, klass, className, false)) {
|
|
108
|
-
context.
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
169
|
-
|
|
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
|
|
208
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
285
|
-
makerRef: context.qualify(resolved.namespace.name, `make${
|
|
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
|
|
405
|
+
const staticNames = shadowedStaticNames(context, klass, callables);
|
|
316
406
|
|
|
317
|
-
if (
|
|
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}, ${
|
|
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
|
-
|
|
329
|
-
return undefined;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
const [namespace, typeName] = splitOptionalNamespace(klass.parent);
|
|
417
|
+
const parent = getParentRef(klass);
|
|
333
418
|
|
|
334
|
-
return
|
|
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 {
|
|
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 {
|
|
4
|
+
import { getParentRef } from "../../gir/ancestry.js";
|
|
5
5
|
|
|
6
6
|
const parentCompanionRef = (context: ModuleContext, klass: GirClass, suffix: string): string | undefined => {
|
|
7
|
-
|
|
7
|
+
const parent = getParentRef(klass);
|
|
8
|
+
|
|
9
|
+
if (parent === undefined) {
|
|
8
10
|
return undefined;
|
|
9
11
|
}
|
|
10
12
|
|
|
11
|
-
const
|
|
12
|
-
const
|
|
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;
|