Skip to content

Commit 55d4b8c

Browse files
committed
Migrate to analyzer Element2 APIs.
1 parent 9c9e5c2 commit 55d4b8c

27 files changed

+446
-293
lines changed

analysis_options.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ analyzer:
55
strict-casts: true
66
strict-inference: true
77
strict-raw-types: true
8-
errors:
9-
# analyzer deprecations
10-
deprecated_member_use: ignore
118

129
linter:
1310
rules:

example/lib/src/member_count_library_generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class MemberCountLibraryGenerator extends Generator {
1313
final topLevelVarCount = topLevelNumVariables(library).length;
1414

1515
return '''
16-
// Source library: ${library.element.source.uri}
16+
// Source library: ${library.element.uri}
1717
const topLevelNumVarCount = $topLevelVarCount;
1818
''';
1919
}

example/lib/src/multiplier_generator.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/element/element.dart';
5+
import 'package:analyzer/dart/element/element2.dart';
66
import 'package:build/build.dart';
77
import 'package:source_gen/source_gen.dart';
88

@@ -11,12 +11,12 @@ import '../annotations.dart';
1111
class MultiplierGenerator extends GeneratorForAnnotation<Multiplier> {
1212
@override
1313
String generateForAnnotatedElement(
14-
Element element,
14+
Element2 element,
1515
ConstantReader annotation,
1616
BuildStep buildStep,
1717
) {
1818
final numValue = annotation.read('value').literalValue as num;
1919

20-
return 'num ${element.name}Multiplied() => ${element.name} * $numValue;';
20+
return 'num ${element.name3}Multiplied() => ${element.name3} * $numValue;';
2121
}
2222
}

