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

import "implicit_new.dart" as prefix;

class Foo {
  operator +(other) => null;
}

class Bar {
  Bar.named();

  operator +(other) => null;
}

testNSM() {
  var y = prefix.Bar();
  prefix.Bar();
}

f(x) => x;

class IndexTester {
  operator [](_) => null;
  void operator []=(_a, _b) {}
}

main() {
  var x = Foo();
  x = prefix.Foo();
  var z = Bar.named();
  z = prefix.Bar.named();
  f(Foo());
  f(prefix.Foo());
  f(Bar.named());
  f(prefix.Bar.named());
  var l = [Foo(), Bar.named()];
  l = [prefix.Foo(), prefix.Bar.named()];
  var m = {"foo": Foo(), "bar": Bar.named()};
  m = {"foo": prefix.Foo(), "bar": prefix.Bar.named()};
  var i = new IndexTester();
  i[Foo()];
  i[prefix.Foo()];
  i[Bar.named()];
  i[prefix.Bar.named()];
  i[Foo()] = null;
  i[prefix.Foo()] = null;
  i[Bar.named()] = null;
  i[prefix.Bar.named()] = null;
  Foo() + Bar.named();
  prefix.Foo() + prefix.Bar.named();
  Bar.named() + Foo();
  prefix.Bar.named() + prefix.Foo();
}
