// 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.

import 'package:kernel/ast.dart';

/// Returns a [Component] object containing empty definitions of core SDK classes.
Component createMockSdkComponent() {
  var coreLib = new Library(Uri.parse('dart:core'), name: 'dart.core');
  var asyncLib = new Library(Uri.parse('dart:async'), name: 'dart.async');
  var internalLib =
      new Library(Uri.parse('dart:_internal'), name: 'dart._internal');

  Class addClass(Library lib, Class c) {
    lib.addClass(c);
    return c;
  }

  var objectClass = addClass(coreLib, new Class(name: 'Object'));
  var objectType = new InterfaceType(objectClass);

  TypeParameter typeParam(String name, [DartType bound]) {
    return new TypeParameter(name, bound ?? objectType);
  }

  Class class_(String name,
      {Supertype supertype,
      List<TypeParameter> typeParameters,
      List<Supertype> implementedTypes}) {
    return new Class(
        name: name,
        supertype: supertype ?? objectClass.asThisSupertype,
        typeParameters: typeParameters,
        implementedTypes: implementedTypes);
  }

  addClass(coreLib, class_('Null'));
  addClass(coreLib, class_('bool'));
  var num = addClass(coreLib, class_('num'));
  addClass(coreLib, class_('String'));
  var iterable =
      addClass(coreLib, class_('Iterable', typeParameters: [typeParam('T')]));
  {
    var T = typeParam('T');
    addClass(
        coreLib,
        class_('List', typeParameters: [
          T
        ], implementedTypes: [
          new Supertype(iterable, [new TypeParameterType(T)])
        ]));
  }
  addClass(
      coreLib, class_('Map', typeParameters: [typeParam('K'), typeParam('V')]));
  addClass(coreLib, class_('int', supertype: num.asThisSupertype));
  addClass(coreLib, class_('double', supertype: num.asThisSupertype));
  addClass(coreLib, class_('Iterator', typeParameters: [typeParam('T')]));
  addClass(coreLib, class_('Symbol'));
  addClass(coreLib, class_('Type'));
  addClass(coreLib, class_('Function'));
  addClass(coreLib, class_('Invocation'));
  addClass(asyncLib, class_('Future', typeParameters: [typeParam('T')]));
  addClass(asyncLib, class_('FutureOr', typeParameters: [typeParam('T')]));
  addClass(asyncLib, class_('Stream', typeParameters: [typeParam('T')]));
  addClass(internalLib, class_('Symbol'));

  return new Component(libraries: [coreLib, asyncLib, internalLib]);
}
