// Copyright (c) 2019, 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 vm.bytecode.options;

/// Collection of options for bytecode generator.
class BytecodeOptions {
  static Map<String, String> commandLineFlags = {
    'annotations': 'Emit Dart annotations',
    'local-var-info': 'Emit debug information about local variables',
    'show-bytecode-size-stat': 'Show bytecode size breakdown',
    'source-positions': 'Emit source positions',
  };

  bool enableAsserts;
  bool causalAsyncStacks;
  bool emitSourcePositions;
  bool emitSourceFiles;
  bool emitLocalVarInfo;
  bool emitAnnotations;
  bool omitAssertSourcePositions;
  bool showBytecodeSizeStatistics;
  Map<String, String> environmentDefines;

  BytecodeOptions(
      {this.enableAsserts = false,
      this.causalAsyncStacks,
      this.emitSourcePositions = false,
      this.emitSourceFiles = false,
      this.emitLocalVarInfo = false,
      this.emitAnnotations = false,
      this.omitAssertSourcePositions = false,
      this.showBytecodeSizeStatistics = false,
      this.environmentDefines = const <String, String>{}}) {
    causalAsyncStacks ??=
        environmentDefines['dart.developer.causal_async_stacks'] == 'true';
  }

  void parseCommandLineFlags(List<String> flags) {
    if (flags == null) {
      return;
    }
    for (String flag in flags) {
      switch (flag) {
        case 'source-positions':
          emitSourcePositions = true;
          break;
        case 'local-var-info':
          emitLocalVarInfo = true;
          break;
        case 'annotations':
          emitAnnotations = true;
          break;
        case 'show-bytecode-size-stat':
          showBytecodeSizeStatistics = true;
          break;
        default:
          throw 'Unexpected bytecode flag $flag';
      }
    }
  }
}
