ExpressionWithOperatorControlFlowReplacer.ts 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { TControlFlowCustomNodeFactory } from '../../../types/container/custom-nodes/TControlFlowCustomNodeFactory';
  5. import { TIdentifierNamesGeneratorFactory } from '../../../types/container/generators/TIdentifierNamesGeneratorFactory';
  6. import { TInitialData } from '../../../types/TInitialData';
  7. import { TStatement } from '../../../types/node/TStatement';
  8. import { ICustomNode } from '../../../interfaces/custom-nodes/ICustomNode';
  9. import { IOptions } from '../../../interfaces/options/IOptions';
  10. import { IRandomGenerator } from '../../../interfaces/utils/IRandomGenerator';
  11. import { ControlFlowCustomNode } from '../../../enums/custom-nodes/ControlFlowCustomNode';
  12. import { AbstractControlFlowReplacer } from './AbstractControlFlowReplacer';
  13. import { ExpressionWithOperatorControlFlowStorageCallNode } from '../../../custom-nodes/control-flow-flattening-nodes/control-flow-storage-nodes/ExpressionWithOperatorControlFlowStorageCallNode';
  14. import { NodeGuards } from '../../../node/NodeGuards';
  15. @injectable()
  16. export abstract class ExpressionWithOperatorControlFlowReplacer extends AbstractControlFlowReplacer {
  17. /**
  18. * @param {TControlFlowCustomNodeFactory} controlFlowCustomNodeFactory
  19. * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
  20. * @param {IRandomGenerator} randomGenerator
  21. * @param {IOptions} options
  22. */
  23. public constructor (
  24. @inject(ServiceIdentifiers.Factory__IControlFlowCustomNode)
  25. controlFlowCustomNodeFactory: TControlFlowCustomNodeFactory,
  26. @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
  27. identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
  28. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  29. @inject(ServiceIdentifiers.IOptions) options: IOptions
  30. ) {
  31. super(
  32. controlFlowCustomNodeFactory,
  33. identifierNamesGeneratorFactory,
  34. randomGenerator,
  35. options
  36. );
  37. }
  38. /**
  39. * @param {string} controlFlowStorageId
  40. * @param {string} storageKey
  41. * @param {Expression} leftExpression
  42. * @param {Expression} rightExpression
  43. * @returns {NodeGuards}
  44. */
  45. protected getControlFlowStorageCallNode (
  46. controlFlowStorageId: string,
  47. storageKey: string,
  48. leftExpression: ESTree.Expression,
  49. rightExpression: ESTree.Expression
  50. ): ESTree.Node {
  51. const controlFlowStorageCallCustomNode: ICustomNode<TInitialData<ExpressionWithOperatorControlFlowStorageCallNode>> =
  52. this.controlFlowCustomNodeFactory(ControlFlowCustomNode.ExpressionWithOperatorControlFlowStorageCallNode);
  53. controlFlowStorageCallCustomNode.initialize(controlFlowStorageId, storageKey, leftExpression, rightExpression);
  54. const statementNode: TStatement = controlFlowStorageCallCustomNode.getNode()[0];
  55. if (!statementNode || !NodeGuards.isExpressionStatementNode(statementNode)) {
  56. throw new Error('`controlFlowStorageCallCustomNode.getNode()[0]` should returns array with `ExpressionStatement` node');
  57. }
  58. return statementNode.expression;
  59. }
  60. }