UNPKG

gauge-ts

Version:
128 lines (127 loc) 6.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RefactorProcessor = void 0; const node_os_1 = require("node:os"); const typescript_1 = require("typescript"); const typescript_2 = require("typescript"); const messages_pb_1 = require("../gen/messages_pb"); const spec_pb_1 = require("../gen/spec_pb"); const CodeHelper_1 = require("../helpers/CodeHelper"); const StepRegistry_1 = require("../models/StepRegistry"); const Util_1 = require("../utils/Util"); class RefactorProcessor extends CodeHelper_1.CodeHelper { process(req) { const oldStep = req.getOldstepvalue(); // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion const newStep = req.getNewstepvalue(); if (!oldStep || !newStep) { return; } if (StepRegistry_1.default.hasMultipleImplementations(oldStep.getStepvalue())) { const res = new messages_pb_1.RefactorResponse(); res.setSuccess(false); res.setError(`Multiple Implementation found for ${oldStep.getParameterizedstepvalue()}`); return res; } // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const positions = req.getParampositionsList().map((p) => { const pp = new messages_pb_1.ParameterPosition(); pp.setNewposition(p.getNewposition()); pp.setOldposition(p.getOldposition()); return pp; }); return this.refactor(oldStep, newStep, positions); } refactor(oldStep, newStep, paramPositions) { const response = new messages_pb_1.RefactorResponse(); try { const info = StepRegistry_1.default.get(oldStep.getStepvalue()); const filePath = info.getFilePath(); const source = (0, typescript_2.createSourceFile)(filePath, Util_1.Util.readFile(filePath), typescript_2.ScriptTarget.Latest, false, typescript_2.ScriptKind.TS); const change1 = new messages_pb_1.FileChanges(); change1.setFilename(filePath); const change2 = new messages_pb_1.FileChanges(); change2.setFilename(filePath); (0, typescript_2.forEachChild)(source, (childNode) => { if ((0, typescript_2.isClassDeclaration)(childNode)) { (0, typescript_2.forEachChild)(childNode, (node) => { if ((0, typescript_2.isMethodDeclaration)(node) && this.hasStepDecorator(node) && this.hasStepText(node, info.getStepText())) { const diff1 = new messages_pb_1.TextDiff(); const span = this.getStepTextRange(source, node); // eslint-disable-next-line @typescript-eslint/no-unsafe-call // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions diff1.setContent(`"${newStep.getParameterizedstepvalue()}"`); diff1.setSpan(span); change1.addDiffs(diff1); const diff2 = new messages_pb_1.TextDiff(); const oldParams = node.parameters; const newParams = new Array(); for (const p of paramPositions) { if (p.getOldposition() < 0) { const pName = this.getParamName(paramPositions.indexOf(p), oldParams, source); newParams.splice(p.getNewposition(), 0, typescript_2.factory.createParameterDeclaration(undefined, undefined, `${pName}: any`)); } else { newParams.splice(p.getNewposition(), 0, oldParams[p.getOldposition()]); } } const content = newParams .map((p) => { return this.printer.printNode(typescript_2.EmitHint.Unspecified, p, source); }) .join(", "); diff2.setContent(content); diff2.setSpan(this.createSpan(source, node.parameters)); change2.addDiffs(diff2); } }); } }); response.setFileschangedList([filePath]); response.setFilechangesList([change1, change2]); response.setSuccess(true); } catch (error) { const err = error; response.setError(`${err.message}${node_os_1.EOL}${err.stack ?? ""}`); response.setSuccess(false); } return response; } getParamName(index, params, source) { const name = `arg${index}`; const p = params.map((p) => { return this.printer.printNode(typescript_2.EmitHint.Unspecified, p, source); }); return !p.includes(name) ? name : this.getParamName(index + 1, params, source); } getStepTextRange(source, node) { const dec = (0, typescript_1.getDecorators)(node); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any const stepDecExp = // eslint-disable-next-line @typescript-eslint/no-explicit-any // biome-ignore lint/suspicious/noExplicitAny: <explanation> dec.filter(CodeHelper_1.CodeHelper.isStepDecorator)[0].expression; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return this.createSpan(source, stepDecExp.arguments[0]); } // biome-ignore lint/suspicious/noExplicitAny: <explanation> createSpan(source, node) { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const start = source.getLineAndCharacterOfPosition(node.pos); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const end = source.getLineAndCharacterOfPosition(node.end); const span = new spec_pb_1.Span(); span.setStart(start.line + 1); span.setStartchar(start.character); span.setEnd(end.line + 1); span.setEndchar(end.character); return span; // eslint-disable-next-line padded-blocks } } exports.RefactorProcessor = RefactorProcessor;