diff --git a/docs/running_psalm/configuration.md b/docs/running_psalm/configuration.md index 6999dd1126c..defdfff5597 100644 --- a/docs/running_psalm/configuration.md +++ b/docs/running_psalm/configuration.md @@ -108,6 +108,16 @@ The PHPDoc `@method` annotation normally only applies to classes with a `__call` ``` The PHPDoc `@property`, `@property-read` and `@property-write` annotations normally only apply to classes with `__get`/`__set` methods. Setting this to `true` allows you to use the `@property`, `@property-read` and `@property-write` annotations to override property existence checks and resulting property types. Defaults to `false`. +#### disableVarParsing + +```xml + +``` + +Disables parsing of `@var` PHPDocs everywhere except for properties. Setting this to `true` can remove many false positives due to outdated `@var` annotations, used before integrations of Psalm generics and proper typing, enforcing Single Source Of Truth principles. Defaults to `false`. + #### strictBinaryOperands ```xml diff --git a/src/Psalm/Config.php b/src/Psalm/Config.php index 8666ec53f74..054b24936b9 100644 --- a/src/Psalm/Config.php +++ b/src/Psalm/Config.php @@ -367,6 +367,11 @@ class Config */ public $add_param_default_to_docblock_type = false; + /** + * @var bool + */ + public $disable_var_parsing = false; + /** * @var bool */ @@ -954,6 +959,7 @@ private static function fromXmlAndPaths( 'allowFileIncludes' => 'allow_includes', 'strictBinaryOperands' => 'strict_binary_operands', 'rememberPropertyAssignmentsAfterCall' => 'remember_property_assignments_after_call', + 'disableVarParsing' => 'disable_var_parsing', 'allowStringToStandInForClass' => 'allow_string_standin_for_class', 'disableSuppressAll' => 'disable_suppress_all', 'usePhpDocMethodsWithoutMagicCall' => 'use_phpdoc_method_without_magic_or_parent', diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 7ef3882ef2b..0003a51921d 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -162,13 +162,15 @@ public static function analyze( $template_type_map = $statements_analyzer->getTemplateTypeMap(); try { - $var_comments = CommentAnalyzer::getTypeFromComment( - $doc_comment, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $template_type_map, - $file_storage->type_aliases - ); + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::getTypeFromComment( + $doc_comment, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $template_type_map, + $file_storage->type_aliases + ); } catch (IncorrectDocblockException $e) { IssueBuffer::maybeAdd( new MissingDocblockType( diff --git a/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php index 64fe69b8935..dc3909caf2d 100644 --- a/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/ReturnAnalyzer.php @@ -74,14 +74,16 @@ public static function analyze( $file_storage = $file_storage_provider->get($statements_analyzer->getFilePath()); try { - $var_comments = CommentAnalyzer::arrayToDocblocks( - $doc_comment, - $parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $statements_analyzer->getTemplateTypeMap(), - $file_storage->type_aliases - ); + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $doc_comment, + $parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $statements_analyzer->getTemplateTypeMap(), + $file_storage->type_aliases + ); } catch (DocblockParseException $e) { IssueBuffer::maybeAdd( new InvalidDocblock( diff --git a/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php index 13152602d6c..d537e8ca870 100644 --- a/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php @@ -60,13 +60,15 @@ public static function analyze( $var_comments = []; try { - $var_comments = CommentAnalyzer::arrayToDocblocks( - $doc_comment, - $parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getSource()->getAliases(), - $statements_analyzer->getSource()->getTemplateTypeMap() - ); + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $doc_comment, + $parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getSource()->getAliases(), + $statements_analyzer->getSource()->getTemplateTypeMap() + ); } catch (IncorrectDocblockException $e) { IssueBuffer::maybeAdd( new MissingDocblockType( diff --git a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php index 13147f29ed3..df6d4283a6f 100644 --- a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -459,14 +459,16 @@ private static function analyzeStatement( $var_comments = []; try { - $var_comments = CommentAnalyzer::arrayToDocblocks( - $docblock, - $statements_analyzer->parsed_docblock, - $statements_analyzer->getSource(), - $statements_analyzer->getAliases(), - $template_type_map, - $file_storage->type_aliases - ); + $var_comments = $codebase->config->disable_var_parsing + ? [] + : CommentAnalyzer::arrayToDocblocks( + $docblock, + $statements_analyzer->parsed_docblock, + $statements_analyzer->getSource(), + $statements_analyzer->getAliases(), + $template_type_map, + $file_storage->type_aliases + ); } catch (IncorrectDocblockException $e) { IssueBuffer::maybeAdd( new MissingDocblockType( diff --git a/src/Psalm/Internal/PluginManager/ConfigFile.php b/src/Psalm/Internal/PluginManager/ConfigFile.php index 0fed0fe7987..1b93ea2c546 100644 --- a/src/Psalm/Internal/PluginManager/ConfigFile.php +++ b/src/Psalm/Internal/PluginManager/ConfigFile.php @@ -10,6 +10,7 @@ use function assert; use function file_get_contents; use function file_put_contents; +use function sprintf; use function strpos; use function substr; @@ -146,6 +147,9 @@ private function saveXml(DOMDocument $config_xml): void } } - file_put_contents($this->path, $new_file_contents); + $result = file_put_contents($this->path, $new_file_contents); + if ($result === false) { + throw new RuntimeException(sprintf('Unable to save xml to %s', $this->path)); + } } }