1
0
mirror of https://github.com/danog/psalm.git synced 2025-01-09 22:49:31 +01:00
psalm/src/Psalm/Issue/CodeIssue.php

130 lines
3.4 KiB
PHP
Raw Normal View History

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
use Psalm\CodeLocation;
2021-06-08 04:55:21 +02:00
use function array_pop;
use function explode;
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
/**
* @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
public function __construct(
string $message,
CodeLocation $code_location
) {
$this->code_location = $code_location;
2016-06-10 00:08:25 +02:00
$this->message = $message;
}
2020-09-11 04:44:35 +02:00
/**
* @deprecated going to be removed in Psalm 5
2020-09-11 04:44:35 +02:00
* @psalm-suppress PossiblyUnusedMethod
*/
public function getLocation(): CodeLocation
{
2016-12-08 04:38:57 +01:00
return $this->code_location;
}
public function getShortLocationWithPrevious(): string
{
$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
}
public function getShortLocation(): string
2019-05-27 16:07:56 +02:00
{
return $this->code_location->file_name . ':' . $this->code_location->getLineNumber();
}
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
/**
* @deprecated going to be removed in Psalm 5
* @psalm-suppress PossiblyUnusedMethod for convenience
2016-11-02 07:29:00 +01: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;
}
2020-09-11 04:44:35 +02:00
/**
* @deprecated going to be removed in Psalm 5
2020-09-11 04:44:35 +02:00
* @psalm-suppress PossiblyUnusedMethod
*/
public function getMessage(): string
{
2016-12-08 04:38:57 +01:00
return $this->message;
2016-06-10 00:08:25 +02:00
}
Refactor scanning and analysis, introducing multithreading (#191) * Add failing test * Add visitor to soup up classlike references * Move a whole bunch of code into the visitor * Move some methods back, move onto analysis stage * Use the getAliases method everywhere * Fix refs * Fix more refs * Fix some tests * Fix more tests * Fix include tests * Shift config class finding to project checker and fix bugs * Fix a few more tests * transition test to new syntax * Remove var_dump * Delete a bunch of code and fix mutation test * Remove unnecessary visitation * Transition to better mocked out file provider, breaking some cached statement loading * Use different scheme for naming anonymous classes * Fix anonymous class issues * Refactor file/statement loading * Add specific property types * Fix mapped property assignment * Improve how we deal with traits * Fix trait checking * Pass Psalm checks * Add multi-process support * Delay console output until the end * Remove PHP 7 syntax * Update file storage with classes * Fix scanning individual files and add reflection return types * Always turn XDebug off * Add quicker method of getting method mutations * Queue return types for crawling * Interpret all strings as possible classes once we see a `get_class` call * Check invalid return types again * Fix template namespacing issues * Default to class-insensitive file names for includes * Don’t overwrite existing issues data * Add var docblocks for scanning * Add null check * Fix loading of external classes in templates * Only try to populate class when we haven’t yet seen it’s not a class * Fix trait property accessibility * Only ever improve docblock param type * Make param replacement more robust * Fix static const missing inferred type * Fix a few more tests * Register constant definitions * Fix trait aliasing * Skip constant type tests for now * Fix linting issues * Make sure caching is off for tests * Remove unnecessary return * Use emulative parser if on PHP 5.6 * Cache parser for faster first-time parse * Fix constant resolution when scanning classes * Remove test that’s beyond a practical scope * Add back --diff support * Add --help for --threads * Remove unused vars
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
Refactor scanning and analysis, introducing multithreading (#191) * Add failing test * Add visitor to soup up classlike references * Move a whole bunch of code into the visitor * Move some methods back, move onto analysis stage * Use the getAliases method everywhere * Fix refs * Fix more refs * Fix some tests * Fix more tests * Fix include tests * Shift config class finding to project checker and fix bugs * Fix a few more tests * transition test to new syntax * Remove var_dump * Delete a bunch of code and fix mutation test * Remove unnecessary visitation * Transition to better mocked out file provider, breaking some cached statement loading * Use different scheme for naming anonymous classes * Fix anonymous class issues * Refactor file/statement loading * Add specific property types * Fix mapped property assignment * Improve how we deal with traits * Fix trait checking * Pass Psalm checks * Add multi-process support * Delay console output until the end * Remove PHP 7 syntax * Update file storage with classes * Fix scanning individual files and add reflection return types * Always turn XDebug off * Add quicker method of getting method mutations * Queue return types for crawling * Interpret all strings as possible classes once we see a `get_class` call * Check invalid return types again * Fix template namespacing issues * Default to class-insensitive file names for includes * Don’t overwrite existing issues data * Add var docblocks for scanning * Add null check * Fix loading of external classes in templates * Only try to populate class when we haven’t yet seen it’s not a class * Fix trait property accessibility * Only ever improve docblock param type * Make param replacement more robust * Fix static const missing inferred type * Fix a few more tests * Register constant definitions * Fix trait aliasing * Skip constant type tests for now * Fix linting issues * Make sure caching is off for tests * Remove unnecessary return * Use emulative parser if on PHP 5.6 * Cache parser for faster first-time parse * Fix constant resolution when scanning classes * Remove test that’s beyond a practical scope * Add back --diff support * Add --help for --threads * Remove unused vars
2017-07-25 22:11:02 +02:00
{
2020-09-11 04:44:35 +02:00
$location = $this->code_location;
Refactor scanning and analysis, introducing multithreading (#191) * Add failing test * Add visitor to soup up classlike references * Move a whole bunch of code into the visitor * Move some methods back, move onto analysis stage * Use the getAliases method everywhere * Fix refs * Fix more refs * Fix some tests * Fix more tests * Fix include tests * Shift config class finding to project checker and fix bugs * Fix a few more tests * transition test to new syntax * Remove var_dump * Delete a bunch of code and fix mutation test * Remove unnecessary visitation * Transition to better mocked out file provider, breaking some cached statement loading * Use different scheme for naming anonymous classes * Fix anonymous class issues * Refactor file/statement loading * Add specific property types * Fix mapped property assignment * Improve how we deal with traits * Fix trait checking * Pass Psalm checks * Add multi-process support * Delay console output until the end * Remove PHP 7 syntax * Update file storage with classes * Fix scanning individual files and add reflection return types * Always turn XDebug off * Add quicker method of getting method mutations * Queue return types for crawling * Interpret all strings as possible classes once we see a `get_class` call * Check invalid return types again * Fix template namespacing issues * Default to class-insensitive file names for includes * Don’t overwrite existing issues data * Add var docblocks for scanning * Add null check * Fix loading of external classes in templates * Only try to populate class when we haven’t yet seen it’s not a class * Fix trait property accessibility * Only ever improve docblock param type * Make param replacement more robust * Fix static const missing inferred type * Fix a few more tests * Register constant definitions * Fix trait aliasing * Skip constant type tests for now * Fix linting issues * Make sure caching is off for tests * Remove unnecessary return * Use emulative parser if on PHP 5.6 * Cache parser for faster first-time parse * Fix constant resolution when scanning classes * Remove test that’s beyond a practical scope * Add back --diff support * Add --help for --threads * Remove unused vars
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);
Refactor scanning and analysis, introducing multithreading (#191) * Add failing test * Add visitor to soup up classlike references * Move a whole bunch of code into the visitor * Move some methods back, move onto analysis stage * Use the getAliases method everywhere * Fix refs * Fix more refs * Fix some tests * Fix more tests * Fix include tests * Shift config class finding to project checker and fix bugs * Fix a few more tests * transition test to new syntax * Remove var_dump * Delete a bunch of code and fix mutation test * Remove unnecessary visitation * Transition to better mocked out file provider, breaking some cached statement loading * Use different scheme for naming anonymous classes * Fix anonymous class issues * Refactor file/statement loading * Add specific property types * Fix mapped property assignment * Improve how we deal with traits * Fix trait checking * Pass Psalm checks * Add multi-process support * Delay console output until the end * Remove PHP 7 syntax * Update file storage with classes * Fix scanning individual files and add reflection return types * Always turn XDebug off * Add quicker method of getting method mutations * Queue return types for crawling * Interpret all strings as possible classes once we see a `get_class` call * Check invalid return types again * Fix template namespacing issues * Default to class-insensitive file names for includes * Don’t overwrite existing issues data * Add var docblocks for scanning * Add null check * Fix loading of external classes in templates * Only try to populate class when we haven’t yet seen it’s not a class * Fix trait property accessibility * Only ever improve docblock param type * Make param replacement more robust * Fix static const missing inferred type * Fix a few more tests * Register constant definitions * Fix trait aliasing * Skip constant type tests for now * Fix linting issues * Make sure caching is off for tests * Remove unnecessary return * Use emulative parser if on PHP 5.6 * Cache parser for faster first-time parse * Fix constant resolution when scanning classes * Remove test that’s beyond a practical scope * Add back --diff support * Add --help for --threads * Remove unused vars
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(),
(int) static::SHORTCODE,
(int) static::ERROR_LEVEL,
2021-03-17 06:10:42 +01:00
$this instanceof TaintedInput
? $this->getTaintTrace()
: null,
$this instanceof MixedIssue && ($origin_location = $this->getOriginalLocation())
2021-03-17 06:10:42 +01:00
? [
TaintedInput::nodeToDataFlowNodeData(
$origin_location,
'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
);
Refactor scanning and analysis, introducing multithreading (#191) * Add failing test * Add visitor to soup up classlike references * Move a whole bunch of code into the visitor * Move some methods back, move onto analysis stage * Use the getAliases method everywhere * Fix refs * Fix more refs * Fix some tests * Fix more tests * Fix include tests * Shift config class finding to project checker and fix bugs * Fix a few more tests * transition test to new syntax * Remove var_dump * Delete a bunch of code and fix mutation test * Remove unnecessary visitation * Transition to better mocked out file provider, breaking some cached statement loading * Use different scheme for naming anonymous classes * Fix anonymous class issues * Refactor file/statement loading * Add specific property types * Fix mapped property assignment * Improve how we deal with traits * Fix trait checking * Pass Psalm checks * Add multi-process support * Delay console output until the end * Remove PHP 7 syntax * Update file storage with classes * Fix scanning individual files and add reflection return types * Always turn XDebug off * Add quicker method of getting method mutations * Queue return types for crawling * Interpret all strings as possible classes once we see a `get_class` call * Check invalid return types again * Fix template namespacing issues * Default to class-insensitive file names for includes * Don’t overwrite existing issues data * Add var docblocks for scanning * Add null check * Fix loading of external classes in templates * Only try to populate class when we haven’t yet seen it’s not a class * Fix trait property accessibility * Only ever improve docblock param type * Make param replacement more robust * Fix static const missing inferred type * Fix a few more tests * Register constant definitions * Fix trait aliasing * Skip constant type tests for now * Fix linting issues * Make sure caching is off for tests * Remove unnecessary return * Use emulative parser if on PHP 5.6 * Cache parser for faster first-time parse * Fix constant resolution when scanning classes * Remove test that’s beyond a practical scope * Add back --diff support * Add --help for --threads * Remove unused vars
2017-07-25 22:11:02 +02:00
}
2016-06-10 00:08:25 +02:00
}