PrevailingKindOfVariablesAnalyzer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import { IArrayUtils } from '../../interfaces/utils/IArrayUtils';
  6. import { IPrevailingKindOfVariablesAnalyzer } from '../../interfaces/analyzers/calls-graph-analyzer/IPrevailingKindOfVariablesAnalyzer';
  7. import { NodeGuards } from '../../node/NodeGuards';
  8. @injectable()
  9. export class PrevailingKindOfVariablesAnalyzer implements IPrevailingKindOfVariablesAnalyzer {
  10. /**
  11. * @type {ESTree.VariableDeclaration['kind']}
  12. */
  13. private static readonly defaultKindOfVariables: ESTree.VariableDeclaration['kind'] = 'var';
  14. /**
  15. * @type {IArrayUtils}
  16. */
  17. private readonly arrayUtils: IArrayUtils;
  18. /**
  19. * @type {ESTree.VariableDeclaration['kind']}
  20. */
  21. private prevailingKindOfVariables: ESTree.VariableDeclaration['kind'] = PrevailingKindOfVariablesAnalyzer.defaultKindOfVariables;
  22. constructor (
  23. @inject(ServiceIdentifiers.IArrayUtils) arrayUtils: IArrayUtils
  24. ) {
  25. this.arrayUtils = arrayUtils;
  26. }
  27. /**
  28. * @param {Program} astTree
  29. */
  30. public analyze (astTree: ESTree.Program): void {
  31. const variableKinds: ESTree.VariableDeclaration['kind'][] = [];
  32. estraverse.traverse(astTree, {
  33. enter: (node: ESTree.Node): estraverse.VisitorOption | void => {
  34. if (!NodeGuards.isVariableDeclarationNode(node)) {
  35. return;
  36. }
  37. variableKinds.push(node.kind);
  38. }
  39. });
  40. this.prevailingKindOfVariables = this.arrayUtils.findMostOccurringElement(variableKinds)
  41. || PrevailingKindOfVariablesAnalyzer.defaultKindOfVariables;
  42. }
  43. /**
  44. * @returns {VariableDeclaration["kind"]}
  45. */
  46. public getPrevailingKind (): ESTree.VariableDeclaration['kind'] {
  47. return this.prevailingKindOfVariables;
  48. }
  49. }