@lezer/common 1.4.0 → 1.5.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
@@ -126,10 +126,17 @@ class MountedTree {
126
126
  /**
127
127
  The parser used to create this subtree.
128
128
  */
129
- parser) {
129
+ parser,
130
+ /**
131
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
132
+ content is delineated with some kind
133
+ of bracket token.
134
+ */
135
+ bracketed = false) {
130
136
  this.tree = tree;
131
137
  this.overlay = overlay;
132
138
  this.parser = parser;
139
+ this.bracketed = bracketed;
133
140
  }
134
141
  /**
135
142
  @internal
@@ -334,6 +341,13 @@ exports.IterMode = void 0;
334
341
  position.
335
342
  */
336
343
  IterMode[IterMode["IgnoreOverlays"] = 8] = "IgnoreOverlays";
344
+ /**
345
+ When set, positions on the boundary of a mounted overlay tree
346
+ that has its [`bracketed`](#common.NestedParse.bracketed) flag
347
+ set will enter that tree regardless of side. Only supported in
348
+ [`enter`](#common.SyntaxNode.enter), not in cursors.
349
+ */
350
+ IterMode[IterMode["EnterBracketed"] = 16] = "EnterBracketed";
337
351
  })(exports.IterMode || (exports.IterMode = {}));
338
352
  /**
339
353
  A piece of syntax tree. There are two ways to approach these
@@ -731,10 +745,13 @@ class TreeNode extends BaseNode {
731
745
  get name() { return this._tree.type.name; }
732
746
  get to() { return this.from + this._tree.length; }
733
747
  nextChild(i, dir, pos, side, mode = 0) {
748
+ var _a;
734
749
  for (let parent = this;;) {
735
750
  for (let { children, positions } = parent._tree, e = dir > 0 ? children.length : -1; i != e; i += dir) {
736
751
  let next = children[i], start = positions[i] + parent.from;
737
- if (!checkSide(side, pos, start, start + next.length))
752
+ if (!((mode & exports.IterMode.EnterBracketed) && next instanceof Tree &&
753
+ ((_a = MountedTree.get(next)) === null || _a === void 0 ? void 0 : _a.overlay) === null && (start >= pos || start + next.length <= pos)) &&
754
+ !checkSide(side, pos, start, start + next.length))
738
755
  continue;
739
756
  if (next instanceof TreeBuffer) {
740
757
  if (mode & exports.IterMode.ExcludeBuffers)
@@ -749,7 +766,7 @@ class TreeNode extends BaseNode {
749
766
  return new TreeNode(mounted.tree, start, i, parent);
750
767
  let inner = new TreeNode(next, start, i, parent);
751
768
  return (mode & exports.IterMode.IncludeAnonymous) || !inner.type.isAnonymous ? inner
752
- : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side);
769
+ : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side, mode);
753
770
  }
754
771
  }
755
772
  if ((mode & exports.IterMode.IncludeAnonymous) || !parent.type.isAnonymous)
@@ -771,10 +788,10 @@ class TreeNode extends BaseNode {
771
788
  enter(pos, side, mode = 0) {
772
789
  let mounted;
773
790
  if (!(mode & exports.IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) {
774
- let rPos = pos - this.from;
791
+ let rPos = pos - this.from, enterBracketed = (mode & exports.IterMode.EnterBracketed) && mounted.bracketed;
775
792
  for (let { from, to } of mounted.overlay) {
776
- if ((side > 0 ? from <= rPos : from < rPos) &&
777
- (side < 0 ? to >= rPos : to > rPos))
793
+ if ((side > 0 || enterBracketed ? from <= rPos : from < rPos) &&
794
+ (side < 0 || enterBracketed ? to >= rPos : to > rPos))
778
795
  return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);
779
796
  }
780
797
  }
@@ -963,12 +980,7 @@ class TreeCursor {
963
980
  /**
964
981
  @internal
965
982
  */
