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

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

Issue 2658303002: Relax type bound restrictions slightly, apply to typedefs. (Closed)
Patch Set: Typing fix Created 3 years, 11 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 d0042cdf8fd220cef5fcabe2e09148ae09022427..4d6a08f926cbf1c86552e1ff65ae62bc018a725b 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2769,7 +2769,7 @@ class A<T> {}
class B<T extends num> {}
-class C<S extends int, T extends B<S>, U extends B> {}
+class C<S extends int, T extends B<S>, U extends A> {}
void test() {
//
@@ -2781,13 +2781,13 @@ void test() {
var cc = new C();
}
''';
- await resolveTestUnit(code, noErrors: false);
+ await resolveTestUnit(code);
expectIdentifierType('ai', "A<dynamic>");
expectIdentifierType('bi', "B<num>");
- expectIdentifierType('ci', "C<int, B<int>, B<dynamic>>");
+ expectIdentifierType('ci', "C<int, B<int>, A<dynamic>>");
expectIdentifierType('aa', "A<dynamic>");
expectIdentifierType('bb', "B<num>");
- expectIdentifierType('cc', "C<int, B<int>, B<dynamic>>");
+ expectIdentifierType('cc', "C<int, B<int>, A<dynamic>>");
}
test_instantiateToBounds_class_error_recursion() async {
@@ -2821,6 +2821,28 @@ C c;
expectIdentifierType('c;', 'C<dynamic>');
}
+ test_instantiateToBounds_class_error_typedef() async {
+ String code = r'''
+typedef T F<T>(T x);
+class C<T extends F<T>> {}
+C c;
+''';
+ await resolveTestUnit(code, noErrors: false);
+ assertErrors(testSource, [StrongModeCode.NO_DEFAULT_BOUNDS]);
+ expectIdentifierType('c;', 'C<dynamic>');
+ }
+
+ test_instantiateToBounds_class_ok_implicitDynamic_multi() async {
+ String code = r'''
+class C<T0 extends Map<T1, T2>, T1 extends List, T2 extends int> {}
+C c;
+''';
+ await resolveTestUnit(code);
+ assertNoErrors(testSource);
+ expectIdentifierType(
+ 'c;', 'C<Map<List<dynamic>, int>, List<dynamic>, int>');
+ }
+
test_instantiateToBounds_class_ok_referenceOther_after() async {
String code = r'''
class C<T0 extends T1, T1 extends int> {}
@@ -2866,11 +2888,12 @@ C c;
class A<T> {}
class B<T extends num> {}
class C<T extends List<int>> {}
-
+class D<T extends A> {}
void main() {
A a;
B b;
C c;
+ D d;
}
''';
await resolveTestUnit(code);
@@ -2878,6 +2901,7 @@ void main() {
expectIdentifierType('a;', 'A<dynamic>');
expectIdentifierType('b;', 'B<num>');
expectIdentifierType('c;', 'C<List<int>>');
+ expectIdentifierType('d;', 'D<A<dynamic>>');
}
test_instantiateToBounds_method_ok_referenceOther_before() async {
@@ -2910,29 +2934,51 @@ class C<T> {
expectStaticInvokeType('m(null)', '(T) → void');
}
- test_notInstantiatedBound_direct() async {
+ test_notInstantiatedBound_direct_class_class() async {
String code = r'''
-class A<T> {}
+class A<T extends int> {}
class C<T extends A> {}
''';
await resolveTestUnit(code, noErrors: false);
assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
}
- test_notInstantiatedBound_indirect() async {
+ test_notInstantiatedBound_direct_class_typedef() async {
+ // Check that if the bound of a class is an uninstantiated typedef
+ // we emit an error
+ String code = r'''
+typedef void F<T extends int>();
+class C<T extends F> {}
+''';
+ await resolveTestUnit(code, noErrors: false);
+ assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+ }
+
+ test_notInstantiatedBound_direct_typedef_class() async {
+ // Check that if the bound of a typeded is an uninstantiated class
+ // we emit an error
+ String code = r'''
+class C<T extends int> {}
+typedef void F<T extends C>();
+''';
+ await resolveTestUnit(code, noErrors: false);
+ assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+ }
+
+ test_notInstantiatedBound_indirect_class_class() async {
String code = r'''
class A<T> {}
-class B<T> {}
+class B<T extends int> {}
class C<T extends A<B>> {}
''';
await resolveTestUnit(code, noErrors: false);
assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
}
- test_notInstantiatedBound_indirect2() async {
+ test_notInstantiatedBound_indirect_class_class2() async {
String code = r'''
class A<K, V> {}
-class B<T> {}
+class B<T extends int> {}
class C<T extends A<B, B>> {}
''';
await resolveTestUnit(code, noErrors: false);

Powered by Google App Engine
This is Rietveld 408576698