Skip to content
This repository was archived by the owner on Nov 20, 2024. It is now read-only.

Commit 8bb9658

Browse files
authored
Fix unnecessary_parenthesis with null aware expressions. (#4030)
Fixes #4028
1 parent 6006d74 commit 8bb9658

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

lib/src/rules/unnecessary_parenthesis.dart

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,7 @@ class _Visitor extends SimpleAstVisitor<void> {
8888
void visitParenthesizedExpression(ParenthesizedExpression node) {
8989
var parent = node.parent;
9090
var expression = node.expression;
91-
if (expression is SimpleIdentifier ||
92-
(expression is CascadeExpression && expression.isNullAware) ||
93-
(expression is PropertyAccess && expression.isNullAware) ||
94-
(expression is MethodInvocation && expression.isNullAware) ||
95-
(expression is IndexExpression && expression.isNullAware)) {
91+
if (expression is SimpleIdentifier || _isNullAware(expression)) {
9692
if (parent is PropertyAccess) {
9793
var name = parent.propertyName.name;
9894
if (name == 'hashCode' || name == 'runtimeType') {
@@ -238,6 +234,25 @@ class _Visitor extends SimpleAstVisitor<void> {
238234
node.accept(containsFunctionExpressionVisitor);
239235
return containsFunctionExpressionVisitor.hasFunctionExpression;
240236
}
237+
238+
/// Return `true` if the expression is null aware, or if one of its recursive
239+
/// targets is null aware.
240+
bool _isNullAware(Expression? expression) {
241+
if (expression is CascadeExpression) {
242+
// No need to check the target.
243+
return expression.isNullAware;
244+
} else if (expression is PropertyAccess) {
245+
if (expression.isNullAware) return true;
246+
return _isNullAware(expression.target);
247+
} else if (expression is MethodInvocation) {
248+
if (expression.isNullAware) return true;
249+
return _isNullAware(expression.target);
250+
} else if (expression is IndexExpression) {
251+
if (expression.isNullAware) return true;
252+
return _isNullAware(expression.target);
253+
}
254+
return false;
255+
}
241256
}
242257

243258
extension on ParenthesizedExpression {

test_data/rules/unnecessary_parenthesis.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ main() async {
121121
(a?..abs()).hashCode;
122122
(a?[0]).hashCode;
123123

124+
(a?.sign.sign).hashCode;
125+
(a?.abs().abs()).hashCode;
126+
(a?..abs()..abs()).hashCode;
127+
(a?[0][1]).hashCode;
128+
124129
(a?.sign)!;
125130
(a?.abs())!;
126131
(a?..abs())!;

0 commit comments

Comments
 (0)