966
- constructor(node,
967
- /**
968
- @internal
969
- */
970
- mode = 0) {
971
- this.mode = mode;
983
+ constructor(node, mode = 0) {
972
984
  /**
973
985
  @internal
974
986
  */
@@ -979,6 +991,7 @@ class TreeCursor {
979
991
  */
980
992
  this.index = 0;
981
993
  this.bufferNode = null;
994
+ this.mode = mode & ~exports.IterMode.EnterBracketed;
982
995
  if (node instanceof TreeNode) {
983
996
  this.yieldNode(node);
984
997
  }
@@ -1770,10 +1783,11 @@ function parseMixed(nest) {
1770
1783
  return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);
1771
1784
  }
1772
1785
  class InnerParse {
1773
- constructor(parser, parse, overlay, target, from) {
1786
+ constructor(parser, parse, overlay, bracketed, target, from) {
1774
1787
  this.parser = parser;
1775
1788
  this.parse = parse;
1776
1789
  this.overlay = overlay;
1790
+ this.bracketed = bracketed;
1777
1791
  this.target = target;
1778
1792
  this.from = from;
1779
1793
  }
@@ -1783,12 +1797,13 @@ function checkRanges(ranges) {
1783
1797
  throw new RangeError("Invalid inner parse ranges given: " + JSON.stringify(ranges));
1784
1798
  }
1785
1799
  class ActiveOverlay {
1786
- constructor(parser, predicate, mounts, index, start, target, prev) {
1800
+ constructor(parser, predicate, mounts, index, start, bracketed, target, prev) {
1787
1801
  this.parser = parser;
1788
1802
  this.predicate = predicate;
1789
1803
  this.mounts = mounts;
1790
1804
  this.index = index;
1791
1805
  this.start = start;
1806
+ this.bracketed = bracketed;
1792
1807
  this.target = target;
1793
1808
  this.prev = prev;
1794
1809
  this.depth = 0;
@@ -1834,7 +1849,7 @@ class MixedParse {
1834
1849
  // presumably not aliased anywhere else) to hold the information
1835
1850
  // about the inner parse.
1836
1851
  let props = Object.assign(Object.create(null), inner.target.props);
1837
- props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser);
1852
+ props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser, inner.bracketed);
1838
1853
  inner.target.props = props;
1839
1854
  }
1840
1855
  return null;
@@ -1895,7 +1910,7 @@ class MixedParse {
1895
1910
  }
1896
1911
  let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
1897
1912
  if (typeof nest.overlay == "function") {
1898
- overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, cursor.tree, overlay);
1913
+ overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, !!nest.bracketed, cursor.tree, overlay);
1899
1914
  }
1900
1915
  else {
1901
1916
  let ranges = punchRanges(this.ranges, nest.overlay ||
@@ -1904,7 +1919,7 @@ class MixedParse {
1904
1919
  checkRanges(ranges);
1905
1920
  if (ranges.length || !nest.overlay)
1906
1921
  this.inner.push(new InnerParse(nest.parser, ranges.length ? nest.parser.startParse(this.input, enterFragments(oldMounts, ranges), ranges)
1907
- : nest.parser.startParse(""), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, cursor.tree, ranges.length ? ranges[0].from : cursor.from));
1922
+ : nest.parser.startParse(""), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, !!nest.bracketed, cursor.tree, ranges.length ? ranges[0].from : cursor.from));
1908
1923
  if (!nest.overlay)
1909
1924
  enter = false;
1910
1925
  else if (ranges.length)
@@ -1938,7 +1953,7 @@ class MixedParse {
1938
1953
  let ranges = punchRanges(this.ranges, overlay.ranges);
1939
1954
  if (ranges.length) {
1940
1955
  checkRanges(ranges);
1941
- this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.target, ranges[0].from));
1956
+ this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.bracketed, overlay.target, ranges[0].from));
1942
1957
  }
1943
1958
  overlay = overlay.prev;
1944
1959
  }
package/dist/index.d.cts CHANGED
@@ -349,6 +349,12 @@ declare class MountedTree {
349
349
  The parser used to create this subtree.
350
350
  */
351
351
  readonly parser: Parser;
352
+ /**
353
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
354
+ content is delineated with some kind
355
+ of bracket token.
356
+ */
357
+ readonly bracketed: boolean;
352
358
  constructor(
353
359
  /**
354
360
  The inner tree.
@@ -370,7 +376,13 @@ declare class MountedTree {
370
376
  /**
371
377
  The parser used to create this subtree.
372
378
  */
373
- parser: Parser);
379
+ parser: Parser,
380
+ /**
381
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
382
+ content is delineated with some kind
383
+ of bracket token.
384
+ */
385
+ bracketed?: boolean);
374
386
  }
