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

import 'package:kernel/ast.dart' show DartType, InvalidType;

import '../fasta_codes.dart'
    show LocatedMessage, Message, noLength, templateTypeNotFound;

import 'kernel_builder.dart'
    show InvalidTypeBuilder, KernelTypeBuilder, LibraryBuilder;

class KernelInvalidTypeBuilder
    extends InvalidTypeBuilder<KernelTypeBuilder, DartType> {
  @override
  final LocatedMessage message;

  KernelInvalidTypeBuilder(String name, int charOffset, Uri fileUri,
      [Message message])
      : message = (message ?? templateTypeNotFound.withArguments(name))
            .withLocation(fileUri, charOffset, noLength),
        super(name, charOffset, fileUri);

  @override
  InvalidType get target => const InvalidType();

  DartType buildType(
      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
    return buildTypesWithBuiltArguments(library, null);
  }

  /// [Arguments] have already been built.
  DartType buildTypesWithBuiltArguments(
      LibraryBuilder library, List<DartType> arguments) {
    library.addProblem(
        message.messageObject, message.charOffset, message.length, message.uri);
    return const InvalidType();
  }
}
