| // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file |
| // 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. |
| |
| // @dart=2.12 |
| |
| library vm.transformations.specializer.set_factory_specializer; |
| |
| import 'package:kernel/ast.dart'; |
| import 'package:kernel/core_types.dart' show CoreTypes; |
| |
| import 'package:kernel/core_types.dart'; |
| import 'package:vm/transformations/specializer/factory_specializer.dart'; |
| |
| /// Replaces invocation of Set factory constructors with |
| /// factories of VM-specific classes. |
| /// new LinkedHashSet<E>() => new _CompactLinkedHashSet<E>() |
| class SetFactorySpecializer extends BaseSpecializer { |
| final Procedure _linkedHashSetDefaultFactory; |
| final Constructor _compactLinkedHashSetConstructor; |
| |
| SetFactorySpecializer(CoreTypes coreTypes) |
| : _linkedHashSetDefaultFactory = assertNotNull( |
| coreTypes.index.getProcedure( |
| 'dart:collection', |
| 'LinkedHashSet', |
| '', |
| ), |
| ), |
| _compactLinkedHashSetConstructor = assertNotNull( |
| coreTypes.index.getConstructor( |
| 'dart:collection', |
| '_CompactLinkedHashSet', |
| '', |
| ), |
| ) { |
| transformers.addAll({ |
| _linkedHashSetDefaultFactory: transformLinkedHashSet, |
| }); |
| } |
| |
| static T assertNotNull<T>(T t) { |
| assert(t != null); |
| return t; |
| } |
| |
| TreeNode transformLinkedHashSet(StaticInvocation node) { |
| final args = node.arguments; |
| assert(args.positional.isEmpty); |
| if (args.named.isEmpty) { |
| return ConstructorInvocation( |
| _compactLinkedHashSetConstructor, |
| Arguments([], types: args.types), |
| ); |
| } |
| return node; |
| } |
| } |