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 |