/** | |
The [`TreeFragment.applyChanges`](#common.TreeFragment^applyChanges) | |
method expects changed ranges in this format. | |
*/ | |
interface ChangedRange { | |
/** | |
The start of the change in the start document | |
*/ | |
fromA: number; | |
/** | |
The end of the change in the start document | |
*/ | |
toA: number; | |
/** | |
The start of the replacement in the new document | |
*/ | |
fromB: number; | |
/** | |
The end of the replacement in the new document | |
*/ | |
toB: number; | |
} | |
/** | |
Tree fragments are used during [incremental | |
parsing](#common.Parser.startParse) to track parts of old trees | |
that can be reused in a new parse. An array of fragments is used | |
to track regions of an old tree whose nodes might be reused in new | |
parses. Use the static | |
[`applyChanges`](#common.TreeFragment^applyChanges) method to | |
update fragments for document changes. | |
*/ | |
declare class TreeFragment { | |
/** | |
The start of the unchanged range pointed to by this fragment. | |
This refers to an offset in the _updated_ document (as opposed | |
to the original tree). | |
*/ | |
readonly from: number; | |
/** | |
The end of the unchanged range. | |
*/ | |
readonly to: number; | |
/** | |
The tree that this fragment is based on. | |
*/ | |
readonly tree: Tree; | |
/** | |
The offset between the fragment's tree and the document that | |
this fragment can be used against. Add this when going from | |
document to tree positions, subtract it to go from tree to | |
document positions. | |
*/ | |
readonly offset: number; | |
/** | |
Construct a tree fragment. You'll usually want to use | |
[`addTree`](#common.TreeFragment^addTree) and | |
[`applyChanges`](#common.TreeFragment^applyChanges) instead of | |
calling this directly. | |
*/ | |
constructor( | |
/** | |
The start of the unchanged range pointed to by this fragment. | |
This refers to an offset in the _updated_ document (as opposed | |
to the original tree). | |
*/ | |
from: number, | |
/** | |
The end of the unchanged range. | |
*/ | |
to: number, | |
/** | |
The tree that this fragment is based on. | |
*/ | |
tree: Tree, | |
/** | |
The offset between the fragment's tree and the document that | |
this fragment can be used against. Add this when going from | |
document to tree positions, subtract it to go from tree to | |
document positions. | |
*/ | |
offset: number, openStart?: boolean, openEnd?: boolean); | |
/** | |
Whether the start of the fragment represents the start of a | |
parse, or the end of a change. (In the second case, it may not | |
be safe to reuse some nodes at the start, depending on the | |
parsing algorithm.) | |
*/ | |
get openStart(): boolean; | |
/** | |
Whether the end of the fragment represents the end of a | |
full-document parse, or the start of a change. | |
*/ | |
get openEnd(): boolean; | |
/** | |
Create a set of fragments from a freshly parsed tree, or update | |
an existing set of fragments by replacing the ones that overlap | |
with a tree with content from the new tree. When `partial` is | |
true, the parse is treated as incomplete, and the resulting | |
fragment has [`openEnd`](#common.TreeFragment.openEnd) set to | |
true. | |
*/ | |
static addTree(tree: Tree, fragments?: readonly TreeFragment[], partial?: boolean): readonly TreeFragment[]; | |
/** | |
Apply a set of edits to an array of fragments, removing or | |
splitting fragments as necessary to remove edited ranges, and | |
adjusting offsets for fragments that moved. | |
*/ | |
static applyChanges(fragments: readonly TreeFragment[], changes: readonly ChangedRange[], minGap?: number): readonly TreeFragment[]; | |
} | |
/** | |
Interface used to represent an in-progress parse, which can be | |
moved forward piece-by-piece. | |
*/ | |
interface PartialParse { | |
/** | |
Advance the parse state by some amount. Will return the finished | |
syntax tree when the parse completes. | |
*/ | |
advance(): Tree | null; | |
/** | |
The position up to which the document has been parsed. Note | |
that, in multi-pass parsers, this will stay back until the last | |
pass has moved past a given position. | |
*/ | |
readonly parsedPos: number; | |
/** | |
Tell the parse to not advance beyond the given position. | |
`advance` will return a tree when the parse has reached the | |
position. Note that, depending on the parser algorithm and the | |
state of the parse when `stopAt` was called, that tree may | |
contain nodes beyond the position. It is an error to call | |
`stopAt` with a higher position than it's [current | |
value](#common.PartialParse.stoppedAt). | |
*/ | |
stopAt(pos: number): void; | |
/** | |
Reports whether `stopAt` has been called on this parse. | |
*/ | |
readonly stoppedAt: number | null; | |
} | |
/** | |
A superclass that parsers should extend. | |
*/ | |
declare abstract class Parser { | |
/** | |
Start a parse for a single tree. This is the method concrete | |
parser implementations must implement. Called by `startParse`, | |
with the optional arguments resolved. | |
*/ | |
abstract createParse(input: Input, fragments: readonly TreeFragment[], ranges: readonly { | |
from: number; | |
to: number; | |
}[]): PartialParse; | |
/** | |
Start a parse, returning a [partial parse](#common.PartialParse) | |
object. [`fragments`](#common.TreeFragment) can be passed in to | |
make the parse incremental. | |
By default, the entire input is parsed. You can pass `ranges`, | |
which should be a sorted array of non-empty, non-overlapping | |
ranges, to parse only those ranges. The tree returned in that | |
case will start at `ranges[0].from`. | |
*/ | |
startParse(input: Input | string, fragments?: readonly TreeFragment[], ranges?: readonly { | |
from: number; | |
to: number; | |
}[]): PartialParse; | |
/** | |
Run a full parse, returning the resulting tree. | |
*/ | |
parse(input: Input | string, fragments?: readonly TreeFragment[], ranges?: readonly { | |
from: number; | |
to: number; | |
}[]): Tree; | |
} | |
/** | |
This is the interface parsers use to access the document. To run | |
Lezer directly on your own document data structure, you have to | |
write an implementation of it. | |
*/ | |
interface Input { | |
/** | |
The length of the document. | |
*/ | |
readonly length: number; | |
/** | |
Get the chunk after the given position. The returned string | |
should start at `from` and, if that isn't the end of the | |
document, may be of any length greater than zero. | |
*/ | |
chunk(from: number): string; | |
/** | |
Indicates whether the chunks already end at line breaks, so that | |
client code that wants to work by-line can avoid re-scanning | |
them for line breaks. When this is true, the result of `chunk()` | |
should either be a single line break, or the content between | |
`from` and the next line break. | |
*/ | |
readonly lineChunks: boolean; | |
/** | |
Read the part of the document between the given positions. | |
*/ | |
read(from: number, to: number): string; | |
} | |
/** | |
Parse wrapper functions are supported by some parsers to inject | |
additional parsing logic. | |
*/ | |
type ParseWrapper = (inner: PartialParse, input: Input, fragments: readonly TreeFragment[], ranges: readonly { | |
from: number; | |
to: number; | |
}[]) => PartialParse; | |
/** | |
The default maximum length of a `TreeBuffer` node. | |
*/ | |
declare const DefaultBufferLength = 1024; | |
/** | |
Each [node type](#common.NodeType) or [individual tree](#common.Tree) | |
can have metadata associated with it in props. Instances of this | |
class represent prop names. | |
*/ | |
declare class NodeProp<T> { | |
/** | |
Indicates whether this prop is stored per [node | |
type](#common.NodeType) or per [tree node](#common.Tree). | |
*/ | |
perNode: boolean; | |
/** | |
A method that deserializes a value of this prop from a string. | |
Can be used to allow a prop to be directly written in a grammar | |
file. | |
*/ | |
deserialize: (str: string) => T; | |
/** | |
Create a new node prop type. | |
*/ | |
constructor(config?: { | |
/** | |
The [deserialize](#common.NodeProp.deserialize) function to | |
use for this prop, used for example when directly providing | |
the prop from a grammar file. Defaults to a function that | |
raises an error. | |
*/ | |
deserialize?: (str: string) => T; | |
/** | |
By default, node props are stored in the [node | |
type](#common.NodeType). It can sometimes be useful to directly | |
store information (usually related to the parsing algorithm) | |
in [nodes](#common.Tree) themselves. Set this to true to enable | |
that for this prop. | |
*/ | |
perNode?: boolean; | |
}); | |
/** | |
This is meant to be used with | |
[`NodeSet.extend`](#common.NodeSet.extend) or | |
[`LRParser.configure`](#lr.ParserConfig.props) to compute | |
prop values for each node type in the set. Takes a [match | |
object](#common.NodeType^match) or function that returns undefined | |
if the node type doesn't get this prop, and the prop's value if | |
it does. | |
*/ | |
add(match: { | |
[selector: string]: T; | |
} | ((type: NodeType) => T | undefined)): NodePropSource; | |
/** | |
Prop that is used to describe matching delimiters. For opening | |
delimiters, this holds an array of node names (written as a | |
space-separated string when declaring this prop in a grammar) | |
for the node types of closing delimiters that match it. | |
*/ | |
static closedBy: NodeProp<readonly string[]>; | |
/** | |
The inverse of [`closedBy`](#common.NodeProp^closedBy). This is | |
attached to closing delimiters, holding an array of node names | |
of types of matching opening delimiters. | |
*/ | |
static openedBy: NodeProp<readonly string[]>; | |
/** | |
Used to assign node types to groups (for example, all node | |
types that represent an expression could be tagged with an | |
`"Expression"` group). | |
*/ | |
static group: NodeProp<readonly string[]>; | |
/** | |
Attached to nodes to indicate these should be | |
[displayed](https://codemirror.net/docs/ref/#language.syntaxTree) | |
in a bidirectional text isolate, so that direction-neutral | |
characters on their sides don't incorrectly get associated with | |
surrounding text. You'll generally want to set this for nodes | |
that contain arbitrary text, like strings and comments, and for | |
nodes that appear _inside_ arbitrary text, like HTML tags. When | |
not given a value, in a grammar declaration, defaults to | |
`"auto"`. | |
*/ | |
static isolate: NodeProp<"rtl" | "ltr" | "auto">; | |
/** | |
The hash of the [context](#lr.ContextTracker.constructor) | |
that the node was parsed in, if any. Used to limit reuse of | |
contextual nodes. | |
*/ | |
static contextHash: NodeProp<number>; | |
/** | |
The distance beyond the end of the node that the tokenizer | |
looked ahead for any of the tokens inside the node. (The LR | |
parser only stores this when it is larger than 25, for | |
efficiency reasons.) | |
*/ | |
static lookAhead: NodeProp<number>; | |
/** | |
This per-node prop is used to replace a given node, or part of a | |
node, with another tree. This is useful to include trees from | |
different languages in mixed-language parsers. | |
*/ | |
static mounted: NodeProp<MountedTree>; | |
} | |
/** | |
A mounted tree, which can be [stored](#common.NodeProp^mounted) on | |
a tree node to indicate that parts of its content are | |
represented by another tree. | |
*/ | |
declare class MountedTree { | |
/** | |
The inner tree. | |
*/ | |
readonly tree: Tree; | |
/** | |
If this is null, this tree replaces the entire node (it will | |
be included in the regular iteration instead of its host | |
node). If not, only the given ranges are considered to be | |
covered by this tree. This is used for trees that are mixed in | |
a way that isn't strictly hierarchical. Such mounted trees are | |
only entered by [`resolveInner`](#common.Tree.resolveInner) | |
and [`enter`](#common.SyntaxNode.enter). | |
*/ | |
readonly overlay: readonly { | |
from: number; | |
to: number; | |
}[] | null; | |
/** | |
The parser used to create this subtree. | |
*/ | |
readonly parser: Parser; | |
constructor( | |
/** | |
The inner tree. | |
*/ | |
tree: Tree, | |
/** | |
If this is null, this tree replaces the entire node (it will | |
be included in the regular iteration instead of its host | |
node). If not, only the given ranges are considered to be | |
covered by this tree. This is used for trees that are mixed in | |
a way that isn't strictly hierarchical. Such mounted trees are | |
only entered by [`resolveInner`](#common.Tree.resolveInner) | |
and [`enter`](#common.SyntaxNode.enter). | |
*/ | |
overlay: readonly { | |
from: number; | |
to: number; | |
}[] | null, | |
/** | |
The parser used to create this subtree. | |
*/ | |
parser: Parser); | |
} | |
/** | |
Type returned by [`NodeProp.add`](#common.NodeProp.add). Describes | |
whether a prop should be added to a given node type in a node set, | |
and what value it should have. | |
*/ | |
type NodePropSource = (type: NodeType) => null | [NodeProp<any>, any]; | |
/** | |
Each node in a syntax tree has a node type associated with it. | |
*/ | |
declare class NodeType { | |
/** | |
The name of the node type. Not necessarily unique, but if the | |
grammar was written properly, different node types with the | |
same name within a node set should play the same semantic | |
role. | |
*/ | |
readonly name: string; | |
/** | |
The id of this node in its set. Corresponds to the term ids | |
used in the parser. | |
*/ | |
readonly id: number; | |
/** | |
Define a node type. | |
*/ | |
static define(spec: { | |
/** | |
The ID of the node type. When this type is used in a | |
[set](#common.NodeSet), the ID must correspond to its index in | |
the type array. | |
*/ | |
id: number; | |
/** | |
The name of the node type. Leave empty to define an anonymous | |
node. | |
*/ | |
name?: string; | |
/** | |
[Node props](#common.NodeProp) to assign to the type. The value | |
given for any given prop should correspond to the prop's type. | |
*/ | |
props?: readonly ([NodeProp<any>, any] | NodePropSource)[]; | |
/** | |
Whether this is a [top node](#common.NodeType.isTop). | |
*/ | |
top?: boolean; | |
/** | |
Whether this node counts as an [error | |
node](#common.NodeType.isError). | |
*/ | |
error?: boolean; | |
/** | |
Whether this node is a [skipped](#common.NodeType.isSkipped) | |
node. | |
*/ | |
skipped?: boolean; | |
}): NodeType; | |
/** | |
Retrieves a node prop for this type. Will return `undefined` if | |
the prop isn't present on this node. | |
*/ | |
prop<T>(prop: NodeProp<T>): T | undefined; | |
/** | |
True when this is the top node of a grammar. | |
*/ | |
get isTop(): boolean; | |
/** | |
True when this node is produced by a skip rule. | |
*/ | |
get isSkipped(): boolean; | |
/** | |
Indicates whether this is an error node. | |
*/ | |
get isError(): boolean; | |
/** | |
When true, this node type doesn't correspond to a user-declared | |
named node, for example because it is used to cache repetition. | |
*/ | |
get isAnonymous(): boolean; | |
/** | |
Returns true when this node's name or one of its | |
[groups](#common.NodeProp^group) matches the given string. | |
*/ | |
is(name: string | number): boolean; | |
/** | |
An empty dummy node type to use when no actual type is available. | |
*/ | |
static none: NodeType; | |
/** | |
Create a function from node types to arbitrary values by | |
specifying an object whose property names are node or | |
[group](#common.NodeProp^group) names. Often useful with | |
[`NodeProp.add`](#common.NodeProp.add). You can put multiple | |
names, separated by spaces, in a single property name to map | |
multiple node names to a single value. | |
*/ | |
static match<T>(map: { | |
[selector: string]: T; | |
}): (node: NodeType) => T | undefined; | |
} | |
/** | |
A node set holds a collection of node types. It is used to | |
compactly represent trees by storing their type ids, rather than a | |
full pointer to the type object, in a numeric array. Each parser | |
[has](#lr.LRParser.nodeSet) a node set, and [tree | |
buffers](#common.TreeBuffer) can only store collections of nodes | |
from the same set. A set can have a maximum of 2**16 (65536) node | |
types in it, so that the ids fit into 16-bit typed array slots. | |
*/ | |
declare class NodeSet { | |
/** | |
The node types in this set, by id. | |
*/ | |
readonly types: readonly NodeType[]; | |
/** | |
Create a set with the given types. The `id` property of each | |
type should correspond to its position within the array. | |
*/ | |
constructor( | |
/** | |
The node types in this set, by id. | |
*/ | |
types: readonly NodeType[]); | |
/** | |
Create a copy of this set with some node properties added. The | |
arguments to this method can be created with | |
[`NodeProp.add`](#common.NodeProp.add). | |
*/ | |
extend(...props: NodePropSource[]): NodeSet; | |
} | |
/** | |
Options that control iteration. Can be combined with the `|` | |
operator to enable multiple ones. | |
*/ | |
declare enum IterMode { | |
/** | |
When enabled, iteration will only visit [`Tree`](#common.Tree) | |
objects, not nodes packed into | |
[`TreeBuffer`](#common.TreeBuffer)s. | |
*/ | |
ExcludeBuffers = 1, | |
/** | |
Enable this to make iteration include anonymous nodes (such as | |
the nodes that wrap repeated grammar constructs into a balanced | |
tree). | |
*/ | |
IncludeAnonymous = 2, | |
/** | |
By default, regular [mounted](#common.NodeProp^mounted) nodes | |
replace their base node in iteration. Enable this to ignore them | |
instead. | |
*/ | |
IgnoreMounts = 4, | |
/** | |
This option only applies in | |
[`enter`](#common.SyntaxNode.enter)-style methods. It tells the | |
library to not enter mounted overlays if one covers the given | |
position. | |
*/ | |
IgnoreOverlays = 8 | |
} | |
/** | |
A piece of syntax tree. There are two ways to approach these | |
trees: the way they are actually stored in memory, and the | |
convenient way. | |
Syntax trees are stored as a tree of `Tree` and `TreeBuffer` | |
objects. By packing detail information into `TreeBuffer` leaf | |
nodes, the representation is made a lot more memory-efficient. | |
However, when you want to actually work with tree nodes, this | |
representation is very awkward, so most client code will want to | |
use the [`TreeCursor`](#common.TreeCursor) or | |
[`SyntaxNode`](#common.SyntaxNode) interface instead, which provides | |
a view on some part of this data structure, and can be used to | |
move around to adjacent nodes. | |
*/ | |
declare class Tree { | |
/** | |
The type of the top node. | |
*/ | |
readonly type: NodeType; | |
/** | |
This node's child nodes. | |
*/ | |
readonly children: readonly (Tree | TreeBuffer)[]; | |
/** | |
The positions (offsets relative to the start of this tree) of | |
the children. | |
*/ | |
readonly positions: readonly number[]; | |
/** | |
The total length of this tree | |
*/ | |
readonly length: number; | |
/** | |
Construct a new tree. See also [`Tree.build`](#common.Tree^build). | |
*/ | |
constructor( | |
/** | |
The type of the top node. | |
*/ | |
type: NodeType, | |
/** | |
This node's child nodes. | |
*/ | |
children: readonly (Tree | TreeBuffer)[], | |
/** | |
The positions (offsets relative to the start of this tree) of | |
the children. | |
*/ | |
positions: readonly number[], | |
/** | |
The total length of this tree | |
*/ | |
length: number, | |
/** | |
Per-node [node props](#common.NodeProp) to associate with this node. | |
*/ | |
props?: readonly [NodeProp<any> | number, any][]); | |
/** | |
The empty tree | |
*/ | |
static empty: Tree; | |
/** | |
Get a [tree cursor](#common.TreeCursor) positioned at the top of | |
the tree. Mode can be used to [control](#common.IterMode) which | |
nodes the cursor visits. | |
*/ | |
cursor(mode?: IterMode): TreeCursor; | |
/** | |
Get a [tree cursor](#common.TreeCursor) pointing into this tree | |
at the given position and side (see | |
[`moveTo`](#common.TreeCursor.moveTo). | |
*/ | |
cursorAt(pos: number, side?: -1 | 0 | 1, mode?: IterMode): TreeCursor; | |
/** | |
Get a [syntax node](#common.SyntaxNode) object for the top of the | |
tree. | |
*/ | |
get topNode(): SyntaxNode; | |
/** | |
Get the [syntax node](#common.SyntaxNode) at the given position. | |
If `side` is -1, this will move into nodes that end at the | |
position. If 1, it'll move into nodes that start at the | |
position. With 0, it'll only enter nodes that cover the position | |
from both sides. | |
Note that this will not enter | |
[overlays](#common.MountedTree.overlay), and you often want | |
[`resolveInner`](#common.Tree.resolveInner) instead. | |
*/ | |
resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode; | |
/** | |
Like [`resolve`](#common.Tree.resolve), but will enter | |
[overlaid](#common.MountedTree.overlay) nodes, producing a syntax node | |
pointing into the innermost overlaid tree at the given position | |
(with parent links going through all parent structure, including | |
the host trees). | |
*/ | |
resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode; | |
/** | |
In some situations, it can be useful to iterate through all | |
nodes around a position, including those in overlays that don't | |
directly cover the position. This method gives you an iterator | |
that will produce all nodes, from small to big, around the given | |
position. | |
*/ | |
resolveStack(pos: number, side?: -1 | 0 | 1): NodeIterator; | |
/** | |
Iterate over the tree and its children, calling `enter` for any | |
node that touches the `from`/`to` region (if given) before | |
running over such a node's children, and `leave` (if given) when | |
leaving the node. When `enter` returns `false`, that node will | |
not have its children iterated over (or `leave` called). | |
*/ | |
iterate(spec: { | |
enter(node: SyntaxNodeRef): boolean | void; | |
leave?(node: SyntaxNodeRef): void; | |
from?: number; | |
to?: number; | |
mode?: IterMode; | |
}): void; | |
/** | |
Get the value of the given [node prop](#common.NodeProp) for this | |
node. Works with both per-node and per-type props. | |
*/ | |
prop<T>(prop: NodeProp<T>): T | undefined; | |
/** | |
Returns the node's [per-node props](#common.NodeProp.perNode) in a | |
format that can be passed to the [`Tree`](#common.Tree) | |
constructor. | |
*/ | |
get propValues(): readonly [NodeProp<any> | number, any][]; | |
/** | |
Balance the direct children of this tree, producing a copy of | |
which may have children grouped into subtrees with type | |
[`NodeType.none`](#common.NodeType^none). | |
*/ | |
balance(config?: { | |
/** | |
Function to create the newly balanced subtrees. | |
*/ | |
makeTree?: (children: readonly (Tree | TreeBuffer)[], positions: readonly number[], length: number) => Tree; | |
}): Tree; | |
/** | |
Build a tree from a postfix-ordered buffer of node information, | |
or a cursor over such a buffer. | |
*/ | |
static build(data: BuildData): Tree; | |
} | |
/** | |
Represents a sequence of nodes. | |
*/ | |
type NodeIterator = { | |
node: SyntaxNode; | |
next: NodeIterator | null; | |
}; | |
type BuildData = { | |
/** | |
The buffer or buffer cursor to read the node data from. | |
When this is an array, it should contain four values for every | |
node in the tree. | |
- The first holds the node's type, as a node ID pointing into | |
the given `NodeSet`. | |
- The second holds the node's start offset. | |
- The third the end offset. | |
- The fourth the amount of space taken up in the array by this | |
node and its children. Since there's four values per node, | |
this is the total number of nodes inside this node (children | |
and transitive children) plus one for the node itself, times | |
four. | |
Parent nodes should appear _after_ child nodes in the array. As | |
an example, a node of type 10 spanning positions 0 to 4, with | |
two children, of type 11 and 12, might look like this: | |
[11, 0, 1, 4, 12, 2, 4, 4, 10, 0, 4, 12] | |
*/ | |
buffer: BufferCursor | readonly number[]; | |
/** | |
The node types to use. | |
*/ | |
nodeSet: NodeSet; | |
/** | |
The id of the top node type. | |
*/ | |
topID: number; | |
/** | |
The position the tree should start at. Defaults to 0. | |
*/ | |
start?: number; | |
/** | |
The position in the buffer where the function should stop | |
reading. Defaults to 0. | |
*/ | |
bufferStart?: number; | |
/** | |
The length of the wrapping node. The end offset of the last | |
child is used when not provided. | |
*/ | |
length?: number; | |
/** | |
The maximum buffer length to use. Defaults to | |
[`DefaultBufferLength`](#common.DefaultBufferLength). | |
*/ | |
maxBufferLength?: number; | |
/** | |
An optional array holding reused nodes that the buffer can refer | |
to. | |
*/ | |
reused?: readonly Tree[]; | |
/** | |
The first node type that indicates repeat constructs in this | |
grammar. | |
*/ | |
minRepeatType?: number; | |
}; | |
/** | |
This is used by `Tree.build` as an abstraction for iterating over | |
a tree buffer. A cursor initially points at the very last element | |
in the buffer. Every time `next()` is called it moves on to the | |
previous one. | |
*/ | |
interface BufferCursor { | |
/** | |
The current buffer position (four times the number of nodes | |
remaining). | |
*/ | |
pos: number; | |
/** | |
The node ID of the next node in the buffer. | |
*/ | |
id: number; | |
/** | |
The start position of the next node in the buffer. | |
*/ | |
start: number; | |
/** | |
The end position of the next node. | |
*/ | |
end: number; | |
/** | |
The size of the next node (the number of nodes inside, counting | |
the node itself, times 4). | |
*/ | |
size: number; | |
/** | |
Moves `this.pos` down by 4. | |
*/ | |
next(): void; | |
/** | |
Create a copy of this cursor. | |
*/ | |
fork(): BufferCursor; | |
} | |
/** | |
Tree buffers contain (type, start, end, endIndex) quads for each | |
node. In such a buffer, nodes are stored in prefix order (parents | |
before children, with the endIndex of the parent indicating which | |
children belong to it). | |
*/ | |
declare class TreeBuffer { | |
/** | |
The buffer's content. | |
*/ | |
readonly buffer: Uint16Array; | |
/** | |
The total length of the group of nodes in the buffer. | |
*/ | |
readonly length: number; | |
/** | |
The node set used in this buffer. | |
*/ | |
readonly set: NodeSet; | |
/** | |
Create a tree buffer. | |
*/ | |
constructor( | |
/** | |
The buffer's content. | |
*/ | |
buffer: Uint16Array, | |
/** | |
The total length of the group of nodes in the buffer. | |
*/ | |
length: number, | |
/** | |
The node set used in this buffer. | |
*/ | |
set: NodeSet); | |
} | |
/** | |
The set of properties provided by both [`SyntaxNode`](#common.SyntaxNode) | |
and [`TreeCursor`](#common.TreeCursor). Note that, if you need | |
an object that is guaranteed to stay stable in the future, you | |
need to use the [`node`](#common.SyntaxNodeRef.node) accessor. | |
*/ | |
interface SyntaxNodeRef { | |
/** | |
The start position of the node. | |
*/ | |
readonly from: number; | |
/** | |
The end position of the node. | |
*/ | |
readonly to: number; | |
/** | |
The type of the node. | |
*/ | |
readonly type: NodeType; | |
/** | |
The name of the node (`.type.name`). | |
*/ | |
readonly name: string; | |
/** | |
Get the [tree](#common.Tree) that represents the current node, | |
if any. Will return null when the node is in a [tree | |
buffer](#common.TreeBuffer). | |
*/ | |
readonly tree: Tree | null; | |
/** | |
Retrieve a stable [syntax node](#common.SyntaxNode) at this | |
position. | |
*/ | |
readonly node: SyntaxNode; | |
/** | |
Test whether the node matches a given context—a sequence of | |
direct parent nodes. Empty strings in the context array act as | |
wildcards, other strings must match the ancestor node's name. | |
*/ | |
matchContext(context: readonly string[]): boolean; | |
} | |
/** | |
A syntax node provides an immutable pointer to a given node in a | |
tree. When iterating over large amounts of nodes, you may want to | |
use a mutable [cursor](#common.TreeCursor) instead, which is more | |
efficient. | |
*/ | |
interface SyntaxNode extends SyntaxNodeRef { | |
/** | |
The node's parent node, if any. | |
*/ | |
parent: SyntaxNode | null; | |
/** | |
The first child, if the node has children. | |
*/ | |
firstChild: SyntaxNode | null; | |
/** | |
The node's last child, if available. | |
*/ | |
lastChild: SyntaxNode | null; | |
/** | |
The first child that ends after `pos`. | |
*/ | |
childAfter(pos: number): SyntaxNode | null; | |
/** | |
The last child that starts before `pos`. | |
*/ | |
childBefore(pos: number): SyntaxNode | null; | |
/** | |
Enter the child at the given position. If side is -1 the child | |
may end at that position, when 1 it may start there. | |
This will by default enter | |
[overlaid](#common.MountedTree.overlay) | |
[mounted](#common.NodeProp^mounted) trees. You can set | |
`overlays` to false to disable that. | |
Similarly, when `buffers` is false this will not enter | |
[buffers](#common.TreeBuffer), only [nodes](#common.Tree) (which | |
is mostly useful when looking for props, which cannot exist on | |
buffer-allocated nodes). | |
*/ | |
enter(pos: number, side: -1 | 0 | 1, mode?: IterMode): SyntaxNode | null; | |
/** | |
This node's next sibling, if any. | |
*/ | |
nextSibling: SyntaxNode | null; | |
/** | |
This node's previous sibling. | |
*/ | |
prevSibling: SyntaxNode | null; | |
/** | |
A [tree cursor](#common.TreeCursor) starting at this node. | |
*/ | |
cursor(mode?: IterMode): TreeCursor; | |
/** | |
Find the node around, before (if `side` is -1), or after (`side` | |
is 1) the given position. Will look in parent nodes if the | |
position is outside this node. | |
*/ | |
resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode; | |
/** | |
Similar to `resolve`, but enter | |
[overlaid](#common.MountedTree.overlay) nodes. | |
*/ | |
resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode; | |
/** | |
Move the position to the innermost node before `pos` that looks | |
like it is unfinished (meaning it ends in an error node or has a | |
child ending in an error node right at its end). | |
*/ | |
enterUnfinishedNodesBefore(pos: number): SyntaxNode; | |
/** | |
Get a [tree](#common.Tree) for this node. Will allocate one if it | |
points into a buffer. | |
*/ | |
toTree(): Tree; | |
/** | |
Get the first child of the given type (which may be a [node | |
name](#common.NodeType.name) or a [group | |
name](#common.NodeProp^group)). If `before` is non-null, only | |
return children that occur somewhere after a node with that name | |
or group. If `after` is non-null, only return children that | |
occur somewhere before a node with that name or group. | |
*/ | |
getChild(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode | null; | |
/** | |
Like [`getChild`](#common.SyntaxNode.getChild), but return all | |
matching children, not just the first. | |
*/ | |
getChildren(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode[]; | |
} | |
/** | |
A tree cursor object focuses on a given node in a syntax tree, and | |
allows you to move to adjacent nodes. | |
*/ | |
declare class TreeCursor implements SyntaxNodeRef { | |
/** | |
The node's type. | |
*/ | |
type: NodeType; | |
/** | |
Shorthand for `.type.name`. | |
*/ | |
get name(): string; | |
/** | |
The start source offset of this node. | |
*/ | |
from: number; | |
/** | |
The end source offset. | |
*/ | |
to: number; | |
private stack; | |
private bufferNode; | |
private yieldNode; | |
private yieldBuf; | |
/** | |
Move the cursor to this node's first child. When this returns | |
false, the node has no child, and the cursor has not been moved. | |
*/ | |
firstChild(): boolean; | |
/** | |
Move the cursor to this node's last child. | |
*/ | |
lastChild(): boolean; | |
/** | |
Move the cursor to the first child that ends after `pos`. | |
*/ | |
childAfter(pos: number): boolean; | |
/** | |
Move to the last child that starts before `pos`. | |
*/ | |
childBefore(pos: number): boolean; | |
/** | |
Move the cursor to the child around `pos`. If side is -1 the | |
child may end at that position, when 1 it may start there. This | |
will also enter [overlaid](#common.MountedTree.overlay) | |
[mounted](#common.NodeProp^mounted) trees unless `overlays` is | |
set to false. | |
*/ | |
enter(pos: number, side: -1 | 0 | 1, mode?: IterMode): boolean; | |
/** | |
Move to the node's parent node, if this isn't the top node. | |
*/ | |
parent(): boolean; | |
/** | |
Move to this node's next sibling, if any. | |
*/ | |
nextSibling(): boolean; | |
/** | |
Move to this node's previous sibling, if any. | |
*/ | |
prevSibling(): boolean; | |
private atLastNode; | |
private move; | |
/** | |
Move to the next node in a | |
[pre-order](https://en.wikipedia.org/wiki/Tree_traversal#Pre-order,_NLR) | |
traversal, going from a node to its first child or, if the | |
current node is empty or `enter` is false, its next sibling or | |
the next sibling of the first parent node that has one. | |
*/ | |
next(enter?: boolean): boolean; | |
/** | |
Move to the next node in a last-to-first pre-order traveral. A | |
node is followed by its last child or, if it has none, its | |
previous sibling or the previous sibling of the first parent | |
node that has one. | |
*/ | |
prev(enter?: boolean): boolean; | |
/** | |
Move the cursor to the innermost node that covers `pos`. If | |
`side` is -1, it will enter nodes that end at `pos`. If it is 1, | |
it will enter nodes that start at `pos`. | |
*/ | |
moveTo(pos: number, side?: -1 | 0 | 1): this; | |
/** | |
Get a [syntax node](#common.SyntaxNode) at the cursor's current | |
position. | |
*/ | |
get node(): SyntaxNode; | |
/** | |
Get the [tree](#common.Tree) that represents the current node, if | |
any. Will return null when the node is in a [tree | |
buffer](#common.TreeBuffer). | |
*/ | |
get tree(): Tree | null; | |
/** | |
Iterate over the current node and all its descendants, calling | |
`enter` when entering a node and `leave`, if given, when leaving | |
one. When `enter` returns `false`, any children of that node are | |
skipped, and `leave` isn't called for it. | |
*/ | |
iterate(enter: (node: SyntaxNodeRef) => boolean | void, leave?: (node: SyntaxNodeRef) => void): void; | |
/** | |
Test whether the current node matches a given context—a sequence | |
of direct parent node names. Empty strings in the context array | |
are treated as wildcards. | |
*/ | |
matchContext(context: readonly string[]): boolean; | |
} | |
/** | |
Provides a way to associate values with pieces of trees. As long | |
as that part of the tree is reused, the associated values can be | |
retrieved from an updated tree. | |
*/ | |
declare class NodeWeakMap<T> { | |
private map; | |
private setBuffer; | |
private getBuffer; | |
/** | |
Set the value for this syntax node. | |
*/ | |
set(node: SyntaxNode, value: T): void; | |
/** | |
Retrieve value for this syntax node, if it exists in the map. | |
*/ | |
get(node: SyntaxNode): T | undefined; | |
/** | |
Set the value for the node that a cursor currently points to. | |
*/ | |
cursorSet(cursor: TreeCursor, value: T): void; | |
/** | |
Retrieve the value for the node that a cursor currently points | |
to. | |
*/ | |
cursorGet(cursor: TreeCursor): T | undefined; | |
} | |
/** | |
Objects returned by the function passed to | |
[`parseMixed`](#common.parseMixed) should conform to this | |
interface. | |
*/ | |
interface NestedParse { | |
/** | |
The parser to use for the inner region. | |
*/ | |
parser: Parser; | |
/** | |
When this property is not given, the entire node is parsed with | |
this parser, and it is [mounted](#common.NodeProp^mounted) as a | |
non-overlay node, replacing its host node in tree iteration. | |
When an array of ranges is given, only those ranges are parsed, | |
and the tree is mounted as an | |
[overlay](#common.MountedTree.overlay). | |
When a function is given, that function will be called for | |
descendant nodes of the target node, not including child nodes | |
that are covered by another nested parse, to determine the | |
overlay ranges. When it returns true, the entire descendant is | |
included, otherwise just the range given. The mixed parser will | |
optimize range-finding in reused nodes, which means it's a good | |
idea to use a function here when the target node is expected to | |
have a large, deep structure. | |
*/ | |
overlay?: readonly { | |
from: number; | |
to: number; | |
}[] | ((node: SyntaxNodeRef) => { | |
from: number; | |
to: number; | |
} | boolean); | |
} | |
/** | |
Create a parse wrapper that, after the inner parse completes, | |
scans its tree for mixed language regions with the `nest` | |
function, runs the resulting [inner parses](#common.NestedParse), | |
and then [mounts](#common.NodeProp^mounted) their results onto the | |
tree. | |
*/ | |
declare function parseMixed(nest: (node: SyntaxNodeRef, input: Input) => NestedParse | null): ParseWrapper; | |
export { BufferCursor, ChangedRange, DefaultBufferLength, Input, IterMode, MountedTree, NestedParse, NodeIterator, NodeProp, NodePropSource, NodeSet, NodeType, NodeWeakMap, ParseWrapper, Parser, PartialParse, SyntaxNode, SyntaxNodeRef, Tree, TreeBuffer, TreeCursor, TreeFragment, parseMixed }; | |