|
1 | 1 | import 'dart:mirrors';
|
2 | 2 |
|
3 | 3 | import 'package:analyzer/dart/element/type.dart';
|
4 |
| -import 'package:source_gen/source_gen.dart' show ConstantReader; |
| 4 | +import 'package:source_gen/source_gen.dart' show ConstantReader, TypeChecker; |
5 | 5 |
|
6 | 6 | /// Extension adding the type methods to `ConstantReader`.
|
7 | 7 | extension TypeMethods on ConstantReader {
|
@@ -54,26 +54,20 @@ extension TypeMethods on ConstantReader {
|
54 | 54 | }
|
55 | 55 |
|
56 | 56 | final classMirror = reflectClass(T);
|
57 |
| - final typeMirror = reflectType(T); |
58 | 57 | if (!classMirror.isEnum) {
|
59 | 58 | throw Exception(
|
60 | 59 | 'Could not read constant via enumValue<$T>(). $T is not a Dart enum.');
|
61 | 60 | }
|
62 |
| - final varMirrors = <VariableMirror>[]; |
63 |
| - for (final item in classMirror.declarations.values) { |
64 |
| - if (item is VariableMirror && item.type == typeMirror) { |
65 |
| - varMirrors.add(item); |
66 |
| - } |
| 61 | + |
| 62 | + if (!instanceOf(TypeChecker.fromRuntime(T))) { |
| 63 | + throw Exception('Not an instance of $T.'); |
67 | 64 | }
|
| 65 | + |
68 | 66 | // Access enum field 'values'.
|
69 | 67 | final values = classMirror.getField(const Symbol('values')).reflectee;
|
70 |
| - for (final varMirror in varMirrors) { |
71 |
| - final name = MirrorSystem.getName(varMirror.simpleName); |
72 |
| - final index = peek(name)?.intValue; |
73 |
| - if (index != null) { |
74 |
| - return values[index]; |
75 |
| - } |
76 |
| - } |
77 |
| - throw Exception('Could not read enum instance of type $T.'); |
| 68 | + // Get enum field 'index'. |
| 69 | + final enumIndex = objectValue.getField('index')!.toIntValue(); |
| 70 | + |
| 71 | + return values[enumIndex]; |
78 | 72 | }
|
79 | 73 | }
|
0 commit comments