/*
 * Copyright (c) 2018-present, Facebook, Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

class InnerClass {
  synchronized void outerInnerOk(InnerClassA a) {
    a.foo();
  }

  synchronized void bar() {}

  synchronized void outerInnerBad(InnerClassA a) {
    a.baz();
  }

  class InnerClassA {
    void foo() {
      synchronized (InnerClass.this) {
      }
    }

    void outerInnerOk() {
      synchronized (InnerClass.this) {
        InnerClass.this.bar();
      }
    }

    synchronized void baz() {}

    synchronized void innerOuterBad() {
      InnerClass.this.bar();
    }

    // ctrs generate different access paths so test these too
    // following should not be flagged
    InnerClassA() {
      synchronized (InnerClass.this) {
        InnerClass.this.bar();
      }
    }

    // following should be flagged with outer_inner_bad()
    InnerClassA(Object o) {
      synchronized (this) {
        InnerClass.this.bar();
      }
    }
  }
}
