// 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 '../elements/entities.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 {
  JavaScriptConstantCompiler jsConstantCompiler;

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

  String get name => 'ConstantHandler';
}

/// 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();

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

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