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