// Copyright (c) 2025, 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 'dart:typed_data' show Uint8List;

import 'package:dart2bytecode/bytecode_generator.dart' show generateBytecode;
import 'package:dart2bytecode/options.dart' show BytecodeOptions;
import 'package:kernel/ast.dart' show Component, Library;
import 'package:kernel/binary/ast_to_binary.dart' show BytesSink;
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/core_types.dart' show CoreTypes;
import 'package:kernel/target/targets.dart' show Target;

import '../../vm/bin/kernel_service.dart' as kernel_service;

Uint8List _generateBytecode(
  Component component,
  List<Library> libraries,
  CoreTypes coreTypes,
  ClassHierarchy hierarchy,
  Target target,
  bool enableAsserts, {
  Set<Library> extraLoadedLibraries = const {},
}) {
  final byteSink = new BytesSink();
  generateBytecode(
    component,
    byteSink,
    libraries: libraries,
    extraLoadedLibraries: extraLoadedLibraries,
    coreTypes: coreTypes,
    hierarchy: hierarchy,
    target: target,
    options: BytecodeOptions(
      enableAsserts: enableAsserts,
      emitSourcePositions: true,
      emitLocalVarInfo: true,
      emitInstanceFieldInitializers: true,
      embedSourceText: true,
      recordCoverage: true,
    ),
  );
  return byteSink.builder.takeBytes();
}

// Wire up bytecode generator to the kernel service to avoid
// circular dependency between package:vm and package:dart2bytecode.
main([args]) {
  kernel_service.bytecodeGenerator = _generateBytecode;
  return kernel_service.main(args);
}
