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

part of 'fragment.dart';

class ExtensionFragment extends DeclarationFragmentImpl implements Fragment {
  final ExtensionName extensionName;

  final int nameOrExtensionOffset;

  SourceExtensionBuilder? _builder;

  late final List<MetadataBuilder>? metadata;
  late final Modifiers modifiers;
  late final TypeBuilder onType;
  late final int startOffset;
  late final int endOffset;

  @override
  late final UriOffsetLength uriOffset = isUnnamed
      ? new UriOffset(fileUri, nameOrExtensionOffset)
      : new UriOffsetLength(fileUri, nameOrExtensionOffset, name.length);

  ExtensionFragment({
    required String? name,
    required super.fileUri,
    required this.nameOrExtensionOffset,
    required super.typeParameters,
    required super.enclosingScope,
    required super.typeParameterScope,
    required super.nominalParameterNameSpace,
    required super.enclosingCompilationUnit,
  }) : extensionName = name != null
            ? new FixedExtensionName(name)
            : new UnnamedExtensionName();

  @override
  // Coverage-ignore(suite): Not run.
  SourceExtensionBuilder get builder {
    assert(_builder != null, "Builder has not been computed for $this.");
    return _builder!;
  }

  void set builder(SourceExtensionBuilder value) {
    assert(_builder == null, "Builder has already been computed for $this.");
    _builder = value;
  }

  @override
  bool get isPatch => enclosingCompilationUnit.isPatch && modifiers.isAugment;

  bool get isUnnamed => extensionName.isUnnamedExtension;

  @override
  DeclarationFragmentKind get kind =>
      DeclarationFragmentKind.extensionDeclaration;

  @override
  String get name => extensionName.name;

  @override
  String toString() => '$runtimeType($name,$fileUri,$nameOrExtensionOffset)';
}
