// 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.

// @dart = 2.9

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;
  }
}
