// Copyright (c) 2018, 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';

import 'package:dart2js_tools/src/util.dart';

/// Script to show a text representation of the inlining data attached to
/// source-map files.
///
/// This expands the push/pop operations and checks simple invariants (e.g. that
/// the stack is always empty at the beginning of a function).
main(List<String> args) {
  if (args.length != 1) {
    print('usage: show_inline_data.dart <js-file>');
    exit(1);
  }
  var uri = Uri.base.resolve(args[0]);
  var provider = new CachingFileProvider();

  var mapping = provider.mappingFor(uri);
  var starts = functionStarts(provider.sourcesFor(uri));
  var file = provider.fileFor(uri);
  var frames = mapping.frames;
  var offsets = frames.keys.toList()..sort();
  var sb = new StringBuffer();
  int depth = 0;
  int? lastFunctionStart = null;
  for (var offset in offsets) {
    int functionStart = nextFunctionStart(starts, offset, lastFunctionStart);
    if (lastFunctionStart == null || functionStart > lastFunctionStart) {
      sb.write('\n${location(starts[functionStart], file)}: function start\n');

      if (depth != 0) {
        sb.write(
            "[31m[invalid] function start with non-zero depth: $depth[0m\n");
      }
      lastFunctionStart = functionStart;
    }

    var offsetPrefix = '${location(offset, file)}:';
    var pad = ' ' * offsetPrefix.length;
    sb.write(offsetPrefix);
    bool first = true;
    for (var frame in frames[offset]!) {
      if (!first) sb.write('$pad');
      sb.write(' $frame\n');
      first = false;
      if (frame.isPush) depth++;
      if (frame.isPop) depth--;
      if (frame.isEmpty && depth != 0) {
        sb.write("[31m[invalid] pop-empty with non-zero depth: $depth[0m\n");
      }
      if (!frame.isEmpty && depth == 0) {
        sb.write("[31m[invalid] non-empty pop with zero depth: $depth[0m\n");
      }
      if (depth < 0) {
        sb.write("[31m[invalid] negative depth: $depth[0m\n");
      }
    }
  }
  print('$sb');
}

var _functionDeclarationRegExp = new RegExp(r':( )?function\(');

List<int> functionStarts(String sources) {
  List<int> result = [];
  int index = sources.indexOf(_functionDeclarationRegExp);
  while (index != -1) {
    result.add(index + 2);
    index = sources.indexOf(_functionDeclarationRegExp, index + 1);
  }
  return result;
}

int nextFunctionStart(List<int> starts, int offset, int? last) {
  int j = last ?? 0;
  for (; j < starts.length && starts[j] <= offset; j++);
  return j - 1;
}

String location(int offset, file) {
  var line = file.getLine(offset) + 1;
  var column = file.getColumn(offset) + 1;
  var location = '$offset ($line:$column)';
  return location + (' ' * (16 - location.length));
}
