UNPKG

ts-simple-ast

Version:

TypeScript compiler wrapper for AST navigation and code generation.

77 lines (75 loc) 3.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ts = require("typescript"); const utils_1 = require("./../../utils"); const textChecks_1 = require("./../textChecks"); const insertIntoParent_1 = require("./insertIntoParent"); /** * Used to insert non-comma separated nodes into braces or a source file. */ function insertIntoBracesOrSourceFile(opts) { const { parent, index, childCodes, separator, children } = opts; const sourceFile = parent.getSourceFile(); const insertPos = getInsertPosition(index, parent, children); const newLineChar = sourceFile.global.manipulationSettings.getNewLineKind(); let newText = ""; for (let i = 0; i < childCodes.length; i++) { if (i > 0) { newText += separator; if (opts.separatorNewlineWhen != null && opts.separatorNewlineWhen(opts.structures[i - 1], opts.structures[i])) newText += newLineChar; } newText += childCodes[i]; } if (index !== 0) newText = separator + newText; else if (insertPos !== 0) newText = newLineChar + newText; else if (parent.getFullWidth() > 0) newText = newText + separator; if (opts.previousBlanklineWhen != null) { const previousMember = children[index - 1]; const firstStructure = opts.structures[0]; if (previousMember != null && opts.previousBlanklineWhen(previousMember, firstStructure)) newText = newLineChar + newText; } const nextMember = children[index]; if (opts.nextBlanklineWhen != null) { const lastStructure = opts.structures[opts.structures.length - 1]; if (nextMember != null && opts.nextBlanklineWhen(nextMember, lastStructure)) { if (!textChecks_1.isBlankLineAtPos(sourceFile, insertPos)) newText = newText + newLineChar; } } if (utils_1.TypeGuards.isSourceFile(parent) && nextMember == null && !newText.endsWith(newLineChar) && !sourceFile.getFullText().endsWith("\n")) newText = newText + newLineChar; insertIntoParent_1.insertIntoParent({ parent: parent.getChildSyntaxListOrThrow(), insertPos, newText, childIndex: index, insertItemsCount: childCodes.length }); } exports.insertIntoBracesOrSourceFile = insertIntoBracesOrSourceFile; function getInsertPosition(index, parent, children) { if (index === 0) { if (utils_1.TypeGuards.isSourceFile(parent)) return 0; else { const parentContainer = getParentContainer(parent); const openBraceToken = parentContainer.getFirstChildByKindOrThrow(ts.SyntaxKind.OpenBraceToken); return openBraceToken.getEnd(); } } return children[index - 1].getEnd(); } function getParentContainer(parent) { if (utils_1.TypeGuards.isBodiedNode(parent)) return parent.getBody(); if (utils_1.TypeGuards.isBodyableNode(parent)) return parent.getBodyOrThrow(); else return parent; } //# sourceMappingURL=insertIntoBracesOrSourceFile.js.map