tree.d.ts 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import { Parser } from "./parse";
  2. export declare const DefaultBufferLength = 1024;
  3. export declare class Range {
  4. readonly from: number;
  5. readonly to: number;
  6. constructor(from: number, to: number);
  7. }
  8. export declare class NodeProp<T> {
  9. perNode: boolean;
  10. deserialize: (str: string) => T;
  11. constructor(config?: {
  12. deserialize?: (str: string) => T;
  13. perNode?: boolean;
  14. });
  15. add(match: {
  16. [selector: string]: T;
  17. } | ((type: NodeType) => T | undefined)): NodePropSource;
  18. static closedBy: NodeProp<readonly string[]>;
  19. static openedBy: NodeProp<readonly string[]>;
  20. static group: NodeProp<readonly string[]>;
  21. static contextHash: NodeProp<number>;
  22. static lookAhead: NodeProp<number>;
  23. static mounted: NodeProp<MountedTree>;
  24. }
  25. export declare class MountedTree {
  26. readonly tree: Tree;
  27. readonly overlay: readonly {
  28. from: number;
  29. to: number;
  30. }[] | null;
  31. readonly parser: Parser;
  32. constructor(tree: Tree, overlay: readonly {
  33. from: number;
  34. to: number;
  35. }[] | null, parser: Parser);
  36. }
  37. export declare type NodePropSource = (type: NodeType) => null | [NodeProp<any>, any];
  38. export declare class NodeType {
  39. readonly name: string;
  40. readonly id: number;
  41. static define(spec: {
  42. id: number;
  43. name?: string;
  44. props?: readonly ([NodeProp<any>, any] | NodePropSource)[];
  45. top?: boolean;
  46. error?: boolean;
  47. skipped?: boolean;
  48. }): NodeType;
  49. prop<T>(prop: NodeProp<T>): T | undefined;
  50. get isTop(): boolean;
  51. get isSkipped(): boolean;
  52. get isError(): boolean;
  53. get isAnonymous(): boolean;
  54. is(name: string | number): boolean;
  55. static none: NodeType;
  56. static match<T>(map: {
  57. [selector: string]: T;
  58. }): (node: NodeType) => T | undefined;
  59. }
  60. export declare class NodeSet {
  61. readonly types: readonly NodeType[];
  62. constructor(types: readonly NodeType[]);
  63. extend(...props: NodePropSource[]): NodeSet;
  64. }
  65. export declare enum IterMode {
  66. ExcludeBuffers = 1,
  67. IncludeAnonymous = 2,
  68. IgnoreMounts = 4,
  69. IgnoreOverlays = 8
  70. }
  71. export declare class Tree {
  72. readonly type: NodeType;
  73. readonly children: readonly (Tree | TreeBuffer)[];
  74. readonly positions: readonly number[];
  75. readonly length: number;
  76. constructor(type: NodeType, children: readonly (Tree | TreeBuffer)[], positions: readonly number[], length: number, props?: readonly [NodeProp<any> | number, any][]);
  77. static empty: Tree;
  78. cursor(mode?: IterMode): TreeCursor;
  79. cursorAt(pos: number, side?: -1 | 0 | 1, mode?: IterMode): TreeCursor;
  80. get topNode(): SyntaxNode;
  81. resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  82. resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  83. iterate(spec: {
  84. enter(node: SyntaxNodeRef): boolean | void;
  85. leave?(node: SyntaxNodeRef): void;
  86. from?: number;
  87. to?: number;
  88. mode?: IterMode;
  89. }): void;
  90. prop<T>(prop: NodeProp<T>): T | undefined;
  91. get propValues(): readonly [NodeProp<any> | number, any][];
  92. balance(config?: {
  93. makeTree?: (children: readonly (Tree | TreeBuffer)[], positions: readonly number[], length: number) => Tree;
  94. }): Tree;
  95. static build(data: BuildData): Tree;
  96. }
  97. declare type BuildData = {
  98. buffer: BufferCursor | readonly number[];
  99. nodeSet: NodeSet;
  100. topID: number;
  101. start?: number;
  102. bufferStart?: number;
  103. length?: number;
  104. maxBufferLength?: number;
  105. reused?: readonly Tree[];
  106. minRepeatType?: number;
  107. };
  108. export interface BufferCursor {
  109. pos: number;
  110. id: number;
  111. start: number;
  112. end: number;
  113. size: number;
  114. next(): void;
  115. fork(): BufferCursor;
  116. }
  117. export declare class TreeBuffer {
  118. readonly buffer: Uint16Array;
  119. readonly length: number;
  120. readonly set: NodeSet;
  121. constructor(buffer: Uint16Array, length: number, set: NodeSet);
  122. }
  123. export interface SyntaxNodeRef {
  124. readonly from: number;
  125. readonly to: number;
  126. readonly type: NodeType;
  127. readonly name: string;
  128. readonly tree: Tree | null;
  129. readonly node: SyntaxNode;
  130. matchContext(context: readonly string[]): boolean;
  131. }
  132. export interface SyntaxNode extends SyntaxNodeRef {
  133. parent: SyntaxNode | null;
  134. firstChild: SyntaxNode | null;
  135. lastChild: SyntaxNode | null;
  136. childAfter(pos: number): SyntaxNode | null;
  137. childBefore(pos: number): SyntaxNode | null;
  138. enter(pos: number, side: -1 | 0 | 1, mode?: IterMode): SyntaxNode | null;
  139. nextSibling: SyntaxNode | null;
  140. prevSibling: SyntaxNode | null;
  141. cursor(mode?: IterMode): TreeCursor;
  142. resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  143. resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  144. enterUnfinishedNodesBefore(pos: number): SyntaxNode;
  145. toTree(): Tree;
  146. getChild(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode | null;
  147. getChildren(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode[];
  148. matchContext(context: readonly string[]): boolean;
  149. }
  150. declare const enum Side {
  151. Before = -2,
  152. AtOrBefore = -1,
  153. Around = 0,
  154. AtOrAfter = 1,
  155. After = 2,
  156. DontCare = 4
  157. }
  158. export declare class TreeNode implements SyntaxNode {
  159. readonly _tree: Tree;
  160. readonly from: number;
  161. readonly index: number;
  162. readonly _parent: TreeNode | null;
  163. constructor(_tree: Tree, from: number, index: number, _parent: TreeNode | null);
  164. get type(): NodeType;
  165. get name(): string;
  166. get to(): number;
  167. nextChild(i: number, dir: 1 | -1, pos: number, side: Side, mode?: IterMode): TreeNode | BufferNode | null;
  168. get firstChild(): TreeNode | BufferNode;
  169. get lastChild(): TreeNode | BufferNode;
  170. childAfter(pos: number): TreeNode | BufferNode;
  171. childBefore(pos: number): TreeNode | BufferNode;
  172. enter(pos: number, side: -1 | 0 | 1, mode?: number): TreeNode | BufferNode;
  173. nextSignificantParent(): TreeNode;
  174. get parent(): TreeNode | null;
  175. get nextSibling(): SyntaxNode | null;
  176. get prevSibling(): SyntaxNode | null;
  177. cursor(mode?: IterMode): TreeCursor;
  178. get tree(): Tree;
  179. toTree(): Tree;
  180. resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  181. resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  182. enterUnfinishedNodesBefore(pos: number): SyntaxNode;
  183. getChild(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode;
  184. getChildren(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode[];
  185. get node(): this;
  186. matchContext(context: readonly string[]): boolean;
  187. }
  188. declare class BufferContext {
  189. readonly parent: TreeNode;
  190. readonly buffer: TreeBuffer;
  191. readonly index: number;
  192. readonly start: number;
  193. constructor(parent: TreeNode, buffer: TreeBuffer, index: number, start: number);
  194. }
  195. declare class BufferNode implements SyntaxNode {
  196. readonly context: BufferContext;
  197. readonly _parent: BufferNode | null;
  198. readonly index: number;
  199. type: NodeType;
  200. get name(): string;
  201. get from(): number;
  202. get to(): number;
  203. constructor(context: BufferContext, _parent: BufferNode | null, index: number);
  204. child(dir: 1 | -1, pos: number, side: Side): BufferNode | null;
  205. get firstChild(): BufferNode;
  206. get lastChild(): BufferNode;
  207. childAfter(pos: number): BufferNode;
  208. childBefore(pos: number): BufferNode;
  209. enter(pos: number, side: -1 | 0 | 1, mode?: IterMode): BufferNode;
  210. get parent(): SyntaxNode | null;
  211. externalSibling(dir: 1 | -1): TreeNode | BufferNode;
  212. get nextSibling(): SyntaxNode | null;
  213. get prevSibling(): SyntaxNode | null;
  214. cursor(mode?: IterMode): TreeCursor;
  215. get tree(): any;
  216. toTree(): Tree;
  217. resolve(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  218. resolveInner(pos: number, side?: -1 | 0 | 1): SyntaxNode;
  219. enterUnfinishedNodesBefore(pos: number): SyntaxNode;
  220. getChild(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode;
  221. getChildren(type: string | number, before?: string | number | null, after?: string | number | null): SyntaxNode[];
  222. get node(): this;
  223. matchContext(context: readonly string[]): boolean;
  224. }
  225. export declare class TreeCursor implements SyntaxNodeRef {
  226. type: NodeType;
  227. get name(): string;
  228. from: number;
  229. to: number;
  230. private stack;
  231. private bufferNode;
  232. private yieldNode;
  233. private yieldBuf;
  234. private yield;
  235. firstChild(): boolean;
  236. lastChild(): boolean;
  237. childAfter(pos: number): boolean;
  238. childBefore(pos: number): boolean;
  239. enter(pos: number, side: -1 | 0 | 1, mode?: IterMode): boolean;
  240. parent(): boolean;
  241. nextSibling(): boolean;
  242. prevSibling(): boolean;
  243. private atLastNode;
  244. private move;
  245. next(enter?: boolean): boolean;
  246. prev(enter?: boolean): boolean;
  247. moveTo(pos: number, side?: -1 | 0 | 1): this;
  248. get node(): SyntaxNode;
  249. get tree(): Tree | null;
  250. iterate(enter: (node: SyntaxNodeRef) => boolean | void, leave?: (node: SyntaxNodeRef) => void): void;
  251. matchContext(context: readonly string[]): boolean;
  252. }
  253. export declare class NodeWeakMap<T> {
  254. private map;
  255. private setBuffer;
  256. private getBuffer;
  257. set(node: SyntaxNode, value: T): void;
  258. get(node: SyntaxNode): T | undefined;
  259. cursorSet(cursor: TreeCursor, value: T): void;
  260. cursorGet(cursor: TreeCursor): T | undefined;
  261. }
  262. export {};