CallExpressionFunctionNode.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { TStatement } from '../../types/node/TStatement';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { initializable } from '../../decorators/Initializable';
  7. import { AbstractCustomNode } from '../AbstractCustomNode';
  8. import { Nodes } from '../../node/Nodes';
  9. import { NodeUtils } from '../../node/NodeUtils';
  10. import { RandomGeneratorUtils } from '../../utils/RandomGeneratorUtils';
  11. @injectable()
  12. export class CallExpressionFunctionNode extends AbstractCustomNode {
  13. /**
  14. * @type {(ESTree.Expression | ESTree.SpreadElement)[]}
  15. */
  16. @initializable()
  17. private expressionArguments: (ESTree.Expression | ESTree.SpreadElement)[];
  18. /**
  19. * @param options
  20. */
  21. constructor (
  22. @inject(ServiceIdentifiers.IOptions) options: IOptions
  23. ) {
  24. super(options);
  25. }
  26. /**
  27. * @param expressionArguments
  28. */
  29. public initialize (expressionArguments: (ESTree.Expression | ESTree.SpreadElement)[]): void {
  30. this.expressionArguments = expressionArguments;
  31. }
  32. /**
  33. * @returns {TStatement[]}
  34. */
  35. protected getNodeStructure (): TStatement[] {
  36. const calleeIdentifier: ESTree.Identifier = Nodes.getIdentifierNode('callee');
  37. const params: ESTree.Identifier[] = [];
  38. const argumentsLength: number = this.expressionArguments.length;
  39. for (let i: number = 0; i < argumentsLength; i++) {
  40. params.push(Nodes.getIdentifierNode(`param${i + 1}`));
  41. }
  42. const structure: TStatement = Nodes.getFunctionDeclarationNode(
  43. RandomGeneratorUtils.getRandomString(3),
  44. [
  45. calleeIdentifier,
  46. ...params
  47. ],
  48. Nodes.getBlockStatementNode([
  49. Nodes.getReturnStatementNode(
  50. Nodes.getCallExpressionNode(
  51. calleeIdentifier,
  52. params
  53. )
  54. )
  55. ])
  56. );
  57. NodeUtils.parentize(structure);
  58. return [structure];
  59. }
  60. }