@codemirror/state 0.19.7 → 0.19.8
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/CHANGELOG.md +6 -0
- package/dist/index.cjs +89 -80
- package/dist/index.js +89 -80
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -959,7 +959,7 @@ class FacetProvider {
|
|
|
959
959
|
var _a;
|
|
960
960
|
let getter = this.value;
|
|
961
961
|
let compare = this.facet.compareInput;
|
|
962
|
-
let idx = addresses[
|
|
962
|
+
let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Multi */;
|
|
963
963
|
let depDoc = false, depSel = false, depAddrs = [];
|
|
964
964
|
for (let dep of this.dependencies) {
|
|
965
965
|
if (dep == "doc")
|
|
@@ -969,24 +969,35 @@ class FacetProvider {
|
|
|
969
969
|
else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0)
|
|
970
970
|
depAddrs.push(addresses[dep.id]);
|
|
971
971
|
}
|
|
972
|
-
return
|
|
973
|
-
|
|
974
|
-
if (oldVal === Uninitialized) {
|
|
972
|
+
return {
|
|
973
|
+
create(state) {
|
|
975
974
|
state.values[idx] = getter(state);
|
|
976
975
|
return 1 /* Changed */;
|
|
977
|
-
}
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)
|
|
981
|
-
if (depChanged) {
|
|
976
|
+
},
|
|
977
|
+
update(state, tr) {
|
|
978
|
+
if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
|
|
979
|
+
depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)) {
|
|
982
980
|
let newVal = getter(state);
|
|
983
|
-
if (multi ? !compareArray(newVal,
|
|
981
|
+
if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) {
|
|
984
982
|
state.values[idx] = newVal;
|
|
985
983
|
return 1 /* Changed */;
|
|
986
984
|
}
|
|
987
985
|
}
|
|
986
|
+
return 0;
|
|
987
|
+
},
|
|
988
|
+
reconfigure(state, oldState) {
|
|
989
|
+
let newVal = getter(state);
|
|
990
|
+
let oldAddr = oldState.config.address[id];
|
|
991
|
+
if (oldAddr != null) {
|
|
992
|
+
let oldVal = getAddr(oldState, oldAddr);
|
|
993
|
+
if (multi ? compareArray(newVal, oldVal, compare) : compare(newVal, oldVal)) {
|
|
994
|
+
state.values[idx] = oldVal;
|
|
995
|
+
return 0;
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
state.values[idx] = newVal;
|
|
999
|
+
return 1 /* Changed */;
|
|
988
1000
|
}
|
|
989
|
-
return 0;
|
|
990
1001
|
};
|
|
991
1002
|
}
|
|
992
1003
|
}
|
|
@@ -1003,14 +1014,7 @@ function dynamicFacetSlot(addresses, facet, providers) {
|
|
|
1003
1014
|
let providerTypes = providers.map(p => p.type);
|
|
1004
1015
|
let dynamic = providerAddrs.filter(p => !(p & 1));
|
|
1005
1016
|
let idx = addresses[facet.id] >> 1;
|
|
1006
|
-
|
|
1007
|
-
let oldVal = state.values[idx], changed = oldVal === Uninitialized;
|
|
1008
|
-
for (let dynAddr of dynamic) {
|
|
1009
|
-
if (ensureAddr(state, dynAddr) & 1 /* Changed */)
|
|
1010
|
-
changed = true;
|
|
1011
|
-
}
|
|
1012
|
-
if (!changed)
|
|
1013
|
-
return 0;
|
|
1017
|
+
function get(state) {
|
|
1014
1018
|
let values = [];
|
|
1015
1019
|
for (let i = 0; i < providerAddrs.length; i++) {
|
|
1016
1020
|
let value = getAddr(state, providerAddrs[i]);
|
|
@@ -1020,11 +1024,39 @@ function dynamicFacetSlot(addresses, facet, providers) {
|
|
|
1020
1024
|
else
|
|
1021
1025
|
values.push(value);
|
|
1022
1026
|
}
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
state
|
|
1027
|
-
|
|
1027
|
+
return facet.combine(values);
|
|
1028
|
+
}
|
|
1029
|
+
return {
|
|
1030
|
+
create(state) {
|
|
1031
|
+
for (let addr of providerAddrs)
|
|
1032
|
+
ensureAddr(state, addr);
|
|
1033
|
+
state.values[idx] = get(state);
|
|
1034
|
+
return 1 /* Changed */;
|
|
1035
|
+
},
|
|
1036
|
+
update(state, tr) {
|
|
1037
|
+
if (!dynamic.some(dynAddr => ensureAddr(state, dynAddr) & 1 /* Changed */))
|
|
1038
|
+
return 0;
|
|
1039
|
+
let value = get(state);
|
|
1040
|
+
if (facet.compare(value, state.values[idx]))
|
|
1041
|
+
return 0;
|
|
1042
|
+
state.values[idx] = value;
|
|
1043
|
+
return 1 /* Changed */;
|
|
1044
|
+
},
|
|
1045
|
+
reconfigure(state, oldState) {
|
|
1046
|
+
let depChanged = providerAddrs.some(addr => ensureAddr(state, addr) & 1 /* Changed */);
|
|
1047
|
+
let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet);
|
|
1048
|
+
if (oldProviders && !depChanged && sameArray(providers, oldProviders)) {
|
|
1049
|
+
state.values[idx] = oldValue;
|
|
1050
|
+
return 0;
|
|
1051
|
+
}
|
|
1052
|
+
let value = get(state);
|
|
1053
|
+
if (facet.compare(value, oldValue)) {
|
|
1054
|
+
state.values[idx] = oldValue;
|
|
1055
|
+
return 0;
|
|
1056
|
+
}
|
|
1057
|
+
state.values[idx] = value;
|
|
1058
|
+
return 1 /* Changed */;
|
|
1059
|
+
}
|
|
1028
1060
|
};
|
|
1029
1061
|
}
|
|
1030
1062
|
const initField = Facet.define({ static: true });
|
|
@@ -1070,20 +1102,27 @@ class StateField {
|
|
|
1070
1102
|
*/
|
|
1071
1103
|
slot(addresses) {
|
|
1072
1104
|
let idx = addresses[this.id] >> 1;
|
|
1073
|
-
return
|
|
1074
|
-
|
|
1075
|
-
if (oldVal === Uninitialized) {
|
|
1105
|
+
return {
|
|
1106
|
+
create: (state) => {
|
|
1076
1107
|
state.values[idx] = this.create(state);
|
|
1077
1108
|
return 1 /* Changed */;
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1109
|
+
},
|
|
1110
|
+
update: (state, tr) => {
|
|
1111
|
+
let oldVal = state.values[idx];
|
|
1080
1112
|
let value = this.updateF(oldVal, tr);
|
|
1081
|
-
if (
|
|
1082
|
-
|
|
1083
|
-
|
|
1113
|
+
if (this.compareF(oldVal, value))
|
|
1114
|
+
return 0;
|
|
1115
|
+
state.values[idx] = value;
|
|
1116
|
+
return 1 /* Changed */;
|
|
1117
|
+
},
|
|
1118
|
+
reconfigure: (state, oldState) => {
|
|
1119
|
+
if (oldState.config.address[this.id] != null) {
|
|
1120
|
+
state.values[idx] = oldState.field(this);
|
|
1121
|
+
return 0;
|
|
1084
1122
|
}
|
|
1123
|
+
state.values[idx] = this.create(state);
|
|
1124
|
+
return 1 /* Changed */;
|
|
1085
1125
|
}
|
|
1086
|
-
return 0;
|
|
1087
1126
|
};
|
|
1088
1127
|
}
|
|
1089
1128
|
/**
|
|
@@ -1223,44 +1262,26 @@ class Configuration {
|
|
|
1223
1262
|
let address = Object.create(null);
|
|
1224
1263
|
let staticValues = [];
|
|
1225
1264
|
let dynamicSlots = [];
|
|
1226
|
-
let dynamicValues = [];
|
|
1227
1265
|
for (let field of fields) {
|
|
1228
1266
|
address[field.id] = dynamicSlots.length << 1;
|
|
1229
1267
|
dynamicSlots.push(a => field.slot(a));
|
|
1230
|
-
dynamicValues.push(oldState && oldState.config.address[field.id] != null ? oldState.field(field) : Uninitialized);
|
|
1231
1268
|
}
|
|
1232
|
-
let canReuseCache = new Map;
|
|
1233
|
-
let canReuseDep = (dep) => {
|
|
1234
|
-
if (!(dep instanceof Facet))
|
|
1235
|
-
return true;
|
|
1236
|
-
let cached = canReuseCache.get(dep);
|
|
1237
|
-
if (cached != null)
|
|
1238
|
-
return cached;
|
|
1239
|
-
canReuseCache.set(dep, false);
|
|
1240
|
-
if (!oldFacets || !sameArray(oldFacets[dep.id] || [], facets[dep.id] || []))
|
|
1241
|
-
return;
|
|
1242
|
-
for (let input of facets[dep.id] || [])
|
|
1243
|
-
if (!input.dependencies.every(canReuseDep))
|
|
1244
|
-
return;
|
|
1245
|
-
canReuseCache.set(dep, true);
|
|
1246
|
-
};
|
|
1247
1269
|
let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets;
|
|
1248
1270
|
for (let id in facets) {
|
|
1249
1271
|
let providers = facets[id], facet = providers[0].facet;
|
|
1250
1272
|
let oldProviders = oldFacets && oldFacets[id] || [];
|
|
1251
|
-
let canReuse = sameArray(providers, oldProviders);
|
|
1252
1273
|
if (providers.every(p => p.type == 0 /* Static */)) {
|
|
1253
1274
|
address[facet.id] = (staticValues.length << 1) | 1;
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1275
|
+
if (sameArray(oldProviders, providers)) {
|
|
1276
|
+
staticValues.push(oldState.facet(facet));
|
|
1277
|
+
}
|
|
1278
|
+
else {
|
|
1279
|
+
let value = facet.combine(providers.map(p => p.value));
|
|
1280
|
+
staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value);
|
|
1281
|
+
}
|
|
1258
1282
|
}
|
|
1259
1283
|
else {
|
|
1260
1284
|
for (let p of providers) {
|
|
1261
|
-
let canReuseThis = p.dependencies.every(canReuseDep);
|
|
1262
|
-
if (!canReuseThis)
|
|
1263
|
-
canReuse = false;
|
|
1264
1285
|
if (p.type == 0 /* Static */) {
|
|
1265
1286
|
address[p.id] = (staticValues.length << 1) | 1;
|
|
1266
1287
|
staticValues.push(p.value);
|
|
@@ -1268,20 +1289,14 @@ class Configuration {
|
|
|
1268
1289
|
else {
|
|
1269
1290
|
address[p.id] = dynamicSlots.length << 1;
|
|
1270
1291
|
dynamicSlots.push(a => p.dynamicSlot(a));
|
|
1271
|
-
let oldAddr = oldState && canReuseThis ? oldState.config.address[p.id] : null;
|
|
1272
|
-
dynamicValues.push(oldAddr != null ? getAddr(oldState, oldAddr) : Uninitialized);
|
|
1273
1292
|
}
|
|
1274
1293
|
}
|
|
1275
1294
|
address[facet.id] = dynamicSlots.length << 1;
|
|
1276
1295
|
dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers));
|
|
1277
|
-
dynamicValues.push(canReuse || oldProviders.length ? oldState.facet(facet) : Uninitialized);
|
|
1278
1296
|
}
|
|
1279
1297
|
}
|
|
1280
1298
|
let dynamic = dynamicSlots.map(f => f(address));
|
|
1281
|
-
return
|
|
1282
|
-
configuration: new Configuration(base, newCompartments, dynamic, address, staticValues, facets),
|
|
1283
|
-
values: dynamicValues
|
|
1284
|
-
};
|
|
1299
|
+
return new Configuration(base, newCompartments, dynamic, address, staticValues, facets);
|
|
1285
1300
|
}
|
|
1286
1301
|
}
|
|
1287
1302
|
function flatten(extension, compartments, newCompartments) {
|
|
@@ -1333,7 +1348,6 @@ function flatten(extension, compartments, newCompartments) {
|
|
|
1333
1348
|
inner(extension, Prec_.default);
|
|
1334
1349
|
return result.reduce((a, b) => a.concat(b));
|
|
1335
1350
|
}
|
|
1336
|
-
const Uninitialized = {};
|
|
1337
1351
|
function ensureAddr(state, addr) {
|
|
1338
1352
|
if (addr & 1)
|
|
1339
1353
|
return 2 /* Computed */;
|
|
@@ -1344,7 +1358,7 @@ function ensureAddr(state, addr) {
|
|
|
1344
1358
|
if (status & 2 /* Computed */)
|
|
1345
1359
|
return status;
|
|
1346
1360
|
state.status[idx] = 4 /* Computing */;
|
|
1347
|
-
let changed = state.config.dynamicSlots[idx]
|
|
1361
|
+
let changed = state.computeSlot(state, state.config.dynamicSlots[idx]);
|
|
1348
1362
|
return state.status[idx] = 2 /* Computed */ | changed;
|
|
1349
1363
|
}
|
|
1350
1364
|
function getAddr(state, addr) {
|
|
@@ -1863,24 +1877,20 @@ class EditorState {
|
|
|
1863
1877
|
/**
|
|
1864
1878
|
@internal
|
|
1865
1879
|
*/
|
|
1866
|
-
values, tr
|
|
1880
|
+
values, computeSlot, tr) {
|
|
1867
1881
|
this.config = config;
|
|
1868
1882
|
this.doc = doc;
|
|
1869
1883
|
this.selection = selection;
|
|
1870
1884
|
this.values = values;
|
|
1871
|
-
/**
|
|
1872
|
-
@internal
|
|
1873
|
-
*/
|
|
1874
|
-
this.applying = null;
|
|
1875
1885
|
this.status = config.statusTemplate.slice();
|
|
1876
|
-
this.
|
|
1886
|
+
this.computeSlot = computeSlot;
|
|
1877
1887
|
// Fill in the computed state immediately, so that further queries
|
|
1878
1888
|
// for it made during the update return this state
|
|
1879
1889
|
if (tr)
|
|
1880
1890
|
tr._state = this;
|
|
1881
1891
|
for (let i = 0; i < this.config.dynamicSlots.length; i++)
|
|
1882
1892
|
ensureAddr(this, i << 1);
|
|
1883
|
-
this.
|
|
1893
|
+
this.computeSlot = null;
|
|
1884
1894
|
}
|
|
1885
1895
|
field(field, require = true) {
|
|
1886
1896
|
let addr = this.config.address[field.id];
|
|
@@ -1935,15 +1945,14 @@ class EditorState {
|
|
|
1935
1945
|
}
|
|
1936
1946
|
let startValues;
|
|
1937
1947
|
if (!conf) {
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
let intermediateState = new EditorState(conf, this.doc, this.selection, resolved.values, null);
|
|
1948
|
+
conf = Configuration.resolve(base, compartments, this);
|
|
1949
|
+
let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null);
|
|
1941
1950
|
startValues = intermediateState.values;
|
|
1942
1951
|
}
|
|
1943
1952
|
else {
|
|
1944
1953
|
startValues = tr.startState.values.slice();
|
|
1945
1954
|
}
|
|
1946
|
-
new EditorState(conf, tr.newDoc, tr.newSelection, startValues, tr);
|
|
1955
|
+
new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr);
|
|
1947
1956
|
}
|
|
1948
1957
|
/**
|
|
1949
1958
|
Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that
|
|
@@ -2067,7 +2076,7 @@ class EditorState {
|
|
|
2067
2076
|
transactions.
|
|
2068
2077
|
*/
|
|
2069
2078
|
static create(config = {}) {
|
|
2070
|
-
let
|
|
2079
|
+
let configuration = Configuration.resolve(config.extensions || [], new Map);
|
|
2071
2080
|
let doc = config.doc instanceof text.Text ? config.doc
|
|
2072
2081
|
: text.Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit));
|
|
2073
2082
|
let selection = !config.selection ? EditorSelection.single(0)
|
|
@@ -2076,7 +2085,7 @@ class EditorState {
|
|
|
2076
2085
|
checkSelection(selection, doc.length);
|
|
2077
2086
|
if (!configuration.staticFacet(allowMultipleSelections))
|
|
2078
2087
|
selection = selection.asSingle();
|
|
2079
|
-
return new EditorState(configuration, doc, selection,
|
|
2088
|
+
return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null);
|
|
2080
2089
|
}
|
|
2081
2090
|
/**
|
|
2082
2091
|
The size (in columns) of a tab in the document, determined by
|
package/dist/index.js
CHANGED
|
@@ -955,7 +955,7 @@ class FacetProvider {
|
|
|
955
955
|
var _a;
|
|
956
956
|
let getter = this.value;
|
|
957
957
|
let compare = this.facet.compareInput;
|
|
958
|
-
let idx = addresses[
|
|
958
|
+
let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Multi */;
|
|
959
959
|
let depDoc = false, depSel = false, depAddrs = [];
|
|
960
960
|
for (let dep of this.dependencies) {
|
|
961
961
|
if (dep == "doc")
|
|
@@ -965,24 +965,35 @@ class FacetProvider {
|
|
|
965
965
|
else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0)
|
|
966
966
|
depAddrs.push(addresses[dep.id]);
|
|
967
967
|
}
|
|
968
|
-
return
|
|
969
|
-
|
|
970
|
-
if (oldVal === Uninitialized) {
|
|
968
|
+
return {
|
|
969
|
+
create(state) {
|
|
971
970
|
state.values[idx] = getter(state);
|
|
972
971
|
return 1 /* Changed */;
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)
|
|
977
|
-
if (depChanged) {
|
|
972
|
+
},
|
|
973
|
+
update(state, tr) {
|
|
974
|
+
if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) ||
|
|
975
|
+
depAddrs.some(addr => (ensureAddr(state, addr) & 1 /* Changed */) > 0)) {
|
|
978
976
|
let newVal = getter(state);
|
|
979
|
-
if (multi ? !compareArray(newVal,
|
|
977
|
+
if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) {
|
|
980
978
|
state.values[idx] = newVal;
|
|
981
979
|
return 1 /* Changed */;
|
|
982
980
|
}
|
|
983
981
|
}
|
|
982
|
+
return 0;
|
|
983
|
+
},
|
|
984
|
+
reconfigure(state, oldState) {
|
|
985
|
+
let newVal = getter(state);
|
|
986
|
+
let oldAddr = oldState.config.address[id];
|
|
987
|
+
if (oldAddr != null) {
|
|
988
|
+
let oldVal = getAddr(oldState, oldAddr);
|
|
989
|
+
if (multi ? compareArray(newVal, oldVal, compare) : compare(newVal, oldVal)) {
|
|
990
|
+
state.values[idx] = oldVal;
|
|
991
|
+
return 0;
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
state.values[idx] = newVal;
|
|
995
|
+
return 1 /* Changed */;
|
|
984
996
|
}
|
|
985
|
-
return 0;
|
|
986
997
|
};
|
|
987
998
|
}
|
|
988
999
|
}
|
|
@@ -999,14 +1010,7 @@ function dynamicFacetSlot(addresses, facet, providers) {
|
|
|
999
1010
|
let providerTypes = providers.map(p => p.type);
|
|
1000
1011
|
let dynamic = providerAddrs.filter(p => !(p & 1));
|
|
1001
1012
|
let idx = addresses[facet.id] >> 1;
|
|
1002
|
-
|
|
1003
|
-
let oldVal = state.values[idx], changed = oldVal === Uninitialized;
|
|
1004
|
-
for (let dynAddr of dynamic) {
|
|
1005
|
-
if (ensureAddr(state, dynAddr) & 1 /* Changed */)
|
|
1006
|
-
changed = true;
|
|
1007
|
-
}
|
|
1008
|
-
if (!changed)
|
|
1009
|
-
return 0;
|
|
1013
|
+
function get(state) {
|
|
1010
1014
|
let values = [];
|
|
1011
1015
|
for (let i = 0; i < providerAddrs.length; i++) {
|
|
1012
1016
|
let value = getAddr(state, providerAddrs[i]);
|
|
@@ -1016,11 +1020,39 @@ function dynamicFacetSlot(addresses, facet, providers) {
|
|
|
1016
1020
|
else
|
|
1017
1021
|
values.push(value);
|
|
1018
1022
|
}
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
state
|
|
1023
|
-
|
|
1023
|
+
return facet.combine(values);
|
|
1024
|
+
}
|
|
1025
|
+
return {
|
|
1026
|
+
create(state) {
|
|
1027
|
+
for (let addr of providerAddrs)
|
|
1028
|
+
ensureAddr(state, addr);
|
|
1029
|
+
state.values[idx] = get(state);
|
|
1030
|
+
return 1 /* Changed */;
|
|
1031
|
+
},
|
|
1032
|
+
update(state, tr) {
|
|
1033
|
+
if (!dynamic.some(dynAddr => ensureAddr(state, dynAddr) & 1 /* Changed */))
|
|
1034
|
+
return 0;
|
|
1035
|
+
let value = get(state);
|
|
1036
|
+
if (facet.compare(value, state.values[idx]))
|
|
1037
|
+
return 0;
|
|
1038
|
+
state.values[idx] = value;
|
|
1039
|
+
return 1 /* Changed */;
|
|
1040
|
+
},
|
|
1041
|
+
reconfigure(state, oldState) {
|
|
1042
|
+
let depChanged = providerAddrs.some(addr => ensureAddr(state, addr) & 1 /* Changed */);
|
|
1043
|
+
let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet);
|
|
1044
|
+
if (oldProviders && !depChanged && sameArray(providers, oldProviders)) {
|
|
1045
|
+
state.values[idx] = oldValue;
|
|
1046
|
+
return 0;
|
|
1047
|
+
}
|
|
1048
|
+
let value = get(state);
|
|
1049
|
+
if (facet.compare(value, oldValue)) {
|
|
1050
|
+
state.values[idx] = oldValue;
|
|
1051
|
+
return 0;
|
|
1052
|
+
}
|
|
1053
|
+
state.values[idx] = value;
|
|
1054
|
+
return 1 /* Changed */;
|
|
1055
|
+
}
|
|
1024
1056
|
};
|
|
1025
1057
|
}
|
|
1026
1058
|
const initField = /*@__PURE__*/Facet.define({ static: true });
|
|
@@ -1066,20 +1098,27 @@ class StateField {
|
|
|
1066
1098
|
*/
|
|
1067
1099
|
slot(addresses) {
|
|
1068
1100
|
let idx = addresses[this.id] >> 1;
|
|
1069
|
-
return
|
|
1070
|
-
|
|
1071
|
-
if (oldVal === Uninitialized) {
|
|
1101
|
+
return {
|
|
1102
|
+
create: (state) => {
|
|
1072
1103
|
state.values[idx] = this.create(state);
|
|
1073
1104
|
return 1 /* Changed */;
|
|
1074
|
-
}
|
|
1075
|
-
|
|
1105
|
+
},
|
|
1106
|
+
update: (state, tr) => {
|
|
1107
|
+
let oldVal = state.values[idx];
|
|
1076
1108
|
let value = this.updateF(oldVal, tr);
|
|
1077
|
-
if (
|
|
1078
|
-
|
|
1079
|
-
|
|
1109
|
+
if (this.compareF(oldVal, value))
|
|
1110
|
+
return 0;
|
|
1111
|
+
state.values[idx] = value;
|
|
1112
|
+
return 1 /* Changed */;
|
|
1113
|
+
},
|
|
1114
|
+
reconfigure: (state, oldState) => {
|
|
1115
|
+
if (oldState.config.address[this.id] != null) {
|
|
1116
|
+
state.values[idx] = oldState.field(this);
|
|
1117
|
+
return 0;
|
|
1080
1118
|
}
|
|
1119
|
+
state.values[idx] = this.create(state);
|
|
1120
|
+
return 1 /* Changed */;
|
|
1081
1121
|
}
|
|
1082
|
-
return 0;
|
|
1083
1122
|
};
|
|
1084
1123
|
}
|
|
1085
1124
|
/**
|
|
@@ -1219,44 +1258,26 @@ class Configuration {
|
|
|
1219
1258
|
let address = Object.create(null);
|
|
1220
1259
|
let staticValues = [];
|
|
1221
1260
|
let dynamicSlots = [];
|
|
1222
|
-
let dynamicValues = [];
|
|
1223
1261
|
for (let field of fields) {
|
|
1224
1262
|
address[field.id] = dynamicSlots.length << 1;
|
|
1225
1263
|
dynamicSlots.push(a => field.slot(a));
|
|
1226
|
-
dynamicValues.push(oldState && oldState.config.address[field.id] != null ? oldState.field(field) : Uninitialized);
|
|
1227
1264
|
}
|
|
1228
|
-
let canReuseCache = new Map;
|
|
1229
|
-
let canReuseDep = (dep) => {
|
|
1230
|
-
if (!(dep instanceof Facet))
|
|
1231
|
-
return true;
|
|
1232
|
-
let cached = canReuseCache.get(dep);
|
|
1233
|
-
if (cached != null)
|
|
1234
|
-
return cached;
|
|
1235
|
-
canReuseCache.set(dep, false);
|
|
1236
|
-
if (!oldFacets || !sameArray(oldFacets[dep.id] || [], facets[dep.id] || []))
|
|
1237
|
-
return;
|
|
1238
|
-
for (let input of facets[dep.id] || [])
|
|
1239
|
-
if (!input.dependencies.every(canReuseDep))
|
|
1240
|
-
return;
|
|
1241
|
-
canReuseCache.set(dep, true);
|
|
1242
|
-
};
|
|
1243
1265
|
let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets;
|
|
1244
1266
|
for (let id in facets) {
|
|
1245
1267
|
let providers = facets[id], facet = providers[0].facet;
|
|
1246
1268
|
let oldProviders = oldFacets && oldFacets[id] || [];
|
|
1247
|
-
let canReuse = sameArray(providers, oldProviders);
|
|
1248
1269
|
if (providers.every(p => p.type == 0 /* Static */)) {
|
|
1249
1270
|
address[facet.id] = (staticValues.length << 1) | 1;
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1271
|
+
if (sameArray(oldProviders, providers)) {
|
|
1272
|
+
staticValues.push(oldState.facet(facet));
|
|
1273
|
+
}
|
|
1274
|
+
else {
|
|
1275
|
+
let value = facet.combine(providers.map(p => p.value));
|
|
1276
|
+
staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value);
|
|
1277
|
+
}
|
|
1254
1278
|
}
|
|
1255
1279
|
else {
|
|
1256
1280
|
for (let p of providers) {
|
|
1257
|
-
let canReuseThis = p.dependencies.every(canReuseDep);
|
|
1258
|
-
if (!canReuseThis)
|
|
1259
|
-
canReuse = false;
|
|
1260
1281
|
if (p.type == 0 /* Static */) {
|
|
1261
1282
|
address[p.id] = (staticValues.length << 1) | 1;
|
|
1262
1283
|
staticValues.push(p.value);
|
|
@@ -1264,20 +1285,14 @@ class Configuration {
|
|
|
1264
1285
|
else {
|
|
1265
1286
|
address[p.id] = dynamicSlots.length << 1;
|
|
1266
1287
|
dynamicSlots.push(a => p.dynamicSlot(a));
|
|
1267
|
-
let oldAddr = oldState && canReuseThis ? oldState.config.address[p.id] : null;
|
|
1268
|
-
dynamicValues.push(oldAddr != null ? getAddr(oldState, oldAddr) : Uninitialized);
|
|
1269
1288
|
}
|
|
1270
1289
|
}
|
|
1271
1290
|
address[facet.id] = dynamicSlots.length << 1;
|
|
1272
1291
|
dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers));
|
|
1273
|
-
dynamicValues.push(canReuse || oldProviders.length ? oldState.facet(facet) : Uninitialized);
|
|
1274
1292
|
}
|
|
1275
1293
|
}
|
|
1276
1294
|
let dynamic = dynamicSlots.map(f => f(address));
|
|
1277
|
-
return
|
|
1278
|
-
configuration: new Configuration(base, newCompartments, dynamic, address, staticValues, facets),
|
|
1279
|
-
values: dynamicValues
|
|
1280
|
-
};
|
|
1295
|
+
return new Configuration(base, newCompartments, dynamic, address, staticValues, facets);
|
|
1281
1296
|
}
|
|
1282
1297
|
}
|
|
1283
1298
|
function flatten(extension, compartments, newCompartments) {
|
|
@@ -1329,7 +1344,6 @@ function flatten(extension, compartments, newCompartments) {
|
|
|
1329
1344
|
inner(extension, Prec_.default);
|
|
1330
1345
|
return result.reduce((a, b) => a.concat(b));
|
|
1331
1346
|
}
|
|
1332
|
-
const Uninitialized = {};
|
|
1333
1347
|
function ensureAddr(state, addr) {
|
|
1334
1348
|
if (addr & 1)
|
|
1335
1349
|
return 2 /* Computed */;
|
|
@@ -1340,7 +1354,7 @@ function ensureAddr(state, addr) {
|
|
|
1340
1354
|
if (status & 2 /* Computed */)
|
|
1341
1355
|
return status;
|
|
1342
1356
|
state.status[idx] = 4 /* Computing */;
|
|
1343
|
-
let changed = state.config.dynamicSlots[idx]
|
|
1357
|
+
let changed = state.computeSlot(state, state.config.dynamicSlots[idx]);
|
|
1344
1358
|
return state.status[idx] = 2 /* Computed */ | changed;
|
|
1345
1359
|
}
|
|
1346
1360
|
function getAddr(state, addr) {
|
|
@@ -1858,24 +1872,20 @@ class EditorState {
|
|
|
1858
1872
|
/**
|
|
1859
1873
|
@internal
|
|
1860
1874
|
*/
|
|
1861
|
-
values, tr
|
|
1875
|
+
values, computeSlot, tr) {
|
|
1862
1876
|
this.config = config;
|
|
1863
1877
|
this.doc = doc;
|
|
1864
1878
|
this.selection = selection;
|
|
1865
1879
|
this.values = values;
|
|
1866
|
-
/**
|
|
1867
|
-
@internal
|
|
1868
|
-
*/
|
|
1869
|
-
this.applying = null;
|
|
1870
1880
|
this.status = config.statusTemplate.slice();
|
|
1871
|
-
this.
|
|
1881
|
+
this.computeSlot = computeSlot;
|
|
1872
1882
|
// Fill in the computed state immediately, so that further queries
|
|
1873
1883
|
// for it made during the update return this state
|
|
1874
1884
|
if (tr)
|
|
1875
1885
|
tr._state = this;
|
|
1876
1886
|
for (let i = 0; i < this.config.dynamicSlots.length; i++)
|
|
1877
1887
|
ensureAddr(this, i << 1);
|
|
1878
|
-
this.
|
|
1888
|
+
this.computeSlot = null;
|
|
1879
1889
|
}
|
|
1880
1890
|
field(field, require = true) {
|
|
1881
1891
|
let addr = this.config.address[field.id];
|
|
@@ -1930,15 +1940,14 @@ class EditorState {
|
|
|
1930
1940
|
}
|
|
1931
1941
|
let startValues;
|
|
1932
1942
|
if (!conf) {
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
let intermediateState = new EditorState(conf, this.doc, this.selection, resolved.values, null);
|
|
1943
|
+
conf = Configuration.resolve(base, compartments, this);
|
|
1944
|
+
let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null);
|
|
1936
1945
|
startValues = intermediateState.values;
|
|
1937
1946
|
}
|
|
1938
1947
|
else {
|
|
1939
1948
|
startValues = tr.startState.values.slice();
|
|
1940
1949
|
}
|
|
1941
|
-
new EditorState(conf, tr.newDoc, tr.newSelection, startValues, tr);
|
|
1950
|
+
new EditorState(conf, tr.newDoc, tr.newSelection, startValues, (state, slot) => slot.update(state, tr), tr);
|
|
1942
1951
|
}
|
|
1943
1952
|
/**
|
|
1944
1953
|
Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that
|
|
@@ -2062,7 +2071,7 @@ class EditorState {
|
|
|
2062
2071
|
transactions.
|
|
2063
2072
|
*/
|
|
2064
2073
|
static create(config = {}) {
|
|
2065
|
-
let
|
|
2074
|
+
let configuration = Configuration.resolve(config.extensions || [], new Map);
|
|
2066
2075
|
let doc = config.doc instanceof Text ? config.doc
|
|
2067
2076
|
: Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit));
|
|
2068
2077
|
let selection = !config.selection ? EditorSelection.single(0)
|
|
@@ -2071,7 +2080,7 @@ class EditorState {
|
|
|
2071
2080
|
checkSelection(selection, doc.length);
|
|
2072
2081
|
if (!configuration.staticFacet(allowMultipleSelections))
|
|
2073
2082
|
selection = selection.asSingle();
|
|
2074
|
-
return new EditorState(configuration, doc, selection,
|
|
2083
|
+
return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null);
|
|
2075
2084
|
}
|
|
2076
2085
|
/**
|
|
2077
2086
|
The size (in columns) of a tab in the document, determined by
|