Skip to content

Commit 5776d30

Browse files
pqCommit Queue
authored andcommitted
[PE] [linter] make strict_top_level_inference reflectiveTest aware
Turning on this lint in the linter in anticipation of a `package:lints` roll flagged 5K+ violations for test methods missing return types. Since these methods can only be called by the framework, the added type information is of negligible value and just adds noise. Change-Id: I9b7d0c12d51fb512c0f68e09233cec841ed372df Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412361 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent 0c55c7e commit 5776d30

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

pkg/linter/lib/src/rules/strict_top_level_inference.dart

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,9 @@ class _Visitor extends SimpleAstVisitor<void> {
212212
var overriddenMember = context.inheritanceManager.overriddenMember(
213213
node.declaredFragment?.element,
214214
);
215-
if (overriddenMember == null && node.returnType == null) {
215+
if (overriddenMember == null &&
216+
node.returnType == null &&
217+
!container.isReflectiveTest) {
216218
_report(node.name);
217219
}
218220
if (node.parameters case var parameters?) {
@@ -264,3 +266,23 @@ class _Visitor extends SimpleAstVisitor<void> {
264266
}
265267
}
266268
}
269+
270+
extension on InstanceElement2 {
271+
// TODO(pq): share w/ unreachable_from_main
272+
bool get isReflectiveTest {
273+
var self = this;
274+
if (self is! ClassElement2) return false;
275+
276+
var metadata = self.metadata2;
277+
for (var i = 0; i < metadata.annotations.length; i++) {
278+
var annotation = metadata.annotations[i].element2;
279+
if (annotation is GetterElement &&
280+
annotation.name3 == 'reflectiveTest' &&
281+
annotation.library2.uri.toString() ==
282+
'package:test_reflective_loader/test_reflective_loader.dart') {
283+
return true;
284+
}
285+
}
286+
return false;
287+
}
288+
}

pkg/linter/test/rules/strict_top_level_inference_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,33 @@ void f() {
683683
''');
684684
}
685685

686+
test_reflectiveTest() async {
687+
// TODO(pq): share setup logic with unreachable_from_main_test
688+
var testReflectiveLoaderPath = '$workspaceRootPath/test_reflective_loader';
689+
var packageConfigBuilder = PackageConfigFileBuilder();
690+
packageConfigBuilder.add(
691+
name: 'test_reflective_loader',
692+
rootPath: testReflectiveLoaderPath,
693+
);
694+
writeTestPackageConfig(packageConfigBuilder);
695+
newFile('$testReflectiveLoaderPath/lib/test_reflective_loader.dart', r'''
696+
library test_reflective_loader;
697+
698+
const Object reflectiveTest = _ReflectiveTest();
699+
class _ReflectiveTest {
700+
const _ReflectiveTest();
701+
}
702+
''');
703+
await assertNoDiagnostics(r'''
704+
import 'package:test_reflective_loader/test_reflective_loader.dart';
705+
706+
@reflectiveTest
707+
class ReflectiveTest {
708+
test_foo() {}
709+
}
710+
''');
711+
}
712+
686713
test_staticField_final() async {
687714
await assertNoDiagnostics(r'''
688715
class C {

0 commit comments

Comments
 (0)