| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dart._js_mirrors; | 5 library dart._js_mirrors; |
| 6 | 6 |
| 7 import 'dart:mirrors'; | 7 import 'dart:mirrors'; |
| 8 import 'dart:_foreign_helper' show JS; | 8 import 'dart:_foreign_helper' show JS; |
| 9 import 'dart:_internal' as _internal; | 9 import 'dart:_internal' as _internal; |
| 10 | 10 |
| 11 String getName(Symbol symbol) => | 11 String getName(Symbol symbol) { |
| 12 _internal.Symbol.getName(symbol as _internal.Symbol); | 12 if (symbol is _internal.PrivateSymbol) { |
| 13 return _internal.PrivateSymbol.getName(symbol); |
| 14 } else { |
| 15 return _internal.Symbol.getName(symbol as _internal.Symbol); |
| 16 } |
| 17 } |
| 13 | 18 |
| 14 Symbol getSymbol(name, library) => | 19 Symbol getSymbol(name, library) => |
| 15 throw new UnimplementedError("MirrorSystem.getSymbol unimplemented"); | 20 throw new UnimplementedError("MirrorSystem.getSymbol unimplemented"); |
| 16 | 21 |
| 17 final currentJsMirrorSystem = throw new UnimplementedError( | 22 final currentJsMirrorSystem = throw new UnimplementedError( |
| 18 "MirrorSystem.currentJsMirrorSystem unimplemented"); | 23 "MirrorSystem.currentJsMirrorSystem unimplemented"); |
| 19 | 24 |
| 20 final _typeMirror = JS('', 'Symbol("_typeMirror")'); | 25 final _typeMirror = JS('', 'Symbol("_typeMirror")'); |
| 21 | 26 |
| 22 InstanceMirror reflect(reflectee) { | 27 InstanceMirror reflect(reflectee) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 return JS('', '#.definiteFunctionType(#, [])', _dart, type); | 77 return JS('', '#.definiteFunctionType(#, [])', _dart, type); |
| 73 } | 78 } |
| 74 | 79 |
| 75 dynamic _getMixins(type) { | 80 dynamic _getMixins(type) { |
| 76 return JS('', '#.getMixins(#, [])', _dart, type); | 81 return JS('', '#.getMixins(#, [])', _dart, type); |
| 77 } | 82 } |
| 78 | 83 |
| 79 typedef T _Lazy<T>(); | 84 typedef T _Lazy<T>(); |
| 80 | 85 |
| 81 dynamic _getESSymbol(Symbol symbol) => | 86 dynamic _getESSymbol(Symbol symbol) => |
| 82 _internal.Symbol.getNativeSymbol(symbol as _internal.Symbol); | 87 _internal.PrivateSymbol.getNativeSymbol(symbol); |
| 83 | 88 |
| 84 dynamic _getMember(Symbol symbol) { | 89 dynamic _getMember(Symbol symbol) { |
| 85 var privateSymbol = _getESSymbol(symbol); | 90 var privateSymbol = _getESSymbol(symbol); |
| 86 if (privateSymbol != null) { | 91 if (privateSymbol != null) { |
| 87 return privateSymbol; | 92 return privateSymbol; |
| 88 } | 93 } |
| 89 var name = getName(symbol); | 94 var name = getName(symbol); |
| 90 // TODO(jacobr): this code is duplicated in code_generator.dart | 95 // TODO(jacobr): this code is duplicated in code_generator.dart |
| 91 switch (name) { | 96 switch (name) { |
| 92 case '[]': | 97 case '[]': |
| (...skipping 16 matching lines...) Expand all Loading... |
| 109 String _getNameForESSymbol(member) { | 114 String _getNameForESSymbol(member) { |
| 110 // Convert private JS symbol "Symbol(_foo)" to string "_foo". | 115 // Convert private JS symbol "Symbol(_foo)" to string "_foo". |
| 111 assert(JS('bool', 'typeof # == "symbol"', member)); | 116 assert(JS('bool', 'typeof # == "symbol"', member)); |
| 112 var str = member.toString(); | 117 var str = member.toString(); |
| 113 assert(str.startsWith('Symbol(') && str.endsWith(')')); | 118 assert(str.startsWith('Symbol(') && str.endsWith(')')); |
| 114 return str.substring(7, str.length - 1); | 119 return str.substring(7, str.length - 1); |
| 115 } | 120 } |
| 116 | 121 |
| 117 Symbol _getSymbolForESSymbol(member) { | 122 Symbol _getSymbolForESSymbol(member) { |
| 118 var name = _getNameForESSymbol(member); | 123 var name = _getNameForESSymbol(member); |
| 119 return new _internal.Symbol.es6(name, member); | 124 return new _internal.PrivateSymbol(name, member); |
| 120 } | 125 } |
| 121 | 126 |
| 122 // The [member] must be either a string (public) or an ES6 symbol (private). | 127 // The [member] must be either a string (public) or an ES6 symbol (private). |
| 123 Symbol _getSymbolForMember(member) { | 128 Symbol _getSymbolForMember(member) { |
| 124 if (member is String) { | 129 if (member is String) { |
| 125 return new Symbol(member); | 130 return new Symbol(member); |
| 126 } else { | 131 } else { |
| 127 var name = _getNameForESSymbol(member); | 132 var name = _getNameForESSymbol(member); |
| 128 return new _internal.Symbol.es6(name, member); | 133 return new _internal.PrivateSymbol(name, member); |
| 129 } | 134 } |
| 130 } | 135 } |
| 131 | 136 |
| 132 Map<Symbol, dynamic> _toDartMap(data) { | 137 Map<Symbol, dynamic> _toDartMap(data) { |
| 133 if (data == null) return {}; | 138 if (data == null) return {}; |
| 134 var map = new Map<Symbol, dynamic>(); | 139 var map = new Map<Symbol, dynamic>(); |
| 135 // Note: we recorded a map from fields/methods to their type and metadata. | 140 // Note: we recorded a map from fields/methods to their type and metadata. |
| 136 // The key is a string name for public members but an ES6 symbol for private | 141 // The key is a string name for public members but an ES6 symbol for private |
| 137 // ones. That's works nicely for dynamic operations, but dart:mirrors expects | 142 // ones. That's works nicely for dynamic operations, but dart:mirrors expects |
| 138 // Dart symbols, so we convert here. | 143 // Dart symbols, so we convert here. |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 var getters = _getGetters(unwrapped); | 377 var getters = _getGetters(unwrapped); |
| 373 getters.forEach((symbol, ft) { | 378 getters.forEach((symbol, ft) { |
| 374 var name = getName(symbol); | 379 var name = getName(symbol); |
| 375 _declarations[symbol] = | 380 _declarations[symbol] = |
| 376 new JsMethodMirror._instanceMethod(this, symbol, ft); | 381 new JsMethodMirror._instanceMethod(this, symbol, ft); |
| 377 }); | 382 }); |
| 378 var setters = _getSetters(unwrapped); | 383 var setters = _getSetters(unwrapped); |
| 379 setters.forEach((symbol, ft) { | 384 setters.forEach((symbol, ft) { |
| 380 var name = getName(symbol) + '='; | 385 var name = getName(symbol) + '='; |
| 381 // Create a separate symbol for the setter. | 386 // Create a separate symbol for the setter. |
| 382 symbol = new _internal.Symbol.es6(name, _getESSymbol(symbol)); | 387 symbol = new _internal.PrivateSymbol(name, _getESSymbol(symbol)); |
| 383 _declarations[symbol] = | 388 _declarations[symbol] = |
| 384 new JsMethodMirror._instanceMethod(this, symbol, ft); | 389 new JsMethodMirror._instanceMethod(this, symbol, ft); |
| 385 }); | 390 }); |
| 386 var staticFields = _getStaticFields(unwrapped); | 391 var staticFields = _getStaticFields(unwrapped); |
| 387 staticFields.forEach((symbol, t) { | 392 staticFields.forEach((symbol, t) { |
| 388 var name = getName(symbol); | 393 var name = getName(symbol); |
| 389 var metadata = []; | 394 var metadata = []; |
| 390 if (t is List) { | 395 if (t is List) { |
| 391 metadata = t.skip(1).toList(); | 396 metadata = t.skip(1).toList(); |
| 392 t = t[0]; | 397 t = t[0]; |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 var param = | 654 var param = |
| 650 new JsParameterMirror._(new Symbol(''), _wrap(type), metadata); | 655 new JsParameterMirror._(new Symbol(''), _wrap(type), metadata); |
| 651 params[i + args.length] = param; | 656 params[i + args.length] = param; |
| 652 } | 657 } |
| 653 | 658 |
| 654 _params = new List.unmodifiable(params); | 659 _params = new List.unmodifiable(params); |
| 655 } | 660 } |
| 656 | 661 |
| 657 String toString() => "MethodMirror on '$_name'"; | 662 String toString() => "MethodMirror on '$_name'"; |
| 658 } | 663 } |
| OLD | NEW |