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

//ignore_for_file: unused_field, unused_local_variable, prefer_expression_function_bodies

class PrefixOps {
  bool _initialized = false; // LINT
  int _num = 1; // LINT
  int _num2 = 1; // OK
  int _bits = 0xffff; // LINT
  int getValue() {
    if (!_initialized) {
      return 0;
    }
    if (-_num == -1) {
      return 0;
    }
    if (~_bits == 0) {
      return 0;
    }
    if (--_num2 == 0) {
      return 0;
    }
    return 1;
  }
}

typedef bool Predicate();

class PostfixOps {
  int _num = 1; // OK
  int _num2 = 1; // OK
  String _string = ''; // LINT

  Predicate _predicate = () => false; // LINT

  int getValue() {
    if (_num-- == -1) {
      return 0;
    }
    if (_num2++ == 1) {
      return 0;
    }
    if (_predicate()) {
      return 1;
    }
    if (_string.length == 1) {
      return 0;
    }
    return 1;
  }
}

class FalsePositiveWhenReturn {
  int _value = 0;
  int getValue() {
    return ++_value; // OK
  }
}

class BadImmutable {
  var _label = 'hola mundo! BadImmutable'; // LINT
  var label = 'hola mundo! BadImmutable'; // OK
}

class GoodImmutable {
  final label = 'hola mundo! BadImmutable', bla = 5; // OK
  final _label = 'hola mundo! BadImmutable', _bla = 5; // OK
}

class GoodMutable {
  var _label = 'hola mundo! GoodMutable';
  var _someInt = 0;
  var _otherInt = 1;

  void changeLabel() {
    _label = 'hello world! GoodMutable';
    _someInt++;
    _otherInt += 2;
  }
}

class MultipleMutable {
  final int _someOther;
  var _label = 'hola mundo! GoodMutable', _offender = 'mumble mumble!'; // LINT
  var _never_initialized_field; // OK

  MultipleMutable.foo() : _someOther = 5;

  MultipleMutable(this._someOther);

  void changeLabel() {
    _label = 'hello world! GoodMutable';
  }
}

class BadMultipleFormals {
  var _label; // LINT
  BadMultipleFormals(this._label);
  BadMultipleFormals.withDefault(this._label);
}

class BadInitializer {
  var _label; // LINT
  BadInitializer() : _label = 'Hello';
}

class BadMultipleInitializer {
  var _label; // LINT
  BadMultipleInitializer() : _label = 'Hello';
  BadMultipleInitializer.withDefault() : _label = 'Default';
}

class BadMultipleMixConstructors {
  var _label; // LINT
  BadMultipleMixConstructors(this._label);
  BadMultipleMixConstructors.withDefault() : _label = 'Hello';
}

class GoodFormals {
  var _label; // OK
  GoodFormals(this._label);
  GoodFormals.empty();
}

class GoodInitializer {
  var _label; // OK
  GoodInitializer() : _label = 'Hello';
  GoodInitializer.empty();
}

class C {
  int _f = 0; // LINT
  void m() {
    String _f;
    _f = '';
  }
}

class D {
  int _f = 0; // OK
}

void accessD_f() {
  D d = new D();
  d._f = 42;
}

class E {
  int _f = 0; // LINT

  void useItInRightHandSide() {
    // ignore: unused_local_variable
    int a = _f;
  }
}

class F {
  var _array = []; // LINT

  void foo() {
    _array[0] = 3;
  }
}

// https://github.com/dart-lang/linter/issues/686
class IdBug686 {
  static int _id = 0;
  static String generateId({prefix: String}) {
    return (prefix ?? "id") + "-" + (_id++).toString() + "-" + _foo();
  }

  static String _foo() => '';
}

// analyzer's `FieldMember` vs `FieldElement` caused
// https://github.com/dart-lang/sdk/issues/34417
abstract class GenericBase<T> {
  int _current = 0; // OK
}

class GenericSub extends GenericBase<int> {
  void test() {
    _current = 1;
  }
}

class Z {
  /// Set in the top level [z] function below.
  int _z = 1; //OK
}

void z(Z z) {
  z._z = 0;
}
