From 57ad3cce6ed76f58f9925da02a59fc2dc2b7f31c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexei=20Eleusis=20D=C3=ADaz=20Vera?= Date: Tue, 7 Mar 2017 09:26:16 -0800 Subject: [PATCH] invariant_boolean: When searching for references reassignment include PostfixExpression and similar, e.g. variable++. Fixes https://github.com/dart-lang/linter/issues/337 --- lib/src/rules/invariant_booleans.dart | 32 +++++++++++----- test/rules/invariant_booleans.dart | 53 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/lib/src/rules/invariant_booleans.dart b/lib/src/rules/invariant_booleans.dart index ce8a29431..15a8473d0 100644 --- a/lib/src/rules/invariant_booleans.dart +++ b/lib/src/rules/invariant_booleans.dart @@ -216,15 +216,29 @@ AstNodePredicate _isConditionalStatementWithReturn( AstNodePredicate _noFurtherAssignmentInvalidatingCondition( Expression node, Iterable nodesInDFS) { Set identifiers = _findStatementIdentifiers(node.parent); - return (AstNode statement) => - nodesInDFS - .skipWhile((n) => n != statement) - .takeWhile((n) => n != node) - .where((n) => - n is AssignmentExpression && - !identifiers.contains(n.leftHandSide)) - .length == - 0; + return (AstNode statement) { + bool isMutation(AstNode n) { + if (n is AssignmentExpression) { + return !identifiers.contains(n.leftHandSide); + } else if (n is PostfixExpression) { + TokenType type = n.operator.type; + return (type == TokenType.PLUS_PLUS || type == TokenType.MINUS_MINUS) && + !identifiers.contains(n.operand); + } else if (n is PrefixExpression) { + TokenType type = n.operator.type; + return (type == TokenType.PLUS_PLUS || type == TokenType.MINUS_MINUS) && + !identifiers.contains(n.operand); + } + + return false; + } + + return nodesInDFS + .skipWhile((n) => n != statement) + .takeWhile((n) => n != node) + .where(isMutation) + .isEmpty; + }; } List _splitConjunctions(Expression expression) { diff --git a/test/rules/invariant_booleans.dart b/test/rules/invariant_booleans.dart index b0cf3e3f1..d521f21e8 100644 --- a/test/rules/invariant_booleans.dart +++ b/test/rules/invariant_booleans.dart @@ -237,3 +237,56 @@ void bug372(bool foo) { // doSomethingElse(); } } + +void bug337_1(int offset, int length) { + if (offset >= length) { + return; + } + + offset++; + if (offset >= length) { // OK + } +} + +void bug337_2(int offset, int length) { + if (offset >= length) { + return; + } + + offset--; + if (offset >= length) { // OK + } +} + +void bug337_3(int offset, int length) { + if (offset >= length) { + return; + } + + ++offset; + if (offset >= length) { // OK + } +} + +void bug337_4(int offset, int length) { + if (offset >= length) { + return; + } + + --offset; + if (offset >= length) { // OK + } +} + +void test337_5() { + int b = 2; + if (b > 0) { + b--; + if (b == 0) { + return; + } + if (b > 0) { + return; + } + } +}