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

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

import '../fasta_codes.dart' show LocatedMessage;
import '../scope.dart';

import 'library_builder.dart';
import 'nullability_builder.dart';
import 'type_builder.dart';
import 'type_declaration_builder.dart';

class InvalidTypeDeclarationBuilder extends TypeDeclarationBuilderImpl
    with ErroneousMemberBuilderMixin {
  String get debugName => "InvalidTypeBuilder";

  final LocatedMessage message;

  final List<LocatedMessage> context;

  final bool suppressMessage;

  InvalidTypeDeclarationBuilder(String name, this.message,
      {this.context, this.suppressMessage: true})
      : super(null, 0, name, null, message.charOffset, message.uri);

  DartType buildType(LibraryBuilder library,
      NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
      [bool notInstanceContext]) {
    return buildTypesWithBuiltArguments(library, null, null);
  }

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