| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | /* Copyright 2015, Yahoo Inc. Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */'use strict';const { FileCoverage } = require('istanbul-lib-coverage').classes;function locString(loc) {    return [        loc.start.line,        loc.start.column,        loc.end.line,        loc.end.column    ].join(':');}class MappedCoverage extends FileCoverage {    constructor(pathOrObj) {        super(pathOrObj);        this.meta = {            last: {                s: 0,                f: 0,                b: 0            },            seen: {}        };    }    addStatement(loc, hits) {        const key = 's:' + locString(loc);        const { meta } = this;        let index = meta.seen[key];        if (index === undefined) {            index = meta.last.s;            meta.last.s += 1;            meta.seen[key] = index;            this.statementMap[index] = this.cloneLocation(loc);        }        this.s[index] = this.s[index] || 0;        this.s[index] += hits;        return index;    }    addFunction(name, decl, loc, hits) {        const key = 'f:' + locString(decl);        const { meta } = this;        let index = meta.seen[key];        if (index === undefined) {            index = meta.last.f;            meta.last.f += 1;            meta.seen[key] = index;            name = name || `(unknown_${index})`;            this.fnMap[index] = {                name,                decl: this.cloneLocation(decl),                loc: this.cloneLocation(loc)            };        }        this.f[index] = this.f[index] || 0;        this.f[index] += hits;        return index;    }    addBranch(type, loc, branchLocations, hits) {        const key = ['b', ...branchLocations.map(l => locString(l))].join(':');        const { meta } = this;        let index = meta.seen[key];        if (index === undefined) {            index = meta.last.b;            meta.last.b += 1;            meta.seen[key] = index;            this.branchMap[index] = {                loc,                type,                locations: branchLocations.map(l => this.cloneLocation(l))            };        }        if (!this.b[index]) {            this.b[index] = branchLocations.map(() => 0);        }        hits.forEach((hit, i) => {            this.b[index][i] += hit;        });        return index;    }    /* Returns a clone of the location object with only the attributes of interest */    cloneLocation(loc) {        return {            start: {                line: loc.start.line,                column: loc.start.column            },            end: {                line: loc.end.line,                column: loc.end.column            }        };    }}module.exports = {    MappedCoverage};
 |