123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 'use strict';
- const {ReferenceTracker} = require('@eslint-community/eslint-utils');
- const createTraceMap = (object, type) => {
- let map = {[type]: true};
- const path = object.split('.').reverse();
- for (const name of path) {
- map = {[name]: map};
- }
- return map;
- };
- class GlobalReferenceTracker {
- #traceMap = {};
- #filter;
- #handle;
- constructor({
- object,
- objects = [object],
- filter,
- handle,
- type = ReferenceTracker.READ,
- }) {
- for (const object of objects) {
- Object.assign(this.#traceMap, createTraceMap(object, type));
- }
- this.#filter = filter;
- this.#handle = handle;
- }
- * track(globalScope) {
- const tracker = new ReferenceTracker(globalScope);
- for (const reference of tracker.iterateGlobalReferences(this.#traceMap)) {
- if (this.#filter && !this.#filter(reference)) {
- continue;
- }
- const problems = this.#handle(reference);
- if (!problems) {
- continue;
- }
- if (problems[Symbol.iterator]) {
- yield * problems;
- } else {
- yield problems;
- }
- }
- }
- createListeners(context) {
- return {
- 'Program:exit': () => this.track(context.getScope()),
- };
- }
- }
- Object.assign(GlobalReferenceTracker, {
- READ: ReferenceTracker.READ,
- CALL: ReferenceTracker.CALL,
- CONSTRUCT: ReferenceTracker.CONSTRUCT,
- });
- module.exports = {
- GlobalReferenceTracker,
- };
|