From eb3df40fbbe400b655b4151125a2dc6d545f2333 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Wed, 19 Jan 2022 14:20:13 +0100 Subject: [PATCH 1/3] Add option to disable @var parsing everywhere except for properties. --- config.xsd | 1 + docs/running_psalm/configuration.md | 10 ++++++++++ src/Psalm/Config.php | 6 ++++++ .../Expression/AssignmentAnalyzer.php | 16 +++++++++------- .../Analyzer/Statements/ReturnAnalyzer.php | 18 ++++++++++-------- .../Analyzer/Statements/StaticAnalyzer.php | 16 +++++++++------- .../Internal/Analyzer/StatementsAnalyzer.php | 18 ++++++++++-------- 7 files changed, 55 insertions(+), 30 deletions(-) diff --git a/config.xsd b/config.xsd index 9805ba361fe..e2301ea7890 100644 --- a/config.xsd +++ b/config.xsd @@ -109,6 +109,7 @@ + diff --git a/docs/running_psalm/configuration.md b/docs/running_psalm/configuration.md index f8735e390f9..8b1fdf5c5d9 100644 --- a/docs/running_psalm/configuration.md +++ b/docs/running_psalm/configuration.md @@ -116,6 +116,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 ac4355b557c..2ca59125dc3 100644 --- a/src/Psalm/Config.php +++ b/src/Psalm/Config.php @@ -373,6 +373,11 @@ class Config */ public $add_param_default_to_docblock_type = false; + /** + * @var bool + */ + public $disable_var_parsing = false; + /** * @var bool */ @@ -920,6 +925,7 @@ private static function fromXmlAndPaths( 'allowFileIncludes' => 'allow_includes', 'strictBinaryOperands' => 'strict_binary_operands', 'rememberPropertyAssignmentsAfterCall' => 'remember_property_assignments_after_call', + 'disableVarParsing' => 'disable_var_parsing', 'allowPhpStormGenerics' => 'allow_phpstorm_generics', 'allowStringToStandInForClass' => 'allow_string_standin_for_class', 'disableSuppressAll' => 'disable_suppress_all', diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 50ccf068d07..51e91919209 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -155,13 +155,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 6936fc33e14..79832cc9d47 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 6133afd4509..12d068d5251 100644 --- a/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/StaticAnalyzer.php @@ -57,13 +57,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 10ea738065a..78a25799a41 100644 --- a/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/StatementsAnalyzer.php @@ -442,14 +442,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( From dc8764153e27f9034ee0f9f55767d92fda41b54e Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Fri, 18 Feb 2022 10:05:23 +0700 Subject: [PATCH 2/3] Throw exception if file_put_contents failed --- src/Psalm/Internal/PluginManager/ConfigFile.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/PluginManager/ConfigFile.php b/src/Psalm/Internal/PluginManager/ConfigFile.php index 4fd02542575..db3a3242bd6 100644 --- a/src/Psalm/Internal/PluginManager/ConfigFile.php +++ b/src/Psalm/Internal/PluginManager/ConfigFile.php @@ -143,6 +143,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)); + } } } From 8e1e0d1e5ed12d00754cf5e547f1c90db5e0ee1d Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Fri, 18 Feb 2022 10:33:35 +0700 Subject: [PATCH 3/3] style-ci --- src/Psalm/Internal/PluginManager/ConfigFile.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Psalm/Internal/PluginManager/ConfigFile.php b/src/Psalm/Internal/PluginManager/ConfigFile.php index db3a3242bd6..a945dd24931 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;