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
|
|
|
|
{
|
|
|
|
const CODE_EXCEPTION = 1;
|
|
|
|
|
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
|
|
|
|
*
|
2018-02-20 00:16:09 +01:00
|
|
|
* @return array{severity: string, line_from: int, line_to: int, type: string, message: string, file_name: string,
|
2018-01-02 02:04:03 +01:00
|
|
|
* file_path: string, snippet: string, selected_text: string, from: int, to: int, snippet_from: int,
|
2018-02-20 00:16:09 +01:00
|
|
|
* snippet_to: int, column_from: int, column_to: int}
|
2017-07-25 22:11:02 +02:00
|
|
|
*/
|
|
|
|
public function toArray($severity = Config::REPORT_ERROR)
|
|
|
|
{
|
|
|
|
$location = $this->getLocation();
|
|
|
|
$selection_bounds = $location->getSelectionBounds();
|
|
|
|
$snippet_bounds = $location->getSnippetBounds();
|
|
|
|
|
|
|
|
$fqcn_parts = explode('\\', get_called_class());
|
|
|
|
$issue_type = array_pop($fqcn_parts);
|
|
|
|
|
|
|
|
return [
|
|
|
|
'severity' => $severity,
|
2018-02-20 00:16:09 +01:00
|
|
|
'line_from' => $location->getLineNumber(),
|
|
|
|
'line_to' => $location->getEndLineNumber(),
|
2017-07-25 22:11:02 +02:00
|
|
|
'type' => $issue_type,
|
|
|
|
'message' => $this->getMessage(),
|
|
|
|
'file_name' => $location->file_name,
|
|
|
|
'file_path' => $location->file_path,
|
|
|
|
'snippet' => $location->getSnippet(),
|
2018-01-02 02:04:03 +01:00
|
|
|
'selected_text' => $location->getSelectedText(),
|
2017-07-25 22:11:02 +02:00
|
|
|
'from' => $selection_bounds[0],
|
|
|
|
'to' => $selection_bounds[1],
|
|
|
|
'snippet_from' => $snippet_bounds[0],
|
|
|
|
'snippet_to' => $snippet_bounds[1],
|
2018-02-20 00:16:09 +01:00
|
|
|
'column_from' => $location->getColumn(),
|
|
|
|
'column_to' => $location->getEndColumn(),
|
2017-07-25 22:11:02 +02:00
|
|
|
];
|
|
|
|
}
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|