UNPKG

ts-simple-ast

Version:

TypeScript compiler wrapper for AST navigation and code generation.

81 lines (80 loc) 4.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var formatting_1 = require("./../formatting"); var textSeek_1 = require("./../textSeek"); var tree_1 = require("./../tree"); var text_1 = require("./../text"); function removeChildrenWithFormattingFromCollapsibleSyntaxList(opts) { var children = opts.children; if (children.length === 0) return; var syntaxList = children[0].getParentSyntaxListOrThrow(); if (syntaxList.getChildCount() === children.length) { removeChildrenWithFormatting({ children: [syntaxList], getSiblingFormatting: function () { return formatting_1.FormattingKind.None; } }); } else removeChildrenWithFormatting(opts); } exports.removeChildrenWithFormattingFromCollapsibleSyntaxList = removeChildrenWithFormattingFromCollapsibleSyntaxList; function removeChildrenWithFormatting(opts) { var children = opts.children, getSiblingFormatting = opts.getSiblingFormatting; if (children.length === 0) return; var parent = children[0].getParentOrThrow(); var sourceFile = parent.getSourceFile(); var fullText = sourceFile.getFullText(); var newLineKind = sourceFile.global.manipulationSettings.getNewLineKind(); var previousSibling = children[0].getPreviousSibling(); var nextSibling = children[children.length - 1].getNextSibling(); var newText = getPrefix() + getSpacing() + getSuffix(); var tempSourceFile = sourceFile.global.compilerFactory.createTempSourceFileFromText(newText, { filePath: sourceFile.getFilePath() }); tree_1.replaceTreeWithChildIndex({ replacementSourceFile: tempSourceFile, parent: children[0].getParentSyntaxList() || children[0].getParentOrThrow(), childIndex: children[0].getChildIndex(), childCount: -1 * children.length }); function getPrefix() { return fullText.substring(0, getRemovalPos()); } function getSpacing() { return text_1.getSpacingBetweenNodes({ parent: parent, previousSibling: previousSibling, nextSibling: nextSibling, newLineKind: newLineKind, getSiblingFormatting: getSiblingFormatting }); } function getSuffix() { return fullText.substring(getRemovalEnd()); } function getRemovalPos() { if (previousSibling != null && nextSibling != null) return previousSibling.getEnd(); if (parent.getPos() === children[0].getPos()) return children[0].getNonWhitespaceStart(); // do not shift the parent return children[0].isFirstNodeOnLine() ? textSeek_1.getPosAfterPreviousNonBlankLine(fullText, children[0].getNonWhitespaceStart()) : children[0].getNonWhitespaceStart(); } function getRemovalEnd() { if (previousSibling != null && nextSibling != null) { var nextSiblingFormatting = getSiblingFormatting(parent, nextSibling); if (nextSiblingFormatting === formatting_1.FormattingKind.Blankline || nextSiblingFormatting === formatting_1.FormattingKind.Newline) { var nextSiblingStartLinePos = nextSibling.getStartLinePos(); if (nextSiblingStartLinePos !== children[children.length - 1].getStartLinePos()) return nextSiblingStartLinePos; } return nextSibling.getStart(); } if (parent.getEnd() === children[children.length - 1].getEnd()) return children[children.length - 1].getEnd(); // do not shift the parent var nextNonSpaceOrTabChar = textSeek_1.getNextMatchingPos(fullText, children[children.length - 1].getEnd(), function (char) { return char !== " " && char !== "\t"; }); if (fullText[nextNonSpaceOrTabChar] === "\r" || fullText[nextNonSpaceOrTabChar] === "\n") return textSeek_1.getPosAtNextNonBlankLine(fullText, nextNonSpaceOrTabChar); return nextNonSpaceOrTabChar; } } exports.removeChildrenWithFormatting = removeChildrenWithFormatting;