// 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.

class Class {}

class SubClass extends Class {
  method() {}
}

/*element: main:
 static=[
  dynamicToEquals(1),
  dynamicToHashCode(1),
  dynamicToNoSuchMethod(1),
  dynamicToNoSuchMethodTearOff(1),
  dynamicToNoSuchMethodWrong(1),
  dynamicToString(1),
  dynamicToStringTearOff(1),
  dynamicToStringWrong(1),
  negativeDynamic(1),
  positiveDynamic(1),
  positiveTyped(1)],
 type=[inst:JSNull]
*/
main() {
  positiveTyped(null);
  positiveDynamic(null);
  negativeDynamic(null);
  dynamicToString(null);
  dynamicToStringWrong(null);
  dynamicToStringTearOff(null);
  dynamicToEquals(null);
  dynamicToHashCode(null);
  dynamicToNoSuchMethod(null);
  dynamicToNoSuchMethodWrong(null);
  dynamicToNoSuchMethodTearOff(null);
}

/*element: positiveTyped:dynamic=[SubClass.method(0)],type=[inst:JSBool,is:SubClass,param:Class]*/
positiveTyped(Class cls) {
  if (cls is SubClass) cls.method();
}

/*element: positiveDynamic:dynamic=[SubClass.method(0)],type=[inst:JSBool,is:SubClass]*/
positiveDynamic(dynamic cls) {
  if (cls is SubClass) cls.method();
}

/*element: negativeDynamic:dynamic=[call(0),method(0)],type=[inst:JSBool,is:SubClass]*/
negativeDynamic(dynamic cls) {
  if (cls is! SubClass) return;
  cls.method();
}

/*element: dynamicToString:dynamic=[Object.toString(0)]*/
dynamicToString(dynamic cls) {
  cls.toString();
}

/*element: dynamicToStringWrong:dynamic=[call(1),toString(1)],type=[inst:JSNull]*/
dynamicToStringWrong(dynamic cls) {
  cls.toString(null);
}

/*element: dynamicToStringTearOff:dynamic=[Object.toString]*/
dynamicToStringTearOff(dynamic cls) {
  cls.toString;
}

/*element: dynamicToEquals:dynamic=[Object.==],type=[inst:JSNull]*/
dynamicToEquals(dynamic cls) {
  cls == null;
}

/*element: dynamicToHashCode:dynamic=[Object.hashCode]*/
dynamicToHashCode(dynamic cls) {
  cls.hashCode;
}

/*element: dynamicToNoSuchMethod:dynamic=[Object.noSuchMethod(1)],type=[inst:JSNull]*/
dynamicToNoSuchMethod(dynamic cls) {
  cls.noSuchMethod(null);
}

/*element: dynamicToNoSuchMethodWrong:dynamic=[call(0),noSuchMethod(0)]*/
dynamicToNoSuchMethodWrong(dynamic cls) {
  cls.noSuchMethod();
}

/*element: dynamicToNoSuchMethodTearOff:dynamic=[Object.noSuchMethod]*/
dynamicToNoSuchMethodTearOff(dynamic cls) {
  cls.noSuchMethod;
}
