CallExpressionFunctionNode.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
  5. import { TStatement } from '../../types/node/TStatement';
  6. import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
  7. import { IOptions } from '../../interfaces/options/IOptions';
  8. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  9. import { initializable } from '../../decorators/Initializable';
  10. import { AbstractCustomNode } from '../AbstractCustomNode';
  11. import { NodeFactory } from '../../node/NodeFactory';
  12. import { NodeUtils } from '../../node/NodeUtils';
  13. @injectable()
  14. export class CallExpressionFunctionNode extends AbstractCustomNode {
  15. /**
  16. * @type {(ESTree.Expression | ESTree.SpreadElement)[]}
  17. */
  18. @initializable()
  19. private expressionArguments!: (ESTree.Expression | ESTree.SpreadElement)[];
  20. /**
  21. * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
  22. * @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
  23. * @param {IRandomGenerator} randomGenerator
  24. * @param {IOptions} options
  25. */
  26. public constructor (
  27. @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
  28. identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
  29. @inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
  30. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  31. @inject(ServiceIdentifiers.IOptions) options: IOptions
  32. ) {
  33. super(
  34. identifierNamesGeneratorFactory,
  35. customCodeHelperFormatter,
  36. randomGenerator,
  37. options
  38. );
  39. }
  40. /**
  41. * @param {(Expression | SpreadElement)[]} expressionArguments
  42. */
  43. public initialize (expressionArguments: (ESTree.Expression | ESTree.SpreadElement)[]): void {
  44. this.expressionArguments = expressionArguments;
  45. }
  46. /**
  47. * @returns {TStatement[]}
  48. */
  49. protected getNodeStructure (): TStatement[] {
  50. const calleeIdentifier: ESTree.Identifier = NodeFactory.identifierNode('callee');
  51. const params: ESTree.Identifier[] = [];
  52. const argumentsLength: number = this.expressionArguments.length;
  53. for (let i: number = 0; i < argumentsLength; i++) {
  54. params.push(NodeFactory.identifierNode(`param${i + 1}`));
  55. }
  56. const structure: TStatement = NodeFactory.expressionStatementNode(
  57. NodeFactory.functionExpressionNode(
  58. [
  59. calleeIdentifier,
  60. ...params
  61. ],
  62. NodeFactory.blockStatementNode([
  63. NodeFactory.returnStatementNode(
  64. NodeFactory.callExpressionNode(
  65. calleeIdentifier,
  66. params
  67. )
  68. )
  69. ])
  70. )
  71. );
  72. NodeUtils.parentizeAst(structure);
  73. return [structure];
  74. }
  75. }