99import 'package:analyzer/dart/analysis/utilities.dart' ;
1010import 'package:analyzer/dart/ast/ast.dart' ;
1111import 'package:analyzer/dart/element/element.dart' ;
12+ import 'package:analyzer/dart/element/element2.dart' ;
1213import 'package:build/build.dart' ;
1314import 'package:build_test/build_test.dart' ;
1415import 'package:source_gen/source_gen.dart' ;
@@ -25,19 +26,24 @@ void main() {
2526 'list with null, empty, and whitespace items' : [null , '' , '\n \t ' ],
2627 }.entries) {
2728 test (entry.key, () async {
28- final generator =
29- _StubGenerator <Deprecated >('Value' , (_) => entry.value);
29+ final generator = _StubGenerator <Deprecated >(
30+ 'Value' ,
31+ elementBehavior: (_) => entry.value,
32+ );
3033 final builder = LibraryBuilder (generator);
3134 await testBuilder (builder, _inputMap, outputs: {});
3235 });
3336 }
3437 });
3538
3639 test ('Supports and dedupes multiple return values' , () async {
37- final generator = _StubGenerator <Deprecated >('Repeating' , (element) sync * {
38- yield '// There are deprecated values in this library!' ;
39- yield '// ${element .name }' ;
40- });
40+ final generator = _StubGenerator <Deprecated >(
41+ 'Repeating' ,
42+ elementBehavior: (element) sync * {
43+ yield '// There are deprecated values in this library!' ;
44+ yield '// ${element .name }' ;
45+ },
46+ );
4147 final builder = LibraryBuilder (generator);
4248 await testBuilder (
4349 builder,
@@ -65,13 +71,19 @@ $dartFormatWidth
6571
6672 group ('handles errors correctly' , () {
6773 for (var entry in {
68- 'sync errors' : _StubGenerator <Deprecated >('Failing' , (_) {
69- throw StateError ('not supported!' );
70- }),
71- 'from iterable' : _StubGenerator <Deprecated >('FailingIterable' , (_) sync * {
72- yield '// There are deprecated values in this library!' ;
73- throw StateError ('not supported!' );
74- }),
74+ 'sync errors' : _StubGenerator <Deprecated >(
75+ 'Failing' ,
76+ elementBehavior: (_) {
77+ throw StateError ('not supported!' );
78+ },
79+ ),
80+ 'from iterable' : _StubGenerator <Deprecated >(
81+ 'FailingIterable' ,
82+ elementBehavior: (_) sync * {
83+ yield '// There are deprecated values in this library!' ;
84+ throw StateError ('not supported!' );
85+ },
86+ ),
7587 }.entries) {
7688 test (entry.key, () async {
7789 final builder = LibraryBuilder (entry.value);
@@ -92,8 +104,12 @@ $dartFormatWidth
92104
93105 test ('Does not resolve the library if there are no top level annotations' ,
94106 () async {
95- final builder =
96- LibraryBuilder (_StubGenerator <Deprecated >('Deprecated' , (_) => null ));
107+ final builder = LibraryBuilder (
108+ _StubGenerator <Deprecated >(
109+ 'Deprecated' ,
110+ elementBehavior: (_) => null ,
111+ ),
112+ );
97113 final input = AssetId ('a' , 'lib/a.dart' );
98114 final assets = {input: 'main() {}' };
99115
@@ -116,7 +132,7 @@ $dartFormatWidth
116132 final builder = LibraryBuilder (
117133 _StubGenerator <Deprecated >(
118134 'Deprecated' ,
119- (element) => '// ${element .displayName }' ,
135+ elementBehavior : (element) => '// ${element .displayName }' ,
120136 ),
121137 );
122138 await testBuilder (
@@ -142,12 +158,54 @@ $dartFormatWidth
142158 );
143159 });
144160
161+ test ('applies to annotated directives' , () async {
162+ final builder = LibraryBuilder (
163+ _StubGenerator <Deprecated >(
164+ 'Deprecated' ,
165+ directiveBehavior: (element) => '// ${element .runtimeType }' ,
166+ elementBehavior: (element) => '// ${element .runtimeType }' ,
167+ ),
168+ );
169+ await testBuilder (
170+ builder,
171+ {
172+ 'a|lib/imported.dart' : '' ,
173+ 'a|lib/part.dart' : 'part of \' file.dart\' ;' ,
174+ 'a|lib/file.dart' : '''
175+ library;
176+ @deprecated
177+ import 'imported.dart';
178+ @deprecated
179+ export 'imported.dart';
180+ @deprecated
181+ part 'part.dart';
182+ ''' ,
183+ },
184+ outputs: {
185+ 'a|lib/file.g.dart' : '''
186+ $dartFormatWidth
187+ // GENERATED CODE - DO NOT MODIFY BY HAND
188+
189+ // **************************************************************************
190+ // Generator: Deprecated
191+ // **************************************************************************
192+
193+ // LibraryImportElementImpl
194+
195+ // LibraryExportElementImpl
196+
197+ // PartElementImpl
198+ ''' ,
199+ },
200+ );
201+ });
202+
145203 group ('Unresolved annotations' , () {
146204 test ('cause an error by default' , () async {
147205 final builder = LibraryBuilder (
148206 _StubGenerator <Deprecated >(
149207 'Deprecated' ,
150- (element) => '// ${element .displayName }' ,
208+ elementBehavior : (element) => '// ${element .displayName }' ,
151209 ),
152210 );
153211 expect (
@@ -169,7 +227,7 @@ $dartFormatWidth
169227 final builder = LibraryBuilder (
170228 _StubGenerator <Deprecated >(
171229 'Deprecated' ,
172- (element) => '// ${element .displayName }' ,
230+ elementBehavior : (element) => '// ${element .displayName }' ,
173231 throwOnUnresolved: false ,
174232 ),
175233 );
@@ -192,20 +250,36 @@ $dartFormatWidth
192250
193251class _StubGenerator <T > extends GeneratorForAnnotation <T > {
194252 final String _name;
195- final Object ? Function (Element ) _behavior;
253+ final Object ? Function (ElementDirective ) directiveBehavior;
254+ final Object ? Function (Element ) elementBehavior;
255+
256+ const _StubGenerator (
257+ this ._name, {
258+ this .directiveBehavior = _returnNull,
259+ required this .elementBehavior,
260+ super .throwOnUnresolved,
261+ });
196262
197- const _StubGenerator (this ._name, this ._behavior, {super .throwOnUnresolved});
263+ @override
264+ Object ? generateForAnnotatedDirective (
265+ ElementDirective directive,
266+ ConstantReader annotation,
267+ BuildStep buildStep,
268+ ) =>
269+ directiveBehavior (directive);
198270
199271 @override
200272 Object ? generateForAnnotatedElement (
201273 Element element,
202274 ConstantReader annotation,
203275 BuildStep buildStep,
204276 ) =>
205- _behavior (element);
277+ elementBehavior (element);
206278
207279 @override
208280 String toString () => _name;
281+
282+ static Null _returnNull (Object _) => null ;
209283}
210284
211285const _inputMap = {
0 commit comments