example/lib/src/property_product_generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class PropertyProductGenerator extends Generator {
1212
String generate(LibraryReader library, BuildStep buildStep) {
1313
final productNames = topLevelNumVariables(
1414
library,
15-
).map((element) => element.name).join(' * ');
15+
).map((element) => element.name3).join(' * ');
1616

1717
return '''
1818
num allProduct() => $productNames;

example/lib/src/property_sum_generator.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class PropertySumGenerator extends Generator {
1212
String generate(LibraryReader library, BuildStep buildStep) {
1313
final sumNames = topLevelNumVariables(
1414
library,
15-
).map((element) => element.name).join(' + ');
15+
).map((element) => element.name3).join(' + ');
1616

1717
return '''
1818
num allSum() => $sumNames;

example/lib/src/utils.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:analyzer/dart/element/element.dart';
5+
import 'package:analyzer/dart/element/element2.dart';
66
import 'package:source_gen/source_gen.dart';
77

8-
/// Returns all [TopLevelVariableElement] members in [reader]'s library that
8+
/// Returns all [TopLevelVariableElement2] members in [reader]'s library that
99
/// have a type of [num].
10-
Iterable<TopLevelVariableElement> topLevelNumVariables(LibraryReader reader) =>
11-
reader.allElements.whereType<TopLevelVariableElement>().where(
10+
Iterable<TopLevelVariableElement2> topLevelNumVariables(LibraryReader reader) =>
11+
reader.allElements.whereType<TopLevelVariableElement2>().where(
1212
(element) =>
1313
element.type.isDartCoreNum ||
1414
element.type.isDartCoreInt ||

source_gen/lib/src/builder.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'dart:convert';
66

77
import 'package:analyzer/dart/ast/ast.dart';
8-
import 'package:analyzer/dart/element/element.dart';
8+
import 'package:analyzer/dart/element/element2.dart';
99
import 'package:build/build.dart';
1010
import 'package:dart_style/dart_style.dart';
1111
import 'package:pub_semver/pub_semver.dart';
@@ -109,7 +109,7 @@ class _Builder extends Builder {
109109
}
110110

111111
Future<void> _generateForLibrary(
112-
LibraryElement library,
112+
LibraryElement2 library,
113113
BuildStep buildStep,
114114
) async {
115115
final generatedOutputs =
@@ -355,7 +355,7 @@ class LibraryBuilder extends _Builder {
355355
}
356356

357357
Stream<GeneratedOutput> _generate(
358-
LibraryElement library,
358+
LibraryElement2 library,
359359
List<Generator> generators,
360360
BuildStep buildStep,
361361
) async* {
@@ -426,7 +426,7 @@ const partIdRegExpLiteral = r'[A-Za-z_\d-]+';
426426

427427
final _partIdRegExp = RegExp('^$partIdRegExpLiteral\$');
428428

429-
String languageOverrideForLibrary(LibraryElement library) {
429+
String languageOverrideForLibrary(LibraryElement2 library) {
430430
final override = library.languageVersion.override;
431431
return override == null
432432
? ''

source_gen/lib/src/constants/reader.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/constant/value.dart';
6-
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/dart/element/element2.dart';
77
import 'package:analyzer/dart/element/type.dart';
88

99
import '../type_checker.dart';
@@ -268,7 +268,7 @@ class _DartObjectConstant extends ConstantReader {
268268
ConstantReader read(String field) {
269269
final reader = peek(field);
270270
if (reader == null) {
271-
assertHasField(objectValue.type!.element as InterfaceElement, field);
271+
assertHasField(objectValue.type!.element3 as InterfaceElement2, field);
272272
return const _NullConstant();
273273
}
274274
return reader;

source_gen/lib/src/constants/revive.dart

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// ignore_for_file: deprecated_member_use
77

88
import 'package:analyzer/dart/constant/value.dart';
9-
import 'package:analyzer/dart/element/element.dart';
9+
import 'package:analyzer/dart/element/element2.dart';
1010
import 'package:analyzer/dart/element/type.dart';
1111
// ignore: implementation_imports
1212
import 'package:analyzer/src/dart/constant/value.dart' show DartObjectImpl;
@@ -22,35 +22,37 @@ import '../utils.dart';
2222
/// **NOTE**: Some returned [Revivable] instances are not representable as valid
2323
/// Dart source code (such as referencing private constructors). It is up to the
2424
/// build tool(s) using this library to surface error messages to the user.
25-
Revivable reviveInstance(DartObject object, [LibraryElement? origin]) {
25+
Revivable reviveInstance(DartObject object, [LibraryElement2? origin]) {
2626
final objectType = object.type;
27-
Element? element = objectType!.alias?.element;
27+
Element2? element = objectType!.alias?.element2;
2828
if (element == null) {
2929
if (objectType is InterfaceType) {
30-
element = objectType.element;
30+
element = objectType.element3;
3131
} else {
32-
element = object.toFunctionValue();
32+
element = object.toFunctionValue2();
3333
}
3434
}
35-
origin ??= element!.library;
35+
origin ??= element!.library2;
3636
var url = Uri.parse(urlOfElement(element!));
37-
if (element is FunctionElement) {
38-
return Revivable._(source: url.removeFragment(), accessor: element.name);
37+
if (element is TopLevelFunctionElement || element is LocalFunctionElement) {
38+
return Revivable._(source: url.removeFragment(), accessor: element.name3!);
3939
}
40-
if (element is MethodElement && element.isStatic) {
40+
41+
if (element is MethodElement2 && element.isStatic) {
4142
return Revivable._(
4243
source: url.removeFragment(),
43-
accessor: '${element.enclosingElement3.name}.${element.name}',
44+
accessor:
45+
'${element.firstFragment.enclosingFragment!.name2}.${element.name3}',
4446
);
4547
}
4648

47-
if (element is InterfaceElement) {
48-
for (final e in element.fields.where(
49+
if (element is InterfaceElement2) {
50+
for (final e in element.fields2.where(
4951
(f) => f.isPublic && f.isConst && f.computeConstantValue() == object,
5052
)) {
5153
return Revivable._(
5254
source: url.removeFragment(),
53-
accessor: '${element.name}.${e.name}',
55+
accessor: '${element.name3}.${e.name3}',
5456
);
5557
}
5658
}
@@ -64,13 +66,13 @@ Revivable reviveInstance(DartObject object, [LibraryElement? origin]) {
6466
return !result.isPrivate;
6567
}
6668

67-
for (final type in origin!.definingCompilationUnit.classes) {
68-
for (final e in type.fields.where(
69+
for (final type in origin!.classes) {
70+
for (final e in type.fields2.where(
6971
(f) => f.isConst && f.computeConstantValue() == object,
7072
)) {
7173
final result = Revivable._(
7274
source: url.removeFragment(),
73-
accessor: '${type.name}.${e.name}',
75+
accessor: '${type.name3}.${e.name3}',
7476
);
7577
if (tryResult(result)) {
7678
return result;
@@ -79,23 +81,24 @@ Revivable reviveInstance(DartObject object, [LibraryElement? origin]) {
7981
}
8082
final i = (object as DartObjectImpl).getInvocation();
8183
if (i != null) {
82-
url = Uri.parse(urlOfElement(i.constructor.enclosingElement3));
84+
url = Uri.parse(urlOfElement(i.constructor2.enclosingElement2));
85+
String newToEmpty(String string) => string == 'new' ? '' : string;
8386
final result = Revivable._(
8487
source: url,
85-
accessor: i.constructor.name,
88+
accessor: newToEmpty(i.constructor2.name3!),
8689
namedArguments: i.namedArguments,
8790
positionalArguments: i.positionalArguments,
8891
);
8992
if (tryResult(result)) {
9093
return result;
9194
}
9295
}
93-
for (final e in origin.definingCompilationUnit.topLevelVariables.where(
96+
for (final e in origin.topLevelVariables.where(
9497
(f) => f.isConst && f.computeConstantValue() == object,
9598
)) {
9699
final result = Revivable._(
97100
source: Uri.parse(urlOfElement(origin)).replace(fragment: ''),
98-
accessor: e.name,
101+
accessor: e.name3!,
99102
);
100103
if (tryResult(result)) {
101104
return result;

source_gen/lib/src/constants/utils.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/constant/value.dart';
6-
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/dart/element/element2.dart';
77

88
/// Throws a [FormatException] if [root] does not have a given field [name].
99
///
10-
/// Super types [InterfaceElement.supertype] are also checked before throwing.
11-
void assertHasField(InterfaceElement root, String name) {
12-
InterfaceElement? element = root;
10+
/// Super types [InterfaceElement2.supertype] are also checked before throwing.
11+
void assertHasField(InterfaceElement2 root, String name) {
12+
InterfaceElement2? element = root;
1313
while (element != null) {
14-
final field = element.getField(name);
14+
final field = element.getField2(name);
1515
if (field != null) {
1616
return;
1717
}
18-
element = element.supertype?.element;
18+
element = element.supertype?.element3;
1919
}
2020
final allFields = {
21-
...root.fields,
22-
for (var t in root.allSupertypes) ...t.element.fields,
21+
...root.fields2,
22+
for (var t in root.allSupertypes) ...t.element3.fields2,
2323
};
2424

2525
throw FormatException(
26-
'Class ${root.name} does not have field "$name".',
27-
'Fields: \n - ${allFields.map((e) => e.name).join('\n - ')}',
26+
'Class ${root.name3} does not have field "$name".',
27+
'Fields: \n - ${allFields.map((e) => e.name3).join('\n - ')}',
2828
);
2929
}
3030

source_gen/lib/src/generator.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import 'dart:async';
66

77
import 'package:analyzer/dart/ast/ast.dart';
8-
import 'package:analyzer/dart/element/element.dart';
8+
import 'package:analyzer/dart/element/element2.dart';
99
import 'package:build/build.dart';
1010

1111
import 'library.dart';
@@ -49,7 +49,7 @@ class InvalidGenerationSource implements Exception {
4949
///
5050
/// May be `null` if the error had no associated element, or if the location
5151
/// was passed with [node].
52-
final Element? element;
52+
final Element2? element;
5353

5454
/// The AST Node associated with this error.
5555
///

source_gen/lib/src/generator_for_annotation.dart

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import 'dart:async';
66

7-
import 'package:analyzer/dart/element/element.dart';
7+
import 'package:analyzer/dart/element/element2.dart';
88
import 'package:build/build.dart';
99

1010
import 'constants/reader.dart';
@@ -38,7 +38,7 @@ import 'type_checker.dart';
3838
/// Elements which are not at the top level, such as the members of a class or
3939
/// extension, are not searched for annotations. To operate on, for instance,
4040
/// annotated fields of a class ensure that the class itself is annotated with
41-
/// [T] and use the [Element] to iterate over fields. The [TypeChecker] utility
41+
/// [T] and use the [Element2] to iterate over fields. The [TypeChecker] utility
4242
/// may be helpful to check which elements have a given annotation.
4343
abstract class GeneratorForAnnotation<T> extends Generator {
4444
final bool throwOnUnresolved;
@@ -54,6 +54,21 @@ abstract class GeneratorForAnnotation<T> extends Generator {
5454
FutureOr<String> generate(LibraryReader library, BuildStep buildStep) async {
5555
final values = <String>{};
5656

57+
for (var annotatedDirective in library.libraryDirectivesAnnotatedWith(
58+
typeChecker,
59+
throwOnUnresolved: throwOnUnresolved,
60+
)) {
61+
final generatedValue = generateForAnnotatedDirective(
62+
annotatedDirective.directive,
63+
annotatedDirective.annotation,
64+
buildStep,
65+
);
66+
await for (var value in normalizeGeneratorOutput(generatedValue)) {
67+
assert(value.length == value.trim().length);
68+
values.add(value);
69+
}
70+
}
71+
5772
for (var annotatedElement in library.annotatedWith(
5873
typeChecker,
5974
throwOnUnresolved: throwOnUnresolved,
@@ -90,8 +105,34 @@ abstract class GeneratorForAnnotation<T> extends Generator {
90105
/// Implementations should return `null` when no content is generated. Empty
91106
/// or whitespace-only [String] instances are also ignored.
92107
dynamic generateForAnnotatedElement(
93-
Element element,
108+
Element2 element,
109+
ConstantReader annotation,
110+
BuildStep buildStep,
111+
) {}
112+
113+
/// Implement to return source code to generate for [directive]:
114+
/// - [LibraryImport]
115+
/// - [LibraryExport]
116+
/// - [PartInclude]
117+
///
118+
/// This method is invoked based on finding directives annotated with an
119+
/// instance of [T]. The [annotation] is provided as a [ConstantReader].
120+
///
121+
/// Supported return values include a single [String] or multiple [String]
122+
/// instances within an [Iterable] or [Stream]. It is also valid to return a
123+
/// [Future] of [String], [Iterable], or [Stream]. When multiple values are
124+
/// returned through an iterable or stream they will be deduplicated.
125+
/// Typically each value will be an independent unit of code and the
126+
/// deduplication prevents re-defining the same member multiple times. For
127+
/// example if multiple annotated elements may need a specific utility method
128+
/// available it can be output for each one, and the single deduplicated
129+
/// definition can be shared.
130+
///
131+
/// Implementations should return `null` when no content is generated. Empty
132+
/// or whitespace-only [String] instances are also ignored.
133+
dynamic generateForAnnotatedDirective(
134+
ElementDirective directive,
94135
ConstantReader annotation,
95136
BuildStep buildStep,
96-
);
137+
) {}
97138
}

0 commit comments

Comments
 (0)