Skip to content

Commit 696bff3

Browse files
authored
Convert findType -> Library#findType. (#172)
* Convert findType -> Library#findType. * Address feedback. * Oops.
1 parent 924d485 commit 696bff3

File tree

6 files changed

+44
-32
lines changed

6 files changed

+44
-32
lines changed

CHANGELOG.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,17 @@
4040
sdk: '>=1.25.0 <2.0.0'
4141
```
4242
43-
* Added `findType`, an utility method for `LibraryElement#getType` that also
44-
traverses `export` directives for publicly exported types. For example, to
45-
find `Generator` from `package:source_gen/source_gen.dart`:
43+
* Added `LibraryReader`, a utility class for `LibraryElement` that exposes
44+
high-level APIs, including `findType`, which traverses `export` directives
45+
for publicly exported types. For example, to find `Generator` from
46+
`package:source_gen/source_gen.dart`:
4647

4748
```dart
4849
void example(LibraryElement pkgSourceGen) {
49-
findType(pkgSourceGen, 'Generator');
50+
var library = new LibraryReader(pkgSourceGen);
51+
52+
// Instead of pkgSourceGen.getType('Generator'), which is null.
53+
library.findType('Generator');
5054
}
5155
```
5256

lib/source_gen.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ library source_gen;
66

77
export 'src/builder.dart';
88
export 'src/constants.dart' show ConstantReader;
9-
export 'src/find_type.dart' show findType;
109
export 'src/generator.dart';
1110
export 'src/generator_for_annotation.dart';
11+
export 'src/library.dart' show LibraryReader;
1212
export 'src/type_checker.dart' show TypeChecker;

lib/src/find_type.dart

Lines changed: 0 additions & 18 deletions
This file was deleted.

lib/src/library.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:analyzer/src/dart/resolver/scope.dart';
7+
8+
/// A high-level wrapper API with common functionality for [LibraryElement].
9+
class LibraryReader {
10+
final LibraryElement _element;
11+
12+
Namespace _namespaceCache;
13+
14+
LibraryReader(this._element);
15+
16+
Namespace get _namespace => _namespaceCache ??=
17+
new NamespaceBuilder().createExportNamespaceForLibrary(_element);
18+
19+
/// Returns a top-level [ClassElement] publicly visible in by [name].
20+
///
21+
/// Unlike [LibraryElement.getType], this also correctly traverses identifiers
22+
/// that are accessible via one or more `export` directives.
23+
ClassElement findType(String name) =>
24+
_element.getType(name) ?? _namespace.get(name) as ClassElement;
25+
}

test/find_type_test.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:source_gen/source_gen.dart';
88
import 'package:test/test.dart';
99

1010
void main() {
11-
LibraryElement library;
11+
LibraryReader library;
1212

1313
setUpAll(() async {
1414
final resolver = await resolveSource(r'''
@@ -20,24 +20,24 @@ void main() {
2020
2121
class Example {}
2222
''');
23-
library = resolver.getLibraryByName('test_lib');
23+
library = new LibraryReader(resolver.getLibraryByName('test_lib'));
2424
});
2525

2626
final isClassElement = const isInstanceOf<ClassElement>();
2727

2828
test('should return a type not exported', () {
29-
expect(findType(library, 'Example'), isClassElement);
29+
expect(library.findType('Example'), isClassElement);
3030
});
3131

3232
test('should return a type exported from dart:', () {
33-
expect(findType(library, 'LinkedHashMap'), isClassElement);
33+
expect(library.findType('LinkedHashMap'), isClassElement);
3434
});
3535

3636
test('should return a type exported from package:', () {
37-
expect(findType(library, 'Generator'), isClassElement);
37+
expect(library.findType('Generator'), isClassElement);
3838
});
3939

4040
test('should not return a type imported', () {
41-
expect(findType(library, 'Stream'), isNull);
41+
expect(library.findType('Stream'), isNull);
4242
});
4343
}

test/type_checker_test.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ void main() {
3636
staticHashMap = collection.getType('HashMap').type;
3737
staticHashMapChecker = new TypeChecker.fromStatic(staticHashMap);
3838

39-
final sourceGen = resolver.getLibraryByName('source_gen');
40-
staticGenerator = findType(sourceGen, 'Generator').type;
39+
final sourceGen =
40+
new LibraryReader(resolver.getLibraryByName('source_gen'));
41+
staticGenerator = sourceGen.findType('Generator').type;
4142
staticGeneratorChecker = new TypeChecker.fromStatic(staticGenerator);
4243
staticGeneratorForAnnotation =
43-
findType(sourceGen, 'GeneratorForAnnotation').type;
44+
sourceGen.findType('GeneratorForAnnotation').type;
4445
staticGeneratorForAnnotationChecker =
4546
new TypeChecker.fromStatic(staticGeneratorForAnnotation);
4647
});

0 commit comments

Comments
 (0)