// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'library.dart';

// **************************************************************************
// BuiltValueGenerator
// **************************************************************************

class _$Library extends Library {
  @override
  final BuiltList<Expression> annotations;
  @override
  final BuiltList<String> docs;
  @override
  final BuiltList<Directive> directives;
  @override
  final BuiltList<Spec> body;
  @override
  final BuiltList<String> comments;
  @override
  final String? generatedByComment;
  @override
  final BuiltList<String> ignoreForFile;
  @override
  final String? name;

  factory _$Library([void Function(LibraryBuilder)? updates]) =>
      (new LibraryBuilder()..update(updates)).build() as _$Library;

  _$Library._({
    required this.annotations,
    required this.docs,
    required this.directives,
    required this.body,
    required this.comments,
    this.generatedByComment,
    required this.ignoreForFile,
    this.name,
  }) : super._() {
    BuiltValueNullFieldError.checkNotNull(
      annotations,
      r'Library',
      'annotations',
    );
    BuiltValueNullFieldError.checkNotNull(docs, r'Library', 'docs');
    BuiltValueNullFieldError.checkNotNull(directives, r'Library', 'directives');
    BuiltValueNullFieldError.checkNotNull(body, r'Library', 'body');
    BuiltValueNullFieldError.checkNotNull(comments, r'Library', 'comments');
    BuiltValueNullFieldError.checkNotNull(
      ignoreForFile,
      r'Library',
      'ignoreForFile',
    );
  }

  @override
  Library rebuild(void Function(LibraryBuilder) updates) =>
      (toBuilder()..update(updates)).build();

  @override
  _$LibraryBuilder toBuilder() => new _$LibraryBuilder()..replace(this);

  @override
  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    return other is Library &&
        annotations == other.annotations &&
        docs == other.docs &&
        directives == other.directives &&
        body == other.body &&
        comments == other.comments &&
        generatedByComment == other.generatedByComment &&
        ignoreForFile == other.ignoreForFile &&
        name == other.name;
  }

  @override
  int get hashCode {
    var _$hash = 0;
    _$hash = $jc(_$hash, annotations.hashCode);
    _$hash = $jc(_$hash, docs.hashCode);
    _$hash = $jc(_$hash, directives.hashCode);
    _$hash = $jc(_$hash, body.hashCode);
    _$hash = $jc(_$hash, comments.hashCode);
    _$hash = $jc(_$hash, generatedByComment.hashCode);
    _$hash = $jc(_$hash, ignoreForFile.hashCode);
    _$hash = $jc(_$hash, name.hashCode);
    _$hash = $jf(_$hash);
    return _$hash;
  }

  @override
  String toString() {
    return (newBuiltValueToStringHelper(r'Library')
          ..add('annotations', annotations)
          ..add('docs', docs)
          ..add('directives', directives)
          ..add('body', body)
          ..add('comments', comments)
          ..add('generatedByComment', generatedByComment)
          ..add('ignoreForFile', ignoreForFile)
          ..add('name', name))
        .toString();
  }
}

class _$LibraryBuilder extends LibraryBuilder {
  _$Library? _$v;

  @override
  ListBuilder<Expression> get annotations {
    _$this;
    return super.annotations;
  }

  @override
  set annotations(ListBuilder<Expression> annotations) {
    _$this;
    super.annotations = annotations;
  }

  @override
  ListBuilder<String> get docs {
    _$this;
    return super.docs;
  }

  @override
  set docs(ListBuilder<String> docs) {
    _$this;
    super.docs = docs;
  }

  @override
  ListBuilder<Directive> get directives {
    _$this;
    return super.directives;
  }

  @override
  set directives(ListBuilder<Directive> directives) {
    _$this;
    super.directives = directives;
  }

  @override
  ListBuilder<Spec> get body {
    _$this;
    return super.body;
  }

  @override
  set body(ListBuilder<Spec> body) {
    _$this;
    super.body = body;
  }

  @override
  ListBuilder<String> get comments {
    _$this;
    return super.comments;
  }

  @override
  set comments(ListBuilder<String> comments) {
    _$this;
    super.comments = comments;
  }

  @override
  String? get generatedByComment {
    _$this;
    return super.generatedByComment;
  }

  @override
  set generatedByComment(String? generatedByComment) {
    _$this;
    super.generatedByComment = generatedByComment;
  }

  @override
  ListBuilder<String> get ignoreForFile {
    _$this;
    return super.ignoreForFile;
  }

  @override
  set ignoreForFile(ListBuilder<String> ignoreForFile) {
    _$this;
    super.ignoreForFile = ignoreForFile;
  }

  @override
  String? get name {
    _$this;
    return super.name;
  }

  @override
  set name(String? name) {
    _$this;
    super.name = name;
  }

  _$LibraryBuilder() : super._();

  LibraryBuilder get _$this {
    final $v = _$v;
    if ($v != null) {
      super.annotations = $v.annotations.toBuilder();
      super.docs = $v.docs.toBuilder();
      super.directives = $v.directives.toBuilder();
      super.body = $v.body.toBuilder();
      super.comments = $v.comments.toBuilder();
      super.generatedByComment = $v.generatedByComment;
      super.ignoreForFile = $v.ignoreForFile.toBuilder();
      super.name = $v.name;
      _$v = null;
    }
    return this;
  }

  @override
  void replace(Library other) {
    ArgumentError.checkNotNull(other, 'other');
    _$v = other as _$Library;
  }

  @override
  void update(void Function(LibraryBuilder)? updates) {
    if (updates != null) updates(this);
  }

  @override
  Library build() => _build();

  _$Library _build() {
    _$Library _$result;
    try {
      _$result =
          _$v ??
          new _$Library._(
            annotations: annotations.build(),
            docs: docs.build(),
            directives: directives.build(),
            body: body.build(),
            comments: comments.build(),
            generatedByComment: generatedByComment,
            ignoreForFile: ignoreForFile.build(),
            name: name,
          );
    } catch (_) {
      late String _$failedField;
      try {
        _$failedField = 'annotations';
        annotations.build();
        _$failedField = 'docs';
        docs.build();
        _$failedField = 'directives';
        directives.build();
        _$failedField = 'body';
        body.build();
        _$failedField = 'comments';
        comments.build();

        _$failedField = 'ignoreForFile';
        ignoreForFile.build();
      } catch (e) {
        throw new BuiltValueNestedFieldError(
          r'Library',
          _$failedField,
          e.toString(),
        );
      }
      rethrow;
    }
    replace(_$result);
    return _$result;
  }
}

// ignore_for_file: deprecated_member_use_from_same_package,type=lint
