// Copyright (c) 2016, 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 fasta.messages;

import 'package:kernel/ast.dart'
    show Library, Location, Component, Source, TreeNode;

import 'compiler_context.dart' show CompilerContext;

export 'fasta_codes.dart';

bool get isVerbose => CompilerContext.current.options.verbose;

Location? getLocation(Uri uri, int charOffset) {
  return CompilerContext.current.uriToSource[uri]?.getLocation(uri, charOffset);
}

Location? getLocationFromUri(Uri uri, int charOffset) {
  if (charOffset == -1) return null;
  return getLocation(uri, charOffset);
}

String? getSourceLine(Location? location, [Map<Uri, Source>? uriToSource]) {
  if (location == null) return null;
  uriToSource ??= CompilerContext.current.uriToSource;
  return uriToSource[location.file]?.getTextLine(location.line);
}

Location? getLocationFromNode(TreeNode node) {
  if (node.enclosingComponent == null) {
    TreeNode? parent = node;
    while (parent != null && parent is! Library) {
      parent = parent.parent;
    }
    if (parent is Library) {
      Component component = CompilerContext.current.options.target
          .configureComponent(
              new Component(uriToSource: CompilerContext.current.uriToSource));
      component.libraries.add(parent);
      parent.parent = component;
      Location? result = node.location;
      component.libraries.clear();
      parent.parent = null;
      return result;
    } else {
      return null;
    }
  } else {
    return node.location;
  }
}
