// @dart = 2.9
// @dart = 2.9
extension Extension on int {
  Class operator [](Class cls) => new Class();
  void operator []=(Class cls, Class value) {}
}

class Class {
  Class operator [](Class cls) => new Class();
  void operator []=(Class cls, Class value) {}
  Class operator +(Class cls) => cls;
  void indexGetSetForEffect(Map<Class, Class> map) {}
  void indexGetSetForValue(Map<Class, Class> map) {}
  void implicitExtensionGetSetForEffect(int i) {}
  void implicitExtensionGetSetForValue(int i) {}
  void explicitExtensionGetSetForEffect(int i) {}
  void explicitExtensionGetSetForValue(int i) {}
}

class Subclass extends Class {
  void superIndexGetSetForEffect() {}
  void superIndexGetSetForValue() {}
}

extension Extension2 on Class2 {
  Class2 operator [](Class2 cls) => new Class2();
  void operator []=(Class2 cls, Class2 value) {}
}

class Class2 {
  Class2 operator +(Class2 cls) => cls;
  void implicitExtensionGetSetForEffect() {}
  void implicitExtensionGetSetForValue() {}
  void explicitExtensionGetSetForEffect() {}
  void explicitExtensionGetSetForValue() {}
}

main() {}
