blob: d6c1c406ad140cb52dd855b85975ff2e90fdcf09 [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';
void main() {
defineReflectiveSuite(() {
defineReflectiveTests(UnreachableFromMainTest);
});
}
@reflectiveTest
class UnreachableFromMainTest extends LintRuleTest {
@override
bool get addFlutterPackageDep => true;
@override
bool get addMetaPackageDep => true;
@override
bool get addTestReflectiveLoaderPackageDep => true;
@override
String get lintRule => LintNames.unreachable_from_main;
test_class_instanceField_reachable_matchedInPattern() async {
await assertNoDiagnostics(r'''
void main() {
var x = switch (C(1)) {
C(:final f) => f.round(),
};
print(x);
}
class C {
final int f;
C(this.f);
}
''');
}
test_class_instanceField_reachable_overrides_local() async {
await assertDiagnostics(
r'''
void main() {
B();
}
class A {
int? f;
}
class B extends A {
int? f;
}
''',
[lint(41, 1)],
);
}
test_class_instanceField_reachable_read() async {
await assertNoDiagnostics(r'''
void main() {
C().f;
}
class C {
int? f;
}
''');
}
test_class_instanceField_reachable_write() async {
await assertNoDiagnostics(r'''
void main() {
C().f = 0;
}
class C {
int? f;
}
''');
}
test_class_instanceField_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C();
}
class C {
int? f;
}
''',
[lint(41, 1)],
);
}
test_class_instanceGetter_reachable_invoked() async {
await assertNoDiagnostics(r'''
void main() {
C().foo;
}
class C {
int get foo => 0;
}
''');
}
test_class_instanceGetter_reachable_overrides() async {
await assertDiagnostics(
r'''
void main() {
B();
}
class A {
int get foo => 0;
}
class B extends A {
int get foo => 0;
}
''',
[lint(44, 3)],
);
}
test_class_instanceGetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C();
}
class C {
int get foo => 0;
}
''',
[lint(44, 3)],
);
}
test_class_instanceMethod_reachable_invoked() async {
await assertNoDiagnostics(r'''
void main() {
C().foo();
}
class C {
void foo() {}
}
''');
}
test_class_instanceMethod_reachable_invoked_generic() async {
await assertNoDiagnostics(r'''
void main() {
C<int>().foo(null);
}
class C<T> {
void foo(T? _) {}
}
''');
}
test_class_instanceMethod_reachable_overrides_imported() async {
newFile('$testPackageLibPath/a.dart', r'''
class A {
void foo() {}
}
''');
await assertNoDiagnostics(r'''
import 'a.dart';
void main() {
B();
}
class B extends A {
void foo() {}
}
''');
}
test_class_instanceMethod_reachable_overrides_local() async {
await assertDiagnostics(
r'''
void main() {
B();
}
class A {
void foo() {}
}
class B extends A {
void foo() {}
}
''',
[lint(41, 3)],
);
}
test_class_instanceMethod_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C();
}
class C {
void foo() {}
}
''',
[lint(41, 3)],
);
}
test_class_instanceSetter_reachable_invoked() async {
await assertNoDiagnostics(r'''
void main() {
C().foo = 0;
}
class C {
set foo(int _) {}
}
''');
}
test_class_instanceSetter_reachable_overrides() async {
await assertDiagnostics(
r'''
void main() {
B();
}
class A {
set foo(int _) {}
}
class B extends A {
set foo(int _) {}
}
''',
[lint(40, 3)],
);
}
test_class_instanceSetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C();
}
class C {
set foo(int _) {}
}
''',
[lint(40, 3)],
);
}
test_class_reachable_mainInPart() async {
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
void main() => A();
''');
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
class A {}
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', []),
('$testPackageLibPath/part.dart', []),
]);
}
test_class_reachable_referencedDeepInTypeAnnotation_externalMethodDeclaration() async {
await assertNoDiagnostics(r'''
void main() {
D().f;
}
class C {}
class D {
external C Function() f();
}
''');
}
test_class_reachable_referencedDeepInTypeArgument() async {
await assertNoDiagnostics(r'''
void main() {
C<D Function()>();
}
class C<T> {}
class D {}
''');
}
test_class_reachable_referencedInTypeAnnotation_externalFieldDeclaration() async {
await assertNoDiagnostics(r'''
void main() {
D().c;
}
class C {}
class D {
external C? c;
}
''');
}
test_class_reachable_referencedInTypeAnnotation_externalMethodDeclaration() async {
await assertNoDiagnostics(r'''
void main() {
D().f;
}
class C {}
class D {
external C f();
}
''');
}
test_class_reachable_referencedInTypeArgument() async {
await assertNoDiagnostics(r'''
void main() {
C<D>();
}
class C<T> {}
class D {}
''');
}
test_class_reachableViaAnnotation() async {
await assertNoDiagnostics(r'''
void main() {
f();
}
class C {
const C();
}
@C()
void f() {}
''');
}
test_class_reachableViaComment() async {
await assertNoDiagnostics(r'''
/// See [C].
void main() {}
class C {}
''');
}
test_class_reachableViaDefaultValueType() async {
await assertNoDiagnostics(r'''
void main() {
f();
}
class C {
const C();
}
void f([Object? p = const C()]) {}
''');
}
test_class_referencedInObjectPattern() async {
await assertDiagnostics(
r'''
class C {}
void main() {
f();
}
void f([Object? c]) {
if (c case C()) {}
}
''',
[lint(6, 1)],
);
}
test_class_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
class C {}
''',
[lint(22, 1)],
);
}
test_class_unreachable_foundInAsExpression() async {
await assertDiagnostics(
r'''
class A {}
void main() {
f();
}
void f([Object? o]) {
o as A;
}
''',
[lint(6, 1)],
);
}
test_class_unreachable_foundInAsPattern() async {
await assertDiagnostics(
r'''
class A {}
void main() {
f();
}
void f([(Object, )? l]) {
var (_ as A, ) = l!;
}
''',
[lint(6, 1)],
);
}
test_class_unreachable_foundInIsExpression() async {
await assertDiagnostics(
r'''
class A {}
void main() {
f();
}
void f([Object? o]) {
o is A;
}
''',
[lint(6, 1)],
);
}
test_class_unreachable_hasNamedConstructors() async {
await assertDiagnostics(
r'''
void main() {}
class C {
C();
C.named();
}
''',
[
lint(22, 1),
// TODO(srawlins): See if we can skip reporting a declaration if its
// enclosing declaration is being reported.
lint(28, 1),
lint(37, 5),
],
);
}
test_class_unreachable_mainInPart() async {
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
void main() {}
''');
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
class A {}
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', [lint(25, 1)]),
('$testPackageLibPath/part.dart', []),
]);
}
test_class_unreachable_referencedInParameter_externalMethodDeclaration() async {
await assertDiagnostics(
r'''
void main() {
D().f;
}
class C {}
class D {
external f(C c);
}
''',
[lint(32, 1)],
);
}
test_class_unreachable_referencedInTypeAnnotation_fieldDeclaration() async {
await assertDiagnostics(
r'''
void main() {
D().c;
}
class C {}
class D {
C? c;
}
''',
[lint(32, 1)],
);
}
test_class_unreachable_referencedInTypeAnnotation_parameter() async {
await assertDiagnostics(
r'''
void main() {
f();
}
void f([C? c]) {}
class C {}
''',
[lint(49, 1)],
);
}
test_class_unreachable_referencedInTypeAnnotation_topLevelVariable() async {
await assertDiagnostics(
r'''
void main() {
print(c);
}
C? c;
class C {}
''',
[lint(42, 1)],
);
}
test_class_unreachable_referencedInTypeAnnotation_variableDeclaration() async {
await assertDiagnostics(
r'''
void main() {
C? c;
}
class C {}
''',
[lint(31, 1)],
);
}
test_class_unreachable_typeArgumentBound() async {
await assertDiagnostics(
r'''
void main() {
f();
}
class C {}
void f<T extends C>() {}
''',
[lint(30, 1)],
);
}
test_classInPart_reachable() async {
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
class A {}
''');
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
void main() => A();
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', []),
('$testPackageLibPath/part.dart', []),
]);
}
test_classInPart_reachable_mainInPart() async {
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
class A {}
void main() => A();
''');
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', []),
('$testPackageLibPath/part.dart', []),
]);
}
test_classInPart_unreachable() async {
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
void main() {}
''');
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
class A {}
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', []),
('$testPackageLibPath/part.dart', [lint(27, 1)]),
]);
}
test_classInPart_unreachable_mainInPart() async {
newFile('$testPackageLibPath/lib.dart', r'''
part 'part.dart';
''');
newFile('$testPackageLibPath/part.dart', r'''
part of 'lib.dart';
class A {}
void main() {}
''');
await assertDiagnosticsInUnits([
('$testPackageLibPath/lib.dart', []),
('$testPackageLibPath/part.dart', [lint(27, 1)]),
]);
}
test_constructor_named_onEnum() async {
await assertDiagnostics(
r'''
void main() {
E.one;
E.two;
}
enum E {
one(), two();
const E();
const E.named();
}
''',
[
// No lint.
error(WarningCode.UNUSED_ELEMENT, 84, 5),
],
);
}
test_constructor_named_reachableViaDirectCall() async {
await assertNoDiagnostics(r'''
void main() {
C.named();
}
class C {
C.named();
}
''');
}
test_constructor_named_reachableViaExplicitSuperCall() async {
await assertNoDiagnostics(r'''
void main() {
D();
}
class C {
C.named();
}
class D extends C {
D() : super.named();
}
''');
}
test_constructor_named_reachableViaRedirectedConstructor() async {
await assertNoDiagnostics(r'''
void main() {
C.two();
}
class C {
C.named();
factory C.two() = C.named;
}
''');
}
test_constructor_named_reachableViaRedirection() async {
await assertNoDiagnostics(r'''
void main() {
C.two();
}
class C {
C.named();
C.two() : this.named();
}
''');
}
test_constructor_named_reachableViaTearoff() async {
await assertNoDiagnostics(r'''
void main() {
C.named;
}
class C {
C.named();
}
''');
}
test_constructor_named_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
C.named();
}
''',
[lint(36, 5)],
);
}
test_constructor_named_unreachable_inExtensionType() async {
await assertDiagnostics(
r'''
void main() {
E(7);
}
extension type E(int it) {
E.named(this.it);
}
''',
[lint(56, 5)],
);
}
test_constructor_named_unreachable_otherHasRedirectedConstructor() async {
await assertDiagnostics(
r'''
void main() {
C.two();
}
class C {
C.named();
C.one();
factory C.two() = C.one;
}
''',
[lint(42, 5)],
);
}
test_constructor_reachableViaTestReflectiveLoader() async {
await assertNoDiagnostics(r'''
import 'package:test_reflective_loader/test_reflective_loader.dart';
void main() {
// Usually some reference via `defineReflectiveTests`.
A;
}
@reflectiveTest
class A {
A() {}
}
''');
}
test_constructor_unnamed_reachableViaDefaultImplicitSuperCall() async {
await assertNoDiagnostics(r'''
void main() {
D();
}
class C {
C();
}
class D extends C {
// Just a default constructor.
}
''');
}
test_constructor_unnamed_reachableViaDirectCall() async {
await assertNoDiagnostics(r'''
void main() {
C();
}
class C {
C();
}
''');
}
test_constructor_unnamed_reachableViaExplicitSuperCall() async {
await assertNoDiagnostics(r'''
void main() {
D();
}
class C {
C();
}
class D extends C {
D() : super();
}
''');
}
test_constructor_unnamed_reachableViaImplicitSuperCall() async {
await assertNoDiagnostics(r'''
void main() {
D();
}
class C {
C();
}
class D extends C {
D();
}
''');
}
test_constructor_unnamed_reachableViaImplicitSuperCall_indirectly() async {
await assertNoDiagnostics(r'''
void main() {
E();
}
class C {
C();
}
class D extends C {
// Just a default constructor.
}
class E extends D {
E();
}
''');
}
test_constructor_unnamed_reachableViaImplicitSuperCall_superParameters() async {
await assertNoDiagnostics(r'''
void main() {
D(1);
}
class C {
C(int p);
}
class D extends C {
D(super.p);
}
''');
}
test_constructor_unnamed_reachableViaRedirectedConstructor() async {
await assertNoDiagnostics(r'''
void main() {
C.two();
}
class C {
C();
factory C.two() = C;
}
''');
}
test_constructor_unnamed_reachableViaRedirection() async {
await assertNoDiagnostics(r'''
void main() {
C.two();
}
class C {
C();
C.two() : this();
}
''');
}
test_constructor_unnamed_reachableViaTearoff() async {
await assertNoDiagnostics(r'''
void main() {
C.new;
}
class C {
C();
}
''');
}
test_constructor_unnamed_referencedInConstantPattern() async {
await assertDiagnostics(
r'''
class C {
const C();
}
void main() {
f();
}
void f([C? c]) {
if (c case const C()) {}
}
''',
[lint(6, 1), lint(18, 1)],
);
}
test_constructor_unnamed_referencedInConstantPattern_generic() async {
await assertDiagnostics(
r'''
class C<T> {
const C();
}
void main() {
f();
}
void f([C? c]) {
if (c case const C<int>()) {}
}
''',
[lint(6, 1), lint(21, 1)],
);
}
test_constructor_unnamed_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
C();
}
''',
[lint(34, 1)],
);
}
test_constructor_unnamed_unreachable_otherHasRedirection() async {
await assertDiagnostics(
r'''
void main() {
C.two();
}
class C {
C();
C.one();
C.two() : this.one();
}
''',
[lint(40, 1)],
);
}
test_enum_reachableViaValue() async {
await assertNoDiagnostics(r'''
void main() {
E.one;
}
enum E { one, two }
''');
}
test_enum_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
enum E { one, two }
''',
[lint(21, 1)],
);
}
test_extension_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
extension IntExtension on int {}
''',
[lint(26, 12)],
);
}
test_extensionType_reachable_referencedInTypeAnnotation_asExpression() async {
await assertNoDiagnostics(r'''
void main() {
1 as E;
}
extension type E(int it) {}
''');
}
test_extensionType_reachable_referencedInTypeAnnotation_castPattern() async {
await assertNoDiagnostics(r'''
void main() {
var r = (1, );
var (s as E, ) = r;
}
extension type E(int it) {}
''');
}
test_instanceFieldOnExtension_unreachable() async {
await assertDiagnostics(
r'''
void main() {
E.f;
}
extension E on int {
static int f = 1;
void m() {}
}
''',
[lint(72, 1)],
);
}
test_instanceMethod_reachable_toJson() async {
await assertNoDiagnostics(r'''
import 'dart:convert';
void main() async {
jsonEncode([C()]);
}
class C {
List<Object> toJson() => ['c'];
}
''');
}
test_instanceMethod_unreachable_inExtensionType() async {
await assertDiagnostics(
r'''
void main() {
E(7);
}
extension type E(int it) {
void m() {}
}
''',
[lint(59, 1)],
);
}
test_mixin_reachable_implemented() async {
await assertNoDiagnostics(r'''
void main() {
A();
}
mixin M {}
class A implements M {}
''');
}
test_mixin_reachable_mixed() async {
await assertNoDiagnostics(r'''
void main() {
A();
}
mixin M {}
class A with M {}
''');
}
test_mixin_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
mixin M {}
''',
[lint(22, 1)],
);
}
test_staticField_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
static int f = 1;
}
''',
[lint(45, 1)],
);
}
test_staticFieldOnClass_reachable() async {
await assertNoDiagnostics(r'''
void main() {
C.f;
}
class C {
static int f = 1;
}
''');
}
test_staticFieldOnEnum_reachable() async {
await assertNoDiagnostics(r'''
void main() {
E.f;
}
enum E {
one, two, three;
static int f = 1;
}
''');
}
test_staticFieldOnExtension_reachable() async {
await assertNoDiagnostics(r'''
void main() {
E.f;
}
extension E on int {
static int f = 1;
}
''');
}
test_staticFieldOnExtension_unreachable() async {
await assertDiagnostics(
r'''
void main() {
E(1).m();
}
extension E on int {
static int f = 1;
void m() {}
}
''',
[lint(63, 1)],
);
}
test_staticFieldOnMixin_reachable() async {
await assertNoDiagnostics(r'''
void main() {
M.f;
}
mixin M {
static int f = 1;
}
''');
}
test_staticGetter_reachable() async {
await assertNoDiagnostics(r'''
void main() {
C.g;
}
class C {
static int get g => 7;
}
''');
}
test_staticGetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
static int get g => 7;
}
''',
[lint(49, 1)],
);
}
test_staticMethod_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
static void f() {}
}
''',
[lint(46, 1)],
);
}
test_staticMethodOnClass_reachable() async {
await assertNoDiagnostics(r'''
void main() {
C.f();
}
class C {
static void f() {}
}
''');
}
test_staticMethodOnEnum_reachable() async {
await assertNoDiagnostics(r'''
void main() {
E.f();
}
enum E {
one, two, three;
static void f() {}
}
''');
}
test_staticMethodOnExtension_reachable() async {
await assertNoDiagnostics(r'''
void main() {
E.f();
}
extension E on int {
static void f() {}
}
''');
}
test_staticMethodOnMixin_reachable() async {
await assertNoDiagnostics(r'''
void main() {
M.f();
}
mixin M {
static void f() {}
}
''');
}
test_staticSetter_reachable() async {
await assertNoDiagnostics(r'''
void main() {
C.s = 1;
}
class C {
static set s(int value) {}
}
''');
}
test_staticSetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {
C;
}
class C {
static set s(int value) {}
}
''',
[lint(45, 1)],
);
}
test_topLevelFunction_reachable() async {
await assertNoDiagnostics(r'''
void main() {
f1();
}
void f1() {
f2();
}
void f2() {}
''');
}
test_topLevelFunction_reachable_private() async {
await assertNoDiagnostics(r'''
void main() {
_f();
}
void _f() {}
''');
}
test_topLevelFunction_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
void f() {}
''',
[lint(21, 1)],
);
}
test_topLevelFunction_unreachable_unrelatedPragma() async {
await assertDiagnostics(
r'''
void main() {}
@pragma('other')
void f() {}
''',
[lint(38, 1)],
);
}
test_topLevelFunction_unreachable_visibleForTesting() async {
await assertNoDiagnostics(r'''
import 'package:meta/meta.dart';
void main() {}
@visibleForTesting
void f() {}
''');
}
test_topLevelFunction_vmEntryPoint() async {
await assertNoDiagnostics(r'''
void main() {}
@pragma('vm:entry-point')
void f6() {}
''');
}
test_topLevelFunction_vmEntryPoint_const() async {
await assertNoDiagnostics(r'''
void main() {}
const entryPoint = pragma('vm:entry-point');
@entryPoint
void f6() {}
''');
}
test_topLevelGetter_reachable() async {
await assertNoDiagnostics(r'''
void main() {
g;
}
int get g => 7;
''');
}
test_topLevelGetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
int get g => 7;
''',
[lint(24, 1)],
);
}
test_topLevelSetter_reachable() async {
await assertNoDiagnostics(r'''
void main() {
s = 7;
}
set s(int value) {}
''');
}
test_topLevelSetter_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
set s(int value) {}
''',
[lint(20, 1)],
);
}
test_topLevelVariable_reachable() async {
await assertNoDiagnostics(r'''
void main() {
_f();
}
void _f() {
x;
}
int x = 1;
''');
}
test_topLevelVariable_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
int x = 1;
''',
[lint(20, 1)],
);
}
test_typedef_reachable_referencedAsInstanceCreation_named() async {
await assertNoDiagnostics(r'''
void main() {
T.named();
}
class C {
C.named();
}
typedef T = C;
''');
}
test_typedef_reachable_referencedAsInstanceCreation_unnamed() async {
await assertNoDiagnostics(r'''
void main() {
T();
}
class C {}
typedef T = C;
''');
}
test_typedef_reachable_referencedInObjectPattern() async {
await assertNoDiagnostics(r'''
typedef T = int;
void main() {
f();
}
void f([Object? c]) {
if (c case T()) {}
}
''');
}
test_typedef_reachable_referencedInTypeAnnotation_asExpression() async {
await assertNoDiagnostics(r'''
void main() {
1.5 as T;
}
typedef T = int;
''');
}
test_typedef_reachable_referencedInTypeAnnotation_castPattern() async {
await assertNoDiagnostics(r'''
void main() {
var r = (1.5, );
var (s as T, ) = r;
}
typedef T = int;
''');
}
test_typedef_reachable_referencedInTypeAnnotation_genericFunctionType() async {
await assertNoDiagnostics(r'''
void main() {
t = () => 7;
}
T? Function()? t;
typedef T = int;
''');
}
test_typedef_reachable_referencedInTypeAnnotation_isExpression() async {
await assertNoDiagnostics(r'''
void main() {
1.5 is T;
}
typedef T = int;
''');
}
test_typedef_reachable_referencedInTypeAnnotation_parameter() async {
await assertNoDiagnostics(r'''
void main() {
f(() {});
}
void f([Cb? c]) {}
typedef Cb = void Function();
''');
}
test_typedef_reachable_referencedInTypeAnnotation_recordType() async {
await assertNoDiagnostics(r'''
void main() {
t = (1, );
}
(T, )? t;
typedef T = int;
''');
}
test_typedef_reachable_referencedInTypeAnnotation_topLevelVariable() async {
await assertNoDiagnostics(r'''
void main() {
c = () {};
}
Cb? c;
typedef Cb = void Function();
''');
}
test_typedef_reachable_referencedInTypeAnnotation_variableDeclaration() async {
await assertNoDiagnostics(r'''
void main() {
Cb c = () {};
}
typedef Cb = void Function();
''');
}
test_typedef_unreachable() async {
await assertDiagnostics(
r'''
void main() {}
typedef T = String;
''',
[lint(24, 1)],
);
}
test_widgetPreview_classInstanceMethod() async {
await assertDiagnostics(
r'''
import 'package:flutter/widgets.dart';
import 'package:flutter/widget_previews.dart';
void main() {}
class B {
// Widget previews can't be defined with instance methods.
@Preview()
Widget foo() => Text('');
}
''',
[
lint(109, 1),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 177, 7),
lint(196, 3),
],
);
}
test_widgetPreview_classStaticMethod() async {
await assertDiagnostics(
r'''
import 'package:flutter/widgets.dart';
import 'package:flutter/widget_previews.dart';
void main() {}
class B {
@Preview()
static Widget foo() => Text('');
}
''',
[lint(109, 1)],
);
}
test_widgetPreview_constructor() async {
await assertDiagnostics(
r'''
import 'package:flutter/widget_previews.dart';
void main() {}
class B {
@Preview()
const B();
}
''',
[
lint(70, 1),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 77, 7),
],
);
}
test_widgetPreview_factoryConstructor() async {
await assertDiagnostics(
r'''
import 'package:flutter/widget_previews.dart';
void main() {}
class B {
@Preview()
factory B.foo() => B();
const B();
}
''',
[
lint(70, 1),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 77, 7),
lint(122, 1),
],
);
}
test_widgetPreview_privatePreview() async {
await assertDiagnostics(
r'''
// Widget previews can't be defined with private functions.
import 'package:flutter/widget_previews.dart';
import 'package:flutter/widgets.dart';
void main() {}
class B {
@Preview()
factory B._foo() => B._();
@Preview()
B._();
@Preview()
static Widget _bar() => Text('');
}
@Preview()
void _f6() {}
''',
[
lint(168, 1),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 175, 7),
error(WarningCode.UNUSED_ELEMENT, 197, 4),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 218, 7),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 241, 7),
error(WarningCode.UNUSED_ELEMENT, 267, 4),
error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 291, 7),
error(WarningCode.UNUSED_ELEMENT, 306, 3),
],
);
}
test_widgetPreview_topLevelFunction() async {
await assertDiagnostics(
r'''
import 'package:flutter/widget_previews.dart';
void main() {}
@Preview()
void f6() {}
''',
[error(WarningCode.INVALID_WIDGET_PREVIEW_APPLICATION, 65, 7)],
);
}
test_widgetPreview_topLevelFunction_const() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widget_previews.dart';
void main() {}
const preview = Preview();
@preview
void f6() {}
''');
}
test_widgetPreview_topLevelFunction_customPreviewClass() async {
await assertDiagnostics(
r'''
void main() {}
class Preview {
const Preview();
}
// This isn't from package:flutter/widget_previews.dart and shouldn't be exempt.
@Preview()
void f6() {}
''',
[lint(22, 7), lint(40, 7), lint(151, 2)],
);
}
}