Skip to content

Commit

Permalink
linter: Handle more deferred cases in unnecessary_lambdas
Browse files Browse the repository at this point in the history
Fixes dart-lang/linter#2182

Change-Id: I975b4d1ae84245ff66d881a42ad7ca745569fab9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366060
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Samuel Rawlins <srawlins@google.com>
  • Loading branch information
srawlins authored and Commit Queue committed May 13, 2024
1 parent 3f705f0 commit 5547884
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 9 deletions.
23 changes: 14 additions & 9 deletions pkg/linter/lib/src/rules/unnecessary_lambdas.dart
Original file line number Diff line number Diff line change
Expand Up @@ -199,20 +199,16 @@ class _Visitor extends SimpleAstVisitor<void> {

var parameters = nodeToLintParams.map((e) => e.declaredElement).toSet();
if (node is FunctionExpressionInvocation) {
if (node.function.mightBeDeferred) return;

// TODO(pq): consider checking for assignability
// see: https://github.com/dart-lang/linter/issues/1561
var checker = _FinalExpressionChecker(parameters);
if (checker.isFinalNode(node.function)) {
rule.reportLint(nodeToLint);
}
} else if (node is MethodInvocation) {
var target = node.target;
if (target is SimpleIdentifier) {
var element = target.staticElement;
if (element is PrefixElement) {
if (element.imports.any((e) => e.isDeferred)) return;
}
}
if (node.target.mightBeDeferred) return;

var tearoffType = node.staticInvokeType;
if (tearoffType == null) return;
Expand All @@ -239,8 +235,17 @@ class _Visitor extends SimpleAstVisitor<void> {
}
}

extension on LibraryImportElement {
bool get isDeferred => prefix is DeferredImportElementPrefix;
extension on Expression? {
bool get mightBeDeferred {
var self = this;
var element = switch (self) {
PrefixedIdentifier() => self.prefix.staticElement,
SimpleIdentifier() => self.staticElement,
_ => null,
};
return element is PrefixElement &&
element.imports.any((e) => e.prefix is DeferredImportElementPrefix);
}
}

extension on Element? {
Expand Down
31 changes: 31 additions & 0 deletions pkg/linter/test/rules/unnecessary_lambdas_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,37 @@ import 'b.dart' deferred as b;
void f() {
[].where((o) => b.isB(o));
}
''');
}

test_importedStatic_deferred() async {
newFile('$testPackageLibPath/b.dart', r'''
class C {
static bool isB(Object o) => true;
}
''');
await assertNoDiagnostics(r'''
import 'b.dart' deferred as b;
void f() {
[].where((o) => b.C.isB(o));
}
''');
}

test_importedTearoff_deferred() async {
newFile('$testPackageLibPath/b.dart', r'''
bool isB(Object o) => true;
final isB2 = isB;
''');
await assertNoDiagnostics(r'''
import 'b.dart' deferred as b;
void f() {
[].where((o) => b.isB2(o));
}
''');
}

Expand Down

0 comments on commit 5547884

Please sign in to comment.