Skip to content

Commit

Permalink
#1087. More function tear-offs tests added
Browse files Browse the repository at this point in the history
  • Loading branch information
sgrekhov committed Jun 9, 2021
1 parent 47c7a9b commit 4d770fd
Show file tree
Hide file tree
Showing 13 changed files with 512 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,10 @@ main() {
idInt(null);
// ^
// [analyzer] unspecified
// [cfe] unspecified

idInt<double>(3.14);
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of generic instance method
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class C {
var x;
C() {
x = instanceMethod<int>;
}
T instanceMethod<T>(T t) => t;
}

main() {
C c = new C();
Expect.equals(42, c.x(42));
dynamic d1 = -42;
Expect.isTrue(c.x(d1) is int);
Expect.isFalse(c.x(d1) is double); // to check that returned type is not dynamic
dynamic d2 = 3.14;
Expect.throws(() {c.x(d2);});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of generic instance method
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

class C {
var x;
C() {
x = instanceMethod<int>;
}
T instanceMethod<T>(T t) => t;
}

main() {
C c = new C();
c.x(3.14);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
c.x<double>(42);
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of generic instance method including 'this'
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class C {
var x;
C() {
x = this.instanceMethod<int>;
}
T instanceMethod<T>(T t) => t;
}

main() {
C c = new C();
Expect.equals(42, c.x(42));
dynamic d1 = -42;
Expect.isTrue(c.x(d1) is int);
Expect.isFalse(c.x(d1) is double); // to check that returned type is not dynamic
dynamic d2 = 3.14;
Expect.throws(() {c.x(d2);});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of generic instance method including 'this'
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

class C {
var x;
C() {
x = this.instanceMethod<int>;
}
T instanceMethod<T>(T t) => t;
}

main() {
C c = new C();
c.x(3.14);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
c.x<double>(42);
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of inherited generic instance method
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class A {
T instanceMethod<T>(T t) => t;
}

class C extends A {
var x;
C() {
x = instanceMethod<int>;
}
}

main() {
C c = new C();
Expect.equals(42, c.x(42));
dynamic d1 = -42;
Expect.isTrue(c.x(d1) is int);
Expect.isFalse(c.x(d1) is double); // to check that returned type is not dynamic
dynamic d2 = 3.14;
Expect.throws(() {c.x(d2);});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of inherited generic instance method
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

class A {
T instanceMethod<T>(T t) => t;
}

class C extends A {
var x;
C() {
x = instanceMethod<int>;
}
}

main() {
C c = new C();
c.x(3.14);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
c.x<double>(42);
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of inherited generic instance method including
/// 'this'
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class A {
T instanceMethod<T>(T t) => t;
}

class C extends A {
var x;
C() {
x = this.instanceMethod<int>;
}
}

main() {
C c = new C();
Expect.equals(42, c.x(42));
dynamic d1 = -42;
Expect.isTrue(c.x(d1) is int);
Expect.isFalse(c.x(d1) is double); // to check that returned type is not dynamic
dynamic d2 = 3.14;
Expect.throws(() {c.x(d2);});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of inherited generic instance method including
/// 'this'
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

class A {
T instanceMethod<T>(T t) => t;
}

class C extends A {
var x;
C() {
x = this.instanceMethod<int>;
}
}

main() {
C c = new C();
c.x(3.14);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
c.x<double>(42);
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) 2021, 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 These grammar changes allows type parameters without following
/// parenthesized arguments in places where we previously did not allow them.
/// For example, this means that <typeArguments> becomes a selector by itself,
/// not just followed by arguments.
//
// It applies to instance methods as well as local, static and top-level
// function declarations. For instance methods, it applies to references of the
// form
//
// instanceMethod<int> (with implicit this),
// object.instanceMethod<int> (including this) and super.instanceMethod<int>.
///
/// @description Checks tear-off of inherited generic instance method including
/// 'super'
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class A {
T instanceMethod<T>(T t) => t;
}

class C extends A {
var x;
C() {
x = super.instanceMethod<int>;
}
}

main() {
C c = new C();
Expect.equals(42, c.x(42));
dynamic d1 = -42;
Expect.isTrue(c.x(d1) is int);
Expect.isFalse(c.x(d1) is double); // to check that returned type is not dynamic
dynamic d2 = 3.14;
Expect.throws(() {c.x(d2);});
}
Loading

0 comments on commit 4d770fd

Please sign in to comment.