From 89deb405c5732487883656b8052d078f000334ad Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Mon, 30 Jan 2023 11:43:24 +0100 Subject: [PATCH 1/2] Fix `unnecessary_parenthesis` with null aware expressions. Fixes #4028 --- lib/src/rules/unnecessary_parenthesis.dart | 25 ++++++++++++++++---- test_data/rules/unnecessary_parenthesis.dart | 5 ++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/src/rules/unnecessary_parenthesis.dart b/lib/src/rules/unnecessary_parenthesis.dart index 38daa103a..820a6aa86 100644 --- a/lib/src/rules/unnecessary_parenthesis.dart +++ b/lib/src/rules/unnecessary_parenthesis.dart @@ -88,11 +88,7 @@ class _Visitor extends SimpleAstVisitor { void visitParenthesizedExpression(ParenthesizedExpression node) { var parent = node.parent; var expression = node.expression; - if (expression is SimpleIdentifier || - (expression is CascadeExpression && expression.isNullAware) || - (expression is PropertyAccess && expression.isNullAware) || - (expression is MethodInvocation && expression.isNullAware) || - (expression is IndexExpression && expression.isNullAware)) { + if (expression is SimpleIdentifier || _isNullAware(expression)) { if (parent is PropertyAccess) { var name = parent.propertyName.name; if (name == 'hashCode' || name == 'runtimeType') { @@ -238,6 +234,25 @@ class _Visitor extends SimpleAstVisitor { node.accept(containsFunctionExpressionVisitor); return containsFunctionExpressionVisitor.hasFunctionExpression; } + + /// Return if the expression is null aware, or one of its recursive targets + /// is null aware. + bool _isNullAware(Expression? expression) { + if (expression is CascadeExpression) { + // No need to check the target. + return expression.isNullAware; + } else if (expression is PropertyAccess) { + if (expression.isNullAware) return true; + return _isNullAware(expression.target); + } else if (expression is MethodInvocation) { + if (expression.isNullAware) return true; + return _isNullAware(expression.target); + } else if (expression is IndexExpression) { + if (expression.isNullAware) return true; + return _isNullAware(expression.target); + } + return false; + } } extension on ParenthesizedExpression { diff --git a/test_data/rules/unnecessary_parenthesis.dart b/test_data/rules/unnecessary_parenthesis.dart index a1245b8e0..661b2d9d4 100644 --- a/test_data/rules/unnecessary_parenthesis.dart +++ b/test_data/rules/unnecessary_parenthesis.dart @@ -121,6 +121,11 @@ main() async { (a?..abs()).hashCode; (a?[0]).hashCode; + (a?.sign.sign).hashCode; + (a?.abs().abs()).hashCode; + (a?..abs()..abs()).hashCode; + (a?[0][1]).hashCode; + (a?.sign)!; (a?.abs())!; (a?..abs())!; From 74c4b443439bfad3a8f3fd38c63512642717856b Mon Sep 17 00:00:00 2001 From: Ahmed Ashour Date: Mon, 30 Jan 2023 12:24:08 +0100 Subject: [PATCH 2/2] Better doc. --- lib/src/rules/unnecessary_parenthesis.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/rules/unnecessary_parenthesis.dart b/lib/src/rules/unnecessary_parenthesis.dart index 820a6aa86..a765e52f7 100644 --- a/lib/src/rules/unnecessary_parenthesis.dart +++ b/lib/src/rules/unnecessary_parenthesis.dart @@ -235,8 +235,8 @@ class _Visitor extends SimpleAstVisitor { return containsFunctionExpressionVisitor.hasFunctionExpression; } - /// Return if the expression is null aware, or one of its recursive targets - /// is null aware. + /// Return `true` if the expression is null aware, or if one of its recursive + /// targets is null aware. bool _isNullAware(Expression? expression) { if (expression is CascadeExpression) { // No need to check the target.