// 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]) =>
      (new 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._() {
    BuiltValueNullFieldError.checkNotNull(annotations, r'Field', 'annotations');
    BuiltValueNullFieldError.checkNotNull(docs, r'Field', 'docs');
    BuiltValueNullFieldError.checkNotNull(static, r'Field', 'static');
    BuiltValueNullFieldError.checkNotNull(late, r'Field', 'late');
    BuiltValueNullFieldError.checkNotNull(external, r'Field', 'external');
    BuiltValueNullFieldError.checkNotNull(name, r'Field', 'name');
    BuiltValueNullFieldError.checkNotNull(modifier, r'Field', 'modifier');
  }

  @override
  Field rebuild(void Function(FieldBuilder) updates) =>
      (toBuilder()..update(updates)).build();

  @override
  _$FieldBuilder toBuilder() => new _$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) {
    ArgumentError.checkNotNull(other, '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 ??
          new _$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 new BuiltValueNestedFieldError(
          r'Field',
          _$failedField,
          e.toString(),
        );
      }
      rethrow;
    }
    replace(_$result);
    return _$result;
  }
}

// ignore_for_file: deprecated_member_use_from_same_package,type=lint
