ts-simple-ast
Version:
TypeScript compiler wrapper for static analysis and code manipulation.
60 lines (59 loc) • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var typescript_1 = require("../../typescript");
var utils_1 = require("../../utils");
var textSeek_1 = require("../textSeek");
/**
* Gets the insert pos from an index.
*/
function getInsertPosFromIndex(index, syntaxList, children) {
if (index === 0) {
var parent = syntaxList.getParentOrThrow();
if (utils_1.TypeGuards.isSourceFile(parent))
return 0;
else if (utils_1.TypeGuards.isCaseClause(parent) || utils_1.TypeGuards.isDefaultClause(parent)) {
var colonToken = parent.getFirstChildByKindOrThrow(typescript_1.SyntaxKind.ColonToken);
return colonToken.getEnd();
}
var isInline = syntaxList !== parent.getChildSyntaxList();
if (isInline)
return syntaxList.getStart();
var parentContainer = getParentContainer(parent);
var openBraceToken = parentContainer.getFirstChildByKindOrThrow(typescript_1.SyntaxKind.OpenBraceToken);
return openBraceToken.getEnd();
}
else
return children[index - 1].getEnd();
}
exports.getInsertPosFromIndex = getInsertPosFromIndex;
function getEndPosFromIndex(index, parent, children, fullText) {
var endPos;
if (index === children.length) {
if (utils_1.TypeGuards.isSourceFile(parent))
endPos = parent.getEnd();
else if (utils_1.TypeGuards.isCaseClause(parent) || utils_1.TypeGuards.isDefaultClause(parent))
endPos = parent.getEnd();
else {
var parentContainer = getParentContainer(parent);
var closeBraceToken = parentContainer.getLastChildByKind(typescript_1.SyntaxKind.CloseBraceToken);
if (closeBraceToken == null)
endPos = parent.getEnd();
else
endPos = closeBraceToken.getNonWhitespaceStart();
}
}
else
endPos = children[index].getNonWhitespaceStart();
// use the start of the current line instead of the end of the previous line so that
// this works the same for code at the start of the file
return textSeek_1.getPosAtStartOfLineOrNonWhitespace(fullText, endPos);
}
exports.getEndPosFromIndex = getEndPosFromIndex;
function getParentContainer(parent) {
if (utils_1.TypeGuards.isBodiedNode(parent))
return utils_1.TypeGuards.isNamespaceDeclaration(parent) ? parent._getInnerBody() : parent.getBody();
if (utils_1.TypeGuards.isBodyableNode(parent))
return parent.getBodyOrThrow();
else
return parent;
}