Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(288)

Side by Side Diff: reflectable/lib/src/reflectable_transformer_based.dart

Issue 1391543003: Creates `reflectors`, as a meta-meta feature that enables dynamic selection of a "mirror system". (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: Review response. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart Team. All rights reserved. Use of this 1 // Copyright (c) 2015, the Dart Team. All rights reserved. Use of this
2 // source code is governed by a BSD-style license that can be found in 2 // source code is governed by a BSD-style license that can be found in
3 // the LICENSE file. 3 // the LICENSE file.
4 4
5 library reflectable.src.mirrors_unimpl; 5 library reflectable.src.mirrors_unimpl;
6 6
7 import 'dart:collection' show UnmodifiableMapView, UnmodifiableListView; 7 import 'dart:collection' show UnmodifiableMapView, UnmodifiableListView;
8 8
9 import '../capability.dart'; 9 import '../capability.dart';
10 import '../mirrors.dart'; 10 import '../mirrors.dart';
11 import '../reflectable.dart'; 11 import '../reflectable.dart';
12 import 'encoding_constants.dart' as constants; 12 import 'encoding_constants.dart' as constants;
13 import 'encoding_constants.dart' show NO_CAPABILITY_INDEX; 13 import 'encoding_constants.dart' show NO_CAPABILITY_INDEX;
14 import 'reflectable_base.dart'; 14 import 'reflectable_base.dart';
15 15
16 bool get isTransformed => true; 16 bool get isTransformed => true;
17 17
18 /// Returns the set of reflectors in the current program.
19 Set<Reflectable> get reflectors => data.keys.toSet();
20
18 // Mirror classes with default implementations of all methods, to be used as 21 // Mirror classes with default implementations of all methods, to be used as
19 // superclasses of transformer generated static mirror classes. They serve to 22 // superclasses of transformer generated static mirror classes. They serve to
20 // ensure that the static mirror classes always implement all methods, such that 23 // ensure that the static mirror classes always implement all methods, such that
21 // they throw an exception at runtime, rather than causing an error at compile 24 // they throw an exception at runtime, rather than causing an error at compile
22 // time, which is the required behavior for static mirrors when they are used 25 // time, which is the required behavior for static mirrors when they are used
23 // in ways that are not covered by the specified capabilities. 26 // in ways that are not covered by the specified capabilities.
24 // 27 //
25 // Each of these classes implements the corresponding class in 28 // Each of these classes implements the corresponding class in
26 // `package:reflectable/mirrors.dart`, and they replicate the internal 29 // `package:reflectable/mirrors.dart`, and they replicate the internal
27 // implements `structure in package:reflectable/mirrors.dart` using `extends` 30 // implements `structure in package:reflectable/mirrors.dart` using `extends`
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 } 204 }
202 throw new NoSuchInvokeCapabilityError(reflectee, setterName, [value], {}); 205 throw new NoSuchInvokeCapabilityError(reflectee, setterName, [value], {});
203 } 206 }
204 } 207 }
205 208
206 class ClassMirrorImpl extends _DataCaching implements ClassMirror { 209 class ClassMirrorImpl extends _DataCaching implements ClassMirror {
207 /// The reflector which represents the mirror system that this 210 /// The reflector which represents the mirror system that this
208 /// mirror belongs to. 211 /// mirror belongs to.
209 final ReflectableImpl _reflector; 212 final ReflectableImpl _reflector;
210 213
214 /// An encoding of the attributes and kind of this class mirror.
215 final int _descriptor;
216
211 /// The index of this mirror in the [ReflectorData.classMirrors] table. 217 /// The index of this mirror in the [ReflectorData.classMirrors] table.
212 /// Also this is the index of the Type of the reflected class in 218 /// Also this is the index of the Type of the reflected class in
213 /// [ReflectorData.types]. 219 /// [ReflectorData.types].
214 final int _classIndex; 220 final int _classIndex;
215 221
216 /// The index of the owner library in the [ReflectorData.libraryMirrors] 222 /// The index of the owner library in the [ReflectorData.libraryMirrors]
217 /// table. 223 /// table.
218 final int _ownerIndex; 224 final int _ownerIndex;
219 225
220 /// The index of the mirror of the superclass in the 226 /// The index of the mirror of the superclass in the
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 final String simpleName; 280 final String simpleName;
275 final String qualifiedName; 281 final String qualifiedName;
276 final List<Object> _metadata; 282 final List<Object> _metadata;
277 final Map<String, _StaticGetter> _getters; 283 final Map<String, _StaticGetter> _getters;
278 final Map<String, _StaticSetter> _setters; 284 final Map<String, _StaticSetter> _setters;
279 final Map<String, Function> _constructors; 285 final Map<String, Function> _constructors;
280 286
281 ClassMirrorImpl( 287 ClassMirrorImpl(
282 this.simpleName, 288 this.simpleName,
283 this.qualifiedName, 289 this.qualifiedName,
290 this._descriptor,
284 this._classIndex, 291 this._classIndex,
285 this._reflector, 292 this._reflector,
286 this._declarationIndices, 293 this._declarationIndices,
287 this._instanceMemberIndices, 294 this._instanceMemberIndices,
288 this._staticMemberIndices, 295 this._staticMemberIndices,
289 this._superclassIndex, 296 this._superclassIndex,
290 this._getters, 297 this._getters,
291 this._setters, 298 this._setters,
292 this._constructors, 299 this._constructors,
293 this._ownerIndex, 300 this._ownerIndex,
294 this._mixinIndex, 301 this._mixinIndex,
295 this._superinterfaceIndices, 302 this._superinterfaceIndices,
296 List<Object> metadata) 303 List<Object> metadata)
297 : _metadata = 304 : _metadata =
298 (metadata == null) ? null : new UnmodifiableListView(metadata); 305 (metadata == null) ? null : new UnmodifiableListView(metadata);
299 306
300 bool get isAbstract => _unsupported(); 307 bool get isAbstract => (_descriptor & constants.abstractAttribute != 0);
301 308
302 Map<String, DeclarationMirror> _declarations; 309 Map<String, DeclarationMirror> _declarations;
303 310
304 Map<String, DeclarationMirror> get declarations { 311 Map<String, DeclarationMirror> get declarations {
305 if (_declarations == null) { 312 if (_declarations == null) {
306 Map<String, DeclarationMirror> result = 313 Map<String, DeclarationMirror> result =
307 new Map<String, DeclarationMirror>(); 314 new Map<String, DeclarationMirror>();
308 for (int declarationIndex in _declarationIndices) { 315 for (int declarationIndex in _declarationIndices) {
309 // We encode a missing `declarations` capability as an index with 316 // We encode a missing `declarations` capability as an index with
310 // the value NO_CAPABILITY_INDEX. Note that `_declarations` will not be 317 // the value NO_CAPABILITY_INDEX. Note that `_declarations` will not be
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 return _data.classMirrors[_superclassIndex]; 493 return _data.classMirrors[_superclassIndex];
487 } 494 }
488 495
489 String toString() => "ClassMirrorImpl($qualifiedName)"; 496 String toString() => "ClassMirrorImpl($qualifiedName)";
490 497
491 // Because we take care to only ever create one instance for each 498 // Because we take care to only ever create one instance for each
492 // type/reflector-combination we can rely on the default `hashCode` and `==` 499 // type/reflector-combination we can rely on the default `hashCode` and `==`
493 // operations. 500 // operations.
494 } 501 }
495 502
496 class LibraryMirrorImpl implements LibraryMirror { 503 class LibraryMirrorImpl extends _DataCaching implements LibraryMirror {
497 LibraryMirrorImpl(this.simpleName, this.uri, this.getters, this.setters, 504 LibraryMirrorImpl(
505 this.simpleName,
506 this.uri,
507 this._reflector,
508 this._declarationIndices,
509 this.getters,
510 this.setters,
498 List<Object> metadata) 511 List<Object> metadata)
499 : _metadata = 512 : _metadata =
500 metadata == null ? null : new UnmodifiableListView(metadata); 513 metadata == null ? null : new UnmodifiableListView(metadata);
501 514
515 final ReflectableImpl _reflector;
516
517 /// A list of the indices in [ReflectorData.memberMirrors] of the
518 /// declarations of the reflected class. This includes method mirrors for
519 /// top level functions of this library and it directly corresponds to
520 /// `declarations`. Exception: When the given `_reflector.capabilities` do
521 /// not support the operation `declarations`, this will be
522 /// `<int>[NO_CAPABILITY_INDEX]`. It is enough to check that the list is
523 /// non-empty and first element is NO_CAPABILITY_INDEX to detect this
524 /// situation, because NO_CAPABILITY_INDEX` will otherwise never occur.
525 final List<int> _declarationIndices;
526
527 @override
502 final Uri uri; 528 final Uri uri;
503 529
504 // TODO(eernst) clarify: `_unsupported()` means not yet implemented here?
505 Map<String, DeclarationMirror> get declarations => _unsupported();
506
507 @override 530 @override
508 final String simpleName; 531 final String simpleName;
509 532
510 final Map<String, _StaticGetter> getters; 533 final Map<String, _StaticGetter> getters;
511 final Map<String, _StaticSetter> setters; 534 final Map<String, _StaticSetter> setters;
512 535
536 Map<String, DeclarationMirror> _declarations;
537
538 @override
539 Map<String, DeclarationMirror> get declarations {
540 if (_declarations == null) {
541 Map<String, DeclarationMirror> result =
542 new Map<String, DeclarationMirror>();
543 for (int declarationIndex in _declarationIndices) {
544 // We encode a missing `declarations` capability as an index with
545 // the value NO_CAPABILITY_INDEX. Note that `_declarations` will not be
546 // initialized and hence we will come here repeatedly if that is the
547 // case; however, performing operations for which there is no capability
548 // need not have stellar performance, it is almost always a bug to do
549 // that.
550 if (declarationIndex == NO_CAPABILITY_INDEX) {
551 throw new NoSuchCapabilityError(
552 "Requesting declarations of '$qualifiedName' without capability");
553 }
554 DeclarationMirror declarationMirror =
555 _data.memberMirrors[declarationIndex];
556 result[declarationMirror.simpleName] = declarationMirror;
557 }
558 _declarations =
559 new UnmodifiableMapView<String, DeclarationMirror>(result);
560 }
561 return _declarations;
562 }
563
513 @override 564 @override
514 Object invoke(String memberName, List positionalArguments, 565 Object invoke(String memberName, List positionalArguments,
515 [Map<Symbol, dynamic> namedArguments]) { 566 [Map<Symbol, dynamic> namedArguments]) {
516 _StaticGetter getter = getters[memberName]; 567 _StaticGetter getter = getters[memberName];
517 if (getter == null) { 568 if (getter == null) {
518 throw new NoSuchInvokeCapabilityError( 569 throw new NoSuchInvokeCapabilityError(
519 null, memberName, positionalArguments, namedArguments); 570 null, memberName, positionalArguments, namedArguments);
520 } 571 }
521 return Function.apply( 572 return Function.apply(
522 getters[memberName](), positionalArguments, namedArguments); 573 getter(), positionalArguments, namedArguments);
523 } 574 }
524 575
525 @override 576 @override
526 Object invokeGetter(String getterName) { 577 Object invokeGetter(String getterName) {
527 _StaticGetter getter = getters[getterName]; 578 _StaticGetter getter = getters[getterName];
528 if (getter == null) { 579 if (getter == null) {
529 throw new NoSuchInvokeCapabilityError(null, getterName, [], {}); 580 throw new NoSuchInvokeCapabilityError(null, getterName, [], {});
530 } 581 }
531 return getter(); 582 return getter();
532 } 583 }
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 LibraryMirror findLibrary(String libraryName) { 1243 LibraryMirror findLibrary(String libraryName) {
1193 if (data[this].libraryMirrors == null) { 1244 if (data[this].libraryMirrors == null) {
1194 throw new NoSuchCapabilityError("Using 'findLibrary' without capability. " 1245 throw new NoSuchCapabilityError("Using 'findLibrary' without capability. "
1195 "Try adding 'libraryCapability'."); 1246 "Try adding 'libraryCapability'.");
1196 } 1247 }
1197 return data[this].libraryMirrors.singleWhere( 1248 return data[this].libraryMirrors.singleWhere(
1198 (LibraryMirror mirror) => mirror.qualifiedName == libraryName); 1249 (LibraryMirror mirror) => mirror.qualifiedName == libraryName);
1199 } 1250 }
1200 1251
1201 @override 1252 @override
1202 Map<Uri, LibraryMirror> get libraries => _unsupported(); 1253 Map<Uri, LibraryMirror> get libraries {
1254 Map<Uri, LibraryMirror> result = <Uri, LibraryMirror>{};
1255 for (LibraryMirror library in data[this].libraryMirrors) {
1256 result[library.uri] = library;
1257 }
1258 return new UnmodifiableMapView(result);
1259 }
1203 1260
1204 @override 1261 @override
1205 Iterable<ClassMirror> get annotatedClasses { 1262 Iterable<ClassMirror> get annotatedClasses {
1206 return new UnmodifiableListView<ClassMirror>(data[this].classMirrors); 1263 return new UnmodifiableListView<ClassMirror>(data[this].classMirrors);
1207 } 1264 }
1208 } 1265 }
1209 1266
1210 // For mixin-applications we need to construct objects that represents their 1267 // For mixin-applications we need to construct objects that represents their
1211 // type. 1268 // type.
1212 class FakeType implements Type { 1269 class FakeType implements Type {
1213 const FakeType(this.description); 1270 const FakeType(this.description);
1214 1271
1215 final String description; 1272 final String description;
1216 1273
1217 String toString() => "Type($description)"; 1274 String toString() => "Type($description)";
1218 } 1275 }
OLDNEW
« no previous file with comments | « reflectable/lib/src/reflectable_mirror_based.dart ('k') | reflectable/lib/src/transformer_implementation.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698