| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // VM-specific implementation of the dart:mirrors library. | 5 // VM-specific implementation of the dart:mirrors library. |
| 6 | 6 |
| 7 import "dart:collection" show UnmodifiableListView, UnmodifiableMapView; | 7 import "dart:collection" show UnmodifiableListView, UnmodifiableMapView; |
| 8 | 8 |
| 9 final emptyList = new UnmodifiableListView([]); | 9 final emptyList = new UnmodifiableListView([]); |
| 10 final emptyMap = new UnmodifiableMapView({}); | 10 final emptyMap = new UnmodifiableMapView({}); |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 return _s( | 686 return _s( |
| 687 _n(klass.qualifiedName) | 687 _n(klass.qualifiedName) |
| 688 + ' with ' | 688 + ' with ' |
| 689 + mixins.reversed.map((m)=>_n(m.qualifiedName)).join(', ')); | 689 + mixins.reversed.map((m)=>_n(m.qualifiedName)).join(', ')); |
| 690 } | 690 } |
| 691 | 691 |
| 692 var _mixin; | 692 var _mixin; |
| 693 ClassMirror get mixin { | 693 ClassMirror get mixin { |
| 694 if (_mixin == null) { | 694 if (_mixin == null) { |
| 695 if (_isMixinAlias) { | 695 if (_isMixinAlias) { |
| 696 Type mixinType = _nativeMixinInstantiated(_trueSuperclass._reflectedType
, | 696 Type mixinType = _nativeMixinInstantiated( |
| 697 _instantiator); | 697 _trueSuperclass._reflectedType, _instantiator); |
| 698 _mixin = reflectType(mixinType); | 698 _mixin = reflectType(mixinType); |
| 699 } else { | 699 } else { |
| 700 Type mixinType = _nativeMixinInstantiated(_reflectedType, _instantiator)
; | 700 Type mixinType = _nativeMixinInstantiated(_reflectedType, |
| 701 _instantiator); |
| 701 if (mixinType == null) { | 702 if (mixinType == null) { |
| 702 // The reflectee is not a mixin application. | 703 // The reflectee is not a mixin application. |
| 703 _mixin = this; | 704 _mixin = this; |
| 704 } else { | 705 } else { |
| 705 _mixin = reflectType(mixinType); | 706 _mixin = reflectType(mixinType); |
| 706 } | 707 } |
| 707 } | 708 } |
| 708 } | 709 } |
| 709 return _mixin; | 710 return _mixin; |
| 710 } | 711 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 decls.addAll(_constructors); | 772 decls.addAll(_constructors); |
| 772 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); | 773 typeVariables.forEach((tv) => decls[tv.simpleName] = tv); |
| 773 return _declarations = | 774 return _declarations = |
| 774 new UnmodifiableMapView<Symbol, DeclarationMirror>(decls); | 775 new UnmodifiableMapView<Symbol, DeclarationMirror>(decls); |
| 775 } | 776 } |
| 776 | 777 |
| 777 Map<Symbol, Mirror> _cachedMembers; | 778 Map<Symbol, Mirror> _cachedMembers; |
| 778 Map<Symbol, Mirror> get _members { | 779 Map<Symbol, Mirror> get _members { |
| 779 if (_cachedMembers == null) { | 780 if (_cachedMembers == null) { |
| 780 var whoseMembers = _isMixinAlias ? _trueSuperclass : this; | 781 var whoseMembers = _isMixinAlias ? _trueSuperclass : this; |
| 781 _cachedMembers = _makeMemberMap(mixin._computeMembers(whoseMembers.mixin._
reflectee)); | 782 _cachedMembers = _makeMemberMap(mixin._computeMembers( |
| 783 _instantiator, whoseMembers.mixin._reflectee)); |
| 782 } | 784 } |
| 783 return _cachedMembers; | 785 return _cachedMembers; |
| 784 } | 786 } |
| 785 | 787 |
| 786 Map<Symbol, MethodMirror> _cachedMethods; | 788 Map<Symbol, MethodMirror> _cachedMethods; |
| 787 Map<Symbol, MethodMirror> get _methods { | 789 Map<Symbol, MethodMirror> get _methods { |
| 788 if (_cachedMethods == null) { | 790 if (_cachedMethods == null) { |
| 789 _cachedMethods = _filterMap( | 791 _cachedMethods = _filterMap( |
| 790 _members, | 792 _members, |
| 791 (key, value) => (value is MethodMirror && value.isRegularMethod)); | 793 (key, value) => (value is MethodMirror && value.isRegularMethod)); |
| 792 } | 794 } |
| 793 return _cachedMethods; | 795 return _cachedMethods; |
| 794 } | 796 } |
| 795 | 797 |
| 796 Map<Symbol, MethodMirror> _cachedConstructors; | 798 Map<Symbol, MethodMirror> _cachedConstructors; |
| 797 Map<Symbol, MethodMirror> get _constructors { | 799 Map<Symbol, MethodMirror> get _constructors { |
| 798 if (_cachedConstructors == null) { | 800 if (_cachedConstructors == null) { |
| 799 var constructorsList = _computeConstructors(_reflectee); | 801 var constructorsList = _computeConstructors(_instantiator, _reflectee); |
| 800 var stringName = _n(simpleName); | 802 var stringName = _n(simpleName); |
| 801 constructorsList.forEach((c) => c._patchConstructorName(stringName)); | 803 constructorsList.forEach((c) => c._patchConstructorName(stringName)); |
| 802 _cachedConstructors = | 804 _cachedConstructors = |
| 803 new Map.fromIterable(constructorsList, key: (e) => e.simpleName); | 805 new Map.fromIterable(constructorsList, key: (e) => e.simpleName); |
| 804 } | 806 } |
| 805 return _cachedConstructors; | 807 return _cachedConstructors; |
| 806 } | 808 } |
| 807 | 809 |
| 808 bool get _isAnonymousMixinApplication { | 810 bool get _isAnonymousMixinApplication { |
| 809 if (_isMixinAlias) return false; // Named mixin application. | 811 if (_isMixinAlias) return false; // Named mixin application. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 936 | 938 |
| 937 static _nativeInterfacesInstantiated(reflectedType) | 939 static _nativeInterfacesInstantiated(reflectedType) |
| 938 native "ClassMirror_interfaces_instantiated"; | 940 native "ClassMirror_interfaces_instantiated"; |
| 939 | 941 |
| 940 static _nativeMixin(reflectedType) | 942 static _nativeMixin(reflectedType) |
| 941 native "ClassMirror_mixin"; | 943 native "ClassMirror_mixin"; |
| 942 | 944 |
| 943 static _nativeMixinInstantiated(reflectedType, instantiator) | 945 static _nativeMixinInstantiated(reflectedType, instantiator) |
| 944 native "ClassMirror_mixin_instantiated"; | 946 native "ClassMirror_mixin_instantiated"; |
| 945 | 947 |
| 946 _computeMembers(reflectee) | 948 _computeMembers(reflectee, instantiator) |
| 947 native "ClassMirror_members"; | 949 native "ClassMirror_members"; |
| 948 | 950 |
| 949 _computeConstructors(reflectee) | 951 _computeConstructors(reflectee, instantiator) |
| 950 native "ClassMirror_constructors"; | 952 native "ClassMirror_constructors"; |
| 951 | 953 |
| 952 _invoke(reflectee, memberName, arguments, argumentNames) | 954 _invoke(reflectee, memberName, arguments, argumentNames) |
| 953 native 'ClassMirror_invoke'; | 955 native 'ClassMirror_invoke'; |
| 954 | 956 |
| 955 _invokeGetter(reflectee, getterName) | 957 _invokeGetter(reflectee, getterName) |
| 956 native 'ClassMirror_invokeGetter'; | 958 native 'ClassMirror_invokeGetter'; |
| 957 | 959 |
| 958 _invokeSetter(reflectee, setterName, value) | 960 _invokeSetter(reflectee, setterName, value) |
| 959 native 'ClassMirror_invokeSetter'; | 961 native 'ClassMirror_invokeSetter'; |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1350 final bool isShow; | 1352 final bool isShow; |
| 1351 | 1353 |
| 1352 _LocalCombinatorMirror(identifierString, this.isShow) | 1354 _LocalCombinatorMirror(identifierString, this.isShow) |
| 1353 : this.identifiers = [_s(identifierString)]; | 1355 : this.identifiers = [_s(identifierString)]; |
| 1354 | 1356 |
| 1355 bool get isHide => !isShow; | 1357 bool get isHide => !isShow; |
| 1356 } | 1358 } |
| 1357 | 1359 |
| 1358 class _LocalMethodMirror extends _LocalDeclarationMirror | 1360 class _LocalMethodMirror extends _LocalDeclarationMirror |
| 1359 implements MethodMirror { | 1361 implements MethodMirror { |
| 1362 final Type _instantiator; |
| 1360 final bool isStatic; | 1363 final bool isStatic; |
| 1361 final bool isAbstract; | 1364 final bool isAbstract; |
| 1362 final bool isGetter; | 1365 final bool isGetter; |
| 1363 final bool isSetter; | 1366 final bool isSetter; |
| 1364 final bool isConstructor; | 1367 final bool isConstructor; |
| 1365 final bool isConstConstructor; | 1368 final bool isConstConstructor; |
| 1366 final bool isGenerativeConstructor; | 1369 final bool isGenerativeConstructor; |
| 1367 final bool isRedirectingConstructor; | 1370 final bool isRedirectingConstructor; |
| 1368 final bool isFactoryConstructor; | 1371 final bool isFactoryConstructor; |
| 1369 final bool isOperator; | 1372 final bool isOperator; |
| 1370 | 1373 |
| 1371 static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<", | 1374 static const _operators = const ["%", "&", "*", "+", "-", "/", "<", "<<", |
| 1372 "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"]; | 1375 "<=", "==", ">", ">=", ">>", "[]", "[]=", "^", "|", "~", "unary-", "~/"]; |
| 1373 | 1376 |
| 1374 _LocalMethodMirror(reflectee, | 1377 _LocalMethodMirror(reflectee, |
| 1375 String simpleName, | 1378 String simpleName, |
| 1376 this._owner, | 1379 this._owner, |
| 1380 this._instantiator, |
| 1377 this.isStatic, | 1381 this.isStatic, |
| 1378 this.isAbstract, | 1382 this.isAbstract, |
| 1379 this.isGetter, | 1383 this.isGetter, |
| 1380 this.isSetter, | 1384 this.isSetter, |
| 1381 this.isConstructor, | 1385 this.isConstructor, |
| 1382 this.isConstConstructor, | 1386 this.isConstConstructor, |
| 1383 this.isGenerativeConstructor, | 1387 this.isGenerativeConstructor, |
| 1384 this.isRedirectingConstructor, | 1388 this.isRedirectingConstructor, |
| 1385 this.isFactoryConstructor) | 1389 this.isFactoryConstructor) |
| 1386 : this.isOperator = _operators.contains(simpleName), | 1390 : this.isOperator = _operators.contains(simpleName), |
| 1387 super(reflectee, _s(simpleName)); | 1391 super(reflectee, _s(simpleName)); |
| 1388 | 1392 |
| 1389 DeclarationMirror _owner; | 1393 DeclarationMirror _owner; |
| 1390 DeclarationMirror get owner { | 1394 DeclarationMirror get owner { |
| 1391 // For nested closures it is possible, that the mirror for the owner has not | 1395 // For nested closures it is possible, that the mirror for the owner has not |
| 1392 // been created yet. | 1396 // been created yet. |
| 1393 if (_owner == null) { | 1397 if (_owner == null) { |
| 1394 _owner = _MethodMirror_owner(_reflectee); | 1398 _owner = _MethodMirror_owner(_reflectee, _instantiator); |
| 1395 } | 1399 } |
| 1396 return _owner; | 1400 return _owner; |
| 1397 } | 1401 } |
| 1398 | 1402 |
| 1399 bool get isPrivate => _n(simpleName).startsWith('_') || | 1403 bool get isPrivate => _n(simpleName).startsWith('_') || |
| 1400 _n(constructorName).startsWith('_'); | 1404 _n(constructorName).startsWith('_'); |
| 1401 | 1405 |
| 1402 bool get isTopLevel => owner is LibraryMirror; | 1406 bool get isTopLevel => owner is LibraryMirror; |
| 1403 bool get isSynthetic => false; | 1407 bool get isSynthetic => false; |
| 1404 | 1408 |
| 1405 Type get _instantiator { | |
| 1406 var o = owner; | |
| 1407 while (o is MethodMirror) o = o.owner; | |
| 1408 return o._instantiator; | |
| 1409 } | |
| 1410 | |
| 1411 TypeMirror _returnType = null; | 1409 TypeMirror _returnType = null; |
| 1412 TypeMirror get returnType { | 1410 TypeMirror get returnType { |
| 1413 if (_returnType == null) { | 1411 if (_returnType == null) { |
| 1414 if (isConstructor) { | 1412 if (isConstructor) { |
| 1415 _returnType = owner; | 1413 _returnType = owner; |
| 1416 } else { | 1414 } else { |
| 1417 _returnType = reflectType( | 1415 _returnType = reflectType( |
| 1418 _MethodMirror_return_type(_reflectee, _instantiator)); | 1416 _MethodMirror_return_type(_reflectee, _instantiator)); |
| 1419 } | 1417 } |
| 1420 } | 1418 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1466 var cn = _n(constructorName); | 1464 var cn = _n(constructorName); |
| 1467 if(cn == ''){ | 1465 if(cn == ''){ |
| 1468 _simpleName = _s(ownerName); | 1466 _simpleName = _s(ownerName); |
| 1469 } else { | 1467 } else { |
| 1470 _simpleName = _s(ownerName + "." + cn); | 1468 _simpleName = _s(ownerName + "." + cn); |
| 1471 } | 1469 } |
| 1472 } | 1470 } |
| 1473 | 1471 |
| 1474 String toString() => "MethodMirror on '${MirrorSystem.getName(simpleName)}'"; | 1472 String toString() => "MethodMirror on '${MirrorSystem.getName(simpleName)}'"; |
| 1475 | 1473 |
| 1476 static dynamic _MethodMirror_owner(reflectee) | 1474 static dynamic _MethodMirror_owner(reflectee, instantiator) |
| 1477 native "MethodMirror_owner"; | 1475 native "MethodMirror_owner"; |
| 1478 | 1476 |
| 1479 static dynamic _MethodMirror_return_type(reflectee, instantiator) | 1477 static dynamic _MethodMirror_return_type(reflectee, instantiator) |
| 1480 native "MethodMirror_return_type"; | 1478 native "MethodMirror_return_type"; |
| 1481 | 1479 |
| 1482 List<ParameterMirror> _MethodMirror_parameters(reflectee) | 1480 List<ParameterMirror> _MethodMirror_parameters(reflectee) |
| 1483 native "MethodMirror_parameters"; | 1481 native "MethodMirror_parameters"; |
| 1484 | 1482 |
| 1485 static String _MethodMirror_source(reflectee) | 1483 static String _MethodMirror_source(reflectee) |
| 1486 native "MethodMirror_source"; | 1484 native "MethodMirror_source"; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 SourceLocation get location { | 1562 SourceLocation get location { |
| 1565 throw new UnsupportedError("ParameterMirror.location unimplemented"); | 1563 throw new UnsupportedError("ParameterMirror.location unimplemented"); |
| 1566 } | 1564 } |
| 1567 | 1565 |
| 1568 List<InstanceMirror> get metadata { | 1566 List<InstanceMirror> get metadata { |
| 1569 if (_unmirroredMetadata == null) return emptyList; | 1567 if (_unmirroredMetadata == null) return emptyList; |
| 1570 return new UnmodifiableListView(_unmirroredMetadata.map(reflect)); | 1568 return new UnmodifiableListView(_unmirroredMetadata.map(reflect)); |
| 1571 } | 1569 } |
| 1572 | 1570 |
| 1573 Type get _instantiator { | 1571 Type get _instantiator { |
| 1574 var o = owner; | 1572 return owner._instantiator; |
| 1575 while (o is MethodMirror) o = o.owner; | |
| 1576 return o._instantiator; | |
| 1577 } | 1573 } |
| 1578 | 1574 |
| 1579 TypeMirror _type = null; | 1575 TypeMirror _type = null; |
| 1580 TypeMirror get type { | 1576 TypeMirror get type { |
| 1581 if (_type == null) { | 1577 if (_type == null) { |
| 1582 _type = reflectType( | 1578 _type = reflectType( |
| 1583 _ParameterMirror_type(_reflectee, _position, _instantiator)); | 1579 _ParameterMirror_type(_reflectee, _position, _instantiator)); |
| 1584 } | 1580 } |
| 1585 return _type; | 1581 return _type; |
| 1586 } | 1582 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1688 if (typeMirror == null) { | 1684 if (typeMirror == null) { |
| 1689 typeMirror = makeLocalTypeMirror(key); | 1685 typeMirror = makeLocalTypeMirror(key); |
| 1690 _instanitationCache[key] = typeMirror; | 1686 _instanitationCache[key] = typeMirror; |
| 1691 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { | 1687 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { |
| 1692 _declarationCache[key] = typeMirror; | 1688 _declarationCache[key] = typeMirror; |
| 1693 } | 1689 } |
| 1694 } | 1690 } |
| 1695 return typeMirror; | 1691 return typeMirror; |
| 1696 } | 1692 } |
| 1697 } | 1693 } |
| OLD | NEW |