// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'field.dart';

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

class _$Field extends Field {
  @override
  final BuiltList<Expression> annotations;
  @override
  final BuiltList<String> docs;
  @override
  final Code? assignment;
  @override
  final bool static;
  @override
  final bool late;
  @override
  final bool external;
  @override
  final String name;
  @override
  final Reference? type;
  @override
  final FieldModifier modifier;

  factory _$Field([void Function(FieldBuilder)? updates]) =>
      (FieldBuilder()..update(updates)).build() as _$Field;

  _$Field._({
    required this.annotations,
    required this.docs,
    this.assignment,
    required this.static,
    required this.late,
    required this.external,
    required this.name,
    this.type,
    required this.modifier,
  }) : super._();
  @override
  Field rebuild(void Function(FieldBuilder) updates) =>
      (toBuilder()..update(updates)).build();

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

  @override
  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    return other is Field &&
        annotations == other.annotations &&
        docs == other.docs &&
        assignment == other.assignment &&
        static == other.static &&
        late == other.late &&
        external == other.external &&
        name == other.name &&
        type == other.type &&
        modifier == other.modifier;
  }

  @override
  int get hashCode {
    var _$hash = 0;
    _$hash = $jc(_$hash, annotations.hashCode);
    _$hash = $jc(_$hash, docs.hashCode);
    _$hash = $jc(_$hash, assignment.hashCode);
    _$hash = $jc(_$hash, static.hashCode);
    _$hash = $jc(_$hash, late.hashCode);
    _$hash = $jc(_$hash, external.hashCode);
    _$hash = $jc(_$hash, name.hashCode);
    _$hash = $jc(_$hash, type.hashCode);
    _$hash = $jc(_$hash, modifier.hashCode);
    _$hash = $jf(_$hash);
    return _$hash;
  }

  @override
  String toString() {
    return (newBuiltValueToStringHelper(r'Field')
          ..add('annotations', annotations)
          ..add('docs', docs)
          ..add('assignment', assignment)
          ..add('static', static)
          ..add('late', late)
          ..add('external', external)
          ..add('name', name)
          ..add('type', type)
          ..add('modifier', modifier))
        .toString();
  }
}

class _$FieldBuilder extends FieldBuilder {
  _$Field? _$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
  Code? get assignment {
    _$this;
    return super.assignment;
  }

  @override
  set assignment(Code? assignment) {
    _$this;
    super.assignment = assignment;
  }

  @override
  bool get static {
    _$this;
    return super.static;
  }

  @override
  set static(bool static) {
    _$this;
    super.static = static;
  }

  @override
  bool get late {
    _$this;
    return super.late;
  }

  @override
  set late(bool late) {
    _$this;
    super.late = late;
  }

  @override
  bool get external {
    _$this;
    return super.external;
  }

  @override
  set external(bool external) {
    _$this;
    super.external = external;
  }

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

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

  @override
  Reference? get type {
    _$this;
    return super.type;
  }

  @override
  set type(Reference? type) {
    _$this;
    super.type = type;
  }

  @override
  FieldModifier get modifier {
    _$this;
    return super.modifier;
  }

  @override
  set modifier(FieldModifier modifier) {
    _$this;
    super.modifier = modifier;
  }

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

  FieldBuilder get _$this {
    final $v = _$v;
    if ($v != null) {
      super.annotations = $v.annotations.toBuilder();
      super.docs = $v.docs.toBuilder();
      super.assignment = $v.assignment;
      super.static = $v.static;
      super.late = $v.late;
      super.external = $v.external;
      super.name = $v.name;
      super.type = $v.type;
      super.modifier = $v.modifier;
      _$v = null;
    }
    return this;
  }

  @override
  void replace(Field other) {
    _$v = other as _$Field;
  }

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

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

  _$Field _build() {
    _$Field _$result;
    try {
      _$result =
          _$v ??
          _$Field._(
            annotations: annotations.build(),
            docs: docs.build(),
            assignment: assignment,
            static: BuiltValueNullFieldError.checkNotNull(
              static,
              r'Field',
              'static',
            ),
            late: BuiltValueNullFieldError.checkNotNull(late, r'Field', 'late'),
            external: BuiltValueNullFieldError.checkNotNull(
              external,
              r'Field',
              'external',
            ),
            name: BuiltValueNullFieldError.checkNotNull(name, r'Field', 'name'),
            type: type,
            modifier: BuiltValueNullFieldError.checkNotNull(
              modifier,
              r'Field',
              'modifier',
            ),
          );
    } catch (_) {
      late String _$failedField;
      try {
        _$failedField = 'annotations';
        annotations.build();
        _$failedField = 'docs';
        docs.build();
      } catch (e) {
        throw BuiltValueNestedFieldError(r'Field', _$failedField, e.toString());
      }
      rethrow;
    }
    replace(_$result);
    return _$result;
  }
}

// ignore_for_file: deprecated_member_use_from_same_package,type=lint
