@gtkx/runtime 1.0.0-rc.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/application-class.d.ts +37 -0
- package/dist/application-class.d.ts.map +1 -0
- package/dist/application-class.js +78 -0
- package/dist/application-class.js.map +1 -0
- package/dist/arg.d.ts +2 -1
- package/dist/arg.d.ts.map +1 -1
- package/dist/arg.js +2 -1
- package/dist/arg.js.map +1 -1
- package/dist/bind.d.ts +11 -0
- package/dist/bind.d.ts.map +1 -1
- package/dist/bind.js +11 -0
- package/dist/bind.js.map +1 -1
- package/dist/callback.d.ts +4 -3
- package/dist/callback.d.ts.map +1 -1
- package/dist/callback.js +124 -29
- package/dist/callback.js.map +1 -1
- package/dist/closure.d.ts +26 -0
- package/dist/closure.d.ts.map +1 -0
- package/dist/closure.js +99 -0
- package/dist/closure.js.map +1 -0
- package/dist/default-application.d.ts +4 -0
- package/dist/default-application.d.ts.map +1 -0
- package/dist/default-application.js +17 -0
- package/dist/default-application.js.map +1 -0
- package/dist/descriptors.d.ts +98 -4
- package/dist/descriptors.d.ts.map +1 -1
- package/dist/descriptors.js +72 -6
- package/dist/descriptors.js.map +1 -1
- package/dist/error.d.ts +1 -0
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js.map +1 -1
- package/dist/exit-hook.js +13 -0
- package/dist/exit-hook.js.map +1 -1
- package/dist/fn.d.ts +24 -2
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +67 -32
- package/dist/fn.js.map +1 -1
- package/dist/folded-lengths.d.ts +16 -0
- package/dist/folded-lengths.d.ts.map +1 -0
- package/dist/folded-lengths.js +38 -0
- package/dist/folded-lengths.js.map +1 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- 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/library.d.ts +3 -1
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +3 -1
- package/dist/library.js.map +1 -1
- package/dist/lifecycle.d.ts +58 -11
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +95 -22
- package/dist/lifecycle.js.map +1 -1
- package/dist/listeners.d.ts.map +1 -1
- package/dist/listeners.js +19 -5
- package/dist/listeners.js.map +1 -1
- package/dist/mixin.d.ts +3 -2
- package/dist/mixin.d.ts.map +1 -1
- package/dist/mixin.js +13 -1
- package/dist/mixin.js.map +1 -1
- package/dist/native-value.d.ts.map +1 -1
- package/dist/native-value.js +4 -3
- package/dist/native-value.js.map +1 -1
- package/dist/object.d.ts +40 -7
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +95 -26
- package/dist/object.js.map +1 -1
- package/dist/param-spec.d.ts +11 -0
- package/dist/param-spec.d.ts.map +1 -0
- package/dist/param-spec.js +147 -0
- package/dist/param-spec.js.map +1 -0
- package/dist/promisify.d.ts.map +1 -1
- package/dist/promisify.js +3 -2
- package/dist/promisify.js.map +1 -1
- package/dist/properties.d.ts +39 -7
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +310 -43
- package/dist/properties.js.map +1 -1
- package/dist/register-class.d.ts +147 -12
- package/dist/register-class.d.ts.map +1 -1
- package/dist/register-class.js +129 -83
- package/dist/register-class.js.map +1 -1
- package/dist/registry.d.ts +80 -21
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +86 -33
- package/dist/registry.js.map +1 -1
- package/dist/signal.d.ts +11 -4
- package/dist/signal.d.ts.map +1 -1
- package/dist/signal.js +85 -25
- package/dist/signal.js.map +1 -1
- package/dist/t.d.ts +2 -0
- package/dist/t.d.ts.map +1 -1
- package/dist/t.js +1 -0
- package/dist/t.js.map +1 -1
- package/dist/tuple.d.ts +6 -3
- package/dist/tuple.d.ts.map +1 -1
- package/dist/tuple.js +9 -7
- package/dist/tuple.js.map +1 -1
- package/dist/type.d.ts +2 -1
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +2 -0
- package/dist/type.js.map +1 -1
- package/dist/value.d.ts +10 -1
- package/dist/value.d.ts.map +1 -1
- package/dist/value.js +99 -24
- package/dist/value.js.map +1 -1
- package/dist/vfunc-call.d.ts +37 -0
- package/dist/vfunc-call.d.ts.map +1 -0
- package/dist/vfunc-call.js +172 -0
- package/dist/vfunc-call.js.map +1 -0
- package/dist/vfunc-seeds.d.ts +12 -0
- package/dist/vfunc-seeds.d.ts.map +1 -0
- package/dist/vfunc-seeds.js +19 -0
- package/dist/vfunc-seeds.js.map +1 -0
- package/dist/vfunc.d.ts +8 -0
- package/dist/vfunc.d.ts.map +1 -0
- package/dist/vfunc.js +29 -0
- package/dist/vfunc.js.map +1 -0
- package/package.json +14 -4
- package/src/application-class.ts +126 -0
- package/src/arg.ts +2 -1
- package/src/bind.ts +11 -0
- package/src/callback.ts +178 -34
- package/src/closure.ts +136 -0
- package/src/default-application.ts +21 -0
- package/src/descriptors.ts +150 -34
- package/src/error.ts +1 -0
- package/src/exit-hook.ts +18 -0
- package/src/fn.ts +107 -36
- package/src/folded-lengths.ts +64 -0
- package/src/index.ts +21 -6
- package/src/internal.ts +2 -0
- package/src/library.ts +3 -1
- package/src/lifecycle.ts +138 -25
- package/src/listeners.ts +25 -6
- package/src/mixin.ts +15 -2
- package/src/native-value.ts +5 -3
- package/src/object.ts +134 -35
- package/src/param-spec.ts +234 -0
- package/src/promisify.ts +4 -2
- package/src/properties.ts +473 -46
- package/src/register-class.ts +386 -114
- package/src/registry.ts +169 -49
- package/src/signal.ts +116 -42
- package/src/t.ts +3 -0
- package/src/tuple.ts +18 -12
- package/src/type.ts +3 -1
- package/src/value.ts +143 -23
- package/src/vfunc-call.ts +247 -0
- package/src/vfunc-seeds.ts +36 -0
- package/src/vfunc.ts +38 -0
package/dist/properties.js
CHANGED
|
@@ -1,73 +1,340 @@
|
|
|
1
|
-
import { camelCase } from "@gtkx/utils";
|
|
1
|
+
import { camelCase, kebabCase } from "@gtkx/utils";
|
|
2
2
|
import { bind } from "./bind.js";
|
|
3
|
+
import { biguint64T, stringT, structT, voidT } from "./descriptors.js";
|
|
3
4
|
import { LIB, PARAM_T, VALUE_T } from "./library.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { getParamFlags, getParamValueType, isParamConstructOnly, isParamLaxlyValidated, isParamWritable, valueGuardFor, wasParamValueModified, } from "./param-spec.js";
|
|
6
|
+
import { getHandle, getInterfaceProperties, instanceClassName } from "./registry.js";
|
|
7
|
+
import { typeName } from "./type.js";
|
|
8
|
+
import { fromValue, newValueForType, valueNarrowerFor, valueWriterFor, } from "./value.js";
|
|
6
9
|
const FIRST_PROPERTY_ID = 1;
|
|
10
|
+
const GET_PROPERTY_VFUNC = "vfuncGetProperty";
|
|
11
|
+
const SET_PROPERTY_VFUNC = "vfuncSetProperty";
|
|
12
|
+
const READ_ONLY_REASON = "the property is read-only";
|
|
13
|
+
const CONSTRUCT_ONLY_REASON = "the property can only be set when the object is constructed";
|
|
14
|
+
const CLASS_T = structT("borrowed");
|
|
15
|
+
const interfaceStorages = new Map();
|
|
7
16
|
const paramSpecDefaultValue = bind(LIB, "g_param_spec_get_default_value", [PARAM_T], VALUE_T);
|
|
17
|
+
const paramSpecName = bind(LIB, "g_param_spec_get_name", [PARAM_T], stringT("borrowed"));
|
|
18
|
+
const typeClassRef = bind(LIB, "g_type_class_ref", [biguint64T], CLASS_T);
|
|
19
|
+
const typeClassUnref = bind(LIB, "g_type_class_unref", [CLASS_T], voidT);
|
|
20
|
+
const classFindProperty = bind(LIB, "g_object_class_find_property", [CLASS_T, stringT("borrowed")], PARAM_T);
|
|
21
|
+
const getPropertyName = (pspec) => paramSpecName(getHandle(pspec));
|
|
8
22
|
const underscoreCase = (name) => name.replaceAll("-", "_");
|
|
23
|
+
const canonicalCase = (name) => kebabCase(name).replaceAll("_", "-");
|
|
9
24
|
const accessorNames = (name) => [...new Set([name, underscoreCase(name), camelCase(name)])];
|
|
25
|
+
const typeLabel = (type) => typeName(type) ?? String(type);
|
|
26
|
+
const defaultValueFor = (handle) => paramSpecDefaultValue(handle);
|
|
27
|
+
const heldValue = (value) => value ?? null;
|
|
28
|
+
const holdsReason = (check) => `the property holds values of type '${typeLabel(check.valueType)}'`;
|
|
29
|
+
function checkFor(handle, name) {
|
|
30
|
+
const valueType = getParamValueType(handle);
|
|
31
|
+
return {
|
|
32
|
+
name,
|
|
33
|
+
propertyName: paramSpecName(handle),
|
|
34
|
+
handle,
|
|
35
|
+
flags: getParamFlags(handle),
|
|
36
|
+
valueType,
|
|
37
|
+
canHoldValue: valueGuardFor(valueType),
|
|
38
|
+
narrowValue: valueNarrowerFor(valueType),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function findPropertySpec(klass, name) {
|
|
42
|
+
const found = classFindProperty(klass, name);
|
|
43
|
+
return found ?? classFindProperty(klass, canonicalCase(name));
|
|
44
|
+
}
|
|
45
|
+
function describeValue(value) {
|
|
46
|
+
if (typeof value === "string") {
|
|
47
|
+
return JSON.stringify(value);
|
|
48
|
+
}
|
|
49
|
+
if (typeof value === "object" && value !== null) {
|
|
50
|
+
return instanceClassName(value);
|
|
51
|
+
}
|
|
52
|
+
return String(value);
|
|
53
|
+
}
|
|
54
|
+
function propertyMessage(instance, check, tail) {
|
|
55
|
+
return `${instanceClassName(instance)}.${check.name}: ${tail}`;
|
|
56
|
+
}
|
|
57
|
+
function refusalTail(check, value, reason) {
|
|
58
|
+
return `cannot set property '${check.propertyName}' to ${describeValue(value)}; ${reason}`;
|
|
59
|
+
}
|
|
60
|
+
function serveTail(check, value) {
|
|
61
|
+
return `cannot serve property '${check.propertyName}' from ${describeValue(value)}; ${holdsReason(check)}`;
|
|
62
|
+
}
|
|
63
|
+
function assertValueFits(instance, check, value) {
|
|
64
|
+
if (check.canHoldValue(value)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const tail = refusalTail(check, value, holdsReason(check));
|
|
68
|
+
throw new TypeError(propertyMessage(instance, check, tail));
|
|
69
|
+
}
|
|
70
|
+
function assertValueServes(instance, check, value) {
|
|
71
|
+
if (check.canHoldValue(value)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
throw new TypeError(propertyMessage(instance, check, serveTail(check, value)));
|
|
75
|
+
}
|
|
76
|
+
function assertValueValidates(instance, check, value, gValue) {
|
|
77
|
+
if (!wasParamValueModified(check.handle, gValue) || isParamLaxlyValidated(check.flags)) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const reason = `the value is invalid or out of range for type '${typeLabel(check.valueType)}', ` +
|
|
81
|
+
`and GObject would put ${describeValue(fromValue(gValue))} in its place`;
|
|
82
|
+
throw new RangeError(propertyMessage(instance, check, refusalTail(check, value, reason)));
|
|
83
|
+
}
|
|
84
|
+
function assertWritable(instance, check, value) {
|
|
85
|
+
if (isParamWritable(check.flags)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
throw new TypeError(propertyMessage(instance, check, refusalTail(check, value, READ_ONLY_REASON)));
|
|
89
|
+
}
|
|
90
|
+
function writeHeld(check, gValue, value) {
|
|
91
|
+
check.write ??= valueWriterFor(check.valueType);
|
|
92
|
+
check.write(gValue, check.narrowValue(value));
|
|
93
|
+
}
|
|
94
|
+
function fillCheckedValue(instance, check, gValue, value) {
|
|
95
|
+
assertValueFits(instance, check, value);
|
|
96
|
+
writeHeld(check, gValue, value);
|
|
97
|
+
assertValueValidates(instance, check, value, gValue);
|
|
98
|
+
}
|
|
99
|
+
function checkedValueFor(instance, check, value) {
|
|
100
|
+
const gValue = newValueForType(check.valueType);
|
|
101
|
+
fillCheckedValue(instance, check, gValue, value);
|
|
102
|
+
return gValue;
|
|
103
|
+
}
|
|
104
|
+
function assertValueAccepted(instance, check, value) {
|
|
105
|
+
check.scratch ??= newValueForType(check.valueType);
|
|
106
|
+
fillCheckedValue(instance, check, check.scratch, value);
|
|
107
|
+
}
|
|
108
|
+
function constructValueFor(wrapper, check, value) {
|
|
109
|
+
assertWritable(wrapper, check, value);
|
|
110
|
+
return { name: check.propertyName, value: checkedValueFor(wrapper, check, value) };
|
|
111
|
+
}
|
|
112
|
+
function constructPropertyFor(gtype, name, value, wrapper) {
|
|
113
|
+
const klass = typeClassRef(gtype);
|
|
114
|
+
try {
|
|
115
|
+
const pspec = findPropertySpec(klass, name);
|
|
116
|
+
return pspec === null ? undefined : constructValueFor(wrapper, checkFor(pspec, name), value);
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
typeClassUnref(klass);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
10
122
|
function readStored(instance, accessor) {
|
|
11
123
|
if (!Object.hasOwn(instance, accessor.storage)) {
|
|
12
|
-
|
|
13
|
-
instance[accessor.storage] = fromValue(defaults);
|
|
124
|
+
instance[accessor.storage] = fromValue(defaultValueFor(accessor.handle));
|
|
14
125
|
}
|
|
15
126
|
return instance[accessor.storage];
|
|
16
127
|
}
|
|
17
|
-
function
|
|
18
|
-
|
|
128
|
+
function storeValue(instance, accessor, value) {
|
|
129
|
+
instance[accessor.storage] = heldValue(value);
|
|
130
|
+
}
|
|
131
|
+
function writeStored(instance, accessor, value) {
|
|
132
|
+
if (readStored(instance, accessor) === heldValue(value)) {
|
|
19
133
|
return;
|
|
20
134
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
135
|
+
storeValue(instance, accessor, value);
|
|
136
|
+
instance.notify?.(accessor.propertyName);
|
|
137
|
+
}
|
|
138
|
+
function writeProperty(instance, accessor, value) {
|
|
139
|
+
const stored = instance;
|
|
140
|
+
if (readStored(stored, accessor) === heldValue(value)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
assertValueAccepted(instance, accessor, value);
|
|
144
|
+
writeStored(stored, accessor, accessor.narrowValue(value));
|
|
145
|
+
}
|
|
146
|
+
function storedGetter(accessor) {
|
|
147
|
+
return function get() {
|
|
148
|
+
return readStored(this, accessor);
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function memberGetter(accessor) {
|
|
152
|
+
return function get() {
|
|
153
|
+
return this[accessor.memberName];
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function memberSetter(accessor) {
|
|
157
|
+
return function set(value) {
|
|
158
|
+
this[accessor.memberName] = value;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function refusalFor(accessor, reason) {
|
|
162
|
+
return function set(value) {
|
|
163
|
+
throw new TypeError(propertyMessage(this, accessor, refusalTail(accessor, value, reason)));
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function checkedSetter(accessor) {
|
|
167
|
+
if (!isParamWritable(accessor.flags)) {
|
|
168
|
+
return refusalFor(accessor, READ_ONLY_REASON);
|
|
169
|
+
}
|
|
170
|
+
if (isParamConstructOnly(accessor.flags)) {
|
|
171
|
+
return refusalFor(accessor, CONSTRUCT_ONLY_REASON);
|
|
172
|
+
}
|
|
173
|
+
return function set(value) {
|
|
174
|
+
writeProperty(this, accessor, value);
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function hasOwnMember(prototype, alias) {
|
|
178
|
+
return Object.getOwnPropertyDescriptor(prototype, alias) !== undefined;
|
|
179
|
+
}
|
|
180
|
+
function defineAccessor(prototype, descriptor, alias) {
|
|
181
|
+
if (hasOwnMember(prototype, alias)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
Object.defineProperty(prototype, alias, descriptor);
|
|
35
185
|
}
|
|
36
186
|
function installAccessors(klass, accessor) {
|
|
37
187
|
const prototype = klass.prototype;
|
|
188
|
+
accessor.hasGeneratedMember = !hasOwnMember(prototype, accessor.memberName);
|
|
189
|
+
const descriptor = {
|
|
190
|
+
configurable: true,
|
|
191
|
+
enumerable: true,
|
|
192
|
+
get: accessor.hasGeneratedMember ? storedGetter(accessor) : memberGetter(accessor),
|
|
193
|
+
set: accessor.hasGeneratedMember ? checkedSetter(accessor) : memberSetter(accessor),
|
|
194
|
+
};
|
|
38
195
|
for (const alias of accessorNames(accessor.name)) {
|
|
39
|
-
defineAccessor(prototype,
|
|
196
|
+
defineAccessor(prototype, descriptor, alias);
|
|
40
197
|
}
|
|
41
198
|
}
|
|
42
|
-
function
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
|
|
199
|
+
function storageFor(propertyName) {
|
|
200
|
+
const existing = interfaceStorages.get(propertyName);
|
|
201
|
+
if (existing !== undefined) {
|
|
202
|
+
return existing;
|
|
203
|
+
}
|
|
204
|
+
const created = Symbol(`gtkx:property:${propertyName}`);
|
|
205
|
+
interfaceStorages.set(propertyName, created);
|
|
206
|
+
return created;
|
|
207
|
+
}
|
|
208
|
+
function interfaceAccessorFor(dispatch, pspec) {
|
|
209
|
+
const handle = getHandle(pspec);
|
|
210
|
+
const propertyName = paramSpecName(handle);
|
|
211
|
+
const delegate = dispatch.delegates.get(propertyName);
|
|
212
|
+
const accessor = {
|
|
213
|
+
...checkFor(handle, propertyName),
|
|
214
|
+
memberName: camelCase(propertyName),
|
|
215
|
+
storage: storageFor(propertyName),
|
|
216
|
+
hasGeneratedMember: false,
|
|
217
|
+
isInterfaceProperty: true,
|
|
218
|
+
};
|
|
219
|
+
if (delegate !== undefined) {
|
|
220
|
+
accessor.delegate = delegate;
|
|
46
221
|
}
|
|
47
222
|
return accessor;
|
|
48
223
|
}
|
|
49
|
-
function
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
224
|
+
function resolveAccessor(dispatch, propertyId, pspec) {
|
|
225
|
+
const accessor = dispatch.accessors[propertyId - FIRST_PROPERTY_ID];
|
|
226
|
+
if (accessor !== undefined) {
|
|
227
|
+
return accessor;
|
|
228
|
+
}
|
|
229
|
+
const created = interfaceAccessorFor(dispatch, pspec);
|
|
230
|
+
dispatch.accessors[propertyId - FIRST_PROPERTY_ID] = created;
|
|
231
|
+
return created;
|
|
232
|
+
}
|
|
233
|
+
function callMember(instance, member, args) {
|
|
234
|
+
const fn = instance[member];
|
|
235
|
+
if (typeof fn !== "function") {
|
|
236
|
+
throw new TypeError(`registerClass: ${instanceClassName(instance)} has no '${member}' member`);
|
|
237
|
+
}
|
|
238
|
+
return fn.apply(instance, args);
|
|
239
|
+
}
|
|
240
|
+
function backingMemberFor(instance, accessor) {
|
|
241
|
+
if (accessor.hasGeneratedMember && !Object.hasOwn(instance, accessor.memberName)) {
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
return accessor.memberName;
|
|
245
|
+
}
|
|
246
|
+
function readCurrent(instance, accessor) {
|
|
247
|
+
const getter = accessor.delegate?.getter;
|
|
248
|
+
if (getter !== undefined) {
|
|
249
|
+
return callMember(instance, getter, []);
|
|
250
|
+
}
|
|
251
|
+
if (accessor.isInterfaceProperty === true) {
|
|
252
|
+
return readStored(instance, accessor);
|
|
253
|
+
}
|
|
254
|
+
const member = backingMemberFor(instance, accessor);
|
|
255
|
+
return member === undefined
|
|
256
|
+
? readStored(instance, accessor)
|
|
257
|
+
: instance[member];
|
|
258
|
+
}
|
|
259
|
+
function writeCurrent(instance, accessor, value) {
|
|
260
|
+
const setter = accessor.delegate?.setter;
|
|
261
|
+
if (setter !== undefined) {
|
|
262
|
+
callMember(instance, setter, [value]);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (accessor.isInterfaceProperty === true) {
|
|
266
|
+
writeStored(instance, accessor, value);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const member = backingMemberFor(instance, accessor);
|
|
270
|
+
if (member === undefined) {
|
|
271
|
+
storeValue(instance, accessor, value);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
instance[member] = value;
|
|
275
|
+
}
|
|
276
|
+
function makeGetProperty(dispatch) {
|
|
277
|
+
return function getProperty(propertyId, value, pspec) {
|
|
278
|
+
const accessor = resolveAccessor(dispatch, propertyId, pspec);
|
|
279
|
+
const current = readCurrent(this, accessor);
|
|
280
|
+
assertValueServes(this, accessor, current);
|
|
281
|
+
writeHeld(accessor, getHandle(value), current);
|
|
54
282
|
};
|
|
55
283
|
}
|
|
56
|
-
function makeSetProperty(
|
|
57
|
-
return function setProperty(propertyId, value) {
|
|
58
|
-
const accessor = resolveAccessor(
|
|
59
|
-
|
|
60
|
-
this[camelCase(accessor.name)] = jsValue;
|
|
284
|
+
function makeSetProperty(dispatch) {
|
|
285
|
+
return function setProperty(propertyId, value, pspec) {
|
|
286
|
+
const accessor = resolveAccessor(dispatch, propertyId, pspec);
|
|
287
|
+
writeCurrent(this, accessor, fromValue(getHandle(value)));
|
|
61
288
|
};
|
|
62
289
|
}
|
|
63
|
-
function
|
|
64
|
-
const
|
|
290
|
+
function assertCanonicalName(klass, name, propertyName) {
|
|
291
|
+
const canonical = canonicalCase(name);
|
|
292
|
+
if (propertyName === canonical) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
throw new TypeError(`registerClass: ${klass.name} keys the property '${name}' to a GObject.ParamSpec named ` +
|
|
296
|
+
`'${propertyName}', which is the name GObject notifies under; name the ParamSpec '${canonical}'`);
|
|
297
|
+
}
|
|
298
|
+
function assertCanonicalNames(klass, properties) {
|
|
65
299
|
for (const [name, pspec] of Object.entries(properties)) {
|
|
66
|
-
|
|
67
|
-
installAccessors(klass, accessor);
|
|
68
|
-
accessors.push(accessor);
|
|
300
|
+
assertCanonicalName(klass, name, getPropertyName(pspec));
|
|
69
301
|
}
|
|
70
|
-
|
|
302
|
+
}
|
|
303
|
+
function buildAccessor(klass, name, pspec) {
|
|
304
|
+
const accessor = {
|
|
305
|
+
...checkFor(getHandle(pspec), name),
|
|
306
|
+
memberName: camelCase(name),
|
|
307
|
+
storage: Symbol(`gtkx:property:${name}`),
|
|
308
|
+
hasGeneratedMember: false,
|
|
309
|
+
};
|
|
310
|
+
installAccessors(klass, accessor);
|
|
311
|
+
return accessor;
|
|
312
|
+
}
|
|
313
|
+
function buildAccessors(source) {
|
|
314
|
+
const { klass, properties } = source;
|
|
315
|
+
assertCanonicalNames(klass, properties);
|
|
316
|
+
return Object.entries(properties).map(([name, pspec]) => buildAccessor(klass, name, pspec));
|
|
317
|
+
}
|
|
318
|
+
function addInterfaceDelegates(delegates, gtype) {
|
|
319
|
+
const properties = getInterfaceProperties(gtype) ?? {};
|
|
320
|
+
for (const [name, delegate] of Object.entries(properties)) {
|
|
321
|
+
if (!delegates.has(name)) {
|
|
322
|
+
delegates.set(name, delegate);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function interfaceDelegatesFor(adoptedTypes) {
|
|
327
|
+
const delegates = new Map();
|
|
328
|
+
for (const gtype of adoptedTypes) {
|
|
329
|
+
addInterfaceDelegates(delegates, gtype);
|
|
330
|
+
}
|
|
331
|
+
return delegates;
|
|
332
|
+
}
|
|
333
|
+
function buildPropertyDispatch(source) {
|
|
334
|
+
return {
|
|
335
|
+
accessors: buildAccessors(source),
|
|
336
|
+
delegates: interfaceDelegatesFor(source.adoptedTypes),
|
|
337
|
+
};
|
|
71
338
|
}
|
|
72
339
|
function toNativeProperties(properties) {
|
|
73
340
|
return Object.values(properties).map((pspec, index) => ({
|
|
@@ -75,5 +342,5 @@ function toNativeProperties(properties) {
|
|
|
75
342
|
pspec: getHandle(pspec),
|
|
76
343
|
}));
|
|
77
344
|
}
|
|
78
|
-
export {
|
|
345
|
+
export { buildPropertyDispatch, constructPropertyFor, GET_PROPERTY_VFUNC, makeGetProperty, makeSetProperty, SET_PROPERTY_VFUNC, toNativeProperties, };
|
|
79
346
|
//# sourceMappingURL=properties.js.map
|
package/dist/properties.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalObject, Handle, RegisterClassProperty } from \"@gtkx/native\";\nimport type { AnyClass } from \"@gtkx/utils\";\nimport { camelCase } from \"@gtkx/utils\";\nimport { bind } from \"./bind.js\";\nimport { LIB, PARAM_T, VALUE_T } from \"./library.js\";\nimport { getHandle } from \"./registry.js\";\nimport { fromValue, intoValue } from \"./value.js\";\n\ntype PropertyAccessor = {\n name: string;\n storage: symbol;\n pspec: object;\n};\n\n/** A `GObject.ParamSpec` wrapper describing one property's name, type, flags and default. */\ntype PropertySpec = object;\ntype NotifyingObject = { notify?: (propertyName: string) => void };\n\nconst FIRST_PROPERTY_ID = 1;\nconst paramSpecDefaultValue = bind(LIB, \"g_param_spec_get_default_value\", [PARAM_T], VALUE_T);\n\nconst underscoreCase = (name: string): string => name.replaceAll(\"-\", \"_\");\nconst accessorNames = (name: string): string[] => [...new Set([name, underscoreCase(name), camelCase(name)])];\n\nfunction readStored(instance: Record<symbol, unknown>, accessor: PropertyAccessor): unknown {\n if (!Object.hasOwn(instance, accessor.storage)) {\n const defaults = paramSpecDefaultValue(getHandle(accessor.pspec)) as ExternalObject<Handle>;\n instance[accessor.storage] = fromValue(defaults);\n }\n\n return instance[accessor.storage];\n}\n\nfunction defineAccessor(prototype: object, accessor: PropertyAccessor, alias: string): void {\n if (Object.getOwnPropertyDescriptor(prototype, alias) !== undefined) {\n return;\n }\n\n Object.defineProperty(prototype, alias, {\n configurable: true,\n enumerable: true,\n get(this: Record<symbol, unknown>) {\n return readStored(this, accessor);\n },\n set(this: Record<symbol, unknown>, value: unknown) {\n if (readStored(this, accessor) === value) {\n return;\n }\n\n this[accessor.storage] = value;\n (this as NotifyingObject).notify?.(accessor.name);\n },\n });\n}\n\nfunction installAccessors(klass: AnyClass, accessor: PropertyAccessor): void {\n const prototype = (klass as { prototype: object }).prototype;\n\n for (const alias of accessorNames(accessor.name)) {\n defineAccessor(prototype, accessor, alias);\n }\n}\n\nfunction resolveAccessor(accessors: PropertyAccessor[], propertyId: number): PropertyAccessor {\n const accessor = accessors[propertyId - FIRST_PROPERTY_ID];\n\n if (accessor === undefined) {\n throw new RangeError(`registerClass: no property registered for id ${String(propertyId)}`);\n }\n\n return accessor;\n}\n\nfunction makeGetProperty(accessors: PropertyAccessor[]) {\n return function getProperty(this: object, propertyId: number, value: object): void {\n const accessor = resolveAccessor(accessors, propertyId);\n const current = (this as Record<string, unknown>)[camelCase(accessor.name)];\n intoValue(getHandle(value), current);\n };\n}\n\nfunction makeSetProperty(accessors: PropertyAccessor[]) {\n return function setProperty(this: object, propertyId: number, value: object): void {\n const accessor = resolveAccessor(accessors, propertyId);\n const jsValue = fromValue(getHandle(value));\n (this as Record<string, unknown>)[camelCase(accessor.name)] = jsValue;\n };\n}\n\nfunction buildAccessors(klass: AnyClass, properties: Record<string, PropertySpec>): PropertyAccessor[] {\n const accessors: PropertyAccessor[] = [];\n\n for (const [name, pspec] of Object.entries(properties)) {\n const accessor: PropertyAccessor = { name, storage: Symbol(`gtkx:property:${name}`), pspec };\n installAccessors(klass, accessor);\n accessors.push(accessor);\n }\n\n return accessors;\n}\n\nfunction toNativeProperties(properties: Record<string, PropertySpec>): RegisterClassProperty[] {\n return Object.values(properties).map((pspec, index) => ({\n id: index + FIRST_PROPERTY_ID,\n pspec: getHandle(pspec),\n }));\n}\n\nexport {\n buildAccessors,\n makeGetProperty,\n makeSetProperty,\n toNativeProperties,\n type PropertyAccessor,\n type PropertySpec,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalObject, Handle, RegisterClassProperty } from \"@gtkx/native\";\nimport type { AnyClass } from \"@gtkx/utils\";\nimport { camelCase, kebabCase } from \"@gtkx/utils\";\nimport { bind } from \"./bind.js\";\nimport { biguint64T, stringT, structT, voidT } from \"./descriptors.js\";\nimport { LIB, PARAM_T, VALUE_T } from \"./library.js\";\nimport {\n getParamFlags,\n getParamValueType,\n isParamConstructOnly,\n isParamLaxlyValidated,\n isParamWritable,\n type ValueGuard,\n valueGuardFor,\n wasParamValueModified,\n} from \"./param-spec.js\";\nimport { getHandle, getInterfaceProperties, instanceClassName, type InterfaceProperty } from \"./registry.js\";\nimport { typeName } from \"./type.js\";\nimport {\n fromValue,\n newValueForType,\n type ValueNarrower,\n valueNarrowerFor,\n type ValueWriter,\n valueWriterFor,\n} from \"./value.js\";\n\ntype PropertyCheck = {\n name: string;\n propertyName: string;\n handle: ExternalObject<Handle>;\n flags: number;\n valueType: bigint;\n canHoldValue: ValueGuard;\n narrowValue: ValueNarrower;\n write?: ValueWriter;\n scratch?: ExternalObject<Handle>;\n};\n\ntype PropertyAccessor = PropertyCheck & {\n memberName: string;\n storage: symbol;\n hasGeneratedMember: boolean;\n isInterfaceProperty?: boolean;\n delegate?: InterfaceProperty;\n};\n\n/** A `GObject.ParamSpec` wrapper describing one property's name, type, flags and default. */\ntype PropertySpec = object;\n\ntype PropertyDispatch = {\n accessors: PropertyAccessor[];\n delegates: Map<string, InterfaceProperty>;\n};\n\ntype PropertyDispatchSource = {\n klass: AnyClass;\n properties: Record<string, PropertySpec>;\n adoptedTypes: bigint[];\n};\n\ntype ConstructProperty = {\n name: string;\n value: ExternalObject<Handle>;\n};\n\ntype NotifyingObject = { notify?: (propertyName: string) => void };\n\nconst FIRST_PROPERTY_ID = 1;\nconst GET_PROPERTY_VFUNC = \"vfuncGetProperty\";\nconst SET_PROPERTY_VFUNC = \"vfuncSetProperty\";\nconst READ_ONLY_REASON = \"the property is read-only\";\nconst CONSTRUCT_ONLY_REASON = \"the property can only be set when the object is constructed\";\nconst CLASS_T = structT(\"borrowed\");\nconst interfaceStorages: Map<string, symbol> = new Map();\nconst paramSpecDefaultValue = bind(LIB, \"g_param_spec_get_default_value\", [PARAM_T], VALUE_T);\nconst paramSpecName = bind(LIB, \"g_param_spec_get_name\", [PARAM_T], stringT(\"borrowed\"));\nconst typeClassRef = bind(LIB, \"g_type_class_ref\", [biguint64T], CLASS_T);\nconst typeClassUnref = bind(LIB, \"g_type_class_unref\", [CLASS_T], voidT);\nconst classFindProperty = bind(LIB, \"g_object_class_find_property\", [CLASS_T, stringT(\"borrowed\")], PARAM_T);\n\nconst getPropertyName = (pspec: PropertySpec): string => paramSpecName(getHandle(pspec)) as string;\nconst underscoreCase = (name: string): string => name.replaceAll(\"-\", \"_\");\nconst canonicalCase = (name: string): string => kebabCase(name).replaceAll(\"_\", \"-\");\nconst accessorNames = (name: string): string[] => [...new Set([name, underscoreCase(name), camelCase(name)])];\nconst typeLabel = (type: bigint): string => typeName(type) ?? String(type);\n\nconst defaultValueFor = (handle: ExternalObject<Handle>): ExternalObject<Handle> =>\n paramSpecDefaultValue(handle) as ExternalObject<Handle>;\n\nconst heldValue = (value: unknown): unknown => value ?? null;\n\nconst holdsReason = (check: PropertyCheck): string =>\n `the property holds values of type '${typeLabel(check.valueType)}'`;\n\nfunction checkFor(handle: ExternalObject<Handle>, name: string): PropertyCheck {\n const valueType = getParamValueType(handle);\n\n return {\n name,\n propertyName: paramSpecName(handle) as string,\n handle,\n flags: getParamFlags(handle),\n valueType,\n canHoldValue: valueGuardFor(valueType),\n narrowValue: valueNarrowerFor(valueType),\n };\n}\n\nfunction findPropertySpec(klass: ExternalObject<Handle>, name: string): ExternalObject<Handle> | null {\n const found = classFindProperty(klass, name) as ExternalObject<Handle> | null;\n\n return found ?? (classFindProperty(klass, canonicalCase(name)) as ExternalObject<Handle> | null);\n}\n\nfunction describeValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n\n if (typeof value === \"object\" && value !== null) {\n return instanceClassName(value);\n }\n\n return String(value);\n}\n\nfunction propertyMessage(instance: object, check: PropertyCheck, tail: string): string {\n return `${instanceClassName(instance)}.${check.name}: ${tail}`;\n}\n\nfunction refusalTail(check: PropertyCheck, value: unknown, reason: string): string {\n return `cannot set property '${check.propertyName}' to ${describeValue(value)}; ${reason}`;\n}\n\nfunction serveTail(check: PropertyCheck, value: unknown): string {\n return `cannot serve property '${check.propertyName}' from ${describeValue(value)}; ${holdsReason(check)}`;\n}\n\nfunction assertValueFits(instance: object, check: PropertyCheck, value: unknown): void {\n if (check.canHoldValue(value)) {\n return;\n }\n\n const tail = refusalTail(check, value, holdsReason(check));\n throw new TypeError(propertyMessage(instance, check, tail));\n}\n\nfunction assertValueServes(instance: object, check: PropertyCheck, value: unknown): void {\n if (check.canHoldValue(value)) {\n return;\n }\n\n throw new TypeError(propertyMessage(instance, check, serveTail(check, value)));\n}\n\nfunction assertValueValidates(\n instance: object,\n check: PropertyCheck,\n value: unknown,\n gValue: ExternalObject<Handle>,\n): void {\n if (!wasParamValueModified(check.handle, gValue) || isParamLaxlyValidated(check.flags)) {\n return;\n }\n\n const reason =\n `the value is invalid or out of range for type '${typeLabel(check.valueType)}', ` +\n `and GObject would put ${describeValue(fromValue(gValue))} in its place`;\n\n throw new RangeError(propertyMessage(instance, check, refusalTail(check, value, reason)));\n}\n\nfunction assertWritable(instance: object, check: PropertyCheck, value: unknown): void {\n if (isParamWritable(check.flags)) {\n return;\n }\n\n throw new TypeError(propertyMessage(instance, check, refusalTail(check, value, READ_ONLY_REASON)));\n}\n\nfunction writeHeld(check: PropertyCheck, gValue: ExternalObject<Handle>, value: unknown): void {\n check.write ??= valueWriterFor(check.valueType);\n check.write(gValue, check.narrowValue(value));\n}\n\nfunction fillCheckedValue(\n instance: object,\n check: PropertyCheck,\n gValue: ExternalObject<Handle>,\n value: unknown,\n): void {\n assertValueFits(instance, check, value);\n writeHeld(check, gValue, value);\n assertValueValidates(instance, check, value, gValue);\n}\n\nfunction checkedValueFor(instance: object, check: PropertyCheck, value: unknown): ExternalObject<Handle> {\n const gValue = newValueForType(check.valueType);\n fillCheckedValue(instance, check, gValue, value);\n\n return gValue;\n}\n\nfunction assertValueAccepted(instance: object, check: PropertyCheck, value: unknown): void {\n check.scratch ??= newValueForType(check.valueType);\n fillCheckedValue(instance, check, check.scratch, value);\n}\n\nfunction constructValueFor(wrapper: object, check: PropertyCheck, value: unknown): ConstructProperty {\n assertWritable(wrapper, check, value);\n\n return { name: check.propertyName, value: checkedValueFor(wrapper, check, value) };\n}\n\nfunction constructPropertyFor(\n gtype: bigint,\n name: string,\n value: unknown,\n wrapper: object,\n): ConstructProperty | undefined {\n const klass = typeClassRef(gtype) as ExternalObject<Handle>;\n\n try {\n const pspec = findPropertySpec(klass, name);\n\n return pspec === null ? undefined : constructValueFor(wrapper, checkFor(pspec, name), value);\n } finally {\n typeClassUnref(klass);\n }\n}\n\nfunction readStored(instance: Record<symbol, unknown>, accessor: PropertyAccessor): unknown {\n if (!Object.hasOwn(instance, accessor.storage)) {\n instance[accessor.storage] = fromValue(defaultValueFor(accessor.handle));\n }\n\n return instance[accessor.storage];\n}\n\nfunction storeValue(instance: Record<symbol, unknown>, accessor: PropertyAccessor, value: unknown): void {\n instance[accessor.storage] = heldValue(value);\n}\n\nfunction writeStored(instance: Record<symbol, unknown>, accessor: PropertyAccessor, value: unknown): void {\n if (readStored(instance, accessor) === heldValue(value)) {\n return;\n }\n\n storeValue(instance, accessor, value);\n (instance as NotifyingObject).notify?.(accessor.propertyName);\n}\n\nfunction writeProperty(instance: object, accessor: PropertyAccessor, value: unknown): void {\n const stored = instance as Record<symbol, unknown>;\n\n if (readStored(stored, accessor) === heldValue(value)) {\n return;\n }\n\n assertValueAccepted(instance, accessor, value);\n writeStored(stored, accessor, accessor.narrowValue(value));\n}\n\nfunction storedGetter(accessor: PropertyAccessor): (this: object) => unknown {\n return function get(this: object) {\n return readStored(this as Record<symbol, unknown>, accessor);\n };\n}\n\nfunction memberGetter(accessor: PropertyAccessor): (this: object) => unknown {\n return function get(this: object) {\n return (this as Record<string, unknown>)[accessor.memberName];\n };\n}\n\nfunction memberSetter(accessor: PropertyAccessor): (this: object, value: unknown) => void {\n return function set(this: object, value: unknown) {\n (this as Record<string, unknown>)[accessor.memberName] = value;\n };\n}\n\nfunction refusalFor(accessor: PropertyAccessor, reason: string): (this: object, value: unknown) => void {\n return function set(this: object, value: unknown) {\n throw new TypeError(propertyMessage(this, accessor, refusalTail(accessor, value, reason)));\n };\n}\n\nfunction checkedSetter(accessor: PropertyAccessor): (this: object, value: unknown) => void {\n if (!isParamWritable(accessor.flags)) {\n return refusalFor(accessor, READ_ONLY_REASON);\n }\n\n if (isParamConstructOnly(accessor.flags)) {\n return refusalFor(accessor, CONSTRUCT_ONLY_REASON);\n }\n\n return function set(this: object, value: unknown) {\n writeProperty(this, accessor, value);\n };\n}\n\nfunction hasOwnMember(prototype: object, alias: string): boolean {\n return Object.getOwnPropertyDescriptor(prototype, alias) !== undefined;\n}\n\nfunction defineAccessor(prototype: object, descriptor: PropertyDescriptor, alias: string): void {\n if (hasOwnMember(prototype, alias)) {\n return;\n }\n\n Object.defineProperty(prototype, alias, descriptor);\n}\n\nfunction installAccessors(klass: AnyClass, accessor: PropertyAccessor): void {\n const prototype = (klass as { prototype: object }).prototype;\n accessor.hasGeneratedMember = !hasOwnMember(prototype, accessor.memberName);\n\n const descriptor: PropertyDescriptor = {\n configurable: true,\n enumerable: true,\n get: accessor.hasGeneratedMember ? storedGetter(accessor) : memberGetter(accessor),\n set: accessor.hasGeneratedMember ? checkedSetter(accessor) : memberSetter(accessor),\n };\n\n for (const alias of accessorNames(accessor.name)) {\n defineAccessor(prototype, descriptor, alias);\n }\n}\n\nfunction storageFor(propertyName: string): symbol {\n const existing = interfaceStorages.get(propertyName);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const created = Symbol(`gtkx:property:${propertyName}`);\n interfaceStorages.set(propertyName, created);\n\n return created;\n}\n\nfunction interfaceAccessorFor(dispatch: PropertyDispatch, pspec: PropertySpec): PropertyAccessor {\n const handle = getHandle(pspec);\n const propertyName = paramSpecName(handle) as string;\n const delegate = dispatch.delegates.get(propertyName);\n\n const accessor: PropertyAccessor = {\n ...checkFor(handle, propertyName),\n memberName: camelCase(propertyName),\n storage: storageFor(propertyName),\n hasGeneratedMember: false,\n isInterfaceProperty: true,\n };\n\n if (delegate !== undefined) {\n accessor.delegate = delegate;\n }\n\n return accessor;\n}\n\nfunction resolveAccessor(\n dispatch: PropertyDispatch,\n propertyId: number,\n pspec: PropertySpec,\n): PropertyAccessor {\n const accessor = dispatch.accessors[propertyId - FIRST_PROPERTY_ID];\n\n if (accessor !== undefined) {\n return accessor;\n }\n\n const created = interfaceAccessorFor(dispatch, pspec);\n dispatch.accessors[propertyId - FIRST_PROPERTY_ID] = created;\n\n return created;\n}\n\nfunction callMember(instance: object, member: string, args: unknown[]): unknown {\n const fn: unknown = (instance as Record<string, unknown>)[member];\n\n if (typeof fn !== \"function\") {\n throw new TypeError(`registerClass: ${instanceClassName(instance)} has no '${member}' member`);\n }\n\n return (fn as (...values: unknown[]) => unknown).apply(instance, args);\n}\n\nfunction backingMemberFor(instance: object, accessor: PropertyAccessor): string | undefined {\n if (accessor.hasGeneratedMember && !Object.hasOwn(instance, accessor.memberName)) {\n return undefined;\n }\n\n return accessor.memberName;\n}\n\nfunction readCurrent(instance: object, accessor: PropertyAccessor): unknown {\n const getter = accessor.delegate?.getter;\n\n if (getter !== undefined) {\n return callMember(instance, getter, []);\n }\n\n if (accessor.isInterfaceProperty === true) {\n return readStored(instance as Record<symbol, unknown>, accessor);\n }\n\n const member = backingMemberFor(instance, accessor);\n\n return member === undefined\n ? readStored(instance as Record<symbol, unknown>, accessor)\n : (instance as Record<string, unknown>)[member];\n}\n\nfunction writeCurrent(instance: object, accessor: PropertyAccessor, value: unknown): void {\n const setter = accessor.delegate?.setter;\n\n if (setter !== undefined) {\n callMember(instance, setter, [value]);\n\n return;\n }\n\n if (accessor.isInterfaceProperty === true) {\n writeStored(instance as Record<symbol, unknown>, accessor, value);\n\n return;\n }\n\n const member = backingMemberFor(instance, accessor);\n\n if (member === undefined) {\n storeValue(instance as Record<symbol, unknown>, accessor, value);\n\n return;\n }\n\n (instance as Record<string, unknown>)[member] = value;\n}\n\nfunction makeGetProperty(dispatch: PropertyDispatch) {\n return function getProperty(this: object, propertyId: number, value: object, pspec: PropertySpec): void {\n const accessor = resolveAccessor(dispatch, propertyId, pspec);\n const current = readCurrent(this, accessor);\n assertValueServes(this, accessor, current);\n writeHeld(accessor, getHandle(value), current);\n };\n}\n\nfunction makeSetProperty(dispatch: PropertyDispatch) {\n return function setProperty(this: object, propertyId: number, value: object, pspec: PropertySpec): void {\n const accessor = resolveAccessor(dispatch, propertyId, pspec);\n writeCurrent(this, accessor, fromValue(getHandle(value)));\n };\n}\n\nfunction assertCanonicalName(klass: AnyClass, name: string, propertyName: string): void {\n const canonical = canonicalCase(name);\n\n if (propertyName === canonical) {\n return;\n }\n\n throw new TypeError(\n `registerClass: ${klass.name} keys the property '${name}' to a GObject.ParamSpec named ` +\n `'${propertyName}', which is the name GObject notifies under; name the ParamSpec '${canonical}'`,\n );\n}\n\nfunction assertCanonicalNames(klass: AnyClass, properties: Record<string, PropertySpec>): void {\n for (const [name, pspec] of Object.entries(properties)) {\n assertCanonicalName(klass, name, getPropertyName(pspec));\n }\n}\n\nfunction buildAccessor(klass: AnyClass, name: string, pspec: PropertySpec): PropertyAccessor {\n const accessor: PropertyAccessor = {\n ...checkFor(getHandle(pspec), name),\n memberName: camelCase(name),\n storage: Symbol(`gtkx:property:${name}`),\n hasGeneratedMember: false,\n };\n\n installAccessors(klass, accessor);\n\n return accessor;\n}\n\nfunction buildAccessors(source: PropertyDispatchSource): PropertyAccessor[] {\n const { klass, properties } = source;\n assertCanonicalNames(klass, properties);\n\n return Object.entries(properties).map(([name, pspec]) => buildAccessor(klass, name, pspec));\n}\n\nfunction addInterfaceDelegates(delegates: Map<string, InterfaceProperty>, gtype: bigint): void {\n const properties = getInterfaceProperties(gtype) ?? {};\n\n for (const [name, delegate] of Object.entries(properties)) {\n if (!delegates.has(name)) {\n delegates.set(name, delegate);\n }\n }\n}\n\nfunction interfaceDelegatesFor(adoptedTypes: bigint[]): Map<string, InterfaceProperty> {\n const delegates: Map<string, InterfaceProperty> = new Map();\n\n for (const gtype of adoptedTypes) {\n addInterfaceDelegates(delegates, gtype);\n }\n\n return delegates;\n}\n\nfunction buildPropertyDispatch(source: PropertyDispatchSource): PropertyDispatch {\n return {\n accessors: buildAccessors(source),\n delegates: interfaceDelegatesFor(source.adoptedTypes),\n };\n}\n\nfunction toNativeProperties(properties: Record<string, PropertySpec>): RegisterClassProperty[] {\n return Object.values(properties).map((pspec, index) => ({\n id: index + FIRST_PROPERTY_ID,\n pspec: getHandle(pspec),\n }));\n}\n\nexport {\n buildPropertyDispatch,\n constructPropertyFor,\n GET_PROPERTY_VFUNC,\n makeGetProperty,\n makeSetProperty,\n SET_PROPERTY_VFUNC,\n toNativeProperties,\n type ConstructProperty,\n type PropertyDispatch,\n type PropertySpec,\n};\n"]}
|