From 5a942565828bb9b8a7c154a7c94eb755297acfa5 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Wed, 3 Jun 2026 13:34:57 -0700 Subject: [PATCH] meta: Introduce TargetKind.importDirective Fixes https://github.com/dart-lang/sdk/issues/63467 Change-Id: I02f048405878d9ca578f8cbea318c59697f2811b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/509021 Reviewed-by: Brian Wilkerson Reviewed-by: Konstantin Shcheglov --- .../lib/src/error/annotation_verifier.dart | 1 + .../lib/src/test_utilities/mock_packages.dart | 3 ++ pkg/analyzer/pubspec.yaml | 2 +- .../invalid_annotation_target_test.dart | 29 +++++++++++++++++++ .../lib/src/mock_packages/meta/meta_meta.dart | 4 +++ pkg/meta/CHANGELOG.md | 5 ++++ pkg/meta/lib/meta_meta.dart | 5 ++++ pkg/meta/pubspec.yaml | 2 +- 8 files changed, 49 insertions(+), 2 deletions(-) diff --git a/pkg/analyzer/lib/src/error/annotation_verifier.dart b/pkg/analyzer/lib/src/error/annotation_verifier.dart index 4f1b35a4e72..c398dd5c841 100644 --- a/pkg/analyzer/lib/src/error/annotation_verifier.dart +++ b/pkg/analyzer/lib/src/error/annotation_verifier.dart @@ -783,6 +783,7 @@ class AnnotationVerifier { FunctionDeclaration(isGetter: true) => kinds.contains(TargetKind.getter), FunctionDeclaration(isSetter: true) => kinds.contains(TargetKind.setter), FunctionDeclaration() => kinds.contains(TargetKind.function), + ImportDirective() => kinds.contains(TargetKind.importDirective), MethodDeclaration(isGetter: true) => kinds.contains(TargetKind.getter), MethodDeclaration(isSetter: true) => kinds.contains(TargetKind.setter), MethodDeclaration() => kinds.contains(TargetKind.method), diff --git a/pkg/analyzer/lib/src/test_utilities/mock_packages.dart b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart index 9b1c24951d3..a064b5477a3 100644 --- a/pkg/analyzer/lib/src/test_utilities/mock_packages.dart +++ b/pkg/analyzer/lib/src/test_utilities/mock_packages.dart @@ -351,6 +351,8 @@ class TargetKind { static const function = TargetKind._('top-level functions', 'function'); static const library = TargetKind._('libraries', 'library'); static const getter = TargetKind._('getters', 'getter'); + static const importDirective = + TargetKind._('import directives', 'importDirective'); static const method = TargetKind._('methods', 'method'); static const mixinType = TargetKind._('mixins', 'mixinType'); static const optionalParameter = @@ -378,6 +380,7 @@ class TargetKind { function, library, getter, + importDirective, method, mixinType, optionalParameter, diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml index 3932f63dce2..c7533d59a01 100644 --- a/pkg/analyzer/pubspec.yaml +++ b/pkg/analyzer/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: convert: ^3.0.0 crypto: ^3.0.0 glob: ^2.0.0 - meta: ^1.18.0 + meta: ^1.18.3 package_config: ^2.0.0 path: ^1.9.0 pub_semver: ^2.1.4 diff --git a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart index ffd54966789..d25ee5bab0f 100644 --- a/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart +++ b/pkg/analyzer/test/src/diagnostics/invalid_annotation_target_test.dart @@ -1063,6 +1063,35 @@ 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'; diff --git a/pkg/analyzer_testing/lib/src/mock_packages/meta/meta_meta.dart b/pkg/analyzer_testing/lib/src/mock_packages/meta/meta_meta.dart index ab84f87e38c..67c1559fa6a 100644 --- a/pkg/analyzer_testing/lib/src/mock_packages/meta/meta_meta.dart +++ b/pkg/analyzer_testing/lib/src/mock_packages/meta/meta_meta.dart @@ -43,6 +43,9 @@ class TargetKind { static const getter = TargetKind._('getters', 'getter'); + static const importDirective = + TargetKind._('import directives', 'importDirective'); + static const method = TargetKind._('methods', 'method'); static const mixinType = TargetKind._('mixins', 'mixinType'); @@ -87,6 +90,7 @@ class TargetKind { function, library, getter, + importDirective, method, mixinType, optionalParameter, diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md index 38d6eee43ea..1e1cf476287 100644 --- a/pkg/meta/CHANGELOG.md +++ b/pkg/meta/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.18.3 + +- One new TargetKind is introduced: `TargetKind.importDirective`, which + indicates an annotation is valid on an import directive. + ## 1.18.2 - Change private types in the public API signatures to `Object`. diff --git a/pkg/meta/lib/meta_meta.dart b/pkg/meta/lib/meta_meta.dart index 5957c7eb06a..586c443ca3b 100644 --- a/pkg/meta/lib/meta_meta.dart +++ b/pkg/meta/lib/meta_meta.dart @@ -95,6 +95,10 @@ class TargetKind { /// extension, extension type, or at the top-level of a library. static const getter = TargetKind._('getters', 'getter'); + /// Indicates that an annotation is valid on any import directive. + static const importDirective = + TargetKind._('import directives', 'importDirective'); + /// Indicates that an annotation is valid on any method declaration, both /// instance and static methods, whether it's in a class, enum, mixin, /// extension, or extension type. @@ -164,6 +168,7 @@ class TargetKind { function, library, getter, + importDirective, method, mixinType, optionalParameter, diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml index d590741b57e..5e9fd6f9e2c 100644 --- a/pkg/meta/pubspec.yaml +++ b/pkg/meta/pubspec.yaml @@ -1,7 +1,7 @@ name: meta # Note, because version `2.0.0` was mistakenly released, # the next major version must be `3.x.y`. -version: 1.18.2 +version: 1.18.3 description: >- Annotations used to express developer intentions that can't otherwise be deduced by statically analyzing source code.