ts-simple-ast
Version:
TypeScript compiler wrapper for AST navigation and code generation.
77 lines (75 loc) • 3.1 kB
JavaScript
;
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