refakts
Version:
TypeScript refactoring tool built for AI coding agents to perform precise refactoring operations via command line instead of requiring complete code regeneration.
125 lines • 4.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VariableNameValidator = void 0;
const ts_morph_1 = require("ts-morph");
class VariableNameValidator {
generateUniqueName(baseName, scope) {
const existingNames = this.getExistingVariableNames(scope);
if (!existingNames.has(baseName)) {
return baseName;
}
throw new Error(`Variable name '${baseName}' already exists in this scope. Please choose a different name.`);
}
getExistingVariableNames(scope) {
const names = new Set();
this.addFunctionParametersIfInBlock(scope, names);
this.addDescendantVariableNames(scope, names);
return names;
}
addFunctionParametersIfInBlock(scope, names) {
if (ts_morph_1.Node.isBlock(scope)) {
const parent = scope.getParent();
if (this.isFunctionNode(parent)) {
this.addFunctionParameterNames(parent, names);
}
}
}
isFunctionNode(node) {
return ts_morph_1.Node.isFunctionDeclaration(node) || ts_morph_1.Node.isFunctionExpression(node) ||
ts_morph_1.Node.isArrowFunction(node) || ts_morph_1.Node.isMethodDeclaration(node) ||
ts_morph_1.Node.isConstructorDeclaration(node);
}
addDescendantVariableNames(scope, names) {
scope.forEachDescendant((node) => {
this.addVariableNameIfExists(node, names);
this.addParameterNameIfExists(node, names);
});
}
addVariableNameIfExists(node, names) {
if (ts_morph_1.Node.isVariableDeclaration(node)) {
const nameNode = node.getNameNode();
if (ts_morph_1.Node.isIdentifier(nameNode)) {
names.add(nameNode.getText());
}
}
}
addParameterNameIfExists(node, names) {
if (ts_morph_1.Node.isParameterDeclaration(node)) {
const nameNode = node.getNameNode();
if (ts_morph_1.Node.isIdentifier(nameNode)) {
names.add(nameNode.getText());
}
}
}
addFunctionParameterNames(functionNode, names) {
if (this.isFunctionNode(functionNode)) {
this.processParameters(functionNode, names);
}
}
processParameters(functionNode, names) {
const parameters = this.getParametersFromFunction(functionNode);
for (const param of parameters) {
this.processParameter(param, names);
}
}
getParametersFromFunction(functionNode) {
if (ts_morph_1.Node.isFunctionDeclaration(functionNode) || ts_morph_1.Node.isMethodDeclaration(functionNode) ||
ts_morph_1.Node.isArrowFunction(functionNode) || ts_morph_1.Node.isFunctionExpression(functionNode) ||
ts_morph_1.Node.isConstructorDeclaration(functionNode)) {
return functionNode.getParameters();
}
return [];
}
processParameter(param, names) {
const nameNode = param.getNameNode();
if (ts_morph_1.Node.isIdentifier(nameNode)) {
names.add(nameNode.getText());
}
else {
this.addDestructuredParameterNames(nameNode, names);
}
}
addDestructuredParameterNames(nameNode, names) {
if (ts_morph_1.Node.isObjectBindingPattern(nameNode)) {
this.addObjectBindingNames(nameNode, names);
}
else if (ts_morph_1.Node.isArrayBindingPattern(nameNode)) {
this.addArrayBindingNames(nameNode, names);
}
}
addObjectBindingNames(nameNode, names) {
if (ts_morph_1.Node.isObjectBindingPattern(nameNode)) {
this.processBindingElements(nameNode, names);
}
}
processBindingElements(nameNode, names) {
nameNode.getElements().forEach((element) => {
this.processBindingElement(element, names);
});
}
processBindingElement(element, names) {
if (!ts_morph_1.Node.isBindingElement(element))
return;
const elementName = element.getNameNode();
if (ts_morph_1.Node.isIdentifier(elementName)) {
names.add(elementName.getText());
}
}
addArrayBindingNames(nameNode, names) {
if (ts_morph_1.Node.isArrayBindingPattern(nameNode)) {
nameNode.getElements().forEach((element) => {
this.processArrayBindingElement(element, names);
});
}
}
processArrayBindingElement(element, names) {
if (element && ts_morph_1.Node.isBindingElement(element)) {
const elementName = element.getNameNode();
if (ts_morph_1.Node.isIdentifier(elementName)) {
names.add(elementName.getText());
}
}
}
}
exports.VariableNameValidator = VariableNameValidator;
//# sourceMappingURL=variable-name-validator.js.map