// Copyright (c) 2015, 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.

// @dart = 2.7

library sourcemap.trace_graph;

import 'dart:collection';

import 'package:compiler/src/io/source_information.dart';
import 'package:compiler/src/io/position_information.dart';
import 'package:compiler/src/js/js_debug.dart';

import 'sourcemap_html_helper.dart';

class TraceGraph {
  List<TraceStep> steps = <TraceStep>[];
  TraceStep entry;
  Queue stack = new Queue();
  Map<int, TraceStep> offsetMap = {};

  void addStep(TraceStep step) {
    steps.add(step);
    int offset = step.offset.value;
    TraceStep existingStep = offsetMap[offset];
    if (existingStep != null) {
      // TODO(johnniwinther): Fix problems with reuse of JS nodes from
      // templates.
      if (identical(existingStep.node, step.node)) {
        print('duplicate node: ${nodeToString(step.node)}');
      } else {
        print('duplicate offset: ${offset} : ${nodeToString(step.node)}');
      }
      print('  ${existingStep.id}:${existingStep.text}:${existingStep.offset}');
      print('  ${step.id}:${step.text}:${step.offset}');
    }
    offsetMap[offset] = step;
    step.stack = stack.toList();
  }

  void pushBranch(branch) {
    stack.addLast(branch);
  }

  void popBranch() {
    stack.removeLast();
  }
}

class TraceStep {
  final kind;
  final int id;
  final node;
  final Offset offset;
  final List text;
  final SourceLocation sourceLocation;

  TraceStep next;
  Map<dynamic, TraceStep> branchMap;

  List stack;

  TraceStep(this.kind, this.id, this.node, this.offset, this.text,
      [this.sourceLocation]);

  @override
  String toString() => '<span style="background:${toColorCss(id)}">$id</span>';
}
