// Copyright (c) 2014, 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 '../compile_time_constants.dart';
import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constant_system_dart.dart';
import '../elements/entities.dart';
import 'constant_system_javascript.dart';

/// [ConstantCompilerTask] for compilation of constants for the JavaScript
/// backend.
///
/// Since this task needs to distinguish between frontend and backend constants
/// the actual compilation of the constants is forwarded to a
/// [DartConstantCompiler] for the frontend interpretation of the constants and
/// to a [JavaScriptConstantCompiler] for the backend interpretation.
class JavaScriptConstantTask extends ConstantCompilerTask {
  ConstantSystem dartConstantSystem;
  JavaScriptConstantCompiler jsConstantCompiler;

  JavaScriptConstantTask(Compiler compiler)
      : this.dartConstantSystem = const DartConstantSystem(),
        this.jsConstantCompiler = new JavaScriptConstantCompiler(),
        super(compiler.measurer);

  String get name => 'ConstantHandler';

  @override
  ConstantSystem get constantSystem => dartConstantSystem;
}

/// The [JavaScriptConstantCompiler] is used to keep track of compile-time
/// constants, initializations of global and static fields, and default values
/// of optional parameters for the JavaScript interpretation of constants.
class JavaScriptConstantCompiler implements BackendConstantEnvironment {
  // TODO(johnniwinther): Move this to the backend constant handler.
  /// Caches the statics where the initial value cannot be eagerly compiled.
  final Set<FieldEntity> lazyStatics = new Set<FieldEntity>();

  JavaScriptConstantCompiler();

  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;

  @override
  void registerLazyStatic(FieldEntity element) {
    lazyStatics.add(element);
  }

  List<FieldEntity> getLazilyInitializedFieldsForEmission() {
    return new List<FieldEntity>.from(lazyStatics);
  }
}
