// Copyright (c) 2017, 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 'package:_fe_analyzer_shared/src/testing/id.dart';
import 'package:compiler/src/common.dart';
import 'package:compiler/src/ir/util.dart';
import 'package:compiler/src/js_model/locals.dart';
import 'package:expect/expect.dart';
import 'package:kernel/ast.dart' as ir;
import 'package:front_end/src/api_prototype/testing.dart';

export 'package:_fe_analyzer_shared/src/testing/id.dart';
export 'package:front_end/src/api_prototype/testing.dart'
    show computeMemberId, computeTreeNodeWithOffset;

SourceSpan computeSourceSpanFromUriOffset(Uri uri, int offset) {
  return offset != -1
      ? SourceSpan(uri, offset, offset + 1)
      : SourceSpan(uri, 0, 0);
}

mixin IrDataRegistryMixin<T> implements DataRegistry<T> {
  DiagnosticReporter get reporter;

  @override
  void report(Uri uri, int offset, String message) {
    reportHere(reporter, computeSourceSpanFromUriOffset(uri, offset), message);
  }

  @override
  void fail(String message) {
    Expect.fail(message);
  }
}

abstract class IrDataExtractor<T> extends DataExtractor<T>
    with IrDataRegistryMixin<T> {
  @override
  final DiagnosticReporter reporter;

  IrDataExtractor(this.reporter, Map<Id, ActualData<T>> actualMap)
      : super(actualMap);

  SourceSpan computeSourceSpan(ir.TreeNode node) {
    return computeSourceSpanFromTreeNode(node);
  }

  @override
  visitLabeledStatement(ir.LabeledStatement node) {
    if (!JumpVisitor.canBeBreakTarget(node.body) &&
        !JumpVisitor.canBeContinueTarget(node.parent!)) {
      computeForNode(node, createLabeledStatementId(node));
    }
    super.visitLabeledStatement(node);
  }
}

/// Print a message with a source location.
void reportHere(
    DiagnosticReporter reporter, Spannable node, String debugMessage) {
  reporter.reportInfoMessage(
      node, MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
}
