UNPKG

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
"use strict"; 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