2016-06-10 00:08:25 +02:00
|
|
|
<?php
|
2016-07-26 00:37:44 +02:00
|
|
|
namespace Psalm\Issue;
|
2016-06-10 00:08:25 +02:00
|
|
|
|
2016-12-04 01:11:30 +01:00
|
|
|
use Psalm\CodeLocation;
|
2017-07-25 22:11:02 +02:00
|
|
|
use Psalm\Config;
|
2019-06-26 22:52:29 +02:00
|
|
|
use function explode;
|
|
|
|
use function get_called_class;
|
|
|
|
use function array_pop;
|
2016-12-04 01:11:30 +01:00
|
|
|
|
2016-06-10 00:08:25 +02:00
|
|
|
abstract class CodeIssue
|
|
|
|
{
|
2020-02-17 06:04:46 +01:00
|
|
|
const ERROR_LEVEL = -1;
|
2016-06-10 00:08:25 +02:00
|
|
|
|
2016-11-02 07:29:00 +01:00
|
|
|
/**
|
2016-12-04 01:11:30 +01:00
|
|
|
* @var CodeLocation
|
2016-11-02 07:29:00 +01:00
|
|
|
*/
|
2016-12-04 01:11:30 +01:00
|
|
|
protected $code_location;
|
2016-11-01 05:39:41 +01:00
|
|
|
|
2016-11-02 07:29:00 +01:00
|
|
|
/**
|
|
|
|
* @var string
|
|
|
|
*/
|
2016-06-10 00:08:25 +02:00
|
|
|
protected $message;
|
|
|
|
|
2016-11-01 05:39:41 +01:00
|
|
|
/**
|
2016-12-04 01:11:30 +01:00
|
|
|
* @param string $message
|
|
|
|
* @param CodeLocation $code_location
|
2016-11-01 05:39:41 +01:00
|
|
|
*/
|
2018-01-06 01:49:27 +01:00
|
|
|
public function __construct(
|
|
|
|
$message,
|
|
|
|
CodeLocation $code_location
|
|
|
|
) {
|
2016-12-04 01:11:30 +01:00
|
|
|
$this->code_location = $code_location;
|
2016-06-10 00:08:25 +02:00
|
|
|
$this->message = $message;
|
|
|
|
}
|
|
|
|
|
2016-12-04 01:11:30 +01:00
|
|
|
/**
|
2016-12-08 04:38:57 +01:00
|
|
|
* @return CodeLocation
|
2016-12-04 01:11:30 +01:00
|
|
|
*/
|
2016-12-08 04:38:57 +01:00
|
|
|
public function getLocation()
|
2016-12-04 01:11:30 +01:00
|
|
|
{
|
2016-12-08 04:38:57 +01:00
|
|
|
return $this->code_location;
|
2016-12-04 01:11:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
2019-05-27 16:07:56 +02:00
|
|
|
public function getShortLocationWithPrevious()
|
2016-12-04 01:11:30 +01:00
|
|
|
{
|
2017-06-21 20:22:52 +02:00
|
|
|
$previous_text = '';
|
|
|
|
|
|
|
|
if ($this->code_location->previous_location) {
|
|
|
|
$previous_location = $this->code_location->previous_location;
|
|
|
|
$previous_text = ' from ' . $previous_location->file_name . ':' . $previous_location->getLineNumber();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->code_location->file_name . ':' . $this->code_location->getLineNumber() . $previous_text;
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|
|
|
|
|
2019-05-27 16:07:56 +02:00
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
public function getShortLocation()
|
|
|
|
{
|
|
|
|
return $this->code_location->file_name . ':' . $this->code_location->getLineNumber();
|
|
|
|
}
|
|
|
|
|
2016-11-02 07:29:00 +01:00
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
2016-12-08 04:38:57 +01:00
|
|
|
public function getFilePath()
|
2016-06-10 00:08:25 +02:00
|
|
|
{
|
2016-12-08 04:38:57 +01:00
|
|
|
return $this->code_location->file_path;
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|
|
|
|
|
2016-11-02 07:29:00 +01:00
|
|
|
/**
|
|
|
|
* @return string
|
2017-12-29 23:27:16 +01:00
|
|
|
*
|
|
|
|
* @psalm-suppress PossiblyUnusedMethod for convenience
|
2016-11-02 07:29:00 +01:00
|
|
|
*/
|
2016-12-08 04:38:57 +01:00
|
|
|
public function getFileName()
|
2016-06-10 00:08:25 +02:00
|
|
|
{
|
2016-12-08 04:38:57 +01:00
|
|
|
return $this->code_location->file_name;
|
2016-12-04 01:11:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
2016-12-08 04:38:57 +01:00
|
|
|
public function getMessage()
|
2016-12-04 01:11:30 +01:00
|
|
|
{
|
2016-12-08 04:38:57 +01:00
|
|
|
return $this->message;
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|
2017-07-25 22:11:02 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $severity
|
|
|
|
*
|
2020-02-17 00:24:40 +01:00
|
|
|
* @return \Psalm\Internal\Analyzer\IssueData
|
2017-07-25 22:11:02 +02:00
|
|
|
*/
|
2020-02-17 00:24:40 +01:00
|
|
|
public function toIssueData($severity = Config::REPORT_ERROR)
|
2017-07-25 22:11:02 +02:00
|
|
|
{
|
|
|
|
$location = $this->getLocation();
|
|
|
|
$selection_bounds = $location->getSelectionBounds();
|
|
|
|
$snippet_bounds = $location->getSnippetBounds();
|
|
|
|
|
|
|
|
$fqcn_parts = explode('\\', get_called_class());
|
|
|
|
$issue_type = array_pop($fqcn_parts);
|
|
|
|
|
2020-03-19 22:12:16 +01:00
|
|
|
/** @psalm-suppress UndefinedConstant */
|
2020-02-17 00:24:40 +01:00
|
|
|
return new \Psalm\Internal\Analyzer\IssueData(
|
|
|
|
$severity,
|
|
|
|
$location->getLineNumber(),
|
|
|
|
$location->getEndLineNumber(),
|
|
|
|
$issue_type,
|
|
|
|
$this->getMessage(),
|
|
|
|
$location->file_name,
|
|
|
|
$location->file_path,
|
|
|
|
$location->getSnippet(),
|
|
|
|
$location->getSelectedText(),
|
|
|
|
$selection_bounds[0],
|
|
|
|
$selection_bounds[1],
|
|
|
|
$snippet_bounds[0],
|
|
|
|
$snippet_bounds[1],
|
|
|
|
$location->getColumn(),
|
2020-02-17 22:32:16 +01:00
|
|
|
$location->getEndColumn(),
|
2020-03-19 22:12:16 +01:00
|
|
|
(int) static::SHORTCODE,
|
2020-02-17 22:32:16 +01:00
|
|
|
(int) static::ERROR_LEVEL
|
2020-02-17 00:24:40 +01:00
|
|
|
);
|
2017-07-25 22:11:02 +02:00
|
|
|
}
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|