Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Unified Diff: pkg/analyzer/test/generated/strong_mode_test.dart

Issue 2990383002: Emit a hint when using generic method comment syntax (issue 30356) (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/test/generated/strong_mode_test.dart
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 20c44f0980f6255e1146462f9c35755313ed41eb..a142b744f0f179b233a2904ae31274412dd43eb7 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2,8 +2,6 @@
// 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.
-library analyzer.test.generated.strong_mode_test;
-
import 'dart:async';
import 'package:analyzer/dart/ast/ast.dart';
@@ -480,35 +478,6 @@ class E extends C<int> {
expect(covariantE.toList(), []);
}
- test_covarianceChecks_superclass() async {
- var source = addSource(r'''
-class C<T> {
- add(T t) {}
- forEach(void f(T t)) {}
-}
-class D {
- add(int t) {}
- forEach(void f(int t)) {}
-}
-class E extends D implements C<int> {}
-''');
- var unit = (await computeAnalysisResult(source)).unit;
- assertNoErrors(source);
- var cAdd = AstFinder.getMethodInClass(unit, "C", "add");
- var covariantC = getClassCovariantParameters(AstFinder.getClass(unit, "C"));
- expect(covariantC.toList(), [cAdd.element.parameters[0]]);
-
- var dAdd = AstFinder.getMethodInClass(unit, "D", "add");
- var covariantD = getClassCovariantParameters(AstFinder.getClass(unit, "D"));
- expect(covariantD, null);
-
- var classE = AstFinder.getClass(unit, "E");
- var covariantE = getClassCovariantParameters(classE);
- var superCovariantE = getSuperclassCovariantParameters(classE);
- expect(covariantE.toList(), []);
- expect(superCovariantE.toList(), [dAdd.element.parameters[0]]);
- }
-
test_covarianceChecks_returnFunction() async {
var source = addSource(r'''
typedef F<T>(T t);
@@ -714,6 +683,35 @@ noCasts() {
}
}
+ test_covarianceChecks_superclass() async {
+ var source = addSource(r'''
+class C<T> {
+ add(T t) {}
+ forEach(void f(T t)) {}
+}
+class D {
+ add(int t) {}
+ forEach(void f(int t)) {}
+}
+class E extends D implements C<int> {}
+''');
+ var unit = (await computeAnalysisResult(source)).unit;
+ assertNoErrors(source);
+ var cAdd = AstFinder.getMethodInClass(unit, "C", "add");
+ var covariantC = getClassCovariantParameters(AstFinder.getClass(unit, "C"));
+ expect(covariantC.toList(), [cAdd.element.parameters[0]]);
+
+ var dAdd = AstFinder.getMethodInClass(unit, "D", "add");
+ var covariantD = getClassCovariantParameters(AstFinder.getClass(unit, "D"));
+ expect(covariantD, null);
+
+ var classE = AstFinder.getClass(unit, "E");
+ var covariantE = getClassCovariantParameters(classE);
+ var superCovariantE = getSuperclassCovariantParameters(classE);
+ expect(covariantE.toList(), []);
+ expect(superCovariantE.toList(), [dAdd.element.parameters[0]]);
+ }
+
test_factoryConstructor_propagation() async {
String code = r'''
class A<T> {
@@ -2681,23 +2679,23 @@ class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared {
fail_genericMethod_tearoff_instantiated() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(E e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(E e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
- var methodTearOffInst = c.f/*<int>*/;
- var staticTearOffInst = C.g/*<int>*/;
- var staticFieldTearOffInst = C.h/*<int>*/;
- var topFunTearOffInst = topF/*<int>*/;
- var topFieldTearOffInst = topG/*<int>*/;
- var localTearOffInst = lf/*<int>*/;
- var paramTearOffInst = pf/*<int>*/;
+ T lf<T>(T e) => null;
+ var methodTearOffInst = c.f<int>;
+ var staticTearOffInst = C.g<int>;
+ var staticFieldTearOffInst = C.h<int>;
+ var topFunTearOffInst = topF<int>;
+ var topFieldTearOffInst = topG<int>;
+ var localTearOffInst = lf<int>;
+ var paramTearOffInst = pf<int>;
}
''');
expectIdentifierType('methodTearOffInst', "(int) → int");
@@ -2770,7 +2768,7 @@ main() {
}
test_genericFunction() async {
- await resolveTestUnit(r'/*=T*/ f/*<T>*/(/*=T*/ x) => null;');
+ await resolveTestUnit(r'T f<T>(T x) => null;');
expectFunctionType('f', '<T>(T) → T',
elementTypeParams: '[T]', typeFormals: '[T]');
SimpleIdentifier f = findIdentifier('f');
@@ -2780,14 +2778,14 @@ main() {
}
test_genericFunction_bounds() async {
- await resolveTestUnit(r'/*=T*/ f/*<T extends num>*/(/*=T*/ x) => null;');
+ await resolveTestUnit(r'T f<T extends num>(T x) => null;');
expectFunctionType('f', '<T extends num>(T) → T',
elementTypeParams: '[T extends num]', typeFormals: '[T extends num]');
}
test_genericFunction_parameter() async {
await resolveTestUnit(r'''
-void g(/*=T*/ f/*<T>*/(/*=T*/ x)) {}
+void g(T f<T>(T x)) {}
''', noErrors: false // TODO(paulberry): remove when dartbug.com/28515 fixed.
);
expectFunctionType('f', '<T>(T) → T',
@@ -2802,7 +2800,7 @@ void g(/*=T*/ f/*<T>*/(/*=T*/ x)) {}
test_genericFunction_static() async {
await resolveTestUnit(r'''
class C<E> {
- static /*=T*/ f/*<T>*/(/*=T*/ x) => null;
+ static T f<T>(T x) => null;
}
''');
expectFunctionType('f', '<T>(T) → T',
@@ -2885,7 +2883,7 @@ List<Object> eee = [new Object()];
test_genericMethod() async {
await resolveTestUnit(r'''
class C<E> {
- List/*<T>*/ f/*<T>*/(E e) => null;
+ List<T> f<T>(E e) => null;
}
main() {
C<String> cOfString;
@@ -2907,14 +2905,14 @@ main() {
test_genericMethod_explicitTypeParams() async {
await resolveTestUnit(r'''
class C<E> {
- List/*<T>*/ f/*<T>*/(E e) => null;
+ List<T> f<T>(E e) => null;
}
main() {
C<String> cOfString;
- var x = cOfString.f/*<int>*/('hi');
+ var x = cOfString.f<int>('hi');
}
''');
- MethodInvocation f = findIdentifier('f/*<int>*/').parent;
+ MethodInvocation f = findIdentifier('f<int>').parent;
FunctionType ft = f.staticInvokeType;
expect(ft.toString(), '(String) → List<int>');
expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
@@ -2927,25 +2925,25 @@ main() {
test_genericMethod_functionExpressionInvocation_explicit() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(/*=T*/ e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(T e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
-
- var lambdaCall = (/*<E>*/(/*=E*/ e) => e)/*<int>*/(3);
- var methodCall = (c.f)/*<int>*/(3);
- var staticCall = (C.g)/*<int>*/(3);
- var staticFieldCall = (C.h)/*<int>*/(3);
- var topFunCall = (topF)/*<int>*/(3);
- var topFieldCall = (topG)/*<int>*/(3);
- var localCall = (lf)/*<int>*/(3);
- var paramCall = (pf)/*<int>*/(3);
+ T lf<T>(T e) => null;
+
+ var lambdaCall = (<E>(E e) => e)<int>(3);
+ var methodCall = (c.f)<int>(3);
+ var staticCall = (C.g)<int>(3);
+ var staticFieldCall = (C.h)<int>(3);
+ var topFunCall = (topF)<int>(3);
+ var topFieldCall = (topG)<int>(3);
+ var localCall = (lf)<int>(3);
+ var paramCall = (pf)<int>(3);
}
''', noErrors: false // TODO(paulberry): remove when dartbug.com/28515 fixed.
);
@@ -2962,18 +2960,18 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
test_genericMethod_functionExpressionInvocation_inferred() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(/*=T*/ e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(T e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
+ T lf<T>(T e) => null;
- var lambdaCall = (/*<E>*/(/*=E*/ e) => e)(3);
+ var lambdaCall = (<E>(E e) => e)(3);
var methodCall = (c.f)(3);
var staticCall = (C.g)(3);
var staticFieldCall = (C.h)(3);
@@ -2997,23 +2995,23 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
test_genericMethod_functionInvocation_explicit() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(/*=T*/ e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(T e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
- var methodCall = c.f/*<int>*/(3);
- var staticCall = C.g/*<int>*/(3);
- var staticFieldCall = C.h/*<int>*/(3);
- var topFunCall = topF/*<int>*/(3);
- var topFieldCall = topG/*<int>*/(3);
- var localCall = lf/*<int>*/(3);
- var paramCall = pf/*<int>*/(3);
+ T lf<T>(T e) => null;
+ var methodCall = c.f<int>(3);
+ var staticCall = C.g<int>(3);
+ var staticFieldCall = C.h<int>(3);
+ var topFunCall = topF<int>(3);
+ var topFieldCall = topG<int>(3);
+ var localCall = lf<int>(3);
+ var paramCall = pf<int>(3);
}
''', noErrors: false // TODO(paulberry): remove when dartbug.com/28515 fixed.
);
@@ -3029,16 +3027,16 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
test_genericMethod_functionInvocation_inferred() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(/*=T*/ e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(T e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
+ T lf<T>(T e) => null;
var methodCall = c.f(3);
var staticCall = C.g(3);
var staticFieldCall = C.h(3);
@@ -3061,7 +3059,7 @@ void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
test_genericMethod_functionTypedParameter() async {
await resolveTestUnit(r'''
class C<E> {
- List/*<T>*/ f/*<T>*/(/*=T*/ f(E e)) => null;
+ List<T> f<T>(T f(E e)) => null;
}
main() {
C<String> cOfString;
@@ -3086,7 +3084,7 @@ main() {
// These should not cause any hints or warnings.
await resolveTestUnit(r'''
class List<E> {
- /*=T*/ map/*<T>*/(/*=T*/ f(E e)) => null;
+ T map<T>(T f(E e)) => null;
}
void foo() {
List list = null;
@@ -3160,7 +3158,7 @@ main() {
test_genericMethod_nestedBound() async {
String code = r'''
class Foo<T extends num> {
- void method/*<U extends T>*/(dynamic/*=U*/ u) {
+ void method<U extends T>(U u) {
u.abs();
}
}
@@ -3172,14 +3170,14 @@ class Foo<T extends num> {
test_genericMethod_nestedCapture() async {
await resolveTestUnit(r'''
class C<T> {
- /*=T*/ f/*<S>*/(/*=S*/ x) {
- new C<S>().f/*<int>*/(3);
+ T f<S>(S x) {
+ new C<S>().f<int>(3);
new C<S>().f; // tear-off
return null;
}
}
''');
- MethodInvocation f = findIdentifier('f/*<int>*/(3);').parent;
+ MethodInvocation f = findIdentifier('f<int>(3);').parent;
expect(f.staticInvokeType.toString(), '(int) → S');
FunctionType ft = f.staticInvokeType;
expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]');
@@ -3189,8 +3187,8 @@ class C<T> {
test_genericMethod_nestedFunctions() async {
await resolveTestUnit(r'''
-/*=S*/ f/*<S>*/(/*=S*/ x) {
- g/*<S>*/(/*=S*/ x) => f;
+S f<S>(S x) {
+ g<S>(S x) => f;
return null;
}
''');
@@ -3201,16 +3199,15 @@ class C<T> {
test_genericMethod_override() async {
await resolveTestUnit(r'''
class C {
- /*=T*/ f/*<T>*/(/*=T*/ x) => null;
+ T f<T>(T x) => null;
}
class D extends C {
- /*=T*/ f/*<T>*/(/*=T*/ x) => null; // from D
+ T f<T>(T x) => null; // from D
}
''');
- expectFunctionType('f/*<T>*/(/*=T*/ x) => null; // from D', '<T>(T) → T',
+ expectFunctionType('f<T>(T x) => null; // from D', '<T>(T) → T',
elementTypeParams: '[T]', typeFormals: '[T]');
- SimpleIdentifier f =
- findIdentifier('f/*<T>*/(/*=T*/ x) => null; // from D');
+ SimpleIdentifier f = findIdentifier('f<T>(T x) => null; // from D');
MethodElementImpl e = f.staticElement;
FunctionType ft = e.type.instantiate([typeProvider.stringType]);
expect(ft.toString(), '(String) → String');
@@ -3221,10 +3218,10 @@ class D extends C {
class A {}
class B extends A {}
class C {
- /*=T*/ f/*<T extends B>*/(/*=T*/ x) => null;
+ T f<T extends B>(T x) => null;
}
class D extends C {
- /*=T*/ f/*<T extends A>*/(/*=T*/ x) => null;
+ T f<T extends A>(T x) => null;
}
''');
}
@@ -3248,10 +3245,10 @@ class B extends A {
test_genericMethod_override_invalidReturnType() async {
Source source = addSource(r'''
class C {
- Iterable/*<T>*/ f/*<T>*/(/*=T*/ x) => null;
+ Iterable<T> f<T>(T x) => null;
}
class D extends C {
- String f/*<S>*/(/*=S*/ x) => null;
+ String f<S>(S x) => null;
}''');
await computeAnalysisResult(source);
assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
@@ -3263,10 +3260,10 @@ class D extends C {
class A {}
class B extends A {}
class C {
- /*=T*/ f/*<T extends A>*/(/*=T*/ x) => null;
+ T f<T extends A>(T x) => null;
}
class D extends C {
- /*=T*/ f/*<T extends B>*/(/*=T*/ x) => null;
+ T f<T extends B>(T x) => null;
}''');
await computeAnalysisResult(source);
assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
@@ -3276,10 +3273,10 @@ class D extends C {
test_genericMethod_override_invalidTypeParamCount() async {
Source source = addSource(r'''
class C {
- /*=T*/ f/*<T>*/(/*=T*/ x) => null;
+ T f<T>(T x) => null;
}
class D extends C {
- /*=S*/ f/*<T, S>*/(/*=T*/ x) => null;
+ S f<T, S>(T x) => null;
}''');
await computeAnalysisResult(source);
assertErrors(source, [StrongModeCode.INVALID_METHOD_OVERRIDE]);
@@ -3296,7 +3293,7 @@ class D extends C {
// strong mode.
await resolveTestUnit(r'''
abstract class Iter {
- List/*<S>*/ map/*<S>*/(/*=S*/ f(x));
+ List<S> map<S>(S f(x));
}
class C {}
C toSpan(dynamic element) {
@@ -3311,16 +3308,16 @@ C toSpan(dynamic element) {
test_genericMethod_tearoff() async {
await resolveTestUnit(r'''
class C<E> {
- /*=T*/ f/*<T>*/(E e) => null;
- static /*=T*/ g/*<T>*/(/*=T*/ e) => null;
+ T f<T>(E e) => null;
+ static T g<T>(T e) => null;
static final h = g;
}
-/*=T*/ topF/*<T>*/(/*=T*/ e) => null;
+T topF<T>(T e) => null;
var topG = topF;
-void test/*<S>*/(/*=T*/ pf/*<T>*/(/*=T*/ e)) {
+void test<S>(T pf<T>(T e)) {
var c = new C<int>();
- /*=T*/ lf/*<T>*/(/*=T*/ e) => null;
+ T lf<T>(T e) => null;
var methodTearOff = c.f;
var staticTearOff = C.g;
var staticFieldTearOff = C.h;
« no previous file with comments | « pkg/analyzer/test/generated/static_type_warning_code_test.dart ('k') | pkg/analyzer/test/src/task/strong/checker_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698