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

import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
import 'package:kernel/ast.dart' show Class, DartType, ExtensionTypeDeclaration;

import '../builder/declaration_builders.dart';
import '../builder/library_builder.dart';
import '../builder/type_builder.dart';
import 'messages.dart' show FormattedMessage, LocatedMessage, Message;

const String untranslatableUriScheme = "org-dartlang-untranslatable-uri";

abstract class Loader {
  /// Register [message] as a problem with a severity determined by the
  /// intrinsic severity of the message.
  FormattedMessage? addProblem(
      Message message, int charOffset, int length, Uri? fileUri,
      {bool wasHandled = false,
      List<LocatedMessage>? context,
      Severity? severity,
      bool problemOnLibrary = false,
      List<Uri>? involvedFiles});

  ClassBuilder computeClassBuilderFromTargetClass(Class cls);

  ExtensionTypeDeclarationBuilder
      computeExtensionTypeBuilderFromTargetExtensionType(
          ExtensionTypeDeclaration extensionType);

  TypeBuilder computeTypeBuilder(DartType type);

  /// The [LibraryBuilder] for 'dart:core'.
  LibraryBuilder get coreLibrary;

  /// The main compilation unit for 'dart:core'.
  CompilationUnit get coreLibraryCompilationUnit;
}
