mirror of
https://github.com/danog/psalm.git
synced 2024-11-30 04:39:00 +01:00
Report unused baseline entries
This commit is contained in:
parent
b6bdc94070
commit
56f6dfecc8
@ -44,6 +44,8 @@
|
||||
<xs:attribute name="findUnusedCode" type="xs:boolean" default="false" />
|
||||
<xs:attribute name="findUnusedVariablesAndParams" type="xs:boolean" default="false" />
|
||||
<xs:attribute name="findUnusedPsalmSuppress" type="xs:boolean" default="false" />
|
||||
<!-- TODO: Update default to true in Psalm 6 -->
|
||||
<xs:attribute name="findUnusedBaselineEntry" type="xs:boolean" default="false" />
|
||||
<xs:attribute name="hideExternalErrors" type="xs:boolean" default="false" />
|
||||
<xs:attribute name="hoistConstants" type="xs:boolean" default="false" />
|
||||
<xs:attribute name="ignoreInternalFunctionFalseReturn" type="xs:boolean" default="true" />
|
||||
@ -476,6 +478,7 @@
|
||||
<xs:element name="UnsafeGenericInstantiation" type="IssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnsafeInstantiation" type="IssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnsupportedReferenceUsage" type="IssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnusedBaselineEntry" type="IssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnusedClass" type="ClassIssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnusedClosureParam" type="IssueHandlerType" minOccurs="0" />
|
||||
<xs:element name="UnusedConstructor" type="MethodIssueHandlerType" minOccurs="0" />
|
||||
|
@ -491,6 +491,10 @@ class PremiumCar extends StandardCar {
|
||||
```
|
||||
`ImplementedReturnTypeMismatch - The inherited return type 'list{'motor', 'brakes', 'wheels'}' for StandardCar::getSystems is different to the implemented return type for PremiumCar::getsystems 'list{'motor', 'brakes', 'wheels', 'rear parking sensor'}'`
|
||||
|
||||
#### findUnusedBaselineEntry
|
||||
|
||||
Emits [UnusedBaselineEntry](issues/UnusedBaselineEntry.md) when a baseline entry
|
||||
is not being used to suppress an issue.
|
||||
|
||||
## Project settings
|
||||
|
||||
|
@ -282,6 +282,7 @@
|
||||
- [UnsafeGenericInstantiation](issues/UnsafeGenericInstantiation.md)
|
||||
- [UnsafeInstantiation](issues/UnsafeInstantiation.md)
|
||||
- [UnsupportedReferenceUsage](issues/UnsupportedReferenceUsage.md)
|
||||
- [UnusedBaselineEntry](issues/UnusedBaselineEntry.md)
|
||||
- [UnusedClass](issues/UnusedClass.md)
|
||||
- [UnusedClosureParam](issues/UnusedClosureParam.md)
|
||||
- [UnusedConstructor](issues/UnusedConstructor.md)
|
||||
|
22
docs/running_psalm/issues/UnusedBaselineEntry.md
Normal file
22
docs/running_psalm/issues/UnusedBaselineEntry.md
Normal file
@ -0,0 +1,22 @@
|
||||
# UnusedBaselineEntry
|
||||
|
||||
Emitted when a baseline entry is not being used to suppress an issue.
|
||||
|
||||
Enabled by [findUnusedBaselineEntry](../configuration.md#findunusedbaselineentry)
|
||||
|
||||
```php
|
||||
<?php
|
||||
$a = 'Hello, World!';
|
||||
echo $a;
|
||||
```
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<files>
|
||||
<file src="example.php">
|
||||
<UnusedVariable>
|
||||
<!-- The following entry is unused and should be removed. -->
|
||||
<code>$a</code>
|
||||
</UnusedVariable>
|
||||
</file>
|
||||
</files>
|
||||
```
|
@ -701,11 +701,6 @@
|
||||
<code>hasLowercaseString</code>
|
||||
</PossiblyUnusedMethod>
|
||||
</file>
|
||||
<file src="tests/Internal/Codebase/InternalCallMapHandlerTest.php">
|
||||
<UnusedPsalmSuppress>
|
||||
<code>UndefinedMethod</code>
|
||||
</UnusedPsalmSuppress>
|
||||
</file>
|
||||
<file src="vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php">
|
||||
<PossiblyUndefinedStringArrayOffset>
|
||||
<code>$subNodes['expr']</code>
|
||||
|
@ -12,6 +12,7 @@
|
||||
limitMethodComplexity="true"
|
||||
errorBaseline="psalm-baseline.xml"
|
||||
findUnusedPsalmSuppress="true"
|
||||
findUnusedBaselineEntry="true"
|
||||
>
|
||||
<stubs>
|
||||
<file name="stubs/phpparser.phpstub"/>
|
||||
|
@ -460,6 +460,11 @@ class Config
|
||||
*/
|
||||
public $find_unused_psalm_suppress = false;
|
||||
|
||||
/**
|
||||
* TODO: Psalm 6: Update default to be true and remove warning.
|
||||
*/
|
||||
public bool $find_unused_baseline_entry = false;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
@ -1061,6 +1066,7 @@ class Config
|
||||
'allowInternalNamedArgumentsCalls' => 'allow_internal_named_arg_calls',
|
||||
'allowNamedArgumentCalls' => 'allow_named_arg_calls',
|
||||
'findUnusedPsalmSuppress' => 'find_unused_psalm_suppress',
|
||||
'findUnusedBaselineEntry' => 'find_unused_baseline_entry',
|
||||
'reportInfo' => 'report_info',
|
||||
'restrictReturnTypes' => 'restrict_return_types',
|
||||
'limitMethodComplexity' => 'limit_method_complexity',
|
||||
@ -1164,6 +1170,10 @@ class Config
|
||||
$config->use_igbinary = version_compare($igbinary_version, '2.0.5') >= 0;
|
||||
}
|
||||
|
||||
if (!isset($config_xml['findUnusedBaselineEntry']) && !defined('__IS_TEST_ENV__')) {
|
||||
fwrite(STDERR, 'Warning: "findUnusedBaselineEntry" will be defaulted to "true" in Psalm 6. You should'
|
||||
. ' explicitly enable or disable this setting.' . PHP_EOL);
|
||||
}
|
||||
|
||||
if (isset($config_xml['findUnusedCode'])) {
|
||||
$attribute_text = (string) $config_xml['findUnusedCode'];
|
||||
|
@ -45,6 +45,7 @@ final class Creator
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="https://getpsalm.org/schema/config"
|
||||
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||
findUnusedBaselineEntry="true"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src" />
|
||||
|
11
src/Psalm/Issue/UnusedBaselineEntry.php
Normal file
11
src/Psalm/Issue/UnusedBaselineEntry.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Psalm\Issue;
|
||||
|
||||
class UnusedBaselineEntry extends ClassIssue
|
||||
{
|
||||
public const ERROR_LEVEL = -1;
|
||||
public const SHORTCODE = 316;
|
||||
}
|
@ -14,6 +14,7 @@ use Psalm\Issue\CodeIssue;
|
||||
use Psalm\Issue\ConfigIssue;
|
||||
use Psalm\Issue\MixedIssue;
|
||||
use Psalm\Issue\TaintedInput;
|
||||
use Psalm\Issue\UnusedBaselineEntry;
|
||||
use Psalm\Issue\UnusedPsalmSuppress;
|
||||
use Psalm\Plugin\EventHandler\Event\AfterAnalysisEvent;
|
||||
use Psalm\Plugin\EventHandler\Event\BeforeAddIssueEvent;
|
||||
@ -611,6 +612,39 @@ final class IssueBuffer
|
||||
$issues_data[$file_path][$key] = $issue_data;
|
||||
}
|
||||
}
|
||||
|
||||
if ($codebase->config->find_unused_baseline_entry) {
|
||||
foreach ($issue_baseline as $file_path => $issues) {
|
||||
foreach ($issues as $issue_name => $issue) {
|
||||
if ($issue['o'] !== 0) {
|
||||
$issues_data[$file_path][] = new IssueData(
|
||||
Config::REPORT_ERROR,
|
||||
0,
|
||||
0,
|
||||
UnusedBaselineEntry::getIssueType(),
|
||||
sprintf(
|
||||
'Baseline for issue "%s" has %d extra %s.',
|
||||
$issue_name,
|
||||
$issue['o'],
|
||||
$issue['o'] === 1 ? 'entry' : 'entries',
|
||||
),
|
||||
$file_path,
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
UnusedBaselineEntry::SHORTCODE,
|
||||
UnusedBaselineEntry::ERROR_LEVEL,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@ class CreatorTest extends TestCase
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="https://getpsalm.org/schema/config"
|
||||
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||
findUnusedBaselineEntry="true"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="lib" />
|
||||
|
@ -15,6 +15,7 @@ use Psalm\Internal\Analyzer\ProjectAnalyzer;
|
||||
use Psalm\Internal\Provider\FakeFileProvider;
|
||||
use Psalm\Internal\Provider\Providers;
|
||||
use Psalm\Internal\RuntimeCaches;
|
||||
use Psalm\Issue\UnusedBaselineEntry;
|
||||
use Psalm\Tests\Internal\Provider\FakeParserCacheProvider;
|
||||
use UnexpectedValueException;
|
||||
|
||||
@ -262,6 +263,7 @@ class DocumentationTest extends TestCase
|
||||
case 'RedundantIdentityWithTrue':
|
||||
case 'TraitMethodSignatureMismatch':
|
||||
case 'UncaughtThrowInGlobalScope':
|
||||
case UnusedBaselineEntry::getIssueType():
|
||||
continue 2;
|
||||
|
||||
/** @todo reinstate this test when the issue is restored */
|
||||
|
@ -1395,7 +1395,6 @@ class InternalCallMapHandlerTest extends TestCase
|
||||
}
|
||||
}
|
||||
|
||||
/** @psalm-suppress UndefinedMethod */
|
||||
public function assertEntryReturnType(ReflectionFunctionAbstract $function, string $entryReturnType): void
|
||||
{
|
||||
if (version_compare(PHP_VERSION, '8.1.0', '>=')) {
|
||||
|
Loading…
Reference in New Issue
Block a user