Skip to content

Commit ad130fa

Browse files
authored
Merge pull request #222 from davidmorgan/support-mixins
Improve annotation handling.
2 parents bf5e006 + f6823a8 commit ad130fa

File tree

5 files changed

+29
-5
lines changed

5 files changed

+29
-5
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 4.0.1 (unreleased)
44

5-
- Make generator robust against invalid annotations.
5+
- Improved annotation handling for corner cases.
66

77
## 4.0.0
88

built_value_generator/lib/src/memoized_getter.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ library built_value_generator.memoized_getter;
22

33
import 'package:analyzer/dart/element/element.dart';
44
import 'package:built_value/built_value.dart';
5+
import 'package:built_value_generator/src/metadata.dart'
6+
show metadataToStringValue;
57

68
part 'memoized_getter.g.dart';
79

@@ -18,8 +20,8 @@ abstract class MemoizedGetter
1820
.where((field) =>
1921
field.getter != null &&
2022
!field.getter.isAbstract &&
21-
field.getter.metadata.any((metadata) =>
22-
metadata.constantValue?.toStringValue() == 'memoized'))
23+
field.getter.metadata.any(
24+
(metadata) => metadataToStringValue(metadata) == 'memoized'))
2325
.map((field) => new MemoizedGetter((b) => b
2426
..returnType = field.getter.returnType.toString()
2527
..name = field.displayName))
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) 2017, Google Inc. Please see the AUTHORS file for details.
2+
// All rights reserved. Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/dart/element/element.dart';
6+
import 'package:source_gen/source_gen.dart';
7+
8+
/// Gets the `String` value of an annotation. Throws a descriptive
9+
/// [InvalidGenerationSourceError] if the annotation can't be resolved.
10+
String metadataToStringValue(ElementAnnotation annotation) {
11+
final value = annotation.computeConstantValue();
12+
if (value == null) {
13+
throw new InvalidGenerationSourceError(
14+
'Can’t process annotation “${annotation.toSource()}” in '
15+
'“${annotation.librarySource.uri}”. Please check for a missing import.');
16+
}
17+
return value.toStringValue();
18+
}

built_value_generator/lib/src/serializer_source_field.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import 'package:analyzer/dart/element/element.dart';
99
import 'package:built_collection/built_collection.dart';
1010
import 'package:built_value/built_value.dart';
1111
import 'package:built_value_generator/src/dart_types.dart';
12+
import 'package:built_value_generator/src/metadata.dart'
13+
show metadataToStringValue;
1214

1315
part 'serializer_source_field.g.dart';
1416

@@ -47,7 +49,7 @@ abstract class SerializerSourceField
4749

4850
@memoized
4951
bool get isNullable => element.getter.metadata
50-
.any((metadata) => metadata.constantValue?.toStringValue() == 'nullable');
52+
.any((metadata) => metadataToStringValue(metadata) == 'nullable');
5153

5254
@memoized
5355
String get name => element.displayName;

built_value_generator/lib/src/value_source_field.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import 'package:built_collection/built_collection.dart';
1111
import 'package:built_value/built_value.dart';
1212
import 'package:built_value_generator/src/dart_types.dart';
1313
import 'package:built_value_generator/src/fields.dart' show collectFields;
14+
import 'package:built_value_generator/src/metadata.dart'
15+
show metadataToStringValue;
1416

1517
part 'value_source_field.g.dart';
1618

@@ -43,7 +45,7 @@ abstract class ValueSourceField
4345

4446
@memoized
4547
bool get isNullable => element.getter.metadata
46-
.any((metadata) => metadata.constantValue?.toStringValue() == 'nullable');
48+
.any((metadata) => metadataToStringValue(metadata) == 'nullable');
4749

4850
@memoized
4951
bool get builderFieldExists => builderElement != null;

0 commit comments

Comments
 (0)