From e76aafe69de189b51e0b3a222d42973b9edbfc58 Mon Sep 17 00:00:00 2001 From: shaark Date: Wed, 4 Dec 2024 12:36:34 +0200 Subject: [PATCH 1/3] issue-182. fixed throw expression --- .../visitors/prefer_early_return_visitor.dart | 8 ++++++++ .../visitors/throw_expression_visitor.dart | 16 ++++++++++++++++ lint_test/prefer_early_return_test.dart | 9 +++++++++ 3 files changed, 33 insertions(+) create mode 100644 lib/src/lints/prefer_early_return/visitors/throw_expression_visitor.dart diff --git a/lib/src/lints/prefer_early_return/visitors/prefer_early_return_visitor.dart b/lib/src/lints/prefer_early_return/visitors/prefer_early_return_visitor.dart index cc82a1ec..127de6e8 100644 --- a/lib/src/lints/prefer_early_return/visitors/prefer_early_return_visitor.dart +++ b/lib/src/lints/prefer_early_return/visitors/prefer_early_return_visitor.dart @@ -1,6 +1,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/ast/visitor.dart'; import 'package:solid_lints/src/lints/prefer_early_return/visitors/return_statement_visitor.dart'; +import 'package:solid_lints/src/lints/prefer_early_return/visitors/throw_expression_visitor.dart'; /// The AST visitor that will collect all unnecessary if statements class PreferEarlyReturnVisitor extends RecursiveAstVisitor { @@ -33,6 +34,7 @@ class PreferEarlyReturnVisitor extends RecursiveAstVisitor { if (_isElseIfStatement(node)) return; if (_hasElseStatement(node)) return; if (_hasReturnStatement(node)) return; + if (_hasThrowExpression(node)) return; _nodes.add(node); } @@ -70,4 +72,10 @@ class PreferEarlyReturnVisitor extends RecursiveAstVisitor { node.accept(visitor); return visitor.nodes.isNotEmpty; } + + bool _hasThrowExpression(Statement node) { + final visitor = ThrowExpressionVisitor(); + node.accept(visitor); + return visitor.nodes.isNotEmpty; + } } diff --git a/lib/src/lints/prefer_early_return/visitors/throw_expression_visitor.dart b/lib/src/lints/prefer_early_return/visitors/throw_expression_visitor.dart new file mode 100644 index 00000000..ceff7bd2 --- /dev/null +++ b/lib/src/lints/prefer_early_return/visitors/throw_expression_visitor.dart @@ -0,0 +1,16 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/visitor.dart'; + +/// The AST visitor that will collect every Return statement +class ThrowExpressionVisitor extends RecursiveAstVisitor { + final _nodes = []; + + /// All unnecessary return statements + Iterable get nodes => _nodes; + + @override + void visitThrowExpression(ThrowExpression node) { + super.visitThrowExpression(node); + _nodes.add(node); + } +} diff --git a/lint_test/prefer_early_return_test.dart b/lint_test/prefer_early_return_test.dart index f5a076bf..7fe656d7 100644 --- a/lint_test/prefer_early_return_test.dart +++ b/lint_test/prefer_early_return_test.dart @@ -235,3 +235,12 @@ void threeSeqentialIfReturn2() { _doSomething(); } } + +void throwExpression() { + //no lint + if (true) { + throw ''; + } + + return; +} From 46fc1439fabb2a6ccd617f5e5d20a71dc8d8eeab Mon Sep 17 00:00:00 2001 From: shaark Date: Wed, 4 Dec 2024 13:07:29 +0200 Subject: [PATCH 2/3] issue-182. added new test case --- lint_test/prefer_early_return_test.dart | 55 ++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/lint_test/prefer_early_return_test.dart b/lint_test/prefer_early_return_test.dart index 7fe656d7..d9108186 100644 --- a/lint_test/prefer_early_return_test.dart +++ b/lint_test/prefer_early_return_test.dart @@ -236,7 +236,7 @@ void threeSeqentialIfReturn2() { } } -void throwExpression() { +void oneIfWithThrowWithReturn() { //no lint if (true) { throw ''; @@ -244,3 +244,56 @@ void throwExpression() { return; } + +void oneIfElseWithThrowReturn() { + //no lint + if (true) { + _doSomething(); + } else { + throw ''; + } +} + +void twoSeqentialIfWithThrow() { + if (false) throw ''; + //expect_lint: prefer_early_return + if (true) { + _doSomething(); + } +} + +void twoSeqentialIfWithThrowReturn2() { + //no lint + if (false) throw ''; + //expect_lint: prefer_early_return + if (true) { + _doSomething(); + } + + return; +} + +void threeSeqentialIfWithThrowReturn() { + //no lint + if (false) throw ''; + if (true) throw ''; + //expect_lint: prefer_early_return + if (true) { + _doSomething(); + } + + return; +} + +void threeSeqentialIfWithThrowReturn2() { + //no lint + if (false) throw ''; + //no lint + if (true) { + _doSomething(); + } + //expect_lint: prefer_early_return + if (true) { + _doSomething(); + } +} From d41747d4a18f71fe277207e11217d0e3f81423b8 Mon Sep 17 00:00:00 2001 From: shaark Date: Wed, 4 Dec 2024 13:18:02 +0200 Subject: [PATCH 3/3] issue-182. added changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31779dec..1f3d977e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.4 + +- Fixed an issue with `prefer_early_retrun` for throw expression + ## 0.2.3 - Replace deprecated whereNotNull()