Skip to content

Commit d250de7

Browse files
nateboschmatanlurey
authored andcommitted
Move allElements to LibraryReader (#238)
* Move allElements to LibraryReader Fixes #229 LibraryReader is a nicer place for this utility and will give us a surface to attach more functionality than scattering top-level methods. * Unused imports * Dartfmt
1 parent ff22321 commit d250de7

File tree

6 files changed

+36
-35
lines changed

6 files changed

+36
-35
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
`package:json_serializable`.
1414
* Removed `lib/builder.dart`. Import through `source_gen.dart` instead.
1515
* Removed `OutputFormatter` typedef.
16-
* Expose `allElements` - a utility to iterate across all `Element` instances
17-
contained in a `LibraryElement`.
16+
* Add `LibraryReader.allElements` - a utility to iterate across all `Element`
17+
instances contained in Dart library.
1818

1919
## 0.6.1+1
2020

lib/source_gen.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,3 @@ export 'src/library.dart' show LibraryReader;
1212
export 'src/revive.dart' show Revivable;
1313
export 'src/span_for_element.dart' show spanForElement;
1414
export 'src/type_checker.dart' show TypeChecker;
15-
export 'src/utils.dart' show allElements;

lib/src/generator_for_annotation.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import 'package:build/build.dart';
1010

1111
import 'constants.dart';
1212
import 'generator.dart';
13+
import 'library.dart';
1314
import 'type_checker.dart';
14-
import 'utils.dart';
1515

1616
/// A [Generator] that invokes [generateForAnnotatedElement] for every [T].
1717
///
@@ -36,7 +36,8 @@ abstract class GeneratorForAnnotation<T> extends Generator {
3636

3737
@override
3838
Future<String> generate(LibraryElement library, BuildStep buildStep) async {
39-
var elements = allElements(library)
39+
var elements = new LibraryReader(library)
40+
.allElements
4041
.map((e) => new _AnnotatedElement(e, typeChecker.firstAnnotationOf(e)))
4142
.where((e) => e.annotation != null);
4243
var allOutput = await Future.wait(elements.map((e) =>

lib/src/library.dart

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
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/ast/ast.dart';
6+
import 'package:analyzer/dart/ast/standard_resolution_map.dart';
57
import 'package:analyzer/dart/element/element.dart';
68
// ignore: implementation_imports
79
import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -23,4 +25,30 @@ class LibraryReader {
2325
/// that are accessible via one or more `export` directives.
2426
ClassElement findType(String name) =>
2527
_element.getType(name) ?? _namespace.get(name) as ClassElement;
28+
29+
/// Returns all of the declarations in this library, including the
30+
/// [LibraryElement] as the first item.
31+
Iterable<Element> get allElements sync* {
32+
yield _element;
33+
for (var cu in _element.units) {
34+
for (var compUnitMember in cu.unit.declarations) {
35+
yield* _getElements(compUnitMember);
36+
}
37+
}
38+
}
39+
40+
Iterable<Element> _getElements(CompilationUnitMember member) {
41+
if (member is TopLevelVariableDeclaration) {
42+
return member.variables.variables
43+
.map(resolutionMap.elementDeclaredByVariableDeclaration);
44+
}
45+
var element = resolutionMap.elementDeclaredByDeclaration(member);
46+
47+
if (element == null) {
48+
print([member, member.runtimeType, member.element]);
49+
throw new Exception('Could not find any elements for the provided unit.');
50+
}
51+
52+
return [element];
53+
}
2654
}

lib/src/utils.dart

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
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/ast/ast.dart';
6-
import 'package:analyzer/dart/ast/standard_resolution_map.dart';
75
import 'package:analyzer/dart/element/element.dart';
86
import 'package:build/build.dart';
97
import 'package:path/path.dart' as p;
@@ -145,29 +143,3 @@ Uri assetToPackageUrl(Uri url) => url.scheme == 'asset' &&
145143
pathSegments: [url.pathSegments.first]
146144
..addAll(url.pathSegments.skip(2)))
147145
: url;
148-
149-
/// Returns all of the declarations in [library], including [library] as the
150-
/// first item.
151-
Iterable<Element> allElements(LibraryElement library) sync* {
152-
yield library;
153-
for (var cu in library.units) {
154-
for (var compUnitMember in cu.unit.declarations) {
155-
yield* _getElements(compUnitMember);
156-
}
157-
}
158-
}
159-
160-
Iterable<Element> _getElements(CompilationUnitMember member) {
161-
if (member is TopLevelVariableDeclaration) {
162-
return member.variables.variables
163-
.map(resolutionMap.elementDeclaredByVariableDeclaration);
164-
}
165-
var element = resolutionMap.elementDeclaredByDeclaration(member);
166-
167-
if (element == null) {
168-
print([member, member.runtimeType, member.element]);
169-
throw new Exception('Could not find any elements for the provided unit.');
170-
}
171-
172-
return [element];
173-
}

test/src/comment_generator.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ class CommentGenerator extends Generator {
2020
output.writeln('// Code for "$library"');
2121
}
2222
if (forClasses) {
23-
for (var classElement
24-
in allElements(library).where((e) => e is ClassElement)) {
23+
for (var classElement in new LibraryReader(library)
24+
.allElements
25+
.where((e) => e is ClassElement)) {
2526
if (classElement.displayName.contains('GoodError')) {
2627
throw new InvalidGenerationSourceError(
2728
"Don't use classes with the word 'Error' in the name",

0 commit comments

Comments
 (0)