BinaryExpressionControlFlowReplacer.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
  3. import * as escodegen from 'escodegen';
  4. import * as ESTree from 'estree';
  5. import { TCustomNodeFactory } from '../../../types/container/TCustomNodeFactory';
  6. import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
  7. import { IOptions } from '../../../interfaces/options/IOptions';
  8. import { IStorage } from '../../../interfaces/storages/IStorage';
  9. import { CustomNodes } from '../../../enums/container/CustomNodes';
  10. import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
  11. @injectable()
  12. export class BinaryExpressionControlFlowReplacer extends AbstractControlFlowReplacer {
  13. /**
  14. * @type {TCustomNodeFactory}
  15. */
  16. private readonly customNodeFactory: TCustomNodeFactory;
  17. /**
  18. * @param customNodeFactory
  19. * @param options
  20. */
  21. constructor (
  22. @inject(ServiceIdentifiers['Factory<ICustomNode>']) customNodeFactory: TCustomNodeFactory,
  23. @inject(ServiceIdentifiers.IOptions) options: IOptions
  24. ) {
  25. super(options);
  26. this.customNodeFactory = customNodeFactory;
  27. }
  28. /**
  29. * @param expressionNode
  30. * @returns {string}
  31. */
  32. private static getExpressionValue (expressionNode: ESTree.Expression): string {
  33. return escodegen.generate(expressionNode, {
  34. sourceMapWithCode: true
  35. }).code;
  36. }
  37. /**
  38. * @param binaryExpressionNode
  39. * @param parentNode
  40. * @param controlFlowStorage
  41. * @param controlFlowStorageCustomNodeName
  42. * @returns {ICustomNode}
  43. */
  44. public replace (
  45. binaryExpressionNode: ESTree.BinaryExpression,
  46. parentNode: ESTree.Node,
  47. controlFlowStorage: IStorage <ICustomNode>,
  48. controlFlowStorageCustomNodeName: string
  49. ): ICustomNode {
  50. const key: string = AbstractControlFlowReplacer.getStorageKey();
  51. const binaryExpressionFunctionNode: ICustomNode = this.customNodeFactory(CustomNodes.BinaryExpressionFunctionNode);
  52. const controlFlowStorageCallNode: ICustomNode = this.customNodeFactory(CustomNodes.ControlFlowStorageCallNode);
  53. binaryExpressionFunctionNode.initialize(binaryExpressionNode.operator);
  54. controlFlowStorageCallNode.initialize(
  55. controlFlowStorageCustomNodeName,
  56. key,
  57. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.left),
  58. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.right)
  59. );
  60. controlFlowStorage.set(key, binaryExpressionFunctionNode);
  61. return controlFlowStorageCallNode;
  62. }
  63. }