// This test ensures that special handling for method names in DescribeImagesRequest isn't used for
// other classes with the same names.

import org.checkerframework.checker.calledmethods.qual.*;
import org.checkerframework.common.returnsreceiver.qual.*;

public class SpecialNames {
  @This SpecialNames withFilters() {
    return this;
  }

  void setFilters() {}

  @This SpecialNames withFilters(SpecialNames f) {
    return this;
  }

  void setFilters(SpecialNames f) {}

  @This SpecialNames withName() {
    return this;
  }

  @This SpecialNames withName(String f) {
    return this;
  }

  SpecialNames() {}

  SpecialNames(String x) {}

  static void test(SpecialNames s) {
    // :: error: assignment
    @CalledMethods("withOwners") SpecialNames x = s.withFilters(new SpecialNames().withName("owner"));
  }

  static void test2(SpecialNames s) {
    s.setFilters(new SpecialNames("owner"));
    // :: error: assignment
    @CalledMethods("withOwners") SpecialNames x = s;
  }

  static void test3(SpecialNames s) {
    // :: error: assignment
    @CalledMethods("withOwners") SpecialNames x = s.withFilters(new SpecialNames().withName("owner"));
  }

  static void test4(SpecialNames s) {
    s.setFilters(new SpecialNames("owner"));
    // :: error: assignment
    @CalledMethods("withOwners") SpecialNames x = s;
  }

  static void testForCrashes(SpecialNames s) {
    s.setFilters();
    s.withFilters();

    s.setFilters(new SpecialNames().withName());
  }
}
