1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-03 18:17:55 +01:00

Fixes #9180 allow baseline file

This commit is contained in:
Andrew Nagy 2023-01-25 18:13:27 +00:00
parent b14ed73c0b
commit 27c0caf2fb
3 changed files with 69 additions and 2 deletions

View File

@ -82,6 +82,7 @@ final class LanguageServer
'tcp:',
'tcp-server',
'disable-on-change::',
'use-baseline:',
'enable-autocomplete::',
'enable-code-actions::',
'enable-provide-diagnostics::',
@ -181,6 +182,9 @@ final class LanguageServer
--use-ini-defaults
Use PHP-provided ini defaults for memory and error display
--use-baseline=PATH
Allows you to use a baseline other than the default baseline provided in your config
--tcp=url
Use TCP mode (by default Psalm uses STDIO)
@ -312,6 +316,10 @@ final class LanguageServer
}
}
if (isset($options['use-baseline']) && is_string($options['use-baseline'])) {
$clientConfiguration->baseline = $options['use-baseline'];
}
if (isset($options['disable-on-change']) && is_numeric($options['disable-on-change'])) {
$clientConfiguration->onchangeLineLimit = (int) $options['disable-on-change'];
}

View File

@ -12,6 +12,11 @@ use LanguageServerProtocol\MessageType;
class ClientConfiguration
{
/**
* Location of Baseline file
*/
public ?string $baseline = null;
/**
* TCP Server Address
*/
@ -106,7 +111,8 @@ class ClientConfiguration
?bool $findUnusedVariables = null,
?string $findUnusedCode = null,
?int $logLevel = null,
?int $onchangeLineLimit = null
?int $onchangeLineLimit = null,
?string $baseline = null
) {
$this->hideWarnings = $hideWarnings;
$this->provideCompletion = $provideCompletion;
@ -119,5 +125,6 @@ class ClientConfiguration
$this->findUnusedCode = $findUnusedCode;
$this->logLevel = $logLevel;
$this->onchangeLineLimit = $onchangeLineLimit;
$this->baseline = $baseline;
}
}

View File

@ -37,6 +37,7 @@ use LanguageServerProtocol\TextDocumentSyncKind;
use LanguageServerProtocol\TextDocumentSyncOptions;
use Psalm\Codebase;
use Psalm\Config;
use Psalm\ErrorBaseline;
use Psalm\Internal\Analyzer\IssueData;
use Psalm\Internal\Analyzer\ProjectAnalyzer;
use Psalm\Internal\Composer;
@ -59,10 +60,13 @@ use function array_filter;
use function array_keys;
use function array_map;
use function array_reduce;
use function array_search;
use function array_shift;
use function array_splice;
use function array_unshift;
use function array_values;
use function cli_set_process_title;
use function count;
use function explode;
use function extension_loaded;
use function fwrite;
@ -125,6 +129,9 @@ class LanguageServer extends Dispatcher
*/
protected string $versionedAnalysisDelayToken = '';
/** @var array<string,array<string,array{o:int, s: list<string>}>> */
protected array $issue_baseline = [];
/**
* This should actually be a private property on `parent`
*
@ -578,6 +585,14 @@ class LanguageServer extends Dispatcher
*/
$serverCapabilities->signatureHelpProvider = new SignatureHelpOptions(['(', ',']);
if ($this->client->clientConfiguration->baseline !== null) {
$this->logInfo('Utilizing Baseline: '.$this->client->clientConfiguration->baseline);
$this->issue_baseline= ErrorBaseline::read(
new FileProvider,
$this->client->clientConfiguration->baseline,
);
}
$this->logInfo("Initializing: Complete.");
$this->clientStatus('initialized');
@ -724,6 +739,9 @@ class LanguageServer extends Dispatcher
'version' => $version,
]);
//Copy variable here to be able to process it
$issue_baseline = $this->issue_baseline;
$data = IssueBuffer::clear();
foreach ($files as $file_path => $uri) {
//Dont report errors in files we are not watching
@ -787,7 +805,41 @@ class LanguageServer extends Dispatcher
return $diagnostic;
},
array_filter(
$data[$file_path] ?? [],
array_map(function (IssueData $issue_data) use (&$issue_baseline) {
if (empty($issue_baseline)) {
return $issue_data;
}
//Process Baseline
$file = $issue_data->file_name;
$type = $issue_data->type;
/** @psalm-suppress MixedArrayAccess */
if (isset($issue_baseline[$file][$type]) && $issue_baseline[$file][$type]['o'] > 0) {
/** @psalm-suppress MixedArrayAccess, MixedArgument */
if ($issue_baseline[$file][$type]['o'] === count($issue_baseline[$file][$type]['s'])) {
/** @psalm-suppress MixedArrayAccess, MixedAssignment */
$position = array_search(
trim($issue_data->selected_text),
$issue_baseline[$file][$type]['s'],
true,
);
if ($position !== false) {
$issue_data->severity = Config::REPORT_INFO;
/** @psalm-suppress MixedArgument */
array_splice($issue_baseline[$file][$type]['s'], $position, 1);
/** @psalm-suppress MixedArrayAssignment, MixedOperand, MixedAssignment */
$issue_baseline[$file][$type]['o']--;
}
} else {
/** @psalm-suppress MixedArrayAssignment, MixedOperand, MixedAssignment */
$issue_baseline[$file][$type]['s'] = [];
$issue_data->severity = Config::REPORT_INFO;
/** @psalm-suppress MixedArrayAssignment, MixedOperand, MixedAssignment */
$issue_baseline[$file][$type]['o']--;
}
}
return $issue_data;
}, $data[$file_path] ?? []),
function (IssueData $issue_data) {
//Hide Warnings
if ($issue_data->severity === Config::REPORT_INFO &&