@@ -152,6 +152,11 @@ abstract class ConstantReader {
152152 /// [FormatException] .
153153 ConstantReader read (String field);
154154
155+ /// Reads [field] from the constant as another constant value.
156+ ///
157+ /// Unlike [read] , returns `null` if the field is not found.
158+ ConstantReader peek (String field);
159+
155160 /// Returns as a revived meta class.
156161 ///
157162 /// This is appropriate for cases where the underlying object is not a literal
@@ -224,6 +229,9 @@ class _NullConstant implements ConstantReader {
224229 @override
225230 ConstantReader read (_) => throw new UnsupportedError ('Null' );
226231
232+ @override
233+ ConstantReader peek (_) => null ;
234+
227235 @override
228236 Revivable revive () => throw new UnsupportedError ('Null' );
229237
@@ -307,14 +315,24 @@ class _Constant implements ConstantReader {
307315 checker.isAssignableFromType (_object.type);
308316
309317 @override
310- ConstantReader read (String field) {
318+ ConstantReader peek (String field) {
311319 final constant = new ConstantReader (_getFieldRecursive (_object, field));
312320 if (constant.isNull) {
313- _assertHasField (_object ? .type ? .element, field) ;
321+ return null ;
314322 }
315323 return constant;
316324 }
317325
326+ @override
327+ ConstantReader read (String field) {
328+ final reader = peek (field);
329+ if (reader == null ) {
330+ _assertHasField (_object? .type? .element, field);
331+ return const _NullConstant ();
332+ }
333+ return reader;
334+ }
335+
318336 @override
319337 Revivable revive () => reviveInstance (_object);
320338
0 commit comments