BinaryExpressionControlFlowReplacer.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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 { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
  6. import { IOptions } from '../../../interfaces/IOptions';
  7. import { IStorage } from '../../../interfaces/IStorage';
  8. import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
  9. import { BinaryExpressionFunctionNode } from '../../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/BinaryExpressionFunctionNode';
  10. import { ControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-replacers-nodes/binary-expression-control-flow-replacer-nodes/ControlFlowStorageCallNode';
  11. @injectable()
  12. export class BinaryExpressionControlFlowReplacer extends AbstractControlFlowReplacer {
  13. /**
  14. * @param customNodesStorage
  15. * @param options
  16. */
  17. constructor (
  18. @inject(ServiceIdentifiers['IStorage<ICustomNode>']) customNodesStorage: IStorage<ICustomNode>,
  19. @inject(ServiceIdentifiers.IOptions) options: IOptions
  20. ) {
  21. super(customNodesStorage, options);
  22. }
  23. /**
  24. * @param expressionNode
  25. * @returns {string}
  26. */
  27. private static getExpressionValue (expressionNode: ESTree.Expression): string {
  28. return escodegen.generate(expressionNode, {
  29. sourceMapWithCode: true
  30. }).code;
  31. }
  32. /**
  33. * @param binaryExpressionNode
  34. * @param parentNode
  35. * @param controlFlowStorage
  36. * @param controlFlowStorageCustomNodeName
  37. * @returns {ICustomNode | undefined}
  38. */
  39. public replace (
  40. binaryExpressionNode: ESTree.BinaryExpression,
  41. parentNode: ESTree.Node,
  42. controlFlowStorage: IStorage <ICustomNode>,
  43. controlFlowStorageCustomNodeName: string
  44. ): ICustomNode | undefined {
  45. const key: string = AbstractControlFlowReplacer.getStorageKey();
  46. controlFlowStorage.set(key, new BinaryExpressionFunctionNode(binaryExpressionNode.operator, this.options));
  47. return new ControlFlowStorageCallNode(
  48. controlFlowStorageCustomNodeName,
  49. key,
  50. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.left),
  51. BinaryExpressionControlFlowReplacer.getExpressionValue(binaryExpressionNode.right),
  52. this.options
  53. );
  54. }
  55. }