Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// Implementation of the smoke services using mirrors. | 5 /// Implementation of the smoke services using mirrors. |
| 6 library smoke.mirrors; | 6 library smoke.mirrors; |
| 7 | 7 |
| 8 import 'dart:mirrors'; | 8 import 'dart:mirrors'; |
| 9 import 'package:smoke/smoke.dart'; | 9 import 'package:smoke/smoke.dart'; |
| 10 import 'package:logging/logging.dart'; | 10 import 'package:logging/logging.dart'; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 args = adjustList(args, required, required + optional); | 62 args = adjustList(args, required, required + optional); |
| 63 } | 63 } |
| 64 return receiverMirror.invoke(methodName, args, namedArgs).reflectee; | 64 return receiverMirror.invoke(methodName, args, namedArgs).reflectee; |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 | 67 |
| 68 /// Implements [TypeInspectorService] using mirrors. | 68 /// Implements [TypeInspectorService] using mirrors. |
| 69 class ReflectiveTypeInspectorService implements TypeInspectorService { | 69 class ReflectiveTypeInspectorService implements TypeInspectorService { |
| 70 bool isSubclassOf(Type type, Type supertype) { | |
| 71 if (type == supertype || supertype == Object) return true; | |
| 72 // TODO(sigmund): change to mirror.isSubclassOf when it gets implemented in | |
| 73 // dart2js. (dartbug.com/12439) | |
| 74 var mirror = reflectClass(type); | |
| 75 var top = reflectClass(supertype); | |
| 76 while (mirror != _objectType) { | |
| 77 mirror = _safeSuperclass(mirror); | |
| 78 if (mirror == top) return true; | |
| 79 } | |
| 80 return false; | |
| 81 } | |
| 82 | |
| 70 bool hasGetter(Type type, Symbol name) { | 83 bool hasGetter(Type type, Symbol name) { |
| 71 var mirror = reflectType(type); | 84 var mirror = reflectType(type); |
| 72 if (mirror is! ClassMirror) return false; | 85 if (mirror is! ClassMirror) return false; |
| 73 while (mirror != _objectType) { | 86 while (mirror != _objectType) { |
| 74 final members = mirror.declarations; | 87 final members = mirror.declarations; |
| 75 if (members.containsKey(name)) return true; | 88 if (members.containsKey(name)) return true; |
| 76 mirror = _safeSuperclass(mirror); | 89 mirror = _safeSuperclass(mirror); |
| 77 } | 90 } |
| 78 return false; | 91 return false; |
| 79 } | 92 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 return new _MirrorDeclaration(mirror, declaration); | 143 return new _MirrorDeclaration(mirror, declaration); |
| 131 } | 144 } |
| 132 | 145 |
| 133 List<Declaration> query(Type type, QueryOptions options) { | 146 List<Declaration> query(Type type, QueryOptions options) { |
| 134 var mirror = reflectType(type); | 147 var mirror = reflectType(type); |
| 135 if (mirror is! ClassMirror) return null; | 148 if (mirror is! ClassMirror) return null; |
| 136 return _query(mirror, options); | 149 return _query(mirror, options); |
| 137 } | 150 } |
| 138 | 151 |
| 139 List<Declaration> _query(ClassMirror cls, QueryOptions options) { | 152 List<Declaration> _query(ClassMirror cls, QueryOptions options) { |
| 140 var result = (!options.includeInherited || cls.superclass == _objectType) | 153 final visitParent = options.includeInherited && cls.superclass != null && |
| 141 ? [] : _query(cls.superclass, options); | 154 cls.superclass != reflectClass(options.includeUpTo); |
|
Siggi Cherem (dart-lang)
2014/02/25 23:23:23
note that for the same reasons than below (classes
Jennifer Messerly
2014/02/25 23:50:09
might be worth adding this comment (it can refer t
Siggi Cherem (dart-lang)
2014/02/26 00:09:50
Done.
| |
| 155 var result = visitParent ? _query(cls.superclass, options) : []; | |
| 142 for (var member in cls.declarations.values) { | 156 for (var member in cls.declarations.values) { |
| 143 if (member is! VariableMirror && member is! MethodMirror) continue; | 157 if (member is! VariableMirror && member is! MethodMirror) continue; |
| 144 if (member.isStatic || member.isPrivate) continue; | 158 if (member.isStatic || member.isPrivate) continue; |
| 145 var name = member.simpleName; | 159 var name = member.simpleName; |
| 146 bool isMethod = false; | 160 bool isMethod = false; |
| 147 if (member is VariableMirror) { | 161 if (member is VariableMirror) { |
| 148 if (!options.includeFields) continue; | 162 if (!options.includeFields) continue; |
| 149 if (options.excludeFinal && member.isFinal) continue; | 163 if (options.excludeFinal && member.isFinal) continue; |
| 150 } | 164 } |
| 151 | 165 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 // dartbug.com/16078). | 321 // dartbug.com/16078). |
| 308 // * having [call] also allows `is` checks to work for functions of 0 | 322 // * having [call] also allows `is` checks to work for functions of 0 |
| 309 // through 3 arguments. We depend on this in | 323 // through 3 arguments. We depend on this in |
| 310 // `polymer_expressions/lib/eval.dart` to check whether a function is a | 324 // `polymer_expressions/lib/eval.dart` to check whether a function is a |
| 311 // filter (takes a single argument). (Note that it's possible to include | 325 // filter (takes a single argument). (Note that it's possible to include |
| 312 // both [call] and [noSuchMethod], which would make instance-of checks | 326 // both [call] and [noSuchMethod], which would make instance-of checks |
| 313 // work with the signature of [call], but will allow invoking the function | 327 // work with the signature of [call], but will allow invoking the function |
| 314 // using [noSuchMethod]. | 328 // using [noSuchMethod]. |
| 315 call([a, b, c]) => invoke(receiver, methodName, [a, b, c], adjust: true); | 329 call([a, b, c]) => invoke(receiver, methodName, [a, b, c], adjust: true); |
| 316 } | 330 } |
| OLD | NEW |