MetadataTransformer.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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 { NodeTransformer } from '../../enums/node-transformers/NodeTransformer';
  8. import { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { NodeGuards } from '../../node/NodeGuards';
  11. import { NodeMetadata } from '../../node/NodeMetadata';
  12. /**
  13. * Adds metadata properties to each node
  14. */
  15. @injectable()
  16. export class MetadataTransformer extends AbstractNodeTransformer {
  17. /**
  18. * @type {NodeTransformer[]}
  19. */
  20. public override readonly runAfter: NodeTransformer[] = [
  21. NodeTransformer.ParentificationTransformer,
  22. NodeTransformer.VariablePreserveTransformer
  23. ];
  24. /**
  25. * @param {IRandomGenerator} randomGenerator
  26. * @param {IOptions} options
  27. */
  28. public constructor (
  29. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  30. @inject(ServiceIdentifiers.IOptions) options: IOptions
  31. ) {
  32. super(randomGenerator, options);
  33. }
  34. /**
  35. * @param {NodeTransformationStage} nodeTransformationStage
  36. * @returns {IVisitor | null}
  37. */
  38. public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null {
  39. switch (nodeTransformationStage) {
  40. case NodeTransformationStage.Preparing:
  41. return {
  42. enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
  43. return this.transformNode(node, parentNode);
  44. }
  45. };
  46. default:
  47. return null;
  48. }
  49. }
  50. /**
  51. * @param {Node} node
  52. * @param {Node} parentNode
  53. * @returns {Node}
  54. */
  55. public transformNode (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node {
  56. NodeMetadata.set(node, { ignoredNode: false });
  57. if (NodeGuards.isLiteralNode(node)) {
  58. NodeMetadata.set(node, { replacedLiteral: false });
  59. }
  60. return node;
  61. }
  62. }