Skip to content

Commit

Permalink
Add annotationsOfExact. (dart-lang/source_gen#200)
Browse files Browse the repository at this point in the history
  • Loading branch information
matanlurey authored Jul 6, 2017
1 parent 0779c2b commit 0052d4d
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 8 deletions.
7 changes: 7 additions & 0 deletions source_gen/source_gen/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## 0.6.0

* **Breaking change**: `TypeChecker#annotationsOf|firstAnnotationOf` now
returns annotations that are _assignable_ to the `TypeChecker`'s type. As a
result we've added `#annotationsOfExact|firstAnnotationOfExact` which has the
old behavior for precise checks.

## 0.5.10+1

* Update minimum `analyzer` package to `0.29.10`.
Expand Down
26 changes: 19 additions & 7 deletions source_gen/source_gen/lib/src/type_checker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ abstract class TypeChecker {
/// package like in the `dart:` SDK.
const factory TypeChecker.fromUrl(dynamic url) = _UriTypeChecker;

/// Returns the first constant annotating [element] that is this type.
/// Returns the first constant annotating [element] assignable to this type.
///
/// Otherwise returns `null`.
DartObject firstAnnotationOf(Element element) {
Expand All @@ -49,18 +49,30 @@ abstract class TypeChecker {
return results.isEmpty ? null : results.first;
}

/// Returns every constant annotating [element] that is this type.
/// Returns the first constant annotating [element] that is exactly this type.
DartObject firstAnnotationOfExact(Element element) {
if (element.metadata.isEmpty) {
return null;
}
final results = annotationsOfExact(element);
return results.isEmpty ? null : results.first;
}

/// Returns annotating constants on [element] assignable to this type.
Iterable<DartObject> annotationsOf(Element element) => element.metadata
.map((a) => a.computeConstantValue())
.where((a) => isAssignableFromType(a.type));

/// Returns annotating constants on [element] of exactly this type.
Iterable<DartObject> annotationsOfExact(Element element) => element.metadata
.map((a) => a.computeConstantValue())
.where((a) => isExactlyType(a.type));

/// Returns `true` if the type of [element] can be assigned to the type
/// represented by `this`.
/// Returns `true` if the type of [element] can be assigned to this type.
bool isAssignableFrom(Element element) =>
isExactly(element) || _getAllSupertypes(element).any(isExactlyType);

/// Returns `true` if [staticType] can be assigned to the type represented
/// by `this`.
/// Returns `true` if [staticType] can be assigned to this type.
bool isAssignableFromType(DartType staticType) =>
isAssignableFrom(staticType.element);

Expand Down Expand Up @@ -97,7 +109,7 @@ abstract class TypeChecker {
bool isSuperTypeOf(DartType staticType) => isSuperOf(staticType.element);
}

//TODO(kevmoo) Remove when bug with `ClassElement.allSupertypes` is fixed
// TODO(kevmoo) Remove when bug with `ClassElement.allSupertypes` is fixed
// https://github.com/dart-lang/sdk/issues/29767
Iterable<InterfaceType> _getAllSupertypes(Element element) sync* {
if (element is ClassElement) {
Expand Down
2 changes: 1 addition & 1 deletion source_gen/source_gen/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: source_gen
version: 0.5.10+1
version: 0.6.0-dev
author: Dart Team <[email protected]>
description: Automated source code generation for Dart.
homepage: https://github.com/dart-lang/source_gen
Expand Down
2 changes: 2 additions & 0 deletions source_gen/source_gen/test/type_checker_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// Increase timeouts on this test which resolves source code and can be slow.
@Timeout.factor(2.0)
import 'dart:collection';

import 'package:analyzer/dart/element/type.dart';
Expand Down

0 comments on commit 0052d4d

Please sign in to comment.