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 import 'dart:collection' show HashSet, HashMap, SplayTreeSet; | 5 import 'dart:collection' show HashSet, HashMap, SplayTreeSet; |
6 | 6 |
7 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 7 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
8 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator; | 8 import 'package:analyzer/src/generated/ast.dart' hide ConstantEvaluator; |
9 import 'package:analyzer/src/generated/constant.dart'; | 9 import 'package:analyzer/src/generated/constant.dart'; |
10 import 'package:analyzer/src/generated/element.dart'; | 10 import 'package:analyzer/src/generated/element.dart'; |
(...skipping 3186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3197 if (node.constKeyword != null) return _emitConst(emitList); | 3197 if (node.constKeyword != null) return _emitConst(emitList); |
3198 return emitList(); | 3198 return emitList(); |
3199 } | 3199 } |
3200 | 3200 |
3201 @override | 3201 @override |
3202 visitMapLiteral(MapLiteral node) { | 3202 visitMapLiteral(MapLiteral node) { |
3203 // TODO(jmesserly): we can likely make these faster. | 3203 // TODO(jmesserly): we can likely make these faster. |
3204 JS.Expression emitMap() { | 3204 JS.Expression emitMap() { |
3205 var entries = node.entries; | 3205 var entries = node.entries; |
3206 var mapArguments = null; | 3206 var mapArguments = null; |
3207 if (entries.isEmpty) { | 3207 var typeArgs = node.typeArguments; |
| 3208 if (entries.isEmpty && typeArgs == null) { |
3208 mapArguments = []; | 3209 mapArguments = []; |
3209 } else if (entries.every((e) => e.key is StringLiteral)) { | 3210 } else if (entries.every((e) => e.key is StringLiteral)) { |
3210 // Use JS object literal notation if possible, otherwise use an array. | 3211 // Use JS object literal notation if possible, otherwise use an array. |
3211 // We could do this any time all keys are non-nullable String type. | 3212 // We could do this any time all keys are non-nullable String type. |
3212 // For now, support StringLiteral as the common non-nullable String case
. | 3213 // For now, support StringLiteral as the common non-nullable String case
. |
3213 var props = <JS.Property>[]; | 3214 var props = <JS.Property>[]; |
3214 for (var e in entries) { | 3215 for (var e in entries) { |
3215 props.add(new JS.Property(_visit(e.key), _visit(e.value))); | 3216 props.add(new JS.Property(_visit(e.key), _visit(e.value))); |
3216 } | 3217 } |
3217 mapArguments = new JS.ObjectInitializer(props); | 3218 mapArguments = new JS.ObjectInitializer(props); |
3218 } else { | 3219 } else { |
3219 var values = <JS.Expression>[]; | 3220 var values = <JS.Expression>[]; |
3220 for (var e in entries) { | 3221 for (var e in entries) { |
3221 values.add(_visit(e.key)); | 3222 values.add(_visit(e.key)); |
3222 values.add(_visit(e.value)); | 3223 values.add(_visit(e.value)); |
3223 } | 3224 } |
3224 mapArguments = new JS.ArrayInitializer(values); | 3225 mapArguments = new JS.ArrayInitializer(values); |
3225 } | 3226 } |
3226 // TODO(jmesserly): add generic types args. | 3227 var types = <JS.Expression>[]; |
3227 return js.call('dart.map(#)', [mapArguments]); | 3228 if (typeArgs != null) { |
| 3229 types.addAll(typeArgs.arguments.map((e) => _emitTypeName(e.type))); |
| 3230 } |
| 3231 return js.call('dart.map(#, #)', [mapArguments, types]); |
3228 } | 3232 } |
3229 if (node.constKeyword != null) return _emitConst(emitMap); | 3233 if (node.constKeyword != null) return _emitConst(emitMap); |
3230 return emitMap(); | 3234 return emitMap(); |
3231 } | 3235 } |
3232 | 3236 |
3233 @override | 3237 @override |
3234 JS.LiteralString visitSimpleStringLiteral(SimpleStringLiteral node) => | 3238 JS.LiteralString visitSimpleStringLiteral(SimpleStringLiteral node) => |
3235 js.escapedString(node.value, node.isSingleQuoted ? "'" : '"'); | 3239 js.escapedString(node.value, node.isSingleQuoted ? "'" : '"'); |
3236 | 3240 |
3237 @override | 3241 @override |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3585 | 3589 |
3586 /// A special kind of element created by the compiler, signifying a temporary | 3590 /// A special kind of element created by the compiler, signifying a temporary |
3587 /// variable. These objects use instance equality, and should be shared | 3591 /// variable. These objects use instance equality, and should be shared |
3588 /// everywhere in the tree where they are treated as the same variable. | 3592 /// everywhere in the tree where they are treated as the same variable. |
3589 class TemporaryVariableElement extends LocalVariableElementImpl { | 3593 class TemporaryVariableElement extends LocalVariableElementImpl { |
3590 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name); | 3594 TemporaryVariableElement.forNode(Identifier name) : super.forNode(name); |
3591 | 3595 |
3592 int get hashCode => identityHashCode(this); | 3596 int get hashCode => identityHashCode(this); |
3593 bool operator ==(Object other) => identical(this, other); | 3597 bool operator ==(Object other) => identical(this, other); |
3594 } | 3598 } |
OLD | NEW |