ntts
Version:
A CLI tool for refactoring an existing NodeJs application to a fully functional TypeScript application.
55 lines (49 loc) • 2.17 kB
text/typescript
import {
CallExpression,
ElementAccessExpression, Node, PropertyAccessExpression, PropertyName, SyntaxKind,
} from 'ts-morph';
import { isAccessExpression } from '../combined-types/combined-types';
export const getInnerExpression = (node: Node | undefined) => {
if (Node.isParenthesizedExpression(node)) {
getInnerExpression(node.getExpression());
}
return node;
};
export const getExpressionParent = (node: Node | undefined): Node | undefined => {
const parent = node?.getParent();
if (Node.isPropertyAccessExpression(parent)
|| Node.isElementAccessExpression(parent)
|| Node.isParenthesizedExpression(parent)) {
return getExpressionParent(parent);
}
return getInnerExpression(node);
};
export const isAccessExpressionTarget = (expression: PropertyAccessExpression | ElementAccessExpression | PropertyName, target: Node): boolean => {
if (Node.isPropertyAccessExpression(expression)) {
return expression.getNameNode().getPos() === target.getPos();
}
if (Node.isElementAccessExpression(expression)) {
return expression.getArgumentExpression()?.getPos() === target.getPos();
}
return expression.getPos() === target.getPos();
};
export const isCallExpressionTarget = (expression: CallExpression, target: Node): boolean => {
const leftExpression = expression.getExpression();
if (Node.isPropertyAccessExpression(leftExpression)) {
return leftExpression.getNameNode().getPos() === target.getPos();
}
if (Node.isElementAccessExpression(leftExpression)) {
return leftExpression.getArgumentExpression()?.getPos() === target.getPos();
}
return leftExpression.getPos() === target.getPos();
};
export const isWriteAccess = (node: Node): boolean => {
const innerExpression = getExpressionParent(node);
if (isAccessExpression(innerExpression) && isAccessExpressionTarget(innerExpression, node)) {
const binary = node.getFirstAncestorByKind(SyntaxKind.BinaryExpression);
const left = binary?.getLeft();
const inner = getInnerExpression(left);
return !!binary?.getOperatorToken().asKind(SyntaxKind.EqualsToken) && innerExpression.getPos() === inner?.getPos();
}
return false;
};