2007-10-15 02:43:29 +04:00
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
* $Id: Parser.php 14009 2005-03-16 17:33:33Z npac $
|
|
|
|
*
|
|
|
|
* Copyright(c) 2004-2006, SpikeSource Inc. All Rights Reserved.
|
|
|
|
* Licensed under the Open Software License version 2.1
|
|
|
|
* (See http://www.spikesource.com/license.html)
|
|
|
|
*/
|
|
|
|
?>
|
|
|
|
<?php
|
|
|
|
|
2007-10-21 10:23:59 +04:00
|
|
|
if( ! defined("__PHPCOVERAGE_HOME")) {
|
2007-10-15 02:43:29 +04:00
|
|
|
define("__PHPCOVERAGE_HOME", dirname(dirname(__FILE__)));
|
|
|
|
}
|
|
|
|
require_once __PHPCOVERAGE_HOME . "/conf/phpcoverage.conf.php";
|
|
|
|
require_once __PHPCOVERAGE_HOME . "/util/Utility.php";
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Base class for Parsers.
|
|
|
|
*
|
|
|
|
* @author Nimish Pachapurkar (npac@spikesource.com)
|
|
|
|
* @version $Revision: 14009 $
|
|
|
|
* @package SpikePHPCoverage_Parser
|
|
|
|
*/
|
|
|
|
|
|
|
|
define("LINE_TYPE_UNKNOWN", "0");
|
|
|
|
define("LINE_TYPE_EXEC", "1");
|
|
|
|
define("LINE_TYPE_NOEXEC", "2");
|
|
|
|
define("LINE_TYPE_CONT", "3");
|
|
|
|
|
|
|
|
abstract class Parser {
|
|
|
|
/*{{{ Members */
|
|
|
|
|
|
|
|
protected $totalLines;
|
|
|
|
protected $coveredLines;
|
|
|
|
protected $uncoveredLines;
|
|
|
|
protected $fileRef;
|
|
|
|
protected $filename;
|
|
|
|
|
|
|
|
protected $line;
|
|
|
|
protected $logger;
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function __construct() */
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function __construct() {
|
|
|
|
global $util;
|
|
|
|
$this->totalLines = 0;
|
|
|
|
$this->coveredLines = 0;
|
|
|
|
$this->uncoveredLines = 0;
|
|
|
|
|
|
|
|
$this->fileRef = false;
|
|
|
|
$this->line = false;
|
|
|
|
$this->lineType = false;
|
|
|
|
|
|
|
|
$this->logger = $util->getLogger();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public abstract function parse() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Parse a given file
|
|
|
|
*
|
|
|
|
* @param $filename Full path of the file
|
|
|
|
* @return FALSE on error.
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function parse($filename) {
|
|
|
|
$this->filename = $filename;
|
|
|
|
$ret = $this->openFileReadOnly();
|
2007-10-21 10:23:59 +04:00
|
|
|
if( ! $ret) {
|
2007-10-15 02:43:29 +04:00
|
|
|
die("Error: Cannot open file: $this->filename \n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ protected abstract function processLine() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process the line and classify it into either
|
|
|
|
* covered and uncovered.
|
|
|
|
*
|
|
|
|
* @param $line
|
|
|
|
* @return
|
|
|
|
* @access protected
|
|
|
|
*/
|
|
|
|
protected abstract function processLine($line);
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function getLine() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the next line from file.
|
|
|
|
*
|
|
|
|
* @return Next line from file
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function getLine() {
|
2007-10-21 10:23:59 +04:00
|
|
|
if( ! feof($this->fileRef)) {
|
2007-10-15 02:43:29 +04:00
|
|
|
$this->line = fgets($this->fileRef);
|
|
|
|
$this->processLine($this->line);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
fclose($this->fileRef);
|
|
|
|
$this->line = false;
|
|
|
|
}
|
|
|
|
return $this->line;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public abstract function getLineType() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the type of last line read.
|
|
|
|
*
|
|
|
|
* The type can be either
|
|
|
|
* * LINE_TYPE_EXEC Line that can be executed.
|
|
|
|
* * LINE_TYPE_NOEXEC Line that cannot be executed.
|
|
|
|
* This includes the variable and function definitions
|
|
|
|
* (without initialization), blank lines, non-PHP lines,
|
|
|
|
* etc.
|
|
|
|
*
|
|
|
|
* @return Type of last line
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public abstract function getLineType();
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function getLineTypeStr() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the string representation of LINE_TYPE
|
|
|
|
*
|
|
|
|
* @param $lineType
|
|
|
|
* @return Type of line
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function getLineTypeStr($lineType) {
|
|
|
|
if($lineType == LINE_TYPE_EXEC) {
|
|
|
|
return "LINE_TYPE_EXEC";
|
|
|
|
}
|
|
|
|
else if($lineType == LINE_TYPE_NOEXEC) {
|
|
|
|
return "LINE_TYPE_NOEXEC";
|
|
|
|
}
|
|
|
|
else if($lineType == LINE_TYPE_CONT) {
|
|
|
|
return "LINE_TYPE_CONT";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return "LINE_TYPE_UNKNOWN";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ protected function openFileReadOnly() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Opens the file to be parsed in Read-only mode
|
|
|
|
*
|
|
|
|
* @return FALSE on failure.
|
|
|
|
* @access protected
|
|
|
|
*/
|
|
|
|
protected function openFileReadOnly() {
|
|
|
|
$this->fileRef = fopen($this->filename, "r");
|
|
|
|
return $this->fileRef !== false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function getTotalLines() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the total lines (PHP, non-PHP) from a file
|
|
|
|
*
|
|
|
|
* @return Number of lines
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function getTotalLines() {
|
|
|
|
return $this->totalLines;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function getCoveredLines() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of covered PHP lines
|
|
|
|
*
|
|
|
|
* @return Number of covered lines
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function getCoveredLines() {
|
|
|
|
return $this->coveredLines;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
/*{{{ public function getUncoveredLines() */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of uncovered PHP lines
|
|
|
|
*
|
|
|
|
* Note that the sum of covered and uncovered
|
|
|
|
* lines may not be equal to total lines.
|
|
|
|
*
|
|
|
|
* @return Number of uncovered lines
|
|
|
|
* @access public
|
|
|
|
*/
|
|
|
|
public function getUncoveredLines() {
|
|
|
|
return $this->uncoveredLines;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*}}}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
?>
|