| 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 /// Collects services that can be used to access objects dynamically, inspect | 5 /// Collects services that can be used to access objects dynamically, inspect |
| 6 /// type information, and convert between symbols and strings. | 6 /// type information, and convert between symbols and strings. |
| 7 library smoke; | 7 library smoke; |
| 8 | 8 |
| 9 import 'src/implementation.dart' as implementation; | 9 import 'src/implementation.dart' as implementation; |
| 10 | 10 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 /// Invoke [method] in [receiver] with [args]. The [receiver] can be either an | 35 /// Invoke [method] in [receiver] with [args]. The [receiver] can be either an |
| 36 /// object (to invoke instance methods) or a type (to invoke static methods). | 36 /// object (to invoke instance methods) or a type (to invoke static methods). |
| 37 /// This function optionally [adjust]s the list of arguments to match the number | 37 /// This function optionally [adjust]s the list of arguments to match the number |
| 38 /// of formal parameters by either adding nulls for missing arguments, or by | 38 /// of formal parameters by either adding nulls for missing arguments, or by |
| 39 /// truncating the list. | 39 /// truncating the list. |
| 40 invoke(receiver, Symbol method, List args, | 40 invoke(receiver, Symbol method, List args, |
| 41 {Map namedArgs, bool adjust: false}) => | 41 {Map namedArgs, bool adjust: false}) => |
| 42 implementation.objectAccessor.invoke( | 42 implementation.objectAccessor.invoke( |
| 43 receiver, method, args, namedArgs: namedArgs, adjust: adjust); | 43 receiver, method, args, namedArgs: namedArgs, adjust: adjust); |
| 44 | 44 |
| 45 /// Tells whether [type] is transitively a subclass of [supertype]. |
| 46 bool isSubclassOf(Type type, Type supertype) => |
| 47 implementation.typeInspector.isSubclassOf(type, supertype); |
| 48 |
| 49 // TODO(sigmund): consider adding also: |
| 50 // * isImplementationOf(type, subtype) to tells whether [type] declares that it |
| 51 // implements the [supertype] interface. |
| 52 // * isSubtypeOf(type, subtype): Tells whether [type]'s interface is a sybtype |
| 53 // of [supertype]. That is, whether it is a subclass or if [type] implements |
| 54 // [supertype]. |
| 55 |
| 45 /// Tells whether [type] has a field or getter for [field]. | 56 /// Tells whether [type] has a field or getter for [field]. |
| 46 bool hasGetter(Type type, Symbol field) => | 57 bool hasGetter(Type type, Symbol field) => |
| 47 implementation.typeInspector.hasGetter(type, field); | 58 implementation.typeInspector.hasGetter(type, field); |
| 48 | 59 |
| 49 /// Tells whether [type] has a field or setter for [field]. | 60 /// Tells whether [type] has a field or setter for [field]. |
| 50 bool hasSetter(Type type, Symbol field) => | 61 bool hasSetter(Type type, Symbol field) => |
| 51 implementation.typeInspector.hasSetter(type, field); | 62 implementation.typeInspector.hasSetter(type, field); |
| 52 | 63 |
| 53 /// Tells whether [type] or a superclass (other than [Object]) defines | 64 /// Tells whether [type] or a superclass (other than [Object]) defines |
| 54 /// `noSuchMethod`. | 65 /// `noSuchMethod`. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 final bool includeFields; | 99 final bool includeFields; |
| 89 | 100 |
| 90 /// Whether to include getters and setters (default is true). Note that to | 101 /// Whether to include getters and setters (default is true). Note that to |
| 91 /// include fields you also need to enable [includeFields]. | 102 /// include fields you also need to enable [includeFields]. |
| 92 final bool includeProperties; | 103 final bool includeProperties; |
| 93 | 104 |
| 94 /// Whether to include symbols from the given type and its superclasses | 105 /// Whether to include symbols from the given type and its superclasses |
| 95 /// (except [Object]). | 106 /// (except [Object]). |
| 96 final bool includeInherited; | 107 final bool includeInherited; |
| 97 | 108 |
| 109 /// If [includeInherited], walk up the type hierarchy up to this type |
| 110 /// (defaults to [Object]). |
| 111 final Type includeUpTo; |
| 112 |
| 98 /// Whether to include final fields and getter-only properties. | 113 /// Whether to include final fields and getter-only properties. |
| 99 final bool excludeFinal; | 114 final bool excludeFinal; |
| 100 | 115 |
| 101 /// Whether to include methods (default is false). | 116 /// Whether to include methods (default is false). |
| 102 final bool includeMethods; | 117 final bool includeMethods; |
| 103 | 118 |
| 104 /// If [withAnnotation] is not null, then it should be a list of types, so | 119 /// If [withAnnotation] is not null, then it should be a list of types, so |
| 105 /// only symbols that are annotated with instances of those types are | 120 /// only symbols that are annotated with instances of those types are |
| 106 /// included. | 121 /// included. |
| 107 final List withAnnotations; | 122 final List withAnnotations; |
| 108 | 123 |
| 109 const QueryOptions({ | 124 const QueryOptions({ |
| 110 this.includeFields: true, | 125 this.includeFields: true, |
| 111 this.includeProperties: true, | 126 this.includeProperties: true, |
| 112 this.includeInherited: true, | 127 this.includeInherited: true, |
| 128 this.includeUpTo: Object, |
| 113 this.excludeFinal: false, | 129 this.excludeFinal: false, |
| 114 this.includeMethods: false, | 130 this.includeMethods: false, |
| 115 this.withAnnotations: null}); | 131 this.withAnnotations: null}); |
| 116 } | 132 } |
| 117 | 133 |
| 118 /// Information associated with a symbol declaration (like a property or | 134 /// Information associated with a symbol declaration (like a property or |
| 119 /// method). | 135 /// method). |
| 120 class Declaration { | 136 class Declaration { |
| 121 /// Name of the property or method | 137 /// Name of the property or method |
| 122 final Symbol name; | 138 final Symbol name; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 /// Invoke [method] in [object] with [args]. It optionally [adjust]s the list | 206 /// Invoke [method] in [object] with [args]. It optionally [adjust]s the list |
| 191 /// of arguments to match the number of formal parameters by either adding | 207 /// of arguments to match the number of formal parameters by either adding |
| 192 /// nulls for missing arguments, or by truncating the list. | 208 /// nulls for missing arguments, or by truncating the list. |
| 193 invoke(Object object, Symbol method, List args, | 209 invoke(Object object, Symbol method, List args, |
| 194 {Map namedArgs, bool adjust: false}); | 210 {Map namedArgs, bool adjust: false}); |
| 195 } | 211 } |
| 196 | 212 |
| 197 | 213 |
| 198 /// A service that provides partial inspection into Dart types. | 214 /// A service that provides partial inspection into Dart types. |
| 199 abstract class TypeInspectorService { | 215 abstract class TypeInspectorService { |
| 216 /// Tells whether [type] is transitively a subclass of [supertype]. |
| 217 bool isSubclassOf(Type type, Type supertype); |
| 218 |
| 200 /// Tells whether [type] has a field or getter for [name]. | 219 /// Tells whether [type] has a field or getter for [name]. |
| 201 bool hasGetter(Type type, Symbol name); | 220 bool hasGetter(Type type, Symbol name); |
| 202 | 221 |
| 203 /// Tells whether [type] has a field or setter for [name]. | 222 /// Tells whether [type] has a field or setter for [name]. |
| 204 bool hasSetter(Type type, Symbol name); | 223 bool hasSetter(Type type, Symbol name); |
| 205 | 224 |
| 206 /// Tells whether [type] has a specific instance [method]. | 225 /// Tells whether [type] has a specific instance [method]. |
| 207 bool hasInstanceMethod(Type type, Symbol method); | 226 bool hasInstanceMethod(Type type, Symbol method); |
| 208 | 227 |
| 209 /// Tells whether [type] has a specific static [method]. | 228 /// Tells whether [type] has a specific static [method]. |
| 210 bool hasStaticMethod(Type type, Symbol method); | 229 bool hasStaticMethod(Type type, Symbol method); |
| 211 | 230 |
| 212 /// Get the declaration associated with field [name] in [type]. | 231 /// Get the declaration associated with field [name] in [type]. |
| 213 Declaration getDeclaration(Type type, Symbol name); | 232 Declaration getDeclaration(Type type, Symbol name); |
| 214 | 233 |
| 215 /// Retrieve all symbols of [type] that match [options]. | 234 /// Retrieve all symbols of [type] that match [options]. |
| 216 List<Declaration> query(Type type, QueryOptions options); | 235 List<Declaration> query(Type type, QueryOptions options); |
| 217 } | 236 } |
| 218 | 237 |
| 219 | 238 |
| 220 /// A service that converts between [Symbol]s and [String]s. | 239 /// A service that converts between [Symbol]s and [String]s. |
| 221 abstract class SymbolConverterService { | 240 abstract class SymbolConverterService { |
| 222 /// Returns the name associated with a [symbol]. | 241 /// Returns the name associated with a [symbol]. |
| 223 String symbolToName(Symbol symbol); | 242 String symbolToName(Symbol symbol); |
| 224 | 243 |
| 225 /// Returns the symbol associated with a [name]. | 244 /// Returns the symbol associated with a [name]. |
| 226 Symbol nameToSymbol(String name); | 245 Symbol nameToSymbol(String name); |
| 227 } | 246 } |
| OLD | NEW |