// Copyright (c) 2012, 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 dart2js.common.registry;

import '../dart_types.dart' show
    InterfaceType;
import '../enqueue.dart' show
    Enqueuer;
import '../elements/elements.dart' show
    Element,
    FunctionElement;
import '../universe/use.dart' show
    DynamicUse,
    StaticUse;

/// Interface for registration of element dependencies.
abstract class Registry {
  // TODO(johnniwinther): Remove this.
  void registerDependency(Element element) {}

  bool get isForResolution;

  void registerDynamicUse(DynamicUse staticUse);

  void registerStaticUse(StaticUse staticUse);

  void registerInstantiation(InterfaceType type);
}

// TODO(johnniwinther): Remove this.
class EagerRegistry extends Registry {
  final String name;
  final Enqueuer world;

  EagerRegistry(this.name, this.world);

  bool get isForResolution => world.isResolutionQueue;

  @override
  void registerDynamicUse(DynamicUse dynamicUse) {
    world.registerDynamicUse(dynamicUse);
  }

  @override
  void registerInstantiation(InterfaceType type) {
    world.registerInstantiatedType(type);
  }

  @override
  void registerStaticUse(StaticUse staticUse) {
    world.registerStaticUse(staticUse);
  }

  String toString() => name;
}
