ParentificationTransformer.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IOptions } from '../../interfaces/options/IOptions';
  5. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  6. import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
  7. import { TransformationStage } from '../../enums/node-transformers/TransformationStage';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { NodeUtils } from '../../node/NodeUtils';
  10. /**
  11. * Adds `parentNode` properties to each node
  12. */
  13. @injectable()
  14. export class ParentificationTransformer extends AbstractNodeTransformer {
  15. /**
  16. * @param {IRandomGenerator} randomGenerator
  17. * @param {IOptions} options
  18. */
  19. public constructor (
  20. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  21. @inject(ServiceIdentifiers.IOptions) options: IOptions
  22. ) {
  23. super(randomGenerator, options);
  24. }
  25. /**
  26. * @param {TransformationStage} transformationStage
  27. * @returns {IVisitor | null}
  28. */
  29. public getVisitor (transformationStage: TransformationStage): IVisitor | null {
  30. switch (transformationStage) {
  31. case TransformationStage.Preparing:
  32. return {
  33. enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
  34. return this.transformNode(node, parentNode);
  35. }
  36. };
  37. default:
  38. return null;
  39. }
  40. }
  41. /**
  42. * @param {Node} node
  43. * @param {Node} parentNode
  44. * @returns {Node}
  45. */
  46. public transformNode (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node {
  47. return NodeUtils.parentizeNode(node, parentNode);
  48. }
  49. }