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

Unified Diff: pkg/analyzer/test/src/summary/top_level_inference_test.dart

Issue 2761633002: Infer fields/getters/setters types according to the new top-level inference rules. (Closed)
Patch Set: Created 3 years, 9 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/src/summary/top_level_inference_test.dart
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index c365c9731cebfb909a08976b0eb16d26afc17ae8..7a49115d40d90606c1401b0b728ec9c6c5b64fec 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -990,13 +990,78 @@ Null V;
''');
}
- /**
- * A getter, setter or field which overrides/implements only a getter is
- * inferred to have the type taken from the overridden getter result type.
- *
- * Note that overriding a field is addressed via the implicit induced
- * getter/setter pair (or just getter in the case of a final field).
- */
+ test_instanceField_fieldFormal() async {
+ var library = await _encodeDecodeLibrary(r'''
+class A {
+ var f = 0;
+ A([this.f = 'hello']);
+}
+''');
+ checkElementText(
+ library,
+ r'''
+class A {
+ int f;
+ A([int this.f]);
+}
+''');
+ }
+
+ test_instanceField_fromAccessors_multiple_different() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ void set x(String _);
+}
+class C implements A, B {
+ var x;
+}
+''');
+ // TODO(scheglov) test for inference failure error
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ void set x(String _);
+}
+class C implements A, B {
+ dynamic x;
+}
+''');
+ }
+
+ test_instanceField_fromAccessors_multiple_same() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ void set x(int _);
+}
+class C implements A, B {
+ var x;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ void set x(int _);
+}
+class C implements A, B {
+ int x;
+}
+''');
+ }
+
test_instanceField_fromField() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
@@ -1020,17 +1085,110 @@ abstract class A {
}
class B implements A {
int x;
+ synthetic final int y;
+ synthetic int z;
int get y {}
void set z(int _) {}
}
+''',
+ withSyntheticFields: true);
+ }
+
+ test_instanceField_fromField_explicitDynamic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ dynamic x;
+}
+class B implements A {
+ var x = 1;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ dynamic x;
+}
+class B implements A {
+ dynamic x;
+}
+''');
+ }
+
+ test_instanceField_fromField_generic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A<E> {
+ E x;
+ E y;
+ E z;
+}
+class B<T> implements A<T> {
+ var x;
+ get y => null;
+ set z(_) {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A<E> {
+ E x;
+ E y;
+ E z;
+}
+class B<T> implements A<T> {
+ T x;
+ synthetic final T y;
+ synthetic T z;
+ T get y {}
+ void set z(T _) {}
+}
+''',
+ withSyntheticFields: true);
+ }
+
+ test_instanceField_fromField_implicitDynamic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ var x;
+}
+class B implements A {
+ var x = 1;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ dynamic x;
+}
+class B implements A {
+ dynamic x;
+}
+''');
+ }
+
+ test_instanceField_fromField_narrowType() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ num x;
+}
+class B implements A {
+ var x = 1;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ num x;
+}
+class B implements A {
+ num x;
+}
''');
}
- /**
- * A getter, setter or field which overrides/implements only a getter is
- * inferred to have the type taken from the overridden getter result type.
- */
- @failingTest
test_instanceField_fromGetter() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
@@ -1060,22 +1218,45 @@ class B implements A {
''');
}
- /**
- * A field which overrides/implements both a setter and a getter is inferred
- * to have the type taken from the overridden setter parameter type if this
- * type is the same as the return type of the overridden getter (if the types
- * are not the same then inference fails with an error).
- */
- test_instanceField_fromGetterSetter_field_differentType() async {
+ test_instanceField_fromGetter_generic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A<E> {
+ E get x;
+ E get y;
+ E get z;
+}
+class B<T> implements A<T> {
+ var x;
+ get y => null;
+ set z(_) {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A<E> {
+ E get x;
+ E get y;
+ E get z;
+}
+class B<T> implements A<T> {
+ T x;
+ T get y {}
+ void set z(T _) {}
+}
+''');
+ }
+
+ test_instanceField_fromGetter_multiple_different() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
int get x;
}
abstract class B {
- void set x(String _);
+ String get x;
}
class C implements A, B {
- var x;
+ get x => null;
}
''');
// TODO(scheglov) test for inference failure error
@@ -1086,21 +1267,98 @@ abstract class A {
int get x;
}
abstract class B {
- void set x(String _);
+ String get x;
}
class C implements A, B {
- dynamic x;
+ dynamic get x {}
}
''');
}
- /**
- * A field which overrides/implements both a setter and a getter is inferred
- * to have the type taken from the overridden setter parameter type if this
- * type is the same as the return type of the overridden getter (if the types
- * are not the same then inference fails with an error).
- */
- test_instanceField_fromGetterSetter_field_sameType() async {
+ test_instanceField_fromGetter_multiple_different_dynamic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ dynamic get x;
+}
+class C implements A, B {
+ get x => null;
+}
+''');
+ // TODO(scheglov) test for inference failure error
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ dynamic get x;
+}
+class C implements A, B {
+ dynamic get x {}
+}
+''');
+ }
+
+ test_instanceField_fromGetter_multiple_different_generic() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A<T> {
+ T get x;
+}
+abstract class B<T> {
+ T get x;
+}
+class C implements A<int>, B<String> {
+ get x => null;
+}
+''');
+ // TODO(scheglov) test for inference failure error
+ checkElementText(
+ library,
+ r'''
+abstract class A<T> {
+ T get x;
+}
+abstract class B<T> {
+ T get x;
+}
+class C implements A<int>, B<String> {
+ dynamic get x {}
+}
+''');
+ }
+
+ test_instanceField_fromGetter_multiple_same() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ int get x;
+}
+class C implements A, B {
+ get x => null;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ int get x;
+}
+abstract class B {
+ int get x;
+}
+class C implements A, B {
+ int get x {}
+}
+''');
+ }
+
+ test_instanceField_fromGetterSetter_field() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
int get x;
@@ -1127,17 +1385,13 @@ class C implements A, B {
''');
}
- /**
- * A getter which overrides/implements both a setter and a getter is inferred
- * to have the type taken from the overridden getter result type.
- */
test_instanceField_fromGetterSetter_getter() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
int get x;
}
abstract class B {
- void set x(String _);
+ void set x(int _);
}
class C implements A, B {
get x => null;
@@ -1147,21 +1401,21 @@ class C implements A, B {
library,
r'''
abstract class A {
+ synthetic final int x;
int get x;
}
abstract class B {
- void set x(String _);
+ synthetic int x;
+ void set x(int _);
}
class C implements A, B {
+ synthetic final int x;
int get x {}
}
-''');
+''',
+ withSyntheticFields: true);
}
- /**
- * A setter which overrides/implements both a setter and a getter is inferred
- * to have the type taken from the overridden setter parameter type.
- */
test_instanceField_fromGetterSetter_setter() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
@@ -1178,22 +1432,21 @@ class C implements A, B {
library,
r'''
abstract class A {
+ synthetic final int x;
int get x;
}
abstract class B {
+ synthetic String x;
void set x(String _);
}
class C implements A, B {
- void set x(String _);
+ synthetic dynamic x;
+ void set x(dynamic _);
}
-''');
+''',
+ withSyntheticFields: true);
}
- /**
- * A getter, setter or field which overrides/implements only a setter is
- * inferred to have the type taken from the overridden setter parameter.
- */
- @failingTest
test_instanceField_fromSetter() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
@@ -1223,39 +1476,125 @@ class B implements A {
''');
}
- /**
- * A getter, setter or field which overrides/implements only a getter is
- * inferred to have the type taken from the overridden getter result type.
- *
- * Note that overriding a field is addressed via the implicit induced
- * getter/setter pair (or just getter in the case of a final field).
- *
- * A field with no annotated type that does not override anything has the
- * type inferred from its initializer.
- */
- test_instanceField_preferOverride() async {
+ test_instanceField_fromSetter_multiple_different() async {
var library = await _encodeDecodeLibrary(r'''
abstract class A {
- num x;
- var y = 2;
+ void set x(int _);
+}
+abstract class B {
+ void set x(String _);
+}
+class C implements A, B {
+ get x => null;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ void set x(int _);
+}
+abstract class B {
+ void set x(String _);
+}
+class C implements A, B {
+ dynamic get x {}
+}
+''');
+ }
+
+ test_instanceField_fromSetter_multiple_same() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ void set x(int _);
+}
+abstract class B {
+ void set x(int _);
+}
+class C implements A, B {
+ get x => null;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ void set x(int _);
+}
+abstract class B {
+ void set x(int _);
+}
+class C implements A, B {
+ int get x {}
+}
+''');
+ }
+
+ @failingTest
+ test_instanceField_inheritsCovariant_fromSetter_field() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ num get x;
+ void set x(covariant num _);
}
class B implements A {
- var x = 1;
- var y = 2;
- var z = 3;
+ int x;
}
''');
checkElementText(
library,
r'''
abstract class A {
- num x;
- int y;
+ num get x;
+ void set x(covariant num _);
}
class B implements A {
- num x;
- int y;
- int z;
+ int x;
+ synthetic int get x {}
+ synthetic void set x(covariant int _x) {}
+}
+''',
+ withSyntheticAccessors: true);
+ }
+
+ test_instanceField_inheritsCovariant_fromSetter_setter() async {
+ var library = await _encodeDecodeLibrary(r'''
+abstract class A {
+ num get x;
+ void set x(covariant num _);
+}
+class B implements A {
+ set x(int _) {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+abstract class A {
+ num get x;
+ void set x(covariant num _);
+}
+class B implements A {
+ void set x(covariant int _) {}
+}
+''');
+ }
+
+ test_instanceField_initializer() async {
+ var library = await _encodeDecodeLibrary(r'''
+class A {
+ var t1 = 1;
+ var t2 = 2.0;
+ var t3 = null;
+}
+''');
+ checkElementText(
+ library,
+ r'''
+class A {
+ int t1;
+ double t2;
+ dynamic t3;
}
''');
}
« no previous file with comments | « pkg/analyzer/test/src/summary/resynthesize_common.dart ('k') | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698