375
387
  /**
376
388
  Type returned by [`NodeProp.add`](#common.NodeProp.add). Describes
@@ -531,7 +543,14 @@ declare enum IterMode {
531
543
  library to not enter mounted overlays if one covers the given
532
544
  position.
533
545
  */
534
- IgnoreOverlays = 8
546
+ IgnoreOverlays = 8,
547
+ /**
548
+ When set, positions on the boundary of a mounted overlay tree
549
+ that has its [`bracketed`](#common.NestedParse.bracketed) flag
550
+ set will enter that tree regardless of side. Only supported in
551
+ [`enter`](#common.SyntaxNode.enter), not in cursors.
552
+ */
553
+ EnterBracketed = 16
535
554
  }
536
555
  /**
537
556
  A piece of syntax tree. There are two ways to approach these
@@ -1135,6 +1154,13 @@ interface NestedParse {
1135
1154
  from: number;
1136
1155
  to: number;
1137
1156
  } | boolean);
1157
+ /**
1158
+ When `true`, indicates that this nested language is surrounded
1159
+ by some kind of bracket token, which can be used to make
1160
+ iteration [eagerly](#common.IterMode.EnterBracketed) enter such
1161
+ trees.
1162
+ */
1163
+ bracketed?: boolean;
1138
1164
  }
1139
1165
  /**
1140
1166
  Create a parse wrapper that, after the inner parse completes,
package/dist/index.d.ts CHANGED
@@ -349,6 +349,12 @@ declare class MountedTree {
349
349
  The parser used to create this subtree.
350
350
  */
351
351
  readonly parser: Parser;
352
+ /**
353
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
354
+ content is delineated with some kind
355
+ of bracket token.
356
+ */
357
+ readonly bracketed: boolean;
352
358
  constructor(
353
359
  /**
354
360
  The inner tree.
@@ -370,7 +376,13 @@ declare class MountedTree {
370
376
  /**
371
377
  The parser used to create this subtree.
372
378
  */
373
- parser: Parser);
379
+ parser: Parser,
380
+ /**
381
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
382
+ content is delineated with some kind
383
+ of bracket token.
384
+ */
385
+ bracketed?: boolean);
374
386
  }
375
387
  /**
376
388
  Type returned by [`NodeProp.add`](#common.NodeProp.add). Describes
@@ -531,7 +543,14 @@ declare enum IterMode {
531
543
  library to not enter mounted overlays if one covers the given
532
544
  position.
533
545
  */
534
- IgnoreOverlays = 8
546
+ IgnoreOverlays = 8,
547
+ /**
548
+ When set, positions on the boundary of a mounted overlay tree
549
+ that has its [`bracketed`](#common.NestedParse.bracketed) flag
550
+ set will enter that tree regardless of side. Only supported in
551
+ [`enter`](#common.SyntaxNode.enter), not in cursors.
552
+ */
553
+ EnterBracketed = 16
535
554
  }
536
555
  /**
537
556
  A piece of syntax tree. There are two ways to approach these
@@ -1135,6 +1154,13 @@ interface NestedParse {
1135
1154
  from: number;
1136
1155
  to: number;
1137
1156
  } | boolean);
1157
+ /**
1158
+ When `true`, indicates that this nested language is surrounded
1159
+ by some kind of bracket token, which can be used to make
1160
+ iteration [eagerly](#common.IterMode.EnterBracketed) enter such
1161
+ trees.
1162
+ */
1163
+ bracketed?: boolean;
1138
1164
  }
1139
1165
  /**
1140
1166
  Create a parse wrapper that, after the inner parse completes,
package/dist/index.js CHANGED
@@ -124,10 +124,17 @@ class MountedTree {
124
124
  /**
125
125
  The parser used to create this subtree.
126
126
  */
127
- parser) {
127
+ parser,
128
+ /**
129
+ [Indicates](#common.IterMode.EnterBracketed) that the nested
130
+ content is delineated with some kind
131
+ of bracket token.
132
+ */
133
+ bracketed = false) {
128
134
  this.tree = tree;
129
135
  this.overlay = overlay;
130
136
  this.parser = parser;
137
+ this.bracketed = bracketed;
131
138
  }
132
139
  /**
133
140
  @internal
@@ -332,6 +339,13 @@ var IterMode;
332
339
  position.
333
340
  */
334
341
  IterMode[IterMode["IgnoreOverlays"] = 8] = "IgnoreOverlays";
342
+ /**
343
+ When set, positions on the boundary of a mounted overlay tree
344
+ that has its [`bracketed`](#common.NestedParse.bracketed) flag
345
+ set will enter that tree regardless of side. Only supported in
346
+ [`enter`](#common.SyntaxNode.enter), not in cursors.
347
+ */
348
+ IterMode[IterMode["EnterBracketed"] = 16] = "EnterBracketed";
335
349
  })(IterMode || (IterMode = {}));
336
350
  /**
337
351
  A piece of syntax tree. There are two ways to approach these
@@ -729,10 +743,13 @@ class TreeNode extends BaseNode {
729
743
  get name() { return this._tree.type.name; }
730
744
  get to() { return this.from + this._tree.length; }
731
745
  nextChild(i, dir, pos, side, mode = 0) {
746
+ var _a;
732
747
  for (let parent = this;;) {
733
748
  for (let { children, positions } = parent._tree, e = dir > 0 ? children.length : -1; i != e; i += dir) {
734
749
  let next = children[i], start = positions[i] + parent.from;
735
- if (!checkSide(side, pos, start, start + next.length))
750
+ if (!((mode & IterMode.EnterBracketed) && next instanceof Tree &&
751
+ ((_a = MountedTree.get(next)) === null || _a === void 0 ? void 0 : _a.overlay) === null && (start >= pos || start + next.length <= pos)) &&
752
+ !checkSide(side, pos, start, start + next.length))
736
753
  continue;
737
754
  if (next instanceof TreeBuffer) {
738
755
  if (mode & IterMode.ExcludeBuffers)
@@ -747,7 +764,7 @@ class TreeNode extends BaseNode {
747
764
  return new TreeNode(mounted.tree, start, i, parent);
748
765
  let inner = new TreeNode(next, start, i, parent);
749
766
  return (mode & IterMode.IncludeAnonymous) || !inner.type.isAnonymous ? inner
750
- : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side);
767
+ : inner.nextChild(dir < 0 ? next.children.length - 1 : 0, dir, pos, side, mode);
751
768
  }
752
769
  }
753
770
  if ((mode & IterMode.IncludeAnonymous) || !parent.type.isAnonymous)
@@ -769,10 +786,10 @@ class TreeNode extends BaseNode {
769
786
  enter(pos, side, mode = 0) {
770
787
  let mounted;
771
788
  if (!(mode & IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) {
772
- let rPos = pos - this.from;
789
+ let rPos = pos - this.from, enterBracketed = (mode & IterMode.EnterBracketed) && mounted.bracketed;
773
790
  for (let { from, to } of mounted.overlay) {
774
- if ((side > 0 ? from <= rPos : from < rPos) &&
775
- (side < 0 ? to >= rPos : to > rPos))
791
+ if ((side > 0 || enterBracketed ? from <= rPos : from < rPos) &&
792
+ (side < 0 || enterBracketed ? to >= rPos : to > rPos))
776
793
  return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);
777
794
  }
778
795
  }
@@ -961,12 +978,7 @@ class TreeCursor {
961
978
  /**
962
979
  @internal
963
980
  */
964
- constructor(node,
965
- /**
966
- @internal
967
- */
968
- mode = 0) {
969
- this.mode = mode;
981
+ constructor(node, mode = 0) {
970
982
  /**
971
983
  @internal
972
984
  */
@@ -977,6 +989,7 @@ class TreeCursor {
977
989
  */
978
990
  this.index = 0;
979
991
  this.bufferNode = null;
992
+ this.mode = mode & ~IterMode.EnterBracketed;
980
993
  if (node instanceof TreeNode) {
981
994
  this.yieldNode(node);
982
995
  }
@@ -1768,10 +1781,11 @@ function parseMixed(nest) {
1768
1781
  return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);
1769
1782
  }
1770
1783
  class InnerParse {
1771
- constructor(parser, parse, overlay, target, from) {
1784
+ constructor(parser, parse, overlay, bracketed, target, from) {
1772
1785
  this.parser = parser;
1773
1786
  this.parse = parse;
1774
1787
  this.overlay = overlay;
1788
+ this.bracketed = bracketed;
1775
1789
  this.target = target;
1776
1790
  this.from = from;
1777
1791
  }
@@ -1781,12 +1795,13 @@ function checkRanges(ranges) {
1781
1795
  throw new RangeError("Invalid inner parse ranges given: " + JSON.stringify(ranges));
1782
1796
  }
1783
1797
  class ActiveOverlay {
1784
- constructor(parser, predicate, mounts, index, start, target, prev) {
1798
+ constructor(parser, predicate, mounts, index, start, bracketed, target, prev) {
1785
1799
  this.parser = parser;
1786
1800
  this.predicate = predicate;
1787
1801
  this.mounts = mounts;
1788
1802
  this.index = index;
1789
1803
  this.start = start;
1804
+ this.bracketed = bracketed;
1790
1805
  this.target = target;
1791
1806
  this.prev = prev;
1792
1807
  this.depth = 0;
@@ -1832,7 +1847,7 @@ class MixedParse {
1832
1847
  // presumably not aliased anywhere else) to hold the information
1833
1848
  // about the inner parse.
1834
1849
  let props = Object.assign(Object.create(null), inner.target.props);
1835
- props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser);
1850
+ props[NodeProp.mounted.id] = new MountedTree(done, inner.overlay, inner.parser, inner.bracketed);
1836
1851
  inner.target.props = props;
1837
1852
  }
1838
1853
  return null;
@@ -1893,7 +1908,7 @@ class MixedParse {
1893
1908
  }
1894
1909
  let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
1895
1910
  if (typeof nest.overlay == "function") {
1896
- overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, cursor.tree, overlay);
1911
+ overlay = new ActiveOverlay(nest.parser, nest.overlay, oldMounts, this.inner.length, cursor.from, !!nest.bracketed, cursor.tree, overlay);
1897
1912
  }
1898
1913
  else {
1899
1914
  let ranges = punchRanges(this.ranges, nest.overlay ||
@@ -1902,7 +1917,7 @@ class MixedParse {
1902
1917
  checkRanges(ranges);
1903
1918
  if (ranges.length || !nest.overlay)
1904
1919
  this.inner.push(new InnerParse(nest.parser, ranges.length ? nest.parser.startParse(this.input, enterFragments(oldMounts, ranges), ranges)
1905
- : nest.parser.startParse(""), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, cursor.tree, ranges.length ? ranges[0].from : cursor.from));
1920
+ : nest.parser.startParse(""), nest.overlay ? nest.overlay.map(r => new Range(r.from - cursor.from, r.to - cursor.from)) : null, !!nest.bracketed, cursor.tree, ranges.length ? ranges[0].from : cursor.from));
1906
1921
  if (!nest.overlay)
1907
1922
  enter = false;
1908
1923
  else if (ranges.length)
@@ -1936,7 +1951,7 @@ class MixedParse {
1936
1951
  let ranges = punchRanges(this.ranges, overlay.ranges);
1937
1952
  if (ranges.length) {
1938
1953
  checkRanges(ranges);
1939
- this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.target, ranges[0].from));
1954
+ this.inner.splice(overlay.index, 0, new InnerParse(overlay.parser, overlay.parser.startParse(this.input, enterFragments(overlay.mounts, ranges), ranges), overlay.ranges.map(r => new Range(r.from - overlay.start, r.to - overlay.start)), overlay.bracketed, overlay.target, ranges[0].from));
1940
1955
  }
1941
1956
  overlay = overlay.prev;
1942
1957
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lezer/common",
3
- "version": "1.4.0",
3
+ "version": "1.5.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",