| // Copyright (c) 2025, 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:analyzer_testing/package_config_file_builder.dart'; |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import '../dart/resolution/context_collection_resolution.dart'; |
| import '../dart/resolution/node_text_expectations.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(ExperimentalExtendTest); |
| defineReflectiveTests(ExperimentalImplementTest); |
| defineReflectiveTests(ExperimentalInstantiateTest); |
| defineReflectiveTests(ExperimentalMemberUseTest); |
| defineReflectiveTests(ExperimentalMixinTest); |
| defineReflectiveTests(UpdateNodeTextExpectations); |
| }); |
| } |
| |
| @reflectiveTest |
| class ExperimentalExtendTest extends _TestBase { |
| test_annotatedClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar extends Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_annotatedClass_indirect() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| class Bar extends Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Baz extends Bar {} |
| '''); |
| } |
| |
| test_annotatedClass_typedef() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| typedef Foo2 = Foo; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar extends Foo2 {} |
| '''); |
| } |
| |
| test_annotatedClassTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo = Object with M; |
| mixin M {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar extends Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_classTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| mixin M {} |
| class Bar = Foo with M; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_insideLibrary() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| class Bar extends Foo {} |
| '''); |
| } |
| |
| test_noAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar extends Foo {} |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class ExperimentalImplementTest extends _TestBase { |
| test_annotatedClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar implements Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_annotatedClass_indirect() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| class Bar extends Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Baz implements Bar {} |
| '''); |
| } |
| |
| test_annotatedClass_typedef() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| typedef Foo2 = Foo; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar implements Foo2 {} |
| '''); |
| } |
| |
| test_annotatedClassTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo = Object with M; |
| mixin M {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar implements Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_classTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| mixin M {} |
| class Bar = Object with M implements Foo; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_enum() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| enum Bar implements Foo { one; } |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_insideLibrary() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| class Bar implements Foo {} |
| '''); |
| } |
| |
| test_mixinImplementsClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| mixin Bar implements Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_mixinOnClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| mixin Bar on Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_noAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar implements Foo {} |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class ExperimentalInstantiateTest extends _TestBase { |
| test_annotatedClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo(); |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_annotatedClass_tearoff() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo.new; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_annotatedClass_typedef() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| typedef Foo2 = Foo; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo2(); |
| '''); |
| } |
| |
| test_annotatedClass_typedef_tearoff() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| typedef Foo2 = Foo; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo2.new; |
| '''); |
| } |
| |
| test_annotatedClassTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo = Object with M; |
| mixin M {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo(); |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_insideLibrary() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class Foo {} |
| var x = Foo(); |
| '''); |
| } |
| |
| test_noAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = Foo(); |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class ExperimentalMemberUseTest extends _TestBase { |
| test_assignmentExpression_compound_experimentalGetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int get x => 0; |
| |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x += 2; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_assignmentExpression_compound_experimentalSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| int get x => 0; |
| |
| @experimental |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x += 2; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_assignmentExpression_simple_experimentalGetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int get x => 0; |
| |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x = 0; |
| } |
| '''); |
| } |
| |
| test_assignmentExpression_simple_experimentalGetterSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x = 0; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_assignmentExpression_simple_experimentalSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| int get x => 0; |
| |
| @experimental |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x = 0; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_call() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| call() {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) { |
| a(); |
| //^^^ |
| // [diag.experimentalMemberUse] 'call' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_class() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_class_inExperimentalFunctionTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| typedef A T(); |
| '''); |
| } |
| |
| test_class_inExperimentalGenericTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| typedef T = A Function(); |
| '''); |
| } |
| |
| test_compoundAssignment() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A operator+(A a) { return a; } |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| f(A a, A b) { |
| a += b; |
| //^^^^^^ |
| // [diag.experimentalMemberUse] '+' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_dotShorthandConstructorInvocation_experimentalClass_experimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| @experimental |
| A(); |
| } |
| |
| void g(A a) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| g(.new()); |
| // ^^^^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| // ^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_dotShorthandConstructorInvocation_experimentalClass_unexperimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| A(); |
| } |
| void g(A a) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| g(.new()); |
| // ^^^^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_dotShorthandConstructorInvocation_experimentalClass_unexperimentalNamedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| A.a(); |
| } |
| void g(A _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| g(.a()); |
| // ^^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_dotShorthandConstructorInvocation_namedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A.named(int i) {} |
| } |
| void g(A a) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| f() { |
| g(.named(1)); |
| // ^^^^^ |
| // [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_dotShorthandConstructorInvocation_unexperimentalClass_experimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A(); |
| } |
| void g(A a) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| g(.new()); |
| // ^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_experimentalField_inObjectPattern_explicitName() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| @experimental |
| final int foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| int g(Object s) => |
| switch (s) { |
| C(foo: var f) => f, |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| _ => 7, |
| }; |
| '''); |
| } |
| |
| test_experimentalField_inObjectPattern_inferredName() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| @experimental |
| final int foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| int g(Object s) => |
| switch (s) { |
| C(:var foo) => foo, |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| _ => 7, |
| }; |
| '''); |
| } |
| |
| test_export() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| library a; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| export 'package:aaa/a.dart'; |
| // [diag.experimentalMemberUse][column 1][length 28] 'package:aaa/a.dart' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_export_fromSamePackage() async { |
| newFile('$testPackageLibPath/lib2.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| library a; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| export 'lib2.dart'; |
| '''); |
| } |
| |
| test_extensionOverride() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| extension E on int { |
| int get foo => 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| E(0).foo; |
| //^ |
| // [diag.experimentalMemberUse] 'E' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_field_implicitGetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| int foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f(A a) { |
| a.foo; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_field_implicitSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| int foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f(A a) { |
| a.foo = 0; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_field_inExperimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| int x = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class B extends A { |
| @experimental |
| B() { |
| x; |
| x = 1; |
| } |
| } |
| '''); |
| } |
| |
| test_hideCombinator() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A {} |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| // ignore: unused_import |
| import 'package:aaa/a.dart' hide A; |
| '''); |
| } |
| |
| test_import() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| library a; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| // ignore:unused_import |
| import 'package:aaa/a.dart'; |
| // [diag.experimentalMemberUse][column 1][length 28] 'package:aaa/a.dart' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_incorrectlyNestedNamedParameterDeclaration() async { |
| // This is a regression test; previously this code would cause an analyzer |
| // crash in ExperimentalMemberUseVerifier. |
| await resolveTestCodeWithDiagnostics(r''' |
| class C { |
| final String x; |
| final bool y; |
| |
| const C({ |
| // ^ |
| // [diag.finalNotInitializedConstructor1] All final variables must be initialized, but 'y' isn't. |
| required this.x, |
| {this.y = false} |
| // ^ |
| // [diag.missingIdentifier] Expected an identifier. |
| // [diag.expectedToken] Expected to find '}'. |
| }); |
| } |
| |
| const z = C(x: ''); |
| '''); |
| } |
| |
| test_indexExpression() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| operator[](int i) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) { |
| return a[1]; |
| // ^^^^ |
| // [diag.experimentalMemberUse] '[]' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_inEnum() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| void f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| enum E { |
| one, two; |
| |
| void m() { |
| f(); |
| // ^ |
| // [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time. |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| class C { |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalDefaultFormalParameter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C { |
| const C(); |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| f({@experimental C? c = const C()}) {} |
| '''); |
| } |
| |
| test_inExperimentalEnum() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| void f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| enum E { |
| one, two; |
| |
| void m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalExtension() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| void f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| extension E on int { |
| void m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalExtensionType() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| extension type E(int i) { |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalField() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class X { |
| @experimental |
| C f; |
| X(this.f); |
| } |
| '''); |
| } |
| |
| test_inExperimentalFieldFormalParameter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class A { |
| Object? o; |
| A({@experimental C? this.o}); |
| } |
| '''); |
| } |
| |
| test_inExperimentalFunction() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| g() { |
| f(); |
| } |
| '''); |
| } |
| |
| test_inExperimentalFunctionTypedFormalParameter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| f({@experimental C? callback()?}) {} |
| '''); |
| } |
| |
| test_inExperimentalLibrary() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| @experimental |
| library lib; |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class C { |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalMethod() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class C { |
| @experimental |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalMethod_inExperimentalClass() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| class C { |
| @experimental |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalMixin() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| mixin M { |
| m() { |
| f(); |
| } |
| } |
| '''); |
| } |
| |
| test_inExperimentalSimpleFormalParameter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| f({@experimental C? c}) {} |
| '''); |
| } |
| |
| test_inExperimentalSuperFormalParameter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class A { |
| A({Object? o}); |
| } |
| class B extends A { |
| B({@experimental C? super.o}); |
| } |
| '''); |
| } |
| |
| test_inExperimentalTopLevelVariable() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class C {} |
| var x = C(); |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| C v = x; |
| '''); |
| } |
| |
| test_inExtension() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| void f() {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| extension E on int { |
| void m() { |
| f(); |
| // ^ |
| // [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time. |
| } |
| } |
| '''); |
| } |
| |
| test_instanceCreation_experimentalClass_experimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| @experimental |
| A(); |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| A(); |
| //^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_instanceCreation_experimentalClass_unexperimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| A(); |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| A(); |
| //^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_instanceCreation_experimentalClass_unexperimentalNamedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| A.a(); |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| A.a(); |
| //^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_instanceCreation_namedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A.named(int i) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var a = A.named(1); |
| // ^^^^^^^ |
| // [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_instanceCreation_namedConstructor_primary() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A.named() { |
| @experimental |
| this; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var a = A.named(); |
| // ^^^^^^^ |
| // [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_instanceCreation_unexperimentalClass_experimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A(); |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| A(); |
| //^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_instanceCreation_unnamedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A(int i) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| f() { |
| return new A(1); |
| // ^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_methodInvocation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| void foo() {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f(A a) { |
| a.foo(); |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_methodInvocation_constantAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int f() => 0; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = f(); |
| // ^ |
| // [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_methodInvocation_constructorAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int f() => 0; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| var x = f(); |
| // ^ |
| // [diag.experimentalMemberUse] 'f' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_methodInvocation_fromSamePackage() async { |
| newFile('$testPackageLibPath/lib2.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| void foo() {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'lib2.dart'; |
| |
| void f(A a) { |
| a.foo(); |
| } |
| '''); |
| } |
| |
| test_methodInvocation_inExperimentalConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A() { |
| foo(); |
| } |
| |
| @experimental |
| void foo() {} |
| } |
| '''); |
| } |
| |
| test_mixin_inExperimentalClassTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin A {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| class B = Object with A; |
| '''); |
| } |
| |
| test_namedParameterMissingName() async { |
| // This is a regression test; previously this code would cause an analyzer |
| // crash in ExperimentalMemberUseVerifier. |
| await resolveTestCodeWithDiagnostics(r''' |
| class C { |
| const C({this.}); |
| // ^^^^^ |
| // [diag.initializingFormalForNonExistentField] '' isn't a field in the enclosing class. |
| // ^ |
| // [diag.missingIdentifier] Expected an identifier. |
| } |
| var z = C(x: ''); |
| // ^ |
| // [diag.undefinedNamedParameter] The named parameter 'x' isn't defined. |
| '''); |
| } |
| |
| test_operator() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| operator+(A a) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| f(A a, A b) { |
| return a + b; |
| // ^^^^^ |
| // [diag.experimentalMemberUse] '+' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_parameter_named() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| void f({@experimental int x = 0}) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void g() => f(x: 1); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_parameter_named_inDefiningConstructor_asFieldFormalParameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| int x; |
| C({@experimental this.x = 0}); |
| } |
| '''); |
| } |
| |
| test_parameter_named_inDefiningConstructor_assertInitializer() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| C({@experimental int y = 0}) : assert(y > 0); |
| } |
| '''); |
| } |
| |
| test_parameter_named_inDefiningConstructor_fieldInitializer() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| int x; |
| C({@experimental int y = 0}) : x = y; |
| } |
| '''); |
| } |
| |
| test_parameter_named_inDefiningConstructor_inFieldFormalParameter_notName() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A {} |
| |
| @experimental |
| class B extends A { |
| const B(); |
| } |
| |
| const B instance = const B(); |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class C { |
| final A a; |
| C({B this.a = instance}); |
| // ^ |
| // [diag.experimentalMemberUse] 'B' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_parameter_named_inDefiningFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| f({@experimental int x = 0}) => x; |
| '''); |
| } |
| |
| test_parameter_named_inDefiningLocalFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| m() { |
| f({@experimental int x = 0}) { |
| return x; |
| } |
| return f(); |
| } |
| } |
| '''); |
| } |
| |
| test_parameter_named_inDefiningMethod() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| m({@experimental int x = 0}) { |
| return x; |
| } |
| } |
| '''); |
| } |
| |
| test_parameter_named_inNestedLocalFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| m({@experimental int x = 0}) { |
| f() { |
| return x; |
| } |
| return f(); |
| } |
| } |
| '''); |
| } |
| |
| test_parameter_named_inPrimaryConstructor_assertInitializer() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C({@experimental int y = 0}) { |
| this : assert(y > 0); |
| } |
| '''); |
| } |
| |
| test_parameter_named_ofFunction() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| void foo({@experimental int a}) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f() { |
| foo(a: 0); |
| // ^ |
| // [diag.experimentalMemberUse] 'a' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_parameter_named_ofMethod() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| void foo({@experimental int a}) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| |
| void f(A a) { |
| a.foo(a: 0); |
| // ^ |
| // [diag.experimentalMemberUse] 'a' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_parameter_positionalOptional() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| void foo([@experimental int x = 0]) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) { |
| a.foo(0); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_parameter_positionalOptional_inExperimentalConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| void foo([@experimental int x = 0]) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class A { |
| @experimental |
| A() { |
| foo(0); |
| } |
| } |
| '''); |
| } |
| |
| test_parameter_positionalOptional_inExperimentalFunction() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| void foo([@experimental int x = 0]) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| @experimental |
| void f(A a) { |
| a.foo(0); |
| } |
| '''); |
| } |
| |
| test_parameter_positionalOptional_inExperimentalPrimaryConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| void foo([@experimental int x = 0]) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| import 'package:aaa/a.dart'; |
| |
| class A() { |
| @experimental |
| this { |
| foo(0); |
| } |
| } |
| '''); |
| } |
| |
| test_parameter_positionalRequired() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| void foo(@experimental int x) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) { |
| a.foo(0); |
| } |
| '''); |
| } |
| |
| test_postfixExpression_experimentalGetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int get x => 0; |
| |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x++; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_postfixExpression_experimentalNothing() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| int get x => 0; |
| |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x++; |
| } |
| '''); |
| } |
| |
| test_postfixExpression_experimentalSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| int get x => 0; |
| |
| @experimental |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x++; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_prefixedIdentifier_identifier() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| static const foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| A.foo; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_prefixedIdentifier_prefix() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A { |
| static const foo = 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| A.foo; |
| //^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_prefixExpression_experimentalGetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int get x => 0; |
| |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| ++x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_prefixExpression_experimentalSetter() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| int get x => 0; |
| |
| @experimental |
| set x(int _) {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| ++x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_propertyAccess_super() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| int get foo => 0; |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class B extends A { |
| void bar() { |
| super.foo; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| } |
| '''); |
| } |
| |
| test_redirectingConstructorInvocation_namedParameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| A({@experimental int a = 0}) {} |
| A.named() : this(a: 0); |
| } |
| '''); |
| } |
| |
| test_setterInvocation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| set foo(int _) {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(A a) { |
| a.foo = 0; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'foo' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_showCombinator() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| class A {} |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| // ignore: unused_import |
| import 'package:aaa/a.dart' show A; |
| // ^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_superConstructor_namedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A.named() {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class B extends A { |
| B() : super.named() {} |
| // ^^^^^^^^^^^^^ |
| // [diag.experimentalMemberUse] 'A.named' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_superConstructor_unnamedConstructor() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @experimental |
| A() {} |
| } |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class B extends A { |
| B() : super() {} |
| // ^^^^^^^ |
| // [diag.experimentalMemberUse] 'A' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_argument() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| print(x); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_assignment_right() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(int a) { |
| a = x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_binaryExpression() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x + 1; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_constructorFieldInitializer() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| const int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class A { |
| final int f; |
| A() : f = x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_expressionFunctionBody() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| int f() => x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_topLevelVariable_expressionStatement() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| x; |
| //^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_forElement_condition() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = true; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| [for (;x;) 0]; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_forStatement_condition() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = true; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| for (;x;) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_ifElement_condition() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = true; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| [if (x) 0]; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_ifStatement_condition() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = true; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| if (x) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_listLiteral() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| [x]; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_mapLiteralEntry() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| ({0: x, x: 0}); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_namedExpression() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void g({int a = 0}) {} |
| void f() { |
| g(a: x); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_returnStatement() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| int f() { |
| return x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_setLiteral() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| ({x}); |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_spreadElement() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = [0]; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| [...x]; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_switchCase() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| const int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f(int a) { |
| switch (a) { |
| case x: |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| break; |
| } |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_switchCase_language219() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| const int x = 1; |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| // @dart = 2.19 |
| import 'package:aaa/a.dart'; |
| void f(int a) { |
| switch (a) { |
| case x: |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| break; |
| } |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_switchStatement() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| switch (x) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_switchStatement_language219() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| // @dart = 2.19 |
| import 'package:aaa/a.dart'; |
| void f() { |
| switch (x) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_unaryExpression() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| int x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| -x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_variableDeclaration_initializer() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = 1; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| // ignore: unused_local_variable |
| var v = x; |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| test_topLevelVariable_whileStatement_condition() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| var x = true; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| void f() { |
| while (x) {} |
| // ^ |
| // [diag.experimentalMemberUse] 'x' is experimental and could be removed or changed at any time. |
| } |
| '''); |
| } |
| |
| @override |
| void verifyCreatedCollection() { |
| super.verifyCreatedCollection(); |
| assertPackageConfigWorkspaceFor(testFile); |
| } |
| } |
| |
| @reflectiveTest |
| class ExperimentalMixinTest extends _TestBase { |
| test_annotatedClass_typedef() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo {} |
| typedef Foo2 = Foo; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar with Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_annotatedClassTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| mixin M {} |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo = Object with M; |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar with Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_class() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar with Foo {} |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_classTypeAlias() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar = Object with Foo; |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| '''); |
| } |
| |
| test_enum() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| enum Bar with Foo { |
| // ^^^ |
| // [diag.experimentalMemberUse] 'Foo' is experimental and could be removed or changed at any time. |
| one, two; |
| } |
| '''); |
| } |
| |
| test_insideLibrary() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @experimental |
| mixin class Foo {} |
| class Bar with Foo {} |
| '''); |
| } |
| |
| test_noAnnotation() async { |
| newFile('$aaaPackageRootPath/lib/a.dart', r''' |
| mixin class Foo {} |
| '''); |
| |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:aaa/a.dart'; |
| class Bar with Foo {} |
| '''); |
| } |
| } |
| |
| class _TestBase extends PubPackageResolutionTest { |
| String get aaaPackageRootPath => '$workspaceRootPath/aaa'; |
| |
| @override |
| void setUp() { |
| super.setUp(); |
| |
| writeTestPackageConfig( |
| PackageConfigFileBuilder() |
| ..add(name: 'aaa', rootFolder: getFolder(aaaPackageRootPath)), |
| meta: true, |
| ); |
| } |
| } |