| // Copyright (c) 2020, 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 '../dart/resolution/context_collection_resolution.dart'; |
| |
| main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(InvalidAnnotationTarget_MustBeOverriddenTest); |
| defineReflectiveTests(InvalidAnnotationTarget_MustCallSuperTest); |
| defineReflectiveTests(InvalidAnnotationTarget_RedeclareTest); |
| defineReflectiveTests(InvalidAnnotationTargetTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class InvalidAnnotationTarget_MustBeOverriddenTest |
| extends PubPackageResolutionTest { |
| @override |
| void setUp() { |
| super.setUp(); |
| writeTestPackageConfigWithMeta(); |
| } |
| |
| test_class_instance_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustBeOverridden |
| int f = 0; |
| } |
| '''); |
| } |
| |
| test_class_instance_field_declaredInPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A(@mustBeOverridden var int f); |
| '''); |
| } |
| |
| test_class_instance_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustBeOverridden |
| int get f => 0; |
| } |
| '''); |
| } |
| |
| test_class_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustBeOverridden |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_class_instance_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustBeOverridden |
| void set s(int value) {} |
| } |
| '''); |
| } |
| |
| test_class_static_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| static int f = 0; |
| } |
| '''); |
| } |
| |
| test_class_static_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| static int get f => 0; |
| } |
| '''); |
| } |
| |
| test_class_static_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| static void m() {} |
| } |
| '''); |
| } |
| |
| test_class_static_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| static void set f(int value) {} |
| } |
| '''); |
| } |
| |
| test_constructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| C(); |
| } |
| '''); |
| } |
| |
| test_enum_member() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| enum E { |
| one, two; |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_extension_member() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| extension E on String { |
| @mustBeOverridden |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_mixin_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| mixin M { |
| @mustBeOverridden |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_parameter_declaredInPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A(@mustBeOverridden int f); |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| '''); |
| } |
| |
| test_parameter_fieldFormal_declaredInPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A(@mustBeOverridden this.f) { |
| // ^^^^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustBeOverridden' can only be used on overridable members. |
| final int f; |
| } |
| '''); |
| } |
| |
| test_topLevel() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @mustBeOverridden |
| // [diag.invalidAnnotationTarget][column 2][length 16] The annotation 'mustBeOverridden' can only be used on overridable members. |
| void m() {} |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class InvalidAnnotationTarget_MustCallSuperTest |
| extends PubPackageResolutionTest { |
| @override |
| void setUp() { |
| super.setUp(); |
| writeTestPackageConfigWithMeta(); |
| } |
| |
| test_class_instance_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustCallSuper |
| int f = 0; |
| } |
| '''); |
| } |
| |
| test_class_instance_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustCallSuper |
| int get f => 0; |
| } |
| '''); |
| } |
| |
| test_class_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustCallSuper |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_class_instance_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class A { |
| @mustCallSuper |
| void set s(int value) {} |
| } |
| '''); |
| } |
| |
| test_class_static_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| static int f = 0; |
| } |
| '''); |
| } |
| |
| test_class_static_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| static int get f => 0; |
| } |
| '''); |
| } |
| |
| test_class_static_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| static void m() {} |
| } |
| '''); |
| } |
| |
| test_class_static_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| class A { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| static void set f(int value) {} |
| } |
| '''); |
| } |
| |
| test_constructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| C(); |
| } |
| '''); |
| } |
| |
| test_enum_member() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| enum E { |
| one, two; |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_extension_member() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| extension E on String { |
| @mustCallSuper |
| // ^^^^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'mustCallSuper' can only be used on overridable members. |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_mixin_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| mixin M { |
| @mustCallSuper |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_topLevel() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @mustCallSuper |
| // [diag.invalidAnnotationTarget][column 2][length 13] The annotation 'mustCallSuper' can only be used on overridable members. |
| void m() {} |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class InvalidAnnotationTarget_RedeclareTest extends PubPackageResolutionTest { |
| @override |
| void setUp() { |
| super.setUp(); |
| writeTestPackageConfigWithMeta(); |
| } |
| |
| test_class_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| @redeclare |
| // ^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'redeclare' can only be used on instance members of extension types. |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_extensionType_instance_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| int get g => 0; |
| } |
| |
| extension type E(C c) implements C { |
| @redeclare |
| int get g => 0; |
| } |
| '''); |
| } |
| |
| test_extensionType_instance_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| void m() {} |
| } |
| |
| extension type E(C c) implements C { |
| @redeclare |
| void m() {} |
| } |
| '''); |
| } |
| |
| test_extensionType_instance_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| set g(int i) {} |
| } |
| |
| extension type E(C c) implements C { |
| @redeclare |
| set g(int i) {} |
| } |
| '''); |
| } |
| |
| test_extensionType_static_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| static int get g => 0; |
| } |
| |
| extension type E(C c) { |
| @redeclare |
| // ^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'redeclare' can only be used on instance members of extension types. |
| static int get g => 0; |
| } |
| '''); |
| } |
| |
| test_extensionType_static_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| static void m() {} |
| } |
| |
| extension type E(C c) { |
| @redeclare |
| // ^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'redeclare' can only be used on instance members of extension types. |
| static void m() {} |
| } |
| '''); |
| } |
| |
| test_extensionType_static_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| class C { |
| static set g(int i) {} |
| } |
| |
| extension type E(C c) { |
| @redeclare |
| // ^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'redeclare' can only be used on instance members of extension types. |
| static set g(int i) {} |
| } |
| '''); |
| } |
| } |
| |
| @reflectiveTest |
| class InvalidAnnotationTargetTest extends PubPackageResolutionTest { |
| @override |
| void setUp() { |
| super.setUp(); |
| writeTestPackageConfigWithMeta(); |
| } |
| |
| // TODO(pq): add tests for topLevelVariables: |
| // https://dart-review.googlesource.com/c/sdk/+/200301 |
| void test_classType_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| class C {} |
| '''); |
| } |
| |
| void test_classType_classTypeAlias() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType}) |
| class A { |
| const A(); |
| } |
| |
| mixin M {} |
| |
| @A() |
| class C = Object with M; |
| '''); |
| } |
| |
| void test_classType_mixin() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on classes. |
| mixin M {} |
| '''); |
| } |
| |
| void test_classType_topLevelVariable_constructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on classes. |
| int x = 0; |
| '''); |
| } |
| |
| void test_classType_topLevelVariable_topLevelConstant() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType}) |
| class A { |
| const A(); |
| } |
| |
| const a = A(); |
| |
| @a |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'a' can only be used on classes. |
| int x = 0; |
| '''); |
| } |
| |
| void test_constructor_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on constructors. |
| class C {} |
| '''); |
| } |
| |
| void test_constructor_classWithPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on constructors. |
| class C(final int i); |
| '''); |
| } |
| |
| void test_constructor_constructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() C(); |
| } |
| '''); |
| } |
| |
| void test_constructor_enumWithPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on constructors. |
| enum C(int i) { |
| a(1), b(2), c(3); |
| } |
| '''); |
| } |
| |
| void test_constructor_extensionType() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on constructors. |
| extension type C(int i); |
| '''); |
| } |
| |
| void test_constructor_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on constructors. |
| void m() {} |
| } |
| '''); |
| } |
| |
| void test_constructor_primaryConstructorBody() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.constructor}) |
| class A { |
| const A(); |
| } |
| |
| |
| class C(final int i) { |
| @A() |
| this; |
| } |
| '''); |
| } |
| |
| void test_directive_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| // ignore: deprecated_member_use |
| @Target({TargetKind.directive}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on directives. |
| class C {} |
| '''); |
| } |
| |
| void test_directive_directive() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| import 'dart:core'; |
| |
| // ignore: deprecated_member_use |
| @Target({TargetKind.directive}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_enumType_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.enumType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on enums. |
| class C {} |
| '''); |
| } |
| |
| void test_enumType_enum() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.enumType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| enum E {a, b} |
| '''); |
| } |
| |
| void test_enumValue_enumValue() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.enumValue}) |
| class A { |
| const A(); |
| } |
| |
| enum E { |
| @A() one, two; |
| } |
| '''); |
| } |
| |
| void test_enumValue_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.enumValue}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on enum values. |
| int f = 7; |
| } |
| '''); |
| } |
| |
| void test_exportDirective_exportDirective() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| export 'dart:core'; |
| |
| @Target({TargetKind.exportDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_exportDirective_importDirective() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on export directives. |
| import 'dart:core'; |
| |
| @Target({TargetKind.exportDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_extension_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.extension}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on extensions. |
| class C {} |
| '''); |
| } |
| |
| void test_extension_extension() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.extension}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| extension on C {} |
| class C {} |
| '''); |
| } |
| |
| void test_extension_type_parameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.parameter}) |
| class A { |
| const A(); |
| } |
| |
| extension type const E(@A() int x) {} |
| '''); |
| } |
| |
| void test_field_enumValue() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.field}) |
| class A { |
| const A(); |
| } |
| |
| enum E { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on fields. |
| one |
| } |
| '''); |
| } |
| |
| void test_field_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.field}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int f = 0; |
| } |
| '''); |
| } |
| |
| void test_field_field_declaredInPrimaryConstructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.field}) |
| class A { |
| const A(); |
| } |
| |
| class C(@A() final int f); |
| '''); |
| } |
| |
| void test_function_localFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.function}) |
| class A { |
| const A(); |
| } |
| |
| void f() { |
| @A() |
| // ignore: unused_element |
| int g(int x) => 0; |
| } |
| '''); |
| } |
| |
| void test_function_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.function}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on top-level functions. |
| int M(int x) => 0; |
| } |
| '''); |
| } |
| |
| void test_function_topLevelFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.function}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| int f(int x) => 0; |
| '''); |
| } |
| |
| void test_function_topLevelGetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.function}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on top-level functions. |
| int get x => 0; |
| '''); |
| } |
| |
| void test_function_topLevelSetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.function}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on top-level functions. |
| set x(_x) {} |
| '''); |
| } |
| |
| void test_getter_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.getter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on getters. |
| int x = 0; |
| } |
| '''); |
| } |
| |
| void test_getter_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.getter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int get x => 0; |
| } |
| '''); |
| } |
| |
| void test_getter_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.getter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on getters. |
| int m(int x) => x; |
| } |
| '''); |
| } |
| |
| void test_getter_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.getter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on getters. |
| set x(int _x) {} |
| } |
| '''); |
| } |
| |
| void test_getter_topLevelGetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.getter}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| int get x => 0; |
| '''); |
| } |
| |
| void test_importDirective_exportDirective() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on import directives. |
| export 'dart:core'; |
| |
| @Target({TargetKind.importDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_importDirective_importDirective() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| import 'dart:core'; |
| |
| @Target({TargetKind.importDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_library_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.library}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on libraries. |
| class C {} |
| '''); |
| } |
| |
| void test_library_import() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| @A() |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.library}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_library_library() async { |
| await resolveTestCodeWithDiagnostics(''' |
| @A() |
| library test; |
| |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.library}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_method_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on methods. |
| int get x => 0; |
| } |
| '''); |
| } |
| |
| void test_method_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int m(int x) => x; |
| } |
| '''); |
| } |
| |
| void test_method_operator() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int operator +(int x) => x; |
| } |
| '''); |
| } |
| |
| void test_method_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on methods. |
| set x(int _x) {} |
| } |
| '''); |
| } |
| |
| void test_method_topLevelFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on methods. |
| int f(int x) => x; |
| '''); |
| } |
| |
| void test_mixinType_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.mixinType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on mixins. |
| class C {} |
| '''); |
| } |
| |
| void test_mixinType_mixin() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.mixinType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| mixin M {} |
| '''); |
| } |
| |
| void test_multiple_invalid() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType, TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on classes or methods. |
| int x = 0; |
| '''); |
| } |
| |
| void test_multiple_valid() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.classType, TargetKind.method}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| class C { |
| @A() |
| int m(int x) => x; |
| } |
| '''); |
| } |
| |
| void test_optionalParameter_optionalNamed() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.optionalParameter}) |
| class A { |
| const A(); |
| } |
| |
| void f({@A() int? x}) {} |
| '''); |
| } |
| |
| void test_optionalParameter_optionalPositional() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.optionalParameter}) |
| class A { |
| const A(); |
| } |
| |
| void f([@A() int? x]) {} |
| '''); |
| } |
| |
| void test_optionalParameter_requiredNamed() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.optionalParameter}) |
| class A { |
| const A(); |
| } |
| |
| void f({@A() required int x}) {} |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on optional parameters. |
| '''); |
| } |
| |
| void test_optionalParameter_requiredPositional() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.optionalParameter}) |
| class A { |
| const A(); |
| } |
| |
| void f(@A() int x) {} |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on optional parameters. |
| '''); |
| } |
| |
| void test_overridableMember_class_visibleForOverriding() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| @visibleForOverriding |
| // [diag.invalidAnnotationTarget][column 2][length 20] The annotation 'visibleForOverriding' can only be used on overridable members. |
| class C {} |
| '''); |
| } |
| |
| void test_overridableMember_constructor() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on overridable members. |
| C(); |
| } |
| '''); |
| } |
| |
| void test_overridableMember_enumConstant() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| enum E { |
| @nonVirtual |
| // ^^^^^^^^^^ |
| // [diag.invalidAnnotationTarget] The annotation 'nonVirtual' can only be used on overridable members. |
| a, |
| b, c |
| } |
| '''); |
| } |
| |
| void test_overridableMember_extensionType_visibleForOverride() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| @visibleForOverriding |
| // [diag.invalidAnnotationTarget][column 2][length 20] The annotation 'visibleForOverriding' can only be used on overridable members. |
| extension type E(int i) {} |
| '''); |
| } |
| |
| void test_overridableMember_instanceGetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int get x => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceMethod() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int x() => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceMethod_onEnum() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| enum E { |
| one, two; |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on overridable members. |
| int x() => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceMethod_onExtension() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| extension E on int { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on overridable members. |
| int x() => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceMethod_onMixin() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| mixin M { |
| @A() |
| int x() => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceOperator() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| int operator +(int value) => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_instanceSetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| set x(int value) {} |
| } |
| '''); |
| } |
| |
| void test_overridableMember_staticField() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on overridable members. |
| static int x = 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_staticMethod() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.overridableMember}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on overridable members. |
| static int x() => 0; |
| } |
| '''); |
| } |
| |
| void test_overridableMember_topLevelField_visibleForOverriding() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| @visibleForOverriding |
| // [diag.invalidAnnotationTarget][column 2][length 20] The annotation 'visibleForOverriding' can only be used on overridable members. |
| var a = 1, b; |
| '''); |
| } |
| |
| void test_overridableMember_topLevelFunction_visibleForOverriding() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| @visibleForOverriding void foo() {} |
| // [diag.invalidAnnotationTarget][column 2][length 20] The annotation 'visibleForOverriding' can only be used on overridable members. |
| '''); |
| } |
| |
| void test_overridableMember_topLevelGetter_nonVirtual() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @nonVirtual |
| // [diag.invalidAnnotationTarget][column 2][length 10] The annotation 'nonVirtual' can only be used on overridable members. |
| int get a => 1; |
| '''); |
| } |
| |
| void test_overridableMember_topLevelSetter_nonVirtual() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| |
| @nonVirtual |
| // [diag.invalidAnnotationTarget][column 2][length 10] The annotation 'nonVirtual' can only be used on overridable members. |
| set a(int value) {} |
| '''); |
| } |
| |
| void test_overridableMember_typedef() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta.dart'; |
| @nonVirtual |
| // [diag.invalidAnnotationTarget][column 2][length 10] The annotation 'nonVirtual' can only be used on overridable members. |
| typedef bool predicate(Object o); |
| '''); |
| } |
| |
| void test_override_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| class C { |
| int a = 0; |
| } |
| class D extends C { |
| @override |
| int a = 0; |
| } |
| '''); |
| } |
| |
| void test_override_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| class C { |
| int get a => 0; |
| } |
| class D extends C { |
| @override |
| int get a => 0; |
| } |
| '''); |
| } |
| |
| void test_override_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| class C { |
| void m() {} |
| } |
| class D extends C { |
| @override |
| void m() {} |
| } |
| '''); |
| } |
| |
| void test_override_setter() async { |
| await resolveTestCodeWithDiagnostics(''' |
| class C { |
| set a(int p) {} |
| } |
| class D extends C { |
| @override |
| set a(int p) {} |
| } |
| '''); |
| } |
| |
| void test_override_topLevelField() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| @override |
| // [diag.invalidAnnotationTarget][column 2][length 8] The annotation 'override' can only be used on fields, getters, methods, or setters. |
| int a = 1; |
| '''); |
| } |
| |
| void test_override_topLevelFunction() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| @override |
| // [diag.invalidAnnotationTarget][column 2][length 8] The annotation 'override' can only be used on fields, getters, methods, or setters. |
| class C {} |
| '''); |
| } |
| |
| void test_parameter_function() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.parameter}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on parameters. |
| void f(int x) {} |
| '''); |
| } |
| |
| void test_parameter_parameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.parameter}) |
| class A { |
| const A(); |
| } |
| |
| void f(@A() int x) {} |
| '''); |
| } |
| |
| void test_partOfDirective_importDirective() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on "part of" directives. |
| import 'dart:core'; |
| |
| @Target({TargetKind.partOfDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_partOfDirective_partOfDirective() async { |
| newFile('$testPackageLibPath/b.dart', ''' |
| import 'package:meta/meta_meta.dart'; |
| |
| part 'test.dart'; |
| '''); |
| await resolveTestCodeWithDiagnostics(r''' |
| |
| @A() |
| part of 'b.dart'; |
| |
| @Target({TargetKind.partOfDirective}) |
| class A { |
| const A(); |
| } |
| '''); |
| } |
| |
| void test_setter_field_final() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on setters. |
| final int x = 0; |
| } |
| '''); |
| } |
| |
| void test_setter_field_mutable() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on setters. |
| int x = 0; |
| } |
| '''); |
| } |
| |
| void test_setter_getter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on setters. |
| int get x => 0; |
| } |
| '''); |
| } |
| |
| void test_setter_method() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on setters. |
| int m(int x) => x; |
| } |
| '''); |
| } |
| |
| void test_setter_setter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| class C { |
| @A() |
| set x(int _x) {} |
| } |
| '''); |
| } |
| |
| void test_setter_topLevelSetter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.setter}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| set x(_x) {} |
| '''); |
| } |
| |
| void test_topLevelVariable_field() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.topLevelVariable}) |
| class A { |
| const A(); |
| } |
| |
| class B { |
| @A() |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on top-level variables. |
| int f = 0; |
| } |
| '''); |
| } |
| |
| void test_topLevelVariable_topLevelVariable() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.topLevelVariable}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| int f = 0; |
| '''); |
| } |
| |
| void test_type_class() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| class C {} |
| '''); |
| } |
| |
| void test_type_classTypeAlias() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| mixin M {} |
| |
| @A() |
| class C = Object with M; |
| '''); |
| } |
| |
| void test_type_enum() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| enum E {a, b} |
| '''); |
| } |
| |
| void test_type_extension() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| // [diag.invalidAnnotationTarget][column 2][length 1] The annotation 'A.new' can only be used on types (classes, enums, mixins, or typedefs). |
| extension on C {} |
| class C {} |
| '''); |
| } |
| |
| void test_type_genericTypeAlias() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| typedef F = void Function(int); |
| '''); |
| } |
| |
| void test_type_mixin() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.type}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| mixin M {} |
| '''); |
| } |
| |
| void test_typedefType_genericTypeAlias() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.typedefType}) |
| class A { |
| const A(); |
| } |
| |
| @A() |
| typedef F = void Function(int); |
| '''); |
| } |
| |
| void test_typeParameter_parameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.typeParameter}) |
| class A { |
| const A(); |
| } |
| |
| void f(@A() p) {} |
| // ^ |
| // [diag.invalidAnnotationTarget] The annotation 'A.new' can only be used on type parameters. |
| '''); |
| } |
| |
| void test_typeParameter_typeParameter() async { |
| await resolveTestCodeWithDiagnostics(r''' |
| import 'package:meta/meta_meta.dart'; |
| |
| @Target({TargetKind.typeParameter}) |
| class A { |
| const A(); |
| } |
| |
| class C<@A() T> {} |
| '''); |
| } |
| } |