#400. The call member tests added
diff --git a/LanguageFeatures/Extension-methods/call_member_t01.dart b/LanguageFeatures/Extension-methods/call_member_t01.dart
new file mode 100644
index 0000000..7033477
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t01.dart
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that extension with the 'call' method is applicable, then
+ * it is called
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+import "../../Utils/expect.dart";
+
+extension Tricky on int {
+ Iterable<int> call(int to) =>
+ Iterable<int>.generate(to - this + 1, (i) => i + this);
+}
+
+main() {
+ Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1(10));
+ Expect.listEquals([2, 3, 4, 5], 2(5));
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t02.dart b/LanguageFeatures/Extension-methods/call_member_t02.dart
new file mode 100644
index 0000000..aa491e9
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t02.dart
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that the most specific extension with the 'call' method is
+ * taken
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+import "../../Utils/expect.dart";
+
+extension on int {
+ String call(num v) => "My name is int($v)";
+}
+
+extension on num {
+ String call(num v) => "My name is num($v)";
+}
+
+main() {
+ Expect.equals("My name is int(10)", 1(10));
+ Expect.equals("My name is int(10.0)", 1(10.0));
+ Expect.equals("My name is num(10)", 1.0(10));
+ Expect.equals("My name is num(10.0)", 1.0(10.0));
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t03.dart b/LanguageFeatures/Extension-methods/call_member_t03.dart
new file mode 100644
index 0000000..9191ff1
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t03.dart
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that it is a compile error if there is no most specific
+ * extension with the 'call' method
+ * @compile-error
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+
+extension on int {
+ String call(num v) => "My name is int($v)";
+}
+
+extension on num {
+ String call(int v) => "My name is num($v)";
+}
+
+main() {
+ 1.0(10.0);
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t04.dart b/LanguageFeatures/Extension-methods/call_member_t04.dart
new file mode 100644
index 0000000..4f76bfb
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t04.dart
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that it is a compile error if there is e1 is an interface
+ * with 'call' getter
+ * @compile-error
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+
+class A {
+ String get call => "My name is A";
+}
+
+extension on int {
+ String get call => "My name is int";
+}
+
+extension on num {
+ String get call => "My name is num";
+}
+
+
+main() {
+ 1(10); //# 01: compile-time error
+ 1("10"); //# 02: compile-time error
+ 1.0(10); //# 03: compile-time error
+ 1.0("10"); //# 04: compile-time error
+ A(2); //# 05: compile-time error
+ A(2, "3"); //# 06: compile-time error
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t05.dart b/LanguageFeatures/Extension-methods/call_member_t05.dart
new file mode 100644
index 0000000..040ec67
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t05.dart
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that extension with the 'call' method is applicable, then
+ * it is called. Test type arguments
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+import "../../Utils/expect.dart";
+
+class C<T extends num> {
+ T value;
+}
+
+extension IntExtWithCall<T extends num> on C<T> {
+ Iterable<T> call(int to) =>
+ Iterable<T>.generate(to - this.value + 1, (i) => i + this.value);
+}
+
+main() {
+ C<int> c = new C<int>();
+ c.value = 1;
+ Expect.listEquals([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], c(10));
+ c.value = 2;
+ Expect.listEquals([2, 3, 4, 5], c(5));
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t06.dart b/LanguageFeatures/Extension-methods/call_member_t06.dart
new file mode 100644
index 0000000..fc1dbcd
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t06.dart
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion Any expression of the form e1(args) or e1<types>(args) where e1
+ * does not denote a method, and where the static type of e1 is not a function
+ * type, an interface type declaring a call method, or dynamic, will currently
+ * be a compile-time error. If the static type of e1 is an interface type
+ * declaring a call getter, then this stays a compile-time error. Otherwise we
+ * check for extensions applying to the static type of e1 and declaring a call
+ * member. If one such most specific extension exists, and it declares a call
+ * extension method, then the expression is equivalent to e1.call(args) or
+ * e1.call<typeS>(args). Otherwise it is still a compile-time error.
+ *
+ * @description Check that extension with the 'call' method is applicable, then
+ * it is called. Test type arguments
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+import "../../Utils/expect.dart";
+
+class C<T extends num> {
+}
+
+extension IntExtWithCall<T extends num> on C<T> {
+ String call(int v, String m) => "Result: $m $v";
+}
+
+main() {
+ C<int> c = new C<int>();
+ Expect.equals("Result: XxX 42", c(42, "XxX"));
+}
diff --git a/LanguageFeatures/Extension-methods/call_member_t07.dart b/LanguageFeatures/Extension-methods/call_member_t07.dart
new file mode 100644
index 0000000..1d49b8d
--- /dev/null
+++ b/LanguageFeatures/Extension-methods/call_member_t07.dart
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2019, 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.
+ */
+/**
+ * @assertion We do not allow implicit tear-off of an extension call method in a
+ * function typed context.
+ *
+ * @description Check that implicit tear-off of an extension call method in a
+ * function typed context is a compile-time error
+ * @author sgrekhov@unipro.ru
+ */
+// SharedOptions=--enable-experiment=extension-methods
+
+extension on int {
+ String call(int v) => "Result: $v";
+}
+
+String Function(int) from1 = 1; //# 01: compile-time error
+
+main() {
+ String Function(int) from2 = 2; //# 02: compile-time error
+}