From 50c93723dbd1d55cf187527a02490944b6f22b5b Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 15 Aug 2015 17:25:21 +0200 Subject: [PATCH 1/2] Fix coverage for nested functions and classes --- src/CodeCoverage/Report/Node/File.php | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 03b3d8cf8..9edf596b0 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -351,6 +351,8 @@ public function getNumTestedFunctions() */ protected function calculateStatistics() { + $classStack = $functionStack = []; + if ($this->cacheTokens) { $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath()); } else { @@ -367,6 +369,10 @@ protected function calculateStatistics() if (isset($this->startLines[$lineNumber])) { // Start line of a class. if (isset($this->startLines[$lineNumber]['className'])) { + if (isset($currentClass)) { + $classStack[] = &$currentClass; + } + $currentClass = &$this->startLines[$lineNumber]; } // Start line of a trait. elseif (isset($this->startLines[$lineNumber]['traitName'])) { @@ -376,12 +382,15 @@ protected function calculateStatistics() $currentMethod = &$this->startLines[$lineNumber]; } // Start line of a function. elseif (isset($this->startLines[$lineNumber]['functionName'])) { + if (isset($currentFunction)) { + $functionStack[] = &$currentFunction; + } + $currentFunction = &$this->startLines[$lineNumber]; } } - if (isset($this->coverageData[$lineNumber]) && - $this->coverageData[$lineNumber] !== null) { + if (isset($this->coverageData[$lineNumber])) { if (isset($currentClass)) { $currentClass['executableLines']++; } @@ -425,6 +434,13 @@ protected function calculateStatistics() // End line of a class. if (isset($this->endLines[$lineNumber]['className'])) { unset($currentClass); + + if ($classStack) { + end($classStack); + $key = key($classStack); + $currentClass = &$classStack[$key]; + unset($classStack[$key]); + } } // End line of a trait. elseif (isset($this->endLines[$lineNumber]['traitName'])) { unset($currentTrait); @@ -434,6 +450,13 @@ protected function calculateStatistics() } // End line of a function. elseif (isset($this->endLines[$lineNumber]['functionName'])) { unset($currentFunction); + + if ($functionStack) { + end($functionStack); + $key = key($functionStack); + $currentFunction = &$functionStack[$key]; + unset($functionsStack[$key]); + } } } } From 44a1171c933c24571eb32f50ee6215ba61a5cb91 Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 15 Aug 2015 17:39:35 +0200 Subject: [PATCH 2/2] Add PHP 5.3 compability... --- src/CodeCoverage/Report/Node/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CodeCoverage/Report/Node/File.php b/src/CodeCoverage/Report/Node/File.php index 9edf596b0..0b20cf5c8 100644 --- a/src/CodeCoverage/Report/Node/File.php +++ b/src/CodeCoverage/Report/Node/File.php @@ -351,7 +351,7 @@ public function getNumTestedFunctions() */ protected function calculateStatistics() { - $classStack = $functionStack = []; + $classStack = $functionStack = array(); if ($this->cacheTokens) { $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath());