// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'method.dart';

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

class _$Method extends Method {
  @override
  final BuiltList<Expression> annotations;
  @override
  final BuiltList<String> docs;
  @override
  final BuiltList<Reference> types;
  @override
  final BuiltList<Parameter> optionalParameters;
  @override
  final BuiltList<Parameter> requiredParameters;
  @override
  final Code? body;
  @override
  final bool external;
  @override
  final bool? lambda;
  @override
  final bool static;
  @override
  final String? name;
  @override
  final MethodType? type;
  @override
  final MethodModifier? modifier;
  @override
  final Reference? returns;

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

  _$Method._({
    required this.annotations,
    required this.docs,
    required this.types,
    required this.optionalParameters,
    required this.requiredParameters,
    this.body,
    required this.external,
    this.lambda,
    required this.static,
    this.name,
    this.type,
    this.modifier,
    this.returns,
  }) : super._();
  @override
  Method rebuild(void Function(MethodBuilder) updates) =>
      (toBuilder()..update(updates)).build();

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

  @override
  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    return other is Method &&
        annotations == other.annotations &&
        docs == other.docs &&
        types == other.types &&
        optionalParameters == other.optionalParameters &&
        requiredParameters == other.requiredParameters &&
        body == other.body &&
        external == other.external &&
        lambda == other.lambda &&
        static == other.static &&
        name == other.name &&
        type == other.type &&
        modifier == other.modifier &&
        returns == other.returns;
  }

  @override
  int get hashCode {
    var _$hash = 0;
    _$hash = $jc(_$hash, annotations.hashCode);
    _$hash = $jc(_$hash, docs.hashCode);
    _$hash = $jc(_$hash, types.hashCode);
    _$hash = $jc(_$hash, optionalParameters.hashCode);
    _$hash = $jc(_$hash, requiredParameters.hashCode);
    _$hash = $jc(_$hash, body.hashCode);
    _$hash = $jc(_$hash, external.hashCode);
    _$hash = $jc(_$hash, lambda.hashCode);
    _$hash = $jc(_$hash, static.hashCode);
    _$hash = $jc(_$hash, name.hashCode);
    _$hash = $jc(_$hash, type.hashCode);
    _$hash = $jc(_$hash, modifier.hashCode);
    _$hash = $jc(_$hash, returns.hashCode);
    _$hash = $jf(_$hash);
    return _$hash;
  }

  @override
  String toString() {
    return (newBuiltValueToStringHelper(r'Method')
          ..add('annotations', annotations)
          ..add('docs', docs)
          ..add('types', types)
          ..add('optionalParameters', optionalParameters)
          ..add('requiredParameters', requiredParameters)
          ..add('body', body)
          ..add('external', external)
          ..add('lambda', lambda)
          ..add('static', static)
          ..add('name', name)
          ..add('type', type)
          ..add('modifier', modifier)
          ..add('returns', returns))
        .toString();
  }
}

class _$MethodBuilder extends MethodBuilder {
  _$Method? _$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<Reference> get types {
    _$this;
    return super.types;
  }

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

  @override
  ListBuilder<Parameter> get optionalParameters {
    _$this;
    return super.optionalParameters;
  }

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

  @override
  ListBuilder<Parameter> get requiredParameters {
    _$this;
    return super.requiredParameters;
  }

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

