// Copyright (c) 2017, 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.
library kernel.target.vmreify;

import '../ast.dart' show Component;
import '../core_types.dart' show CoreTypes;
import '../transformations/generic_types_reification.dart' as reify
    show transformComponent;
import 'targets.dart' show TargetFlags;
import 'vmcc.dart' as vmcc_target;

/// Specializes the kernel IR to the Dart VM with reified generic types.
class VmGenericTypesReifiedTarget extends vmcc_target.VmClosureConvertedTarget {
  VmGenericTypesReifiedTarget(TargetFlags flags) : super(flags);

  @override
  String get name => "vmreify";

  // This is the order that bootstrap libraries are loaded according to
  // `runtime/vm/object_store.h`.
  List<String> get extraRequiredLibraries {
    return new List<String>.from(super.extraRequiredLibraries)
      ..add("${flags.kernelRuntime.resolve('reify/types.dart')}")
      ..add("${flags.kernelRuntime.resolve('reify/declarations.dart')}")
      ..add("${flags.kernelRuntime.resolve('reify/interceptors.dart')}");
  }

  @override
  void performGlobalTransformations(CoreTypes coreTypes, Component component,
      {void logger(String msg)}) {
    super.performGlobalTransformations(coreTypes, component);
    // TODO(dmitryas) this transformation should be made modular
    reify.transformComponent(coreTypes, component);
  }

  // Disable tree shaking for Generic Types Reification. There are some runtime
  // libraries that are required for the transformation and are shaken off,
  // because they aren't invoked from the component being transformed prior to
  // the transformation.
  // TODO(dmitryas): remove this when the libraries are in dart:_internal
  @override
  void performTreeShaking(CoreTypes coreTypes, Component component) {}
}
