From c6536c14bf0663ca7e0493dd40ea132b05352594 Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Mon, 3 Feb 2020 01:56:48 -0500 Subject: [PATCH] fix: Always call coverage initialization function (#524) Ensure that sources initialize coverage data even if no code is run. --- packages/istanbul-lib-instrument/src/visitor.js | 16 ++++++---------- .../istanbul-lib-instrument/test/varia.test.js | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/istanbul-lib-instrument/src/visitor.js b/packages/istanbul-lib-instrument/src/visitor.js index 1e264fce..fee7a023 100644 --- a/packages/istanbul-lib-instrument/src/visitor.js +++ b/packages/istanbul-lib-instrument/src/visitor.js @@ -28,7 +28,6 @@ class VisitState { ignoreClassMethods = [] ) { this.varName = genVar(sourceFilePath); - this.varCalled = false; this.attrs = {}; this.nextIgnore = null; this.cov = new SourceCoverage(sourceFilePath); @@ -168,7 +167,6 @@ class VisitState { ? // If `index` present, turn `x` into `x[index]`. x => T.memberExpression(x, T.numericLiteral(index), true) : x => x; - this.varCalled = true; return T.updateExpression( '++', wrap( @@ -664,14 +662,12 @@ function programVisitor(types, sourceFilePath = 'unknown.js', opts = {}) { INITIAL: coverageNode, HASH: T.stringLiteral(hash) }); - // explicitly call this.varName if this file has no coverage - if (!visitState.varCalled) { - path.node.body.unshift( - T.expressionStatement( - T.callExpression(T.identifier(visitState.varName), []) - ) - ); - } + // explicitly call this.varName to ensure coverage is always initialized + path.node.body.unshift( + T.expressionStatement( + T.callExpression(T.identifier(visitState.varName), []) + ) + ); path.node.body.unshift(cv); return { fileCoverage: coverageData, diff --git a/packages/istanbul-lib-instrument/test/varia.test.js b/packages/istanbul-lib-instrument/test/varia.test.js index 6ebb87ef..a8de4856 100644 --- a/packages/istanbul-lib-instrument/test/varia.test.js +++ b/packages/istanbul-lib-instrument/test/varia.test.js @@ -96,7 +96,7 @@ describe('varia', () => { const code = v.getGeneratedCode(); assert.ok( code.match( - /return actualCoverage;}export function fn1\(\){cov_(.+)\.f\[\d+\]\+\+;}export default function\(\){cov_(.+)\.f\[\d+\]\+\+;}/ + /return actualCoverage;}cov_([^(]+)\(\);export function fn1\(\){cov_(.+)\.f\[\d+\]\+\+;}export default function\(\){cov_(.+)\.f\[\d+\]\+\+;}/ ) ); });