BinaryExpressionControlFlowReplacer.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 { BinaryExpressionFunctionNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode';
  6. import { ControlFlowStorage } from '../../ControlFlowStorage';
  7. import { ControlFlowStorageCallNode } from '../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/ControlFlowStorageCallNode';
  8. export class BinaryExpressionControlFlowReplacer extends AbstractControlFlowReplacer {
  9. /**
  10. * @param expressionNode
  11. * @returns {string}
  12. */
  13. private static getExpressionValue (expressionNode: ESTree.Expression): string {
  14. return escodegen.generate(expressionNode, {
  15. sourceMapWithCode: true
  16. }).code;
  17. }
  18. /**
  19. * @param binaryExpressionNode
  20. * @param parentNode
  21. * @param controlFlowStorage
  22. * @param controlFlowStorageCustomNodeName
  23. * @returns {ICustomNode | undefined}
  24. */
  25. public replace (
  26. binaryExpressionNode: ESTree.BinaryExpression,
  27. parentNode: ESTree.Node,
  28. controlFlowStorage: ControlFlowStorage,
  29. controlFlowStorageCustomNodeName: string
  30. ): ICustomNode | undefined {
  31. const key: string = AbstractControlFlowReplacer.getStorageKey();
  32. controlFlowStorage.addToStorage(key, new BinaryExpressionFunctionNode(binaryExpressionNode.operator, this.options));
  33. return new ControlFlowStorageCallNode(
  34. controlFlowStorageCustomNodeName,
  35. key,
  36. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.left),
  37. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.right),
  38. this.options
  39. );
  40. }
  41. }