( node: SyntaxNode, code: string, blockTypes: string[], collapseTypes: string[], collapseBlockTypes: string[], maxChunkSize: number, )
| 24 | } |
| 25 | |
| 26 | async function collapseChildren( |
| 27 | node: SyntaxNode, |
| 28 | code: string, |
| 29 | blockTypes: string[], |
| 30 | collapseTypes: string[], |
| 31 | collapseBlockTypes: string[], |
| 32 | maxChunkSize: number, |
| 33 | ): Promise<string> { |
| 34 | code = code.slice(0, node.endIndex); |
| 35 | const block = firstChild(node, blockTypes); |
| 36 | const collapsedChildren = []; |
| 37 | |
| 38 | if (block) { |
| 39 | const childrenToCollapse = block.children.filter((child) => |
| 40 | collapseTypes.includes(child.type), |
| 41 | ); |
| 42 | for (const child of childrenToCollapse.reverse()) { |
| 43 | const grandChild = firstChild(child, collapseBlockTypes); |
| 44 | if (grandChild) { |
| 45 | const start = grandChild.startIndex; |
| 46 | const end = grandChild.endIndex; |
| 47 | const collapsedChild = |
| 48 | code.slice(child.startIndex, start) + |
| 49 | collapsedReplacement(grandChild); |
| 50 | code = |
| 51 | code.slice(0, start) + |
| 52 | collapsedReplacement(grandChild) + |
| 53 | code.slice(end); |
| 54 | |
| 55 | collapsedChildren.unshift(collapsedChild); |
| 56 | } |
| 57 | } |
| 58 | } |
| 59 | code = code.slice(node.startIndex); |
| 60 | let removedChild = false; |
| 61 | while ( |
| 62 | (await countTokensAsync(code.trim())) > maxChunkSize && |
| 63 | collapsedChildren.length > 0 |
| 64 | ) { |
| 65 | removedChild = true; |
| 66 | // Remove children starting at the end - TODO: Add multiple chunks so no children are missing |
| 67 | const childCode = collapsedChildren.pop()!; |
| 68 | const index = code.lastIndexOf(childCode); |
| 69 | if (index > 0) { |
| 70 | code = code.slice(0, index) + code.slice(index + childCode.length); |
| 71 | } |
| 72 | } |
| 73 | |
| 74 | if (removedChild) { |
| 75 | // Remove the extra blank lines |
| 76 | let lines = code.split("\n"); |
| 77 | let firstWhiteSpaceInGroup = -1; |
| 78 | for (let i = lines.length - 1; i >= 0; i--) { |
| 79 | if (lines[i].trim() === "") { |
| 80 | if (firstWhiteSpaceInGroup < 0) { |
| 81 | firstWhiteSpaceInGroup = i; |
| 82 | } |
| 83 | } else { |
no test coverage detected