@lezer/common 1.2.2 → 1.3.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/dist/index.cjs CHANGED
@@ -26,6 +26,7 @@ class NodeProp {
26
26
  this.deserialize = config.deserialize || (() => {
27
27
  throw new Error("This node type doesn't define a deserialize function");
28
28
  });
29
+ this.combine = config.combine || null;
29
30
  }
30
31
  /**
31
32
  This is meant to be used with
@@ -290,7 +291,10 @@ class NodeSet {
290
291
  if (add) {
291
292
  if (!newProps)
292
293
  newProps = Object.assign({}, type.props);
293
- newProps[add[0].id] = add[1];
294
+ let value = add[1], prop = add[0];
295
+ if (prop.combine && prop.id in newProps)
296
+ value = prop.combine(newProps[prop.id], value);
297
+ newProps[prop.id] = value;
294
298
  }
295
299
  }
296
300
  newTypes.push(newProps ? new NodeType(type.name, newProps, type.id, type.flags) : type);
@@ -1153,7 +1157,7 @@ class TreeCursor {
1153
1157
  */
1154
1158
  next(enter = true) { return this.move(1, enter); }
1155
1159
  /**
1156
- Move to the next node in a last-to-first pre-order traveral. A
1160
+ Move to the next node in a last-to-first pre-order traversal. A
1157
1161
  node is followed by its last child or, if it has none, its
1158
1162
  previous sibling or the previous sibling of the first parent
1159
1163
  node that has one.
@@ -1229,10 +1233,10 @@ class TreeCursor {
1229
1233
  if (mustLeave && leave)
1230
1234
  leave(this);
1231
1235
  mustLeave = this.type.isAnonymous;
1232
- if (this.nextSibling())
1233
- break;
1234
1236
  if (!depth)
1235
1237
  return;
1238
+ if (this.nextSibling())
1239
+ break;
1236
1240
  this.parent();
1237
1241
  depth--;
1238
1242
  mustLeave = true;
@@ -1273,7 +1277,7 @@ function buildTree(data) {
1273
1277
  function takeNode(parentStart, minPos, children, positions, inRepeat, depth) {
1274
1278
  let { id, start, end, size } = cursor;
1275
1279
  let lookAheadAtStart = lookAhead, contextAtStart = contextHash;
1276
- while (size < 0) {
1280
+ if (size < 0) {
1277
1281
  cursor.next();
1278
1282
  if (size == -1 /* SpecialRecord.Reuse */) {
1279
1283
  let node = reused[id];
@@ -1878,8 +1882,15 @@ class MixedParse {
1878
1882
  }
1879
1883
  else if (!cursor.type.isAnonymous && (nest = this.nest(cursor, this.input)) &&
1880
1884
  (cursor.from < cursor.to || !nest.overlay)) {
1881
- if (!cursor.tree)
1885
+ if (!cursor.tree) {
1882
1886
  materialize(cursor);
1887
+ // materialize create one more level of nesting
1888
+ // we need to add depth to active overlay for going backwards
1889
+ if (overlay)
1890
+ overlay.depth++;
1891
+ if (covered)
1892
+ covered.depth++;
1893
+ }
1883
1894
  let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
1884
1895
  if (typeof nest.overlay == "function") {
1885
1896
  overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, cursor.tree, overlay);
package/dist/index.d.cts CHANGED
@@ -244,6 +244,13 @@ declare class NodeProp<T> {
244
244
  */
245
245
  deserialize?: (str: string) => T;
246
246
  /**
247
+ If configuring another value for this prop when it already
248
+ exists on a node should combine the old and new values, rather
249
+ than overwrite the old value, you can pass a function that
250
+ does the combining here.
251
+ */
252
+ combine?: (a: T, b: T) => T;
253
+ /**
247
254
  By default, node props are stored in the [node
248
255
  type](#common.NodeType). It can sometimes be useful to directly
249
256
  store information (usually related to the parsing algorithm)
@@ -1024,7 +1031,7 @@ declare class TreeCursor implements SyntaxNodeRef {
1024
1031
  */
1025
1032
  next(enter?: boolean): boolean;
1026
1033
  /**
1027
- Move to the next node in a last-to-first pre-order traveral. A
1034
+ Move to the next node in a last-to-first pre-order traversal. A
1028
1035
  node is followed by its last child or, if it has none, its
1029
1036
  previous sibling or the previous sibling of the first parent
1030
1037
  node that has one.
@@ -1134,4 +1141,4 @@ tree.
1134
1141
  */
1135
1142
  declare function parseMixed(nest: (node: SyntaxNodeRef, input: Input) => NestedParse | null): ParseWrapper;
1136
1143
 
1137
- export { BufferCursor, ChangedRange, DefaultBufferLength, Input, IterMode, MountedTree, NestedParse, NodeIterator, NodeProp, NodePropSource, NodeSet, NodeType, NodeWeakMap, ParseWrapper, Parser, PartialParse, SyntaxNode, SyntaxNodeRef, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed };
1144
+ export { type BufferCursor, type ChangedRange, DefaultBufferLength, type Input, IterMode, MountedTree, type NestedParse, type NodeIterator, NodeProp, type NodePropSource, NodeSet, NodeType, NodeWeakMap, type ParseWrapper, Parser, type PartialParse, type SyntaxNode, type SyntaxNodeRef, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed };
package/dist/index.d.ts CHANGED
@@ -244,6 +244,13 @@ declare class NodeProp<T> {
244
244
  */
245
245
  deserialize?: (str: string) => T;
246
246
  /**
247
+ If configuring another value for this prop when it already
248
+ exists on a node should combine the old and new values, rather
249
+ than overwrite the old value, you can pass a function that
250
+ does the combining here.
251
+ */
252
+ combine?: (a: T, b: T) => T;
253
+ /**
247
254
  By default, node props are stored in the [node
248
255
  type](#common.NodeType). It can sometimes be useful to directly
249
256
  store information (usually related to the parsing algorithm)
@@ -1024,7 +1031,7 @@ declare class TreeCursor implements SyntaxNodeRef {
1024
1031
  */
1025
1032
  next(enter?: boolean): boolean;
1026
1033
  /**
1027
- Move to the next node in a last-to-first pre-order traveral. A
1034
+ Move to the next node in a last-to-first pre-order traversal. A
1028
1035
  node is followed by its last child or, if it has none, its
1029
1036
  previous sibling or the previous sibling of the first parent
1030
1037
  node that has one.
@@ -1134,4 +1141,4 @@ tree.
1134
1141
  */
1135
1142
  declare function parseMixed(nest: (node: SyntaxNodeRef, input: Input) => NestedParse | null): ParseWrapper;
1136
1143
 
1137
- export { BufferCursor, ChangedRange, DefaultBufferLength, Input, IterMode, MountedTree, NestedParse, NodeIterator, NodeProp, NodePropSource, NodeSet, NodeType, NodeWeakMap, ParseWrapper, Parser, PartialParse, SyntaxNode, SyntaxNodeRef, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed };
1144
+ export { type BufferCursor, type ChangedRange, DefaultBufferLength, type Input, IterMode, MountedTree, type NestedParse, type NodeIterator, NodeProp, type NodePropSource, NodeSet, NodeType, NodeWeakMap, type ParseWrapper, Parser, type PartialParse, type SyntaxNode, type SyntaxNodeRef, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed };
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ class NodeProp {
24
24
  this.deserialize = config.deserialize || (() => {
25
25
  throw new Error("This node type doesn't define a deserialize function");
26
26
  });
27
+ this.combine = config.combine || null;
27
28
  }
28
29
  /**
29
30
  This is meant to be used with
@@ -288,7 +289,10 @@ class NodeSet {
288
289
  if (add) {
289
290
  if (!newProps)
290
291
  newProps = Object.assign({}, type.props);
291
- newProps[add[0].id] = add[1];
292
+ let value = add[1], prop = add[0];
293
+ if (prop.combine && prop.id in newProps)
294
+ value = prop.combine(newProps[prop.id], value);
295
+ newProps[prop.id] = value;
292
296
  }
293
297
  }
294
298
  newTypes.push(newProps ? new NodeType(type.name, newProps, type.id, type.flags) : type);
@@ -1151,7 +1155,7 @@ class TreeCursor {
1151
1155
  */
1152
1156
  next(enter = true) { return this.move(1, enter); }
1153
1157
  /**
1154
- Move to the next node in a last-to-first pre-order traveral. A
1158
+ Move to the next node in a last-to-first pre-order traversal. A
1155
1159
  node is followed by its last child or, if it has none, its
1156
1160
  previous sibling or the previous sibling of the first parent
1157
1161
  node that has one.
@@ -1227,10 +1231,10 @@ class TreeCursor {
1227
1231
  if (mustLeave && leave)
1228
1232
  leave(this);
1229
1233
  mustLeave = this.type.isAnonymous;
1230
- if (this.nextSibling())
1231
- break;
1232
1234
  if (!depth)
1233
1235
  return;
1236
+ if (this.nextSibling())
1237
+ break;
1234
1238
  this.parent();
1235
1239
  depth--;
1236
1240
  mustLeave = true;
@@ -1271,7 +1275,7 @@ function buildTree(data) {
1271
1275
  function takeNode(parentStart, minPos, children, positions, inRepeat, depth) {
1272
1276
  let { id, start, end, size } = cursor;
1273
1277
  let lookAheadAtStart = lookAhead, contextAtStart = contextHash;
1274
- while (size < 0) {
1278
+ if (size < 0) {
1275
1279
  cursor.next();
1276
1280
  if (size == -1 /* SpecialRecord.Reuse */) {
1277
1281
  let node = reused[id];
@@ -1876,8 +1880,15 @@ class MixedParse {
1876
1880
  }
1877
1881
  else if (!cursor.type.isAnonymous && (nest = this.nest(cursor, this.input)) &&
1878
1882
  (cursor.from < cursor.to || !nest.overlay)) {
1879
- if (!cursor.tree)
1883
+ if (!cursor.tree) {
1880
1884
  materialize(cursor);
1885
+ // materialize create one more level of nesting
1886
+ // we need to add depth to active overlay for going backwards
1887
+ if (overlay)
1888
+ overlay.depth++;
1889
+ if (covered)
1890
+ covered.depth++;
1891
+ }
1881
1892
  let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
1882
1893
  if (typeof nest.overlay == "function") {
1883
1894
  overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, cursor.tree, overlay);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lezer/common",
3
- "version": "1.2.2",
3
+ "version": "1.3.0",
4
4
  "description": "Syntax tree data structure and parser interfaces for the lezer parser",
5
5
  "main": "dist/index.cjs",
6
6
  "type": "module",