blob: 166232f30b37982e2fe2ecb8251675967d1e4c72 [file] [log] [blame]
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../rule_test_support.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(UnnecessaryLambdasTest);
});
}
@reflectiveTest
class UnnecessaryLambdasTest extends LintRuleTest {
@override
String get lintRule => 'unnecessary_lambdas';
test_asyncLambda() async {
await assertNoDiagnostics(r'''
var x = [].forEach((x) async => print(x));
''');
}
test_constructorCall_const() async {
await assertNoDiagnostics(r'''
class C {
const C();
}
var x = [() => const C()];
''');
}
test_constructorCall_explicitNew() async {
await assertNoDiagnostics(r'''
class C {
C(int a);
}
var x = [].map((e) => C.new(e));
''');
}
test_constructorCall_imported() async {
newFile('$testPackageLibPath/b.dart', r'''
class C {}
''');
await assertDiagnostics(r'''
import 'b.dart' as b;
var x = [() => b.C()];
''', [
lint(32, 11),
]);
}
test_constructorCall_importedDeferred() async {
newFile('$testPackageLibPath/b.dart', r'''
class C {}
''');
await assertNoDiagnostics(r'''
import 'b.dart' deferred as b;
var x = [() => b.C()];
''');
}
test_constructorCall_multipleArgs() async {
await assertNoDiagnostics(r'''
class C {
C(int i, int j);
}
var x = [].map((x) => C(3, x));
''');
}
test_constructorCall_named() async {
await assertNoDiagnostics(r'''
class C {
C.named(int a);
}
var x = [].map((e) => C.named(e));
''');
}
test_constructorCall_noArgs() async {
await assertDiagnostics(r'''
class C {}
var x = [() => C()];
''', [
lint(20, 9),
]);
}
test_constructorCall_noParameter_oneArg() async {
await assertNoDiagnostics(r'''
class C {
C(int i);
}
var x = [() => C(3)];
''');
}
test_constructorCall_unnamed() async {
await assertNoDiagnostics(r'''
class C {
C(int a);
}
var x = [].map((e) => C(e));
''');
}
test_constructorCall_unnamed_blockBody() async {
await assertNoDiagnostics(r'''
class C {
C(int a);
}
var x = [].map((e) { return C(e); });
''');
}
test_constructorCall_unrelatedArg() async {
await assertNoDiagnostics(r'''
class C {
C(int i);
}
var x = [].map((x) => C(3));
''');
}
test_emptyLambda() async {
await assertNoDiagnostics(r'''
var f = () {};
''');
}
test_functionCall_explicitTypeArg() async {
await assertNoDiagnostics(r'''
void f<T>() {}
var x = [() => f<int>()];
''');
}
test_functionCall_matchingArg() async {
await assertDiagnostics(r'''
var x = [].forEach((x) => print(x));
''', [
lint(19, 15),
]);
}
test_functionCall_singleStatement() async {
await assertDiagnostics(r'''
final f = () {};
final l = () {
f();
};
''', [
lint(27, 13),
]);
}
test_functionTearoff() async {
await assertNoDiagnostics(r'''
var x = [].forEach(print);
''');
}
test_importedFunction() async {
newFile('$testPackageLibPath/b.dart', r'''
bool isB(Object o) => true;
''');
await assertDiagnostics(r'''
import 'b.dart' as b;
void f() {
[].where((o) => b.isB(o));
}
''', [
lint(45, 15),
]);
}
test_importedFunction_deferred() async {
newFile('$testPackageLibPath/b.dart', r'''
bool isB(Object o) => true;
''');
await assertNoDiagnostics(r'''
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));
}
''');
}
test_matchingArg_dynamicParameterToOtherArg_named() async {
await assertNoDiagnostics(r'''
var x = f(fn: (s) => count(s));
int count(String s) => s.length;
void f({int Function(dynamic)? fn}) {}
''');
}
@FailingTest(issue: 'https://github.com/dart-lang/linter/issues/3516')
test_matchingArg_dynamicParameterToOtherArg_positional() async {
await assertNoDiagnostics(r'''
var x = f((s) => count(s));
int count(String s) => s.length;
void f(int Function(dynamic)? fn) {}
''');
}
test_methodCallOnFinalLocal_closureParameterIsPartOfTarget() async {
await assertNoDiagnostics(r'''
void f() {
[].where((e) => (e + e).contains(e));
}
''');
}
test_methodCallOnFinalLocal_closureParameterIsTarget() async {
await assertNoDiagnostics(r'''
void f() {
[].where((e) => e.contains(e));
}
''');
}
test_methodCallOnFinalLocal_matchingArg() async {
await assertDiagnostics(r'''
void f() {
final l = [];
[].where((e) => l.contains(e));
}
''', [
lint(38, 20),
]);
}
test_methodCallOnLateFinalLocal_matchingArg() async {
await assertNoDiagnostics(r'''
void f() {
late final List<int> l;
if (1 == 2) l = [];
[].where((e) => l.contains(e));
}
''');
}
test_methodCallOnNonFinalLocal_matchingArg() async {
await assertNoDiagnostics(r'''
void f() {
var l = [];
[].where((e) => l.contains(e));
}
''');
}
test_methodTearoffOnFinalLocal_matchingArg() async {
await assertNoDiagnostics(r'''
void f() {
final l = [];
[].where(l.contains);
}
''');
}
test_multipleStatements() async {
await assertNoDiagnostics(r'''
void f() {
[].forEach((e) {
print(e);
print(e);
});
}
''');
}
test_nonFunctionCall() async {
await assertNoDiagnostics(r'''
void f() {
final l = [];
[].where((e) => l.contains(e) || e is int);
}
''');
}
test_noParameter_targetIsFinalField() async {
await assertDiagnostics(r'''
class C {
final f = 1;
Function m() {
return () {
f.toString();
};
}
}
''', [
lint(53, 30),
]);
}
test_noParameter_targetIsGetter() async {
await assertNoDiagnostics(r'''
class C {
get f => 2;
Function m() {
return () {
f.toString();
};
}
}
''');
}
}