| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 1 library reflect; | 5 library reflect; |
| 2 | 6 |
| 3 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
| 4 import 'dart:collection'; | 8 import 'dart:collection'; |
| 5 | 9 |
| 6 HashMap<ClassMirror, List> _fieldCache = new HashMap<ClassMirror, List>(); | 10 final HashMap<ClassMirror, List> _fieldCache = new HashMap<ClassMirror, List>(); |
| 7 | 11 |
| 8 List<Symbol> _getPublicFields(ClassMirror mirror) { | 12 List<Symbol> _getPublicFields(ClassMirror mirror) { |
| 9 var fields = _fieldCache[mirror]; | 13 return _fieldCache.putIfAbsent(mirror, () { |
| 10 if (fields == null) { | 14 List<Symbol> fields = new List<Symbol>(); |
| 11 fields = new List<Symbol>(); | |
| 12 _fieldCache[mirror] = fields; | |
| 13 | 15 |
| 14 while (mirror != null) { | 16 while (mirror != null) { |
| 15 var decls = mirror.declarations; | 17 var decls = mirror.declarations; |
| 16 fields.addAll(decls.keys.where((symbol) { | 18 fields.addAll(decls.keys.where((symbol) { |
| 17 var mirror = decls[symbol]; | 19 var mirror = decls[symbol]; |
| 18 if (mirror is! VariableMirror) { | 20 if (mirror is! VariableMirror) { |
| 19 return false; | 21 return false; |
| 20 } | 22 } |
| 21 | 23 |
| 22 var vMirror = mirror as VariableMirror; | 24 var vMirror = mirror as VariableMirror; |
| 23 return !vMirror.isPrivate && !vMirror.isStatic && !vMirror.isFinal; | 25 return !vMirror.isPrivate && !vMirror.isStatic && !vMirror.isFinal; |
| 24 })); | 26 })); |
| 25 | 27 |
| 26 mirror = mirror.superclass; | 28 mirror = mirror.superclass; |
| 27 } | 29 } |
| 28 } | |
| 29 | 30 |
| 30 return fields; | 31 return fields; |
| 32 }); |
| 31 } | 33 } |
| 32 | 34 |
| 33 void copyPublicFields(Object source, Object target) { | 35 void copyPublicFields(Object source, Object target) { |
| 34 assert(source.runtimeType == target.runtimeType); | 36 assert(source.runtimeType == target.runtimeType); |
| 35 | 37 |
| 36 var sourceMirror = reflect(source); | 38 var sourceMirror = reflect(source); |
| 37 var targetMirror = reflect(target); | 39 var targetMirror = reflect(target); |
| 38 for (var symbol in _getPublicFields(sourceMirror.type)) { | 40 for (var symbol in _getPublicFields(sourceMirror.type)) { |
| 39 targetMirror.setField(symbol, sourceMirror.getField(symbol).reflectee); | 41 targetMirror.setField(symbol, sourceMirror.getField(symbol).reflectee); |
| 40 } | 42 } |
| 41 } | 43 } |
| OLD | NEW |