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;
|
2021-06-08 04:55:21 +02:00
|
|
|
|
|
|
|
use function array_pop;
|
2019-06-26 22:52:29 +02:00
|
|
|
use function explode;
|
2016-12-04 01:11:30 +01:00
|
|
|
|
2016-06-10 00:08:25 +02:00
|
|
|
abstract class CodeIssue
|
|
|
|
{
|
2020-09-20 18:54:46 +02:00
|
|
|
public const ERROR_LEVEL = -1;
|
|
|
|
public const SHORTCODE = 0;
|
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
|
2020-09-11 04:44:35 +02:00
|
|
|
* @readonly
|
2016-11-02 07:29:00 +01:00
|
|
|
*/
|
2020-09-11 04:44:35 +02:00
|
|
|
public $code_location;
|
2016-11-01 05:39:41 +01:00
|
|
|
|
2016-11-02 07:29:00 +01:00
|
|
|
/**
|
|
|
|
* @var string
|
2020-09-11 04:44:35 +02:00
|
|
|
* @readonly
|
2016-11-02 07:29:00 +01:00
|
|
|
*/
|
2020-09-11 04:44:35 +02:00
|
|
|
public $message;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var ?string
|
|
|
|
*/
|
|
|
|
public $dupe_key;
|
2016-06-10 00:08:25 +02:00
|
|
|
|
2018-01-06 01:49:27 +01:00
|
|
|
public function __construct(
|
2020-09-07 01:36:47 +02:00
|
|
|
string $message,
|
2018-01-06 01:49:27 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-09-11 04:44:35 +02:00
|
|
|
/**
|
2021-06-20 20:12:20 +02:00
|
|
|
* @deprecated going to be removed in Psalm 5
|
2020-09-11 04:44:35 +02:00
|
|
|
* @psalm-suppress PossiblyUnusedMethod
|
|
|
|
*/
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getLocation(): CodeLocation
|
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
|
|
|
}
|
|
|
|
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getShortLocationWithPrevious(): string
|
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
|
|
|
}
|
|
|
|
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getShortLocation(): string
|
2019-05-27 16:07:56 +02:00
|
|
|
{
|
|
|
|
return $this->code_location->file_name . ':' . $this->code_location->getLineNumber();
|
|
|
|
}
|
|
|
|
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getFilePath(): string
|
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
|
|
|
/**
|
2021-06-20 20:12:20 +02:00
|
|
|
* @deprecated going to be removed in Psalm 5
|
2017-12-29 23:27:16 +01:00
|
|
|
* @psalm-suppress PossiblyUnusedMethod for convenience
|
2016-11-02 07:29:00 +01:00
|
|
|
*/
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getFileName(): string
|
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
|
|
|
}
|
|
|
|
|
2020-09-11 04:44:35 +02:00
|
|
|
/**
|
2021-06-20 20:12:20 +02:00
|
|
|
* @deprecated going to be removed in Psalm 5
|
2020-09-11 04:44:35 +02:00
|
|
|
* @psalm-suppress PossiblyUnusedMethod
|
|
|
|
*/
|
2020-09-04 22:26:33 +02:00
|
|
|
public function getMessage(): string
|
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
|
|
|
|
2021-09-26 21:09:20 +02:00
|
|
|
public function toIssueData(string $severity): \Psalm\Internal\Analyzer\IssueData
|
2017-07-25 22:11:02 +02:00
|
|
|
{
|
2020-09-11 04:44:35 +02:00
|
|
|
$location = $this->code_location;
|
2017-07-25 22:11:02 +02:00
|
|
|
$selection_bounds = $location->getSelectionBounds();
|
|
|
|
$snippet_bounds = $location->getSnippetBounds();
|
|
|
|
|
2021-09-26 22:56:52 +02:00
|
|
|
$fqcn_parts = explode('\\', static::class);
|
2017-07-25 22:11:02 +02:00
|
|
|
$issue_type = array_pop($fqcn_parts);
|
|
|
|
|
2020-02-17 00:24:40 +01:00
|
|
|
return new \Psalm\Internal\Analyzer\IssueData(
|
|
|
|
$severity,
|
|
|
|
$location->getLineNumber(),
|
|
|
|
$location->getEndLineNumber(),
|
|
|
|
$issue_type,
|
2020-09-11 04:44:35 +02:00
|
|
|
$this->message,
|
2020-02-17 00:24:40 +01:00
|
|
|
$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-06-30 19:17:51 +02:00
|
|
|
(int) static::ERROR_LEVEL,
|
2021-03-17 06:10:42 +01:00
|
|
|
$this instanceof TaintedInput
|
|
|
|
? $this->getTaintTrace()
|
|
|
|
: null,
|
2021-03-21 02:44:04 +01:00
|
|
|
$this instanceof MixedIssue && ($origin_location = $this->getOriginalLocation())
|
2021-03-17 06:10:42 +01:00
|
|
|
? [
|
|
|
|
TaintedInput::nodeToDataFlowNodeData(
|
2021-03-21 02:44:04 +01:00
|
|
|
$origin_location,
|
2021-05-21 15:15:23 +02:00
|
|
|
'The type of ' . $location->getSelectedText() . ' is sourced from here'
|
2021-03-17 06:10:42 +01:00
|
|
|
)
|
|
|
|
]
|
|
|
|
: null,
|
2020-09-11 04:44:35 +02:00
|
|
|
$this->dupe_key
|
2020-02-17 00:24:40 +01:00
|
|
|
);
|
2017-07-25 22:11:02 +02:00
|
|
|
}
|
2016-06-10 00:08:25 +02:00
|
|
|
}
|