BinaryExpressionControlFlowReplacer.ts 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import * as escodegen from 'escodegen';
  2. import * as ESTree from 'estree';
  3. import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
  4. import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
  5. import { BinaryExpressionSumFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionSumFunctionNode';
  6. import { BinaryExpressionSubtractFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionSubtractFunctionNode';
  7. import { BinaryExpressionMultiplyFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionMultiplyFunctionNode';
  8. import { BinaryExpressionDivideFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionDivideFunctionNode';
  9. import { BinaryExpressionExponentiationFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionExponentiationFunctionNode';
  10. import { ControlFlowStorage } from '../../ControlFlowStorage';
  11. import { ControlFlowStorageCallNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/ControlFlowStorageCallNode';
  12. export class BinaryExpressionControlFlowReplacer extends AbstractControlFlowReplacer {
  13. /**
  14. * @param expressionNode
  15. * @returns {string}
  16. */
  17. private static getExpressionValue (expressionNode: ESTree.Expression): string {
  18. return escodegen.generate(expressionNode, {
  19. sourceMapWithCode: true
  20. }).code;
  21. }
  22. /**
  23. * @param binaryExpressionNode
  24. * @param parentNode
  25. * @param controlFlowStorage
  26. * @param controlFlowStorageCustomNodeName
  27. * @returns {ICustomNode | undefined}
  28. */
  29. public replace (
  30. binaryExpressionNode: ESTree.BinaryExpression,
  31. parentNode: ESTree.Node,
  32. controlFlowStorage: ControlFlowStorage,
  33. controlFlowStorageCustomNodeName: string
  34. ): ICustomNode | undefined {
  35. let binaryExpressionFunctionNode: ICustomNode;
  36. switch (binaryExpressionNode.operator) {
  37. case '+':
  38. binaryExpressionFunctionNode = new BinaryExpressionSumFunctionNode(this.options);
  39. break;
  40. case '-':
  41. binaryExpressionFunctionNode = new BinaryExpressionSubtractFunctionNode(this.options);
  42. break;
  43. case '*':
  44. binaryExpressionFunctionNode = new BinaryExpressionMultiplyFunctionNode(this.options);
  45. break;
  46. case '/':
  47. binaryExpressionFunctionNode = new BinaryExpressionDivideFunctionNode(this.options);
  48. break;
  49. case '**':
  50. binaryExpressionFunctionNode = new BinaryExpressionExponentiationFunctionNode(this.options);
  51. break;
  52. default:
  53. return;
  54. }
  55. const key: string = AbstractControlFlowReplacer.getStorageKey();
  56. controlFlowStorage.addToStorage(key, binaryExpressionFunctionNode);
  57. return new ControlFlowStorageCallNode(
  58. controlFlowStorageCustomNodeName,
  59. key,
  60. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.left),
  61. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.right),
  62. this.options
  63. );
  64. }
  65. }