1
0
mirror of https://github.com/danog/psalm.git synced 2024-11-30 04:39:00 +01:00

Merge pull request #7129 from vimeo/muglug-detect-unused-properties-with-arrays

Detect unused properties that are written to inside arrays
This commit is contained in:
orklah 2021-12-11 18:19:26 +01:00 committed by GitHub
commit 858be40d32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 38 additions and 56 deletions

View File

@ -95,14 +95,6 @@ class Codebase
*/
public $use_referencing_locations = [];
/**
* A map of file names to the classes that they contain explicit references to
* used in collaboration with use_referencing_locations
*
* @var array<string, array<lowercase-string, bool>>
*/
public $use_referencing_files = [];
/**
* @var FileStorageProvider
*/

View File

@ -235,11 +235,6 @@ class Context
*/
public $parent_context;
/**
* @var array<string, Type\Union>
*/
public $possible_param_types = [];
/**
* A list of vars that have been assigned to
*

View File

@ -72,8 +72,6 @@ trait CanAlias
// register the path
$codebase->use_referencing_locations[$use_path_lc][] =
new CodeLocation($this, $use);
$codebase->use_referencing_files[$this->getFilePath()][$use_path_lc] = true;
}
if ($codebase->alter_code) {

View File

@ -459,12 +459,6 @@ class IfElseAnalyzer
}
}
if ($if_scope->possible_param_types) {
foreach ($if_scope->possible_param_types as $var => $type) {
$context->possible_param_types[$var] = $type;
}
}
if ($if_scope->reasonable_clauses
&& (count($if_scope->reasonable_clauses) > 1 || !$if_scope->reasonable_clauses[0]->wedge)
) {

View File

@ -228,7 +228,7 @@ class AtomicPropertyFetchAnalyzer
$naive_property_exists = $codebase->properties->propertyExists(
$property_id,
true,
!$in_assignment,
$statements_analyzer,
$context,
$codebase->collect_locations ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null
@ -252,7 +252,7 @@ class AtomicPropertyFetchAnalyzer
if ($new_class_storage
&& ($codebase->properties->propertyExists(
$new_property_id,
true,
!$in_assignment,
$statements_analyzer,
$context,
$codebase->collect_locations

View File

@ -1285,19 +1285,6 @@ class ClassLikeNodeScanner
}
$constant_storage->description = $description;
foreach ($stmt->attrGroups as $attr_group) {
foreach ($attr_group->attrs as $attr) {
$constant_storage->attributes[] = AttributeResolver::resolve(
$this->codebase,
$this->file_scanner,
$this->file_storage,
$this->aliases,
$attr,
$this->storage->name ?? null
);
}
}
}
}

View File

@ -1368,7 +1368,7 @@ class FunctionLikeDocblockScanner
): array {
$storage->template_types = [];
foreach ($docblock_info->templates as $i => $template_map) {
foreach ($docblock_info->templates as $template_map) {
$template_name = $template_map[0];
if ($template_map[1] !== null && $template_map[2] !== null) {
@ -1416,8 +1416,6 @@ class FunctionLikeDocblockScanner
'fn-' . strtolower($cased_function_id) => $template_type,
];
}
$storage->template_covariants[$i] = $template_map[3];
}
return array_merge($template_types ?: [], $storage->template_types);

View File

@ -74,13 +74,6 @@ class IfScope
*/
public $reasonable_clauses = [];
/**
* Variables that were mixed, but are no longer
*
* @var array<string, Type\Union>|null
*/
public $possible_param_types;
/**
* @var string[]
*/

View File

@ -38,11 +38,6 @@ class ClassConstantStorage
*/
public $deprecated = false;
/**
* @var list<AttributeStorage>
*/
public $attributes = [];
/**
* @var ?string
*/

View File

@ -120,11 +120,6 @@ abstract class FunctionLikeStorage
*/
public $template_types;
/**
* @var array<int, bool>|null
*/
public $template_covariants;
/**
* @var array<int, Assertion>
*/

View File

@ -1195,6 +1195,17 @@ class UnusedCodeTest extends TestCase
foobar
',
],
'usedPropertyAsAssignmentKey' => [
'<?php
class A {
public string $foo = "bar";
public array $bar = [];
}
$a = new A();
$a->bar[$a->foo] = "bar";
print_r($a->bar);',
],
];
}
@ -1248,6 +1259,30 @@ class UnusedCodeTest extends TestCase
'error_message' => 'PossiblyUnusedProperty',
'error_levels' => ['UnusedVariable'],
],
'possiblyUnusedPropertyWrittenNeverRead' => [
'<?php
class A {
/** @var string */
public $foo = "hello";
}
$a = new A();
$a->foo = "bar";',
'error_message' => 'PossiblyUnusedProperty',
'error_levels' => ['UnusedVariable'],
],
'possiblyUnusedPropertyWithArrayWrittenNeverRead' => [
'<?php
class A {
/** @var list<string> */
public array $foo = [];
}
$a = new A();
$a->foo[] = "bar";',
'error_message' => 'PossiblyUnusedProperty',
'error_levels' => ['UnusedVariable'],
],
'unusedProperty' => [
'<?php
class A {