| Index: pkg/dev_compiler/lib/src/compiler/type_utilities.dart
|
| diff --git a/pkg/dev_compiler/lib/src/compiler/type_utilities.dart b/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
|
| index 7632f08124f5eebde8a9a488025b40b4e8d656d0..1f1afa7b1513ac0b0e7f02b43e5ce7ce5198dd87 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/type_utilities.dart
|
| @@ -2,9 +2,8 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -import 'dart:collection' show HashMap, HashSet, LinkedHashMap;
|
| -
|
| import 'package:analyzer/dart/element/element.dart';
|
| +import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
|
| import 'package:analyzer/dart/element/type.dart';
|
|
|
| import '../js_ast/js_ast.dart' as JS;
|
| @@ -12,7 +11,7 @@ import '../js_ast/js_ast.dart' show js;
|
| import 'js_names.dart' as JS;
|
|
|
| Set<TypeParameterElement> freeTypeParameters(DartType t) {
|
| - var result = new HashSet<TypeParameterElement>();
|
| + var result = new Set<TypeParameterElement>();
|
| void find(DartType t) {
|
| if (t is TypeParameterType) {
|
| result.add(t.element);
|
| @@ -37,7 +36,7 @@ class _CacheTable {
|
| // Use a LinkedHashMap to maintain key insertion order so the generated code
|
| // is stable under slight perturbation. (If this is not good enough we could
|
| // sort by name to canonicalize order.)
|
| - final _names = new LinkedHashMap<DartType, JS.TemporaryId>();
|
| + final _names = <DartType, JS.TemporaryId>{};
|
| Iterable<DartType> get keys => _names.keys.toList();
|
|
|
| JS.Statement _dischargeType(DartType type) {
|
| @@ -120,7 +119,7 @@ class _CacheTable {
|
| /// _GeneratorTable tracks types which have been
|
| /// named and hoisted.
|
| class _GeneratorTable extends _CacheTable {
|
| - final _defs = new HashMap<DartType, JS.Expression>();
|
| + final _defs = <DartType, JS.Expression>{};
|
|
|
| final JS.Identifier _runtimeModule;
|
|
|
| @@ -167,8 +166,7 @@ class TypeTable {
|
| /// cache/generator variables discharged at the binding site for the
|
| /// type variable since the type definition depends on the type
|
| /// parameter.
|
| - final _scopeDependencies =
|
| - new HashMap<TypeParameterElement, List<DartType>>();
|
| + final _scopeDependencies = <TypeParameterElement, List<DartType>>{};
|
|
|
| TypeTable(JS.Identifier runtime)
|
| : _generators = new _GeneratorTable(runtime),
|
| @@ -191,22 +189,22 @@ class TypeTable {
|
|
|
| /// Record the dependencies of the type on its free variables
|
| bool recordScopeDependencies(DartType type) {
|
| - var fvs = freeTypeParameters(type);
|
| + var freeVariables = freeTypeParameters(type);
|
| // TODO(leafp): This is a hack to avoid trying to hoist out of
|
| // generic functions and generic function types. This often degrades
|
| // readability to little or no benefit. It would be good to do this
|
| // when we know that we can hoist it to an outer scope, but for
|
| // now we just disable it.
|
| - if (fvs.any((i) => i.enclosingElement is FunctionTypedElement)) {
|
| + if (freeVariables.any((i) => i.enclosingElement is FunctionTypedElement)) {
|
| return true;
|
| }
|
| - void addScope(TypeParameterElement i) {
|
| - List<DartType> types = _scopeDependencies[i];
|
| - if (types == null) _scopeDependencies[i] = types = [];
|
| - types.add(type);
|
| - }
|
|
|
| - fvs.forEach(addScope);
|
| + for (var free in freeVariables) {
|
| + // If `free` is a promoted type parameter, get the original one so we can
|
| + // find it in our map.
|
| + var key = free is TypeParameterMember ? free.baseElement : free;
|
| + _scopeDependencies.putIfAbsent(key, () => []).add(type);
|
| + }
|
| return false;
|
| }
|
|
|
|
|