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

import 'package:kernel/ast.dart' show InterfaceType, Supertype, TypedefType;

import '../problems.dart' show unsupported;
import '../source/source_library_builder.dart';

import 'library_builder.dart';
import 'named_type_builder.dart';
import 'nullability_builder.dart';
import 'type_builder.dart';
import 'type_variable_builder.dart';

class MixinApplicationBuilder extends TypeBuilder {
  final TypeBuilder? supertype;
  final List<TypeBuilder> mixins;
  @override
  final Uri fileUri;
  @override
  final int charOffset;
  Supertype? builtType;

  List<TypeVariableBuilder>? typeVariables;

  MixinApplicationBuilder(
      this.supertype, this.mixins, this.fileUri, this.charOffset);

  @override
  String? get name => null;

  @override
  NullabilityBuilder get nullabilityBuilder {
    return unsupported("nullabilityBuilder", -1, null);
  }

  @override
  String get debugName => "MixinApplicationBuilder";

  @override
  bool get isVoidType => false;

  @override
  StringBuffer printOn(StringBuffer buffer) {
    buffer.write(supertype);
    buffer.write(" with ");
    bool first = true;
    for (TypeBuilder t in mixins) {
      if (!first) buffer.write(", ");
      first = false;
      t.printOn(buffer);
    }
    return buffer;
  }

  @override
  InterfaceType build(LibraryBuilder library, {TypedefType? origin}) {
    int charOffset = -1; // TODO(ahe): Provide these.
    Uri? fileUri = null; // TODO(ahe): Provide these.
    return unsupported("build", charOffset, fileUri);
  }

  @override
  Supertype buildSupertype(
      LibraryBuilder library, int charOffset, Uri fileUri) {
    return unsupported("buildSupertype", charOffset, fileUri);
  }

  @override
  Supertype buildMixedInType(
      LibraryBuilder library, int charOffset, Uri fileUri) {
    return unsupported("buildMixedInType", charOffset, fileUri);
  }

  @override
  MixinApplicationBuilder withNullabilityBuilder(
      NullabilityBuilder nullabilityBuilder) {
    return unsupported("withNullabilityBuilder", -1, null);
  }

  @override
  MixinApplicationBuilder clone(
      List<NamedTypeBuilder> newTypes,
      SourceLibraryBuilder contextLibrary,
      TypeParameterScopeBuilder contextDeclaration) {
    int charOffset = -1; // TODO(dmitryas): Provide these.
    Uri? fileUri = null; // TODO(dmitryas): Provide these.
    return unsupported("clone", charOffset, fileUri);
  }
}
