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

/// This library exports all API from Kernel that can be used throughout fasta.
library fasta.kernel_api;

export 'package:kernel/type_algebra.dart' show Substitution, substitute;

export 'package:kernel/class_hierarchy.dart' show ClassHierarchy;

export 'package:kernel/clone.dart' show CloneVisitorNotMembers;

export 'package:kernel/core_types.dart' show CoreTypes;

export 'package:kernel/transformations/flags.dart' show TransformerFlag;

export 'package:kernel/text/ast_to_text.dart' show NameSystem;

export 'package:kernel/type_environment.dart' show TypeEnvironment;

export 'package:kernel/src/bounds_checks.dart' show instantiateToBounds;

import 'package:kernel/text/ast_to_text.dart' show NameSystem, Printer;

import 'package:kernel/ast.dart' show Class, Member, Node;

void printNodeOn(Node node, StringSink sink, {NameSystem syntheticNames}) {
  if (node == null) {
    sink.write("null");
  } else {
    syntheticNames ??= new NameSystem();
    new Printer(sink, syntheticNames: syntheticNames).writeNode(node);
  }
}

void printQualifiedNameOn(Member member, StringSink sink,
    {NameSystem syntheticNames}) {
  if (member == null) {
    sink.write("null");
  } else {
    syntheticNames ??= new NameSystem();
    sink.write(member.enclosingLibrary.importUri);
    sink.write("::");
    Class cls = member.enclosingClass;
    if (cls != null) {
      sink.write(cls.name ?? syntheticNames.nameClass(cls));
      sink.write("::");
    }
    sink.write(member.name?.text ?? syntheticNames.nameMember(member));
  }
}
