diff --git a/lib/src/rules/unnecessary_parenthesis.dart b/lib/src/rules/unnecessary_parenthesis.dart index 38daa103a..a765e52f7 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 `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. + 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())!;