| Index: pkg/analyzer/test/src/task/strong_mode_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong_mode_test.dart b/pkg/analyzer/test/src/task/strong_mode_test.dart
|
| index 64db1a549f94ea3be772b9a095c8e49b3c79b9f0..6859d48f081dbd34da7fb7ed11152d9fd8ac740b 100644
|
| --- a/pkg/analyzer/test/src/task/strong_mode_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong_mode_test.dart
|
| @@ -4,8 +4,9 @@
|
|
|
| library analyzer.test.src.task.strong_mode_test;
|
|
|
| +import 'package:analyzer/dart/element/element.dart';
|
| +import 'package:analyzer/dart/element/type.dart';
|
| import 'package:analyzer/src/generated/ast.dart';
|
| -import 'package:analyzer/src/generated/element.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
| import 'package:analyzer/src/task/strong_mode.dart';
|
| import 'package:unittest/unittest.dart';
|
| @@ -338,6 +339,29 @@ class B extends A {
|
| expect(getterB.returnType, getterA.returnType);
|
| }
|
|
|
| + void test_inferCompilationUnit_fieldFormal() {
|
| + InstanceMemberInferrer inferrer = createInferrer;
|
| + String fieldName = 'f';
|
| + CompilationUnitElement unit = resolve('''
|
| +class A {
|
| + final $fieldName = 0;
|
| + A([this.$fieldName = 'hello']);
|
| +}
|
| +''');
|
| + ClassElement classA = unit.getType('A');
|
| + FieldElement fieldA = classA.getField(fieldName);
|
| + FieldFormalParameterElement paramA =
|
| + classA.unnamedConstructor.parameters[0];
|
| + expect(fieldA.type.isDynamic, isTrue);
|
| + expect(paramA.type.isDynamic, isTrue);
|
| +
|
| + inferrer.inferCompilationUnit(unit);
|
| +
|
| + DartType intType = inferrer.typeProvider.intType;
|
| + expect(fieldA.type, intType);
|
| + expect(paramA.type, intType);
|
| + }
|
| +
|
| void test_inferCompilationUnit_getter_multiple_different() {
|
| InstanceMemberInferrer inferrer = createInferrer;
|
| String getterName = 'g';
|
| @@ -498,87 +522,6 @@ class B extends A {
|
| expect(getterB.returnType, getterA.returnType);
|
| }
|
|
|
| - void test_inferCompilationUnit_setter_single() {
|
| - InstanceMemberInferrer inferrer = createInferrer;
|
| - String setterName = 'g';
|
| - CompilationUnitElement unit = resolve('''
|
| -class A {
|
| - set $setterName(int x) {}
|
| -}
|
| -class B extends A {
|
| - set $setterName(x) {}
|
| -}
|
| -''');
|
| - ClassElement classA = unit.getType('A');
|
| - FieldElement fieldA = classA.getField(setterName);
|
| - PropertyAccessorElement setterA = classA.getSetter(setterName);
|
| - ClassElement classB = unit.getType('B');
|
| - FieldElement fieldB = classB.getField(setterName);
|
| - PropertyAccessorElement setterB = classB.getSetter(setterName);
|
| - expect(fieldB.type.isDynamic, isTrue);
|
| - expect(setterB.parameters[0].type.isDynamic, isTrue);
|
| -
|
| - inferrer.inferCompilationUnit(unit);
|
| -
|
| - expect(fieldB.type, fieldA.type);
|
| - expect(setterB.parameters[0].type, setterA.parameters[0].type);
|
| - }
|
| -
|
| - void test_inferCompilationUnit_setter_single_generic() {
|
| - InstanceMemberInferrer inferrer = createInferrer;
|
| - String setterName = 'g';
|
| - CompilationUnitElement unit = resolve('''
|
| -class A<E> {
|
| - set $setterName(E x) {}
|
| -}
|
| -class B<E> extends A<E> {
|
| - set $setterName(x) {}
|
| -}
|
| -''');
|
| - ClassElement classB = unit.getType('B');
|
| - DartType typeBE = classB.typeParameters[0].type;
|
| - FieldElement fieldB = classB.getField(setterName);
|
| - PropertyAccessorElement setterB = classB.getSetter(setterName);
|
| - expect(fieldB.type.isDynamic, isTrue);
|
| - expect(setterB.parameters[0].type.isDynamic, isTrue);
|
| -
|
| - inferrer.inferCompilationUnit(unit);
|
| -
|
| - expect(fieldB.type, typeBE);
|
| - expect(setterB.parameters[0].type, typeBE);
|
| - }
|
| -
|
| - void test_inferCompilationUnit_setter_single_inconsistentAccessors() {
|
| - InstanceMemberInferrer inferrer = createInferrer;
|
| - String getterName = 'g';
|
| - CompilationUnitElement unit = resolve('''
|
| -class A {
|
| - int get $getterName => 0;
|
| - set $getterName(String value) {}
|
| -}
|
| -class B extends A {
|
| - set $getterName(x) {}
|
| -}
|
| -''');
|
| - ClassElement classA = unit.getType('A');
|
| - PropertyAccessorElement setterA = classA.getSetter(getterName);
|
| - ClassElement classB = unit.getType('B');
|
| - FieldElement fieldB = classB.getField(getterName);
|
| - PropertyAccessorElement setterB = classB.getSetter(getterName);
|
| - expect(fieldB.type.isDynamic, isTrue);
|
| - expect(setterB.parameters[0].type.isDynamic, isTrue);
|
| -
|
| - inferrer.inferCompilationUnit(unit);
|
| -
|
| - // Expected behavior is that the getter is inferred: getters and setters
|
| - // are treated as independent methods.
|
| - expect(setterB.parameters[0].type, setterA.parameters[0].type);
|
| -
|
| - // Note that B's synthetic field type will be String. This matches what
|
| - // resolver would do if we explicitly typed the parameter as 'String'
|
| - expect(fieldB.type, setterB.parameters[0].type);
|
| - }
|
| -
|
| void test_inferCompilationUnit_invalid_inheritanceCycle() {
|
| InstanceMemberInferrer inferrer = createInferrer;
|
| CompilationUnitElement unit = resolve('''
|
| @@ -689,7 +632,8 @@ class C implements A, B {
|
| expect(parameterC.type.isDynamic, isTrue);
|
| }
|
|
|
| - void test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired() {
|
| + void
|
| + test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired() {
|
| InstanceMemberInferrer inferrer = createInferrer;
|
| String methodName = 'm';
|
| CompilationUnitElement unit = resolve('''
|
| @@ -955,27 +899,85 @@ class B<E> extends A<E> {
|
| reason: 'function type should still have type arguments');
|
| }
|
|
|
| - void test_inferCompilationUnit_fieldFormal() {
|
| + void test_inferCompilationUnit_setter_single() {
|
| InstanceMemberInferrer inferrer = createInferrer;
|
| - String fieldName = 'f';
|
| + String setterName = 'g';
|
| CompilationUnitElement unit = resolve('''
|
| class A {
|
| - final $fieldName = 0;
|
| - A([this.$fieldName = 'hello']);
|
| + set $setterName(int x) {}
|
| +}
|
| +class B extends A {
|
| + set $setterName(x) {}
|
| }
|
| ''');
|
| ClassElement classA = unit.getType('A');
|
| - FieldElement fieldA = classA.getField(fieldName);
|
| - FieldFormalParameterElement paramA =
|
| - classA.unnamedConstructor.parameters[0];
|
| - expect(fieldA.type.isDynamic, isTrue);
|
| - expect(paramA.type.isDynamic, isTrue);
|
| + FieldElement fieldA = classA.getField(setterName);
|
| + PropertyAccessorElement setterA = classA.getSetter(setterName);
|
| + ClassElement classB = unit.getType('B');
|
| + FieldElement fieldB = classB.getField(setterName);
|
| + PropertyAccessorElement setterB = classB.getSetter(setterName);
|
| + expect(fieldB.type.isDynamic, isTrue);
|
| + expect(setterB.parameters[0].type.isDynamic, isTrue);
|
|
|
| inferrer.inferCompilationUnit(unit);
|
|
|
| - DartType intType = inferrer.typeProvider.intType;
|
| - expect(fieldA.type, intType);
|
| - expect(paramA.type, intType);
|
| + expect(fieldB.type, fieldA.type);
|
| + expect(setterB.parameters[0].type, setterA.parameters[0].type);
|
| + }
|
| +
|
| + void test_inferCompilationUnit_setter_single_generic() {
|
| + InstanceMemberInferrer inferrer = createInferrer;
|
| + String setterName = 'g';
|
| + CompilationUnitElement unit = resolve('''
|
| +class A<E> {
|
| + set $setterName(E x) {}
|
| +}
|
| +class B<E> extends A<E> {
|
| + set $setterName(x) {}
|
| +}
|
| +''');
|
| + ClassElement classB = unit.getType('B');
|
| + DartType typeBE = classB.typeParameters[0].type;
|
| + FieldElement fieldB = classB.getField(setterName);
|
| + PropertyAccessorElement setterB = classB.getSetter(setterName);
|
| + expect(fieldB.type.isDynamic, isTrue);
|
| + expect(setterB.parameters[0].type.isDynamic, isTrue);
|
| +
|
| + inferrer.inferCompilationUnit(unit);
|
| +
|
| + expect(fieldB.type, typeBE);
|
| + expect(setterB.parameters[0].type, typeBE);
|
| + }
|
| +
|
| + void test_inferCompilationUnit_setter_single_inconsistentAccessors() {
|
| + InstanceMemberInferrer inferrer = createInferrer;
|
| + String getterName = 'g';
|
| + CompilationUnitElement unit = resolve('''
|
| +class A {
|
| + int get $getterName => 0;
|
| + set $getterName(String value) {}
|
| +}
|
| +class B extends A {
|
| + set $getterName(x) {}
|
| +}
|
| +''');
|
| + ClassElement classA = unit.getType('A');
|
| + PropertyAccessorElement setterA = classA.getSetter(getterName);
|
| + ClassElement classB = unit.getType('B');
|
| + FieldElement fieldB = classB.getField(getterName);
|
| + PropertyAccessorElement setterB = classB.getSetter(getterName);
|
| + expect(fieldB.type.isDynamic, isTrue);
|
| + expect(setterB.parameters[0].type.isDynamic, isTrue);
|
| +
|
| + inferrer.inferCompilationUnit(unit);
|
| +
|
| + // Expected behavior is that the getter is inferred: getters and setters
|
| + // are treated as independent methods.
|
| + expect(setterB.parameters[0].type, setterA.parameters[0].type);
|
| +
|
| + // Note that B's synthetic field type will be String. This matches what
|
| + // resolver would do if we explicitly typed the parameter as 'String'
|
| + expect(fieldB.type, setterB.parameters[0].type);
|
| }
|
| }
|
|
|
|
|