@lezer/common 1.3.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 +36 -19
- package/dist/index.d.cts +32 -2
- package/dist/index.d.ts +32 -2
- package/dist/index.js +36 -19
- package/package.json +1 -1
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 (!
|
|
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)
|
|
@@ -767,13 +784,14 @@ class TreeNode extends BaseNode {
|
|
|
767
784
|
get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* Side.DontCare */); }
|
|
768
785
|
childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* Side.After */); }
|
|
769
786
|
childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Side.Before */); }
|
|
787
|
+
prop(prop) { return this._tree.prop(prop); }
|
|
770
788
|
enter(pos, side, mode = 0) {
|
|
771
789
|
let mounted;
|
|
772
790
|
if (!(mode & exports.IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) {
|
|
773
|
-
let rPos = pos - this.from;
|
|
791
|
+
let rPos = pos - this.from, enterBracketed = (mode & exports.IterMode.EnterBracketed) && mounted.bracketed;
|
|
774
792
|
for (let { from, to } of mounted.overlay) {
|
|
775
|
-
if ((side > 0 ? from <= rPos : from < rPos) &&
|
|
776
|
-
(side < 0 ? to >= rPos : to > rPos))
|
|
793
|
+
if ((side > 0 || enterBracketed ? from <= rPos : from < rPos) &&
|
|
794
|
+
(side < 0 || enterBracketed ? to >= rPos : to > rPos))
|
|
777
795
|
return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);
|
|
778
796
|
}
|
|
779
797
|
}
|
|
@@ -860,6 +878,7 @@ class BufferNode extends BaseNode {
|
|
|
860
878
|
get lastChild() { return this.child(-1, 0, 4 /* Side.DontCare */); }
|
|
861
879
|
childAfter(pos) { return this.child(1, pos, 2 /* Side.After */); }
|
|
862
880
|
childBefore(pos) { return this.child(-1, pos, -2 /* Side.Before */); }
|
|
881
|
+
prop(prop) { return this.type.prop(prop); }
|
|
863
882
|
enter(pos, side, mode = 0) {
|
|
864
883
|
if (mode & exports.IterMode.ExcludeBuffers)
|
|
865
884
|
return null;
|
|
@@ -961,12 +980,7 @@ class TreeCursor {
|
|
|
961
980
|
/**
|
|
962
981
|
@internal
|
|
963
982
|
*/
|
|
964
|
-
constructor(node,
|
|
965
|
-
/**
|
|
966
|
-
@internal
|
|
967
|
-
*/
|
|
968
|
-
mode = 0) {
|
|
969
|
-
this.mode = mode;
|
|
983
|
+
constructor(node, mode = 0) {
|
|
970
984
|
/**
|
|
971
985
|
@internal
|
|
972
986
|
*/
|
|
@@ -977,6 +991,7 @@ class TreeCursor {
|
|
|
977
991
|
*/
|
|
978
992
|
this.index = 0;
|
|
979
993
|
this.bufferNode = null;
|
|
994
|
+
this.mode = mode & ~exports.IterMode.EnterBracketed;
|
|
980
995
|
if (node instanceof TreeNode) {
|
|
981
996
|
this.yieldNode(node);
|
|
982
997
|
}
|
|
@@ -1441,7 +1456,7 @@ function buildTree(data) {
|
|
|
1441
1456
|
fork.next();
|
|
1442
1457
|
while (fork.pos > startPos) {
|
|
1443
1458
|
if (fork.size < 0) {
|
|
1444
|
-
if (fork.size == -3 /* SpecialRecord.ContextChange */)
|
|
1459
|
+
if (fork.size == -3 /* SpecialRecord.ContextChange */ || fork.size == -4 /* SpecialRecord.LookAhead */)
|
|
1445
1460
|
localSkipped += 4;
|
|
1446
1461
|
else
|
|
1447
1462
|
break scan;
|
|
@@ -1768,10 +1783,11 @@ function parseMixed(nest) {
|
|
|
1768
1783
|
return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);
|
|
1769
1784
|
}
|
|
1770
1785
|
class InnerParse {
|
|
1771
|
-
constructor(parser, parse, overlay, target, from) {
|
|
1786
|
+
constructor(parser, parse, overlay, bracketed, target, from) {
|
|
1772
1787
|
this.parser = parser;
|
|
1773
1788
|
this.parse = parse;
|
|
1774
1789
|
this.overlay = overlay;
|
|
1790
|
+
this.bracketed = bracketed;
|
|
1775
1791
|
this.target = target;
|
|
1776
1792
|
this.from = from;
|
|
1777
1793
|
}
|
|
@@ -1781,12 +1797,13 @@ function checkRanges(ranges) {
|
|
|
1781
1797
|
throw new RangeError("Invalid inner parse ranges given: " + JSON.stringify(ranges));
|
|
1782
1798
|
}
|
|
1783
1799
|
class ActiveOverlay {
|
|
1784
|
-
constructor(parser, predicate, mounts, index, start, target, prev) {
|
|
1800
|
+
constructor(parser, predicate, mounts, index, start, bracketed, target, prev) {
|
|
1785
1801
|
this.parser = parser;
|
|
1786
1802
|
this.predicate = predicate;
|
|
1787
1803
|
this.mounts = mounts;
|
|
1788
1804
|
this.index = index;
|
|
1789
1805
|
this.start = start;
|
|
1806
|
+
this.bracketed = bracketed;
|
|
1790
1807
|
this.target = target;
|
|
1791
1808
|
this.prev = prev;
|
|
1792
1809
|
this.depth = 0;
|
|
@@ -1832,7 +1849,7 @@ class MixedParse {
|
|
|
1832
1849
|
// presumably not aliased anywhere else) to hold the information
|
|
1833
1850
|
// about the inner parse.
|
|
1834
1851
|
let props = Object.assign(Object.create(null), inner.target.props);
|
|
1835
|
-
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);
|
|
1836
1853
|
inner.target.props = props;
|
|
1837
1854
|
}
|
|
1838
1855
|
return null;
|
|
@@ -1893,7 +1910,7 @@ class MixedParse {
|
|
|
1893
1910
|
}
|
|
1894
1911
|
let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
|
|
1895
1912
|
if (typeof nest.overlay == "function") {
|
|
1896
|
-
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);
|
|
1897
1914
|
}
|
|
1898
1915
|
else {
|
|
1899
1916
|
let ranges = punchRanges(this.ranges, nest.overlay ||
|
|
@@ -1902,7 +1919,7 @@ class MixedParse {
|
|
|
1902
1919
|
checkRanges(ranges);
|
|
1903
1920
|
if (ranges.length || !nest.overlay)
|
|
1904
1921
|
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));
|
|
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));
|
|
1906
1923
|
if (!nest.overlay)
|
|
1907
1924
|
enter = false;
|
|
1908
1925
|
else if (ranges.length)
|
|
@@ -1936,7 +1953,7 @@ class MixedParse {
|
|
|
1936
1953
|
let ranges = punchRanges(this.ranges, overlay.ranges);
|
|
1937
1954
|
if (ranges.length) {
|
|
1938
1955
|
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));
|
|
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));
|
|
1940
1957
|
}
|
|
1941
1958
|
overlay = overlay.prev;
|
|
1942
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
|
|
@@ -918,6 +937,10 @@ interface SyntaxNode extends SyntaxNodeRef {
|
|
|
918
937
|
*/
|
|
919
938
|
prevSibling: SyntaxNode | null;
|
|
920
939
|
/**
|
|
940
|
+
Read the given node prop from this node.
|
|
941
|
+
*/
|
|
942
|
+
prop<T>(prop: NodeProp<T>): T | undefined;
|
|
943
|
+
/**
|
|
921
944
|
A [tree cursor](#common.TreeCursor) starting at this node.
|
|
922
945
|
*/
|
|
923
946
|
cursor(mode?: IterMode): TreeCursor;
|
|
@@ -1131,6 +1154,13 @@ interface NestedParse {
|
|
|
1131
1154
|
from: number;
|
|
1132
1155
|
to: number;
|
|
1133
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;
|
|
1134
1164
|
}
|
|
1135
1165
|
/**
|
|
1136
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
|
|
@@ -918,6 +937,10 @@ interface SyntaxNode extends SyntaxNodeRef {
|
|
|
918
937
|
*/
|
|
919
938
|
prevSibling: SyntaxNode | null;
|
|
920
939
|
/**
|
|
940
|
+
Read the given node prop from this node.
|
|
941
|
+
*/
|
|
942
|
+
prop<T>(prop: NodeProp<T>): T | undefined;
|
|
943
|
+
/**
|
|
921
944
|
A [tree cursor](#common.TreeCursor) starting at this node.
|
|
922
945
|
*/
|
|
923
946
|
cursor(mode?: IterMode): TreeCursor;
|
|
@@ -1131,6 +1154,13 @@ interface NestedParse {
|
|
|
1131
1154
|
from: number;
|
|
1132
1155
|
to: number;
|
|
1133
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;
|
|
1134
1164
|
}
|
|
1135
1165
|
/**
|
|
1136
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 (!
|
|
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)
|
|
@@ -765,13 +782,14 @@ class TreeNode extends BaseNode {
|
|
|
765
782
|
get lastChild() { return this.nextChild(this._tree.children.length - 1, -1, 0, 4 /* Side.DontCare */); }
|
|
766
783
|
childAfter(pos) { return this.nextChild(0, 1, pos, 2 /* Side.After */); }
|
|
767
784
|
childBefore(pos) { return this.nextChild(this._tree.children.length - 1, -1, pos, -2 /* Side.Before */); }
|
|
785
|
+
prop(prop) { return this._tree.prop(prop); }
|
|
768
786
|
enter(pos, side, mode = 0) {
|
|
769
787
|
let mounted;
|
|
770
788
|
if (!(mode & IterMode.IgnoreOverlays) && (mounted = MountedTree.get(this._tree)) && mounted.overlay) {
|
|
771
|
-
let rPos = pos - this.from;
|
|
789
|
+
let rPos = pos - this.from, enterBracketed = (mode & IterMode.EnterBracketed) && mounted.bracketed;
|
|
772
790
|
for (let { from, to } of mounted.overlay) {
|
|
773
|
-
if ((side > 0 ? from <= rPos : from < rPos) &&
|
|
774
|
-
(side < 0 ? to >= rPos : to > rPos))
|
|
791
|
+
if ((side > 0 || enterBracketed ? from <= rPos : from < rPos) &&
|
|
792
|
+
(side < 0 || enterBracketed ? to >= rPos : to > rPos))
|
|
775
793
|
return new TreeNode(mounted.tree, mounted.overlay[0].from + this.from, -1, this);
|
|
776
794
|
}
|
|
777
795
|
}
|
|
@@ -858,6 +876,7 @@ class BufferNode extends BaseNode {
|
|
|
858
876
|
get lastChild() { return this.child(-1, 0, 4 /* Side.DontCare */); }
|
|
859
877
|
childAfter(pos) { return this.child(1, pos, 2 /* Side.After */); }
|
|
860
878
|
childBefore(pos) { return this.child(-1, pos, -2 /* Side.Before */); }
|
|
879
|
+
prop(prop) { return this.type.prop(prop); }
|
|
861
880
|
enter(pos, side, mode = 0) {
|
|
862
881
|
if (mode & IterMode.ExcludeBuffers)
|
|
863
882
|
return null;
|
|
@@ -959,12 +978,7 @@ class TreeCursor {
|
|
|
959
978
|
/**
|
|
960
979
|
@internal
|
|
961
980
|
*/
|
|
962
|
-
constructor(node,
|
|
963
|
-
/**
|
|
964
|
-
@internal
|
|
965
|
-
*/
|
|
966
|
-
mode = 0) {
|
|
967
|
-
this.mode = mode;
|
|
981
|
+
constructor(node, mode = 0) {
|
|
968
982
|
/**
|
|
969
983
|
@internal
|
|
970
984
|
*/
|
|
@@ -975,6 +989,7 @@ class TreeCursor {
|
|
|
975
989
|
*/
|
|
976
990
|
this.index = 0;
|
|
977
991
|
this.bufferNode = null;
|
|
992
|
+
this.mode = mode & ~IterMode.EnterBracketed;
|
|
978
993
|
if (node instanceof TreeNode) {
|
|
979
994
|
this.yieldNode(node);
|
|
980
995
|
}
|
|
@@ -1439,7 +1454,7 @@ function buildTree(data) {
|
|
|
1439
1454
|
fork.next();
|
|
1440
1455
|
while (fork.pos > startPos) {
|
|
1441
1456
|
if (fork.size < 0) {
|
|
1442
|
-
if (fork.size == -3 /* SpecialRecord.ContextChange */)
|
|
1457
|
+
if (fork.size == -3 /* SpecialRecord.ContextChange */ || fork.size == -4 /* SpecialRecord.LookAhead */)
|
|
1443
1458
|
localSkipped += 4;
|
|
1444
1459
|
else
|
|
1445
1460
|
break scan;
|
|
@@ -1766,10 +1781,11 @@ function parseMixed(nest) {
|
|
|
1766
1781
|
return (parse, input, fragments, ranges) => new MixedParse(parse, nest, input, fragments, ranges);
|
|
1767
1782
|
}
|
|
1768
1783
|
class InnerParse {
|
|
1769
|
-
constructor(parser, parse, overlay, target, from) {
|
|
1784
|
+
constructor(parser, parse, overlay, bracketed, target, from) {
|
|
1770
1785
|
this.parser = parser;
|
|
1771
1786
|
this.parse = parse;
|
|
1772
1787
|
this.overlay = overlay;
|
|
1788
|
+
this.bracketed = bracketed;
|
|
1773
1789
|
this.target = target;
|
|
1774
1790
|
this.from = from;
|
|
1775
1791
|
}
|
|
@@ -1779,12 +1795,13 @@ function checkRanges(ranges) {
|
|
|
1779
1795
|
throw new RangeError("Invalid inner parse ranges given: " + JSON.stringify(ranges));
|
|
1780
1796
|
}
|
|
1781
1797
|
class ActiveOverlay {
|
|
1782
|
-
constructor(parser, predicate, mounts, index, start, target, prev) {
|
|
1798
|
+
constructor(parser, predicate, mounts, index, start, bracketed, target, prev) {
|
|
1783
1799
|
this.parser = parser;
|
|
1784
1800
|
this.predicate = predicate;
|
|
1785
1801
|
this.mounts = mounts;
|
|
1786
1802
|
this.index = index;
|
|
1787
1803
|
this.start = start;
|
|
1804
|
+
this.bracketed = bracketed;
|
|
1788
1805
|
this.target = target;
|
|
1789
1806
|
this.prev = prev;
|
|
1790
1807
|
this.depth = 0;
|
|
@@ -1830,7 +1847,7 @@ class MixedParse {
|
|
|
1830
1847
|
// presumably not aliased anywhere else) to hold the information
|
|
1831
1848
|
// about the inner parse.
|
|
1832
1849
|
let props = Object.assign(Object.create(null), inner.target.props);
|
|
1833
|
-
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);
|
|
1834
1851
|
inner.target.props = props;
|
|
1835
1852
|
}
|
|
1836
1853
|
return null;
|
|
@@ -1891,7 +1908,7 @@ class MixedParse {
|
|
|
1891
1908
|
}
|
|
1892
1909
|
let oldMounts = fragmentCursor.findMounts(cursor.from, nest.parser);
|
|
1893
1910
|
if (typeof nest.overlay == "function") {
|
|
1894
|
-
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);
|
|
1895
1912
|
}
|
|
1896
1913
|
else {
|
|
1897
1914
|
let ranges = punchRanges(this.ranges, nest.overlay ||
|
|
@@ -1900,7 +1917,7 @@ class MixedParse {
|
|
|
1900
1917
|
checkRanges(ranges);
|
|
1901
1918
|
if (ranges.length || !nest.overlay)
|
|
1902
1919
|
this.inner.push(new InnerParse(nest.parser, ranges.length ? nest.parser.startParse(this.input, enterFragments(oldMounts, ranges), ranges)
|
|
1903
|
-
: 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));
|
|
1904
1921
|
if (!nest.overlay)
|
|
1905
1922
|
enter = false;
|
|
1906
1923
|
else if (ranges.length)
|
|
@@ -1934,7 +1951,7 @@ class MixedParse {
|
|
|
1934
1951
|
let ranges = punchRanges(this.ranges, overlay.ranges);
|
|
1935
1952
|
if (ranges.length) {
|
|
1936
1953
|
checkRanges(ranges);
|
|
1937
|
-
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));
|
|
1938
1955
|
}
|
|
1939
1956
|
overlay = overlay.prev;
|
|
1940
1957
|
}
|