CallExpressionControlFlowStorageCallNode.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { Expression } from 'estree';
  5. import { TStatement } from '../../../types/node/TStatement';
  6. import { IOptions } from '../../../interfaces/options/IOptions';
  7. import { initializable } from '../../../decorators/Initializable';
  8. import { AbstractCustomNode } from '../../AbstractCustomNode';
  9. import { Nodes } from '../../../node/Nodes';
  10. import { NodeUtils } from '../../../node/NodeUtils';
  11. @injectable()
  12. export class CallExpressionControlFlowStorageCallNode extends AbstractCustomNode {
  13. /**
  14. * @type {Expression}
  15. */
  16. @initializable()
  17. private callee: Expression;
  18. /**
  19. * @type {string}
  20. */
  21. @initializable()
  22. private controlFlowStorageKey: string;
  23. /**
  24. * @type {string}
  25. */
  26. @initializable()
  27. private controlFlowStorageName: string;
  28. /**
  29. * @type {(ESTree.Expression | ESTree.SpreadElement)[]}
  30. */
  31. @initializable()
  32. private expressionArguments: (ESTree.Expression | ESTree.SpreadElement)[];
  33. /**
  34. * @param options
  35. */
  36. constructor (
  37. @inject(ServiceIdentifiers.IOptions) options: IOptions
  38. ) {
  39. super(options);
  40. }
  41. /**
  42. * @param controlFlowStorageName
  43. * @param controlFlowStorageKey
  44. * @param callee
  45. * @param expressionArguments
  46. */
  47. public initialize (
  48. controlFlowStorageName: string,
  49. controlFlowStorageKey: string,
  50. callee: Expression,
  51. expressionArguments: (ESTree.Expression | ESTree.SpreadElement)[]
  52. ): void {
  53. this.controlFlowStorageName = controlFlowStorageName;
  54. this.controlFlowStorageKey = controlFlowStorageKey;
  55. this.callee = callee;
  56. this.expressionArguments = expressionArguments;
  57. }
  58. protected getNodeStructure (): TStatement[] {
  59. const structure: TStatement = Nodes.getExpressionStatementNode(
  60. Nodes.getCallExpressionNode(
  61. Nodes.getMemberExpressionNode(
  62. Nodes.getIdentifierNode(this.controlFlowStorageName),
  63. Nodes.getIdentifierNode(this.controlFlowStorageKey)
  64. ),
  65. [
  66. this.callee,
  67. ...this.expressionArguments
  68. ]
  69. )
  70. );
  71. NodeUtils.parentize(structure);
  72. return [structure];
  73. }
  74. }