/* 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 };