// Copyright (c) 2023, 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:io' show File;

import 'binary_md_dill_reader.dart' show BinaryMdDillReader;
import 'utils/io_utils.dart' show computeRepoDir;

void main() {
  File binaryMd = new File("$repoDir/pkg/kernel/binary.md");
  String binaryMdContent = binaryMd.readAsStringSync();

  BinaryMdDillReader binaryMdDillReader =
      new BinaryMdDillReader(binaryMdContent, const <int>[]);
  binaryMdDillReader.setup();

  List<String> errors = [];
  binaryMdDillReader.readingInstructions.forEach((clazz, fields) {
    if (binaryMdDillReader.isA(clazz, "Expression") &&
        !binaryMdDillReader.isAbstract(clazz)) {
      bool foundOffset = false;
      for (String field in fields) {
        if (field == 'FileOffset fileOffset;') {
          foundOffset = true;
          break;
        }
      }
      if (!foundOffset) {
        errors.add("$clazz missing required field 'fileOffset'.");
      }
    }
  });

  if (errors.isNotEmpty) {
    throw Exception(
        'Found the following errors with binary.md: ${errors.join('\n')}');
  }
}

final String repoDir = computeRepoDir();
