mirror of
https://github.com/danog/psalm.git
synced 2025-01-22 05:41:20 +01:00
Add config flag to support properties without a magic getter
This commit is contained in:
parent
6f6e26580a
commit
8d7fb2b415
@ -277,6 +277,11 @@ class Config
|
|||||||
*/
|
*/
|
||||||
public $use_phpdoc_method_without_magic_or_parent = false;
|
public $use_phpdoc_method_without_magic_or_parent = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $use_phpdoc_property_without_magic_or_parent = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
@ -722,6 +727,7 @@ class Config
|
|||||||
'allowPhpStormGenerics' => 'allow_phpstorm_generics',
|
'allowPhpStormGenerics' => 'allow_phpstorm_generics',
|
||||||
'allowStringToStandInForClass' => 'allow_string_standin_for_class',
|
'allowStringToStandInForClass' => 'allow_string_standin_for_class',
|
||||||
'usePhpDocMethodsWithoutMagicCall' => 'use_phpdoc_method_without_magic_or_parent',
|
'usePhpDocMethodsWithoutMagicCall' => 'use_phpdoc_method_without_magic_or_parent',
|
||||||
|
'usePhpDocPropertiesWithoutMagicCall' => 'use_phpdoc_properties_without_magic_or_parent',
|
||||||
'memoizeMethodCallResults' => 'memoize_method_calls',
|
'memoizeMethodCallResults' => 'memoize_method_calls',
|
||||||
'hoistConstants' => 'hoist_constants',
|
'hoistConstants' => 'hoist_constants',
|
||||||
'addParamDefaultToDocblockType' => 'add_param_default_to_docblock_type',
|
'addParamDefaultToDocblockType' => 'add_param_default_to_docblock_type',
|
||||||
|
@ -604,6 +604,9 @@ class PropertyFetchAnalyzer
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$class_storage = $codebase->classlike_storage_provider->get($fq_class_name);
|
||||||
|
$config = $statements_analyzer->getProjectAnalyzer()->getConfig();
|
||||||
|
|
||||||
if (!$codebase->properties->propertyExists(
|
if (!$codebase->properties->propertyExists(
|
||||||
$property_id,
|
$property_id,
|
||||||
true,
|
true,
|
||||||
@ -612,6 +615,17 @@ class PropertyFetchAnalyzer
|
|||||||
$context->collect_references ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null
|
$context->collect_references ? new CodeLocation($statements_analyzer->getSource(), $stmt) : null
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
|
if ($config->use_phpdoc_property_without_magic_or_parent
|
||||||
|
&& isset($class_storage->pseudo_property_get_types['$' . $prop_name])
|
||||||
|
) {
|
||||||
|
$stmt_type = clone $class_storage->pseudo_property_get_types['$' . $prop_name];
|
||||||
|
|
||||||
|
$statements_analyzer->node_data->setType($stmt, $stmt_type);
|
||||||
|
|
||||||
|
self::processTaints($statements_analyzer, $stmt, $stmt_type, $property_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ($fq_class_name !== $context->self
|
if ($fq_class_name !== $context->self
|
||||||
&& $context->self
|
&& $context->self
|
||||||
&& $codebase->properties->propertyExists(
|
&& $codebase->properties->propertyExists(
|
||||||
@ -797,8 +811,6 @@ class PropertyFetchAnalyzer
|
|||||||
);
|
);
|
||||||
|
|
||||||
if ($lhs_type_part instanceof TGenericObject) {
|
if ($lhs_type_part instanceof TGenericObject) {
|
||||||
$class_storage = $codebase->classlike_storage_provider->get($fq_class_name);
|
|
||||||
|
|
||||||
if ($class_storage->template_types) {
|
if ($class_storage->template_types) {
|
||||||
$class_template_params = [];
|
$class_template_params = [];
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Psalm\Tests;
|
namespace Psalm\Tests;
|
||||||
|
|
||||||
|
use Psalm\Config;
|
||||||
|
use Psalm\Context;
|
||||||
use const DIRECTORY_SEPARATOR;
|
use const DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
class MagicPropertyTest extends TestCase
|
class MagicPropertyTest extends TestCase
|
||||||
@ -8,6 +10,29 @@ class MagicPropertyTest extends TestCase
|
|||||||
use Traits\InvalidCodeAnalysisTestTrait;
|
use Traits\InvalidCodeAnalysisTestTrait;
|
||||||
use Traits\ValidCodeAnalysisTestTrait;
|
use Traits\ValidCodeAnalysisTestTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPhpDocPropertyWithoutGet()
|
||||||
|
{
|
||||||
|
Config::getInstance()->use_phpdoc_property_without_magic_or_parent = true;
|
||||||
|
|
||||||
|
$this->addFile(
|
||||||
|
'somefile.php',
|
||||||
|
'<?php
|
||||||
|
/**
|
||||||
|
* @property string $hello
|
||||||
|
*/
|
||||||
|
class Child {}
|
||||||
|
|
||||||
|
$child = new Child();
|
||||||
|
|
||||||
|
$a = $child->hello;'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->analyzeFile('somefile.php', new Context());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return iterable<string,array{string,assertions?:array<string,string>,error_levels?:string[]}>
|
* @return iterable<string,array{string,assertions?:array<string,string>,error_levels?:string[]}>
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user