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 |