  @override
  Code? get body {
    _$this;
    return super.body;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  MethodBuilder get _$this {
    final $v = _$v;
    if ($v != null) {
      super.annotations = $v.annotations.toBuilder();
      super.docs = $v.docs.toBuilder();
      super.types = $v.types.toBuilder();
      super.optionalParameters = $v.optionalParameters.toBuilder();
      super.requiredParameters = $v.requiredParameters.toBuilder();
      super.body = $v.body;
      super.external = $v.external;
      super.lambda = $v.lambda;
      super.static = $v.static;
      super.name = $v.name;
      super.type = $v.type;
      super.modifier = $v.modifier;
      super.returns = $v.returns;
      _$v = null;
    }
    return this;
  }

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

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

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

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

class _$Parameter extends Parameter {
  @override
  final Code? defaultTo;
  @override
  final String name;
  @override
  final bool named;
  @override
  final bool toThis;
  @override
  final bool toSuper;
  @override
  final BuiltList<Expression> annotations;
  @override
  final BuiltList<String> docs;
  @override
  final BuiltList<Reference> types;
  @override
  final Reference? type;
  @override
  final bool required;
  @override
  final bool covariant;

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

  _$Parameter._({
    this.defaultTo,
    required this.name,
    required this.named,
    required this.toThis,
    required this.toSuper,
    required this.annotations,
    required this.docs,
    required this.types,
    this.type,
    required this.required,
    required this.covariant,
  }) : super._();
  @override
  Parameter rebuild(void Function(ParameterBuilder) updates) =>
      (toBuilder()..update(updates)).build();

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

  @override
  bool operator ==(Object other) {
    if (identical(other, this)) return true;
    return other is Parameter &&
        defaultTo == other.defaultTo &&
        name == other.name &&
        named == other.named &&
        toThis == other.toThis &&
        toSuper == other.toSuper &&
        annotations == other.annotations &&
        docs == other.docs &&
        types == other.types &&
        type == other.type &&
        required == other.required &&
        covariant == other.covariant;
  }

  @override
  int get hashCode {
    var _$hash = 0;
    _$hash = $jc(_$hash, defaultTo.hashCode);
    _$hash = $jc(_$hash, name.hashCode);
    _$hash = $jc(_$hash, named.hashCode);
    _$hash = $jc(_$hash, toThis.hashCode);
    _$hash = $jc(_$hash, toSuper.hashCode);
    _$hash = $jc(_$hash, annotations.hashCode);
    _$hash = $jc(_$hash, docs.hashCode);
    _$hash = $jc(_$hash, types.hashCode);
    _$hash = $jc(_$hash, type.hashCode);
    _$hash = $jc(_$hash, required.hashCode);
    _$hash = $jc(_$hash, covariant.hashCode);
    _$hash = $jf(_$hash);
    return _$hash;
  }

  @override
  String toString() {
    return (newBuiltValueToStringHelper(r'Parameter')
          ..add('defaultTo', defaultTo)
          ..add('name', name)
          ..add('named', named)
          ..add('toThis', toThis)
          ..add('toSuper', toSuper)
          ..add('annotations', annotations)
          ..add('docs', docs)
          ..add('types', types)
          ..add('type', type)
          ..add('required', required)
          ..add('covariant', covariant))
        .toString();
  }
}

class _$ParameterBuilder extends ParameterBuilder {
  _$Parameter? _$v;

  @override
  Code? get defaultTo {
    _$this;
    return super.defaultTo;
  }

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

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

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

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

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

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

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

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

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

  @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<Reference> get types {
    _$this;
    return super.types;
  }

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

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

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

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

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

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

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

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

  ParameterBuilder get _$this {
    final $v = _$v;
    if ($v != null) {
      super.defaultTo = $v.defaultTo;
      super.name = $v.name;
      super.named = $v.named;
      super.toThis = $v.toThis;
      super.toSuper = $v.toSuper;
      super.annotations = $v.annotations.toBuilder();
      super.docs = $v.docs.toBuilder();
      super.types = $v.types.toBuilder();
      super.type = $v.type;
      super.required = $v.required;
      super.covariant = $v.covariant;
      _$v = null;
    }
    return this;
  }

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

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

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

  _$Parameter _build() {
    _$Parameter _$result;
    try {
      _$result =
          _$v ??
          _$Parameter._(
            defaultTo: defaultTo,
            name: BuiltValueNullFieldError.checkNotNull(
              name,
              r'Parameter',
              'name',
            ),
            named: BuiltValueNullFieldError.checkNotNull(
              named,
              r'Parameter',
              'named',
            ),
            toThis: BuiltValueNullFieldError.checkNotNull(
              toThis,
              r'Parameter',
              'toThis',
            ),
            toSuper: BuiltValueNullFieldError.checkNotNull(
              toSuper,
              r'Parameter',
              'toSuper',
            ),
            annotations: annotations.build(),
            docs: docs.build(),
            types: types.build(),
            type: type,
            required: BuiltValueNullFieldError.checkNotNull(
              required,
              r'Parameter',
              'required',
            ),
            covariant: BuiltValueNullFieldError.checkNotNull(
              covariant,
              r'Parameter',
              'covariant',
            ),
          );
    } catch (_) {
      late String _$failedField;
      try {
        _$failedField = 'annotations';
        annotations.build();
        _$failedField = 'docs';
        docs.build();
        _$failedField = 'types';
        types.build();
      } catch (e) {
        throw BuiltValueNestedFieldError(
          r'Parameter',
          _$failedField,
          e.toString(),
        );
      }
      rethrow;
    }
    replace(_$result);
    return _$result;
  }
}

// ignore_for_file: deprecated_member_use_from_same_package,type=lint
