| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.src.task.strong_mode_test; | 5 library analyzer.test.src.task.strong_mode_test; |
| 6 | 6 |
| 7 import 'package:analyzer/src/generated/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/dart/element/element.dart'; |
| 9 import 'package:analyzer/dart/element/type.dart'; |
| 10 import 'package:analyzer/src/dart/resolver/inheritance_manager.dart'; |
| 9 import 'package:analyzer/src/generated/source.dart'; | 11 import 'package:analyzer/src/generated/source.dart'; |
| 10 import 'package:analyzer/src/task/strong_mode.dart'; | 12 import 'package:analyzer/src/task/strong_mode.dart'; |
| 13 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 11 import 'package:unittest/unittest.dart'; | 14 import 'package:unittest/unittest.dart'; |
| 12 | 15 |
| 13 import '../../reflective_tests.dart'; | |
| 14 import '../../utils.dart'; | 16 import '../../utils.dart'; |
| 15 import '../context/abstract_context.dart'; | 17 import '../context/abstract_context.dart'; |
| 16 | 18 |
| 17 main() { | 19 main() { |
| 18 initializeTestEnvironment(); | 20 initializeTestEnvironment(); |
| 19 runReflectiveTests(InstanceMemberInferrerTest); | 21 defineReflectiveTests(InstanceMemberInferrerTest); |
| 20 runReflectiveTests(VariableGathererTest); | 22 defineReflectiveTests(SetFieldTypeTest); |
| 23 defineReflectiveTests(VariableGathererTest); |
| 21 } | 24 } |
| 22 | 25 |
| 23 @reflectiveTest | 26 @reflectiveTest |
| 24 class InstanceMemberInferrerTest extends AbstractContextTest { | 27 class InstanceMemberInferrerTest extends AbstractContextTest { |
| 25 InstanceMemberInferrer get createInferrer => | 28 InstanceMemberInferrer createInferrer(LibraryElement library) { |
| 26 new InstanceMemberInferrer(context.typeProvider, | 29 return new InstanceMemberInferrer( |
| 27 typeSystem: context.typeSystem); | 30 context.typeProvider, new InheritanceManager(library), |
| 31 typeSystem: context.typeSystem); |
| 32 } |
| 28 | 33 |
| 29 /** | 34 /** |
| 30 * Add a source with the given [content] and return the result of resolving | 35 * Add a source with the given [content] and return the result of resolving |
| 31 * the source. | 36 * the source. |
| 32 */ | 37 */ |
| 33 CompilationUnitElement resolve(String content) { | 38 CompilationUnitElement resolve(String content) { |
| 34 Source source = addSource('/test.dart', content); | 39 Source source = addSource('/test.dart', content); |
| 35 return context.resolveCompilationUnit2(source, source).element; | 40 return context.resolveCompilationUnit2(source, source).element; |
| 36 } | 41 } |
| 37 | 42 |
| 38 void test_creation() { | 43 void test_creation() { |
| 39 InstanceMemberInferrer inferrer = createInferrer; | 44 InstanceMemberInferrer inferrer = createInferrer(null); |
| 40 expect(inferrer, isNotNull); | 45 expect(inferrer, isNotNull); |
| 41 expect(inferrer.typeSystem, isNotNull); | 46 expect(inferrer.typeSystem, isNotNull); |
| 42 } | 47 } |
| 43 | 48 |
| 44 void test_inferCompilationUnit_field_multiple_different() { | 49 void test_inferCompilationUnit_field_multiple_different() { |
| 45 InstanceMemberInferrer inferrer = createInferrer; | |
| 46 String fieldName = 'f'; | 50 String fieldName = 'f'; |
| 47 CompilationUnitElement unit = resolve(''' | 51 CompilationUnitElement unit = resolve(''' |
| 48 class A { | 52 class A { |
| 49 int $fieldName; | 53 int $fieldName; |
| 50 } | 54 } |
| 51 class B { | 55 class B { |
| 52 double $fieldName; | 56 double $fieldName; |
| 53 } | 57 } |
| 54 class C implements A, B { | 58 class C implements A, B { |
| 55 var $fieldName; | 59 var $fieldName; |
| 56 } | 60 } |
| 57 '''); | 61 '''); |
| 58 ClassElement classC = unit.getType('C'); | 62 ClassElement classC = unit.getType('C'); |
| 59 FieldElement fieldC = classC.getField(fieldName); | 63 FieldElement fieldC = classC.getField(fieldName); |
| 60 PropertyAccessorElement getterC = classC.getGetter(fieldName); | 64 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 61 expect(fieldC.type.isDynamic, isTrue); | 65 expect(fieldC.type.isDynamic, isTrue); |
| 62 expect(getterC.returnType.isDynamic, isTrue); | 66 expect(getterC.returnType.isDynamic, isTrue); |
| 63 | 67 |
| 64 inferrer.inferCompilationUnit(unit); | 68 _runInferrer(unit); |
| 65 | 69 |
| 66 expect(fieldC.type.isDynamic, isTrue); | 70 expect(fieldC.type.isDynamic, isTrue); |
| 67 expect(getterC.returnType.isDynamic, isTrue); | 71 expect(getterC.returnType.isDynamic, isTrue); |
| 68 } | 72 } |
| 69 | 73 |
| 70 void test_inferCompilationUnit_field_multiple_different_generic() { | 74 void test_inferCompilationUnit_field_multiple_different_generic() { |
| 71 InstanceMemberInferrer inferrer = createInferrer; | |
| 72 String fieldName = 'f'; | 75 String fieldName = 'f'; |
| 73 CompilationUnitElement unit = resolve(''' | 76 CompilationUnitElement unit = resolve(''' |
| 74 class A<E> { | 77 class A<E> { |
| 75 E $fieldName; | 78 E $fieldName; |
| 76 } | 79 } |
| 77 class B<E> { | 80 class B<E> { |
| 78 E $fieldName; | 81 E $fieldName; |
| 79 } | 82 } |
| 80 class C implements A<int>, B<double> { | 83 class C implements A<int>, B<double> { |
| 81 var $fieldName; | 84 var $fieldName; |
| 82 } | 85 } |
| 83 '''); | 86 '''); |
| 84 ClassElement classC = unit.getType('C'); | 87 ClassElement classC = unit.getType('C'); |
| 85 FieldElement fieldC = classC.getField(fieldName); | 88 FieldElement fieldC = classC.getField(fieldName); |
| 86 PropertyAccessorElement getterC = classC.getGetter(fieldName); | 89 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 87 expect(fieldC.type.isDynamic, isTrue); | 90 expect(fieldC.type.isDynamic, isTrue); |
| 88 expect(getterC.returnType.isDynamic, isTrue); | 91 expect(getterC.returnType.isDynamic, isTrue); |
| 89 | 92 |
| 90 inferrer.inferCompilationUnit(unit); | 93 _runInferrer(unit); |
| 91 | 94 |
| 92 expect(fieldC.type.isDynamic, isTrue); | 95 expect(fieldC.type.isDynamic, isTrue); |
| 93 expect(getterC.returnType.isDynamic, isTrue); | 96 expect(getterC.returnType.isDynamic, isTrue); |
| 94 } | 97 } |
| 95 | 98 |
| 96 void test_inferCompilationUnit_field_multiple_dynamic() { | 99 void test_inferCompilationUnit_field_multiple_dynamic() { |
| 97 InstanceMemberInferrer inferrer = createInferrer; | |
| 98 String fieldName = 'f'; | 100 String fieldName = 'f'; |
| 99 CompilationUnitElement unit = resolve(''' | 101 CompilationUnitElement unit = resolve(''' |
| 100 class A { | 102 class A { |
| 101 int $fieldName; | 103 int $fieldName; |
| 102 } | 104 } |
| 103 class B { | 105 class B { |
| 104 var $fieldName; | 106 var $fieldName; |
| 105 } | 107 } |
| 106 class C implements A, B { | 108 class C implements A, B { |
| 107 var $fieldName; | 109 var $fieldName; |
| 108 } | 110 } |
| 109 '''); | 111 '''); |
| 110 ClassElement classC = unit.getType('C'); | 112 ClassElement classC = unit.getType('C'); |
| 111 FieldElement fieldC = classC.getField(fieldName); | 113 FieldElement fieldC = classC.getField(fieldName); |
| 112 PropertyAccessorElement getterC = classC.getGetter(fieldName); | 114 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 113 expect(fieldC.type.isDynamic, isTrue); | 115 expect(fieldC.type.isDynamic, isTrue); |
| 114 expect(getterC.returnType.isDynamic, isTrue); | 116 expect(getterC.returnType.isDynamic, isTrue); |
| 115 | 117 |
| 116 inferrer.inferCompilationUnit(unit); | 118 _runInferrer(unit); |
| 117 | 119 |
| 118 expect(fieldC.type.isDynamic, isTrue); | 120 expect(fieldC.type.isDynamic, isTrue); |
| 119 expect(getterC.returnType.isDynamic, isTrue); | 121 expect(getterC.returnType.isDynamic, isTrue); |
| 120 } | 122 } |
| 121 | 123 |
| 122 void test_inferCompilationUnit_field_multiple_same() { | 124 void test_inferCompilationUnit_field_multiple_same() { |
| 123 InstanceMemberInferrer inferrer = createInferrer; | |
| 124 String fieldName = 'f'; | 125 String fieldName = 'f'; |
| 125 CompilationUnitElement unit = resolve(''' | 126 CompilationUnitElement unit = resolve(''' |
| 126 class A { | 127 class A { |
| 127 int $fieldName; | 128 int $fieldName; |
| 128 } | 129 } |
| 129 class B { | 130 class B { |
| 130 int $fieldName; | 131 int $fieldName; |
| 131 } | 132 } |
| 132 class C implements A, B { | 133 class C implements A, B { |
| 133 var $fieldName; | 134 var $fieldName; |
| 134 } | 135 } |
| 135 '''); | 136 '''); |
| 136 ClassElement classA = unit.getType('A'); | 137 ClassElement classA = unit.getType('A'); |
| 137 FieldElement fieldA = classA.getField(fieldName); | 138 FieldElement fieldA = classA.getField(fieldName); |
| 138 DartType expectedType = fieldA.type; | 139 DartType expectedType = fieldA.type; |
| 139 ClassElement classC = unit.getType('C'); | 140 ClassElement classC = unit.getType('C'); |
| 140 FieldElement fieldC = classC.getField(fieldName); | 141 FieldElement fieldC = classC.getField(fieldName); |
| 141 PropertyAccessorElement getterC = classC.getGetter(fieldName); | 142 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 142 expect(fieldC.type.isDynamic, isTrue); | 143 expect(fieldC.type.isDynamic, isTrue); |
| 143 expect(getterC.returnType.isDynamic, isTrue); | 144 expect(getterC.returnType.isDynamic, isTrue); |
| 144 | 145 |
| 145 inferrer.inferCompilationUnit(unit); | 146 _runInferrer(unit); |
| 146 | 147 |
| 147 expect(fieldC.type, expectedType); | 148 expect(fieldC.type, expectedType); |
| 148 expect(getterC.returnType, expectedType); | 149 expect(getterC.returnType, expectedType); |
| 149 } | 150 } |
| 150 | 151 |
| 151 void test_inferCompilationUnit_field_noOverride() { | 152 void test_inferCompilationUnit_field_noOverride() { |
| 152 InstanceMemberInferrer inferrer = createInferrer; | |
| 153 String fieldName = 'f'; | 153 String fieldName = 'f'; |
| 154 CompilationUnitElement unit = resolve(''' | 154 CompilationUnitElement unit = resolve(''' |
| 155 class A { | 155 class A { |
| 156 final $fieldName = 0; | 156 final $fieldName = 0; |
| 157 } | 157 } |
| 158 '''); | 158 '''); |
| 159 ClassElement classA = unit.getType('A'); | 159 ClassElement classA = unit.getType('A'); |
| 160 FieldElement fieldA = classA.getField(fieldName); | 160 FieldElement fieldA = classA.getField(fieldName); |
| 161 PropertyAccessorElement getterA = classA.getGetter(fieldName); | 161 PropertyAccessorElement getterA = classA.getGetter(fieldName); |
| 162 expect(fieldA.type.isDynamic, isTrue); | 162 expect(fieldA.type.isDynamic, isTrue); |
| 163 expect(getterA.returnType.isDynamic, isTrue); | 163 expect(getterA.returnType.isDynamic, isTrue); |
| 164 | 164 |
| 165 inferrer.inferCompilationUnit(unit); | 165 InstanceMemberInferrer inferrer = _runInferrer(unit); |
| 166 | 166 |
| 167 DartType intType = inferrer.typeProvider.intType; | 167 DartType intType = inferrer.typeProvider.intType; |
| 168 expect(fieldA.type, intType); | 168 expect(fieldA.type, intType); |
| 169 expect(getterA.returnType, intType); | 169 expect(getterA.returnType, intType); |
| 170 } | 170 } |
| 171 | 171 |
| 172 void test_inferCompilationUnit_field_noOverride_bottom() { | 172 void test_inferCompilationUnit_field_noOverride_bottom() { |
| 173 InstanceMemberInferrer inferrer = createInferrer; | |
| 174 String fieldName = 'f'; | 173 String fieldName = 'f'; |
| 175 CompilationUnitElement unit = resolve(''' | 174 CompilationUnitElement unit = resolve(''' |
| 176 class A { | 175 class A { |
| 177 var $fieldName = null; | 176 var $fieldName = null; |
| 178 } | 177 } |
| 179 '''); | 178 '''); |
| 180 ClassElement classA = unit.getType('A'); | 179 ClassElement classA = unit.getType('A'); |
| 181 FieldElement fieldA = classA.getField(fieldName); | 180 FieldElement fieldA = classA.getField(fieldName); |
| 182 PropertyAccessorElement getterA = classA.getGetter(fieldName); | 181 PropertyAccessorElement getterA = classA.getGetter(fieldName); |
| 183 expect(fieldA.type.isDynamic, isTrue); | 182 expect(fieldA.type.isDynamic, isTrue); |
| 184 expect(getterA.returnType.isDynamic, isTrue); | 183 expect(getterA.returnType.isDynamic, isTrue); |
| 185 | 184 |
| 186 inferrer.inferCompilationUnit(unit); | 185 _runInferrer(unit); |
| 187 | 186 |
| 188 expect(fieldA.type.isDynamic, isTrue); | 187 expect(fieldA.type.isDynamic, isTrue); |
| 189 expect(getterA.returnType.isDynamic, isTrue); | 188 expect(getterA.returnType.isDynamic, isTrue); |
| 190 } | 189 } |
| 191 | 190 |
| 192 void test_inferCompilationUnit_field_single_explicitlyDynamic() { | 191 void test_inferCompilationUnit_field_single_explicitlyDynamic() { |
| 193 InstanceMemberInferrer inferrer = createInferrer; | |
| 194 String fieldName = 'f'; | 192 String fieldName = 'f'; |
| 195 CompilationUnitElement unit = resolve(''' | 193 CompilationUnitElement unit = resolve(''' |
| 196 class A { | 194 class A { |
| 197 dynamic $fieldName; | 195 dynamic $fieldName; |
| 198 } | 196 } |
| 199 class B extends A { | 197 class B extends A { |
| 200 var $fieldName = 0; | 198 var $fieldName = 0; |
| 201 } | 199 } |
| 202 '''); | 200 '''); |
| 203 ClassElement classA = unit.getType('A'); | 201 ClassElement classA = unit.getType('A'); |
| 204 FieldElement fieldA = classA.getField(fieldName); | 202 FieldElement fieldA = classA.getField(fieldName); |
| 205 PropertyAccessorElement getterA = classA.getGetter(fieldName); | 203 PropertyAccessorElement getterA = classA.getGetter(fieldName); |
| 206 ClassElement classB = unit.getType('B'); | 204 ClassElement classB = unit.getType('B'); |
| 207 FieldElement fieldB = classB.getField(fieldName); | 205 FieldElement fieldB = classB.getField(fieldName); |
| 208 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 206 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 209 expect(fieldB.type.isDynamic, isTrue); | 207 expect(fieldB.type.isDynamic, isTrue); |
| 210 expect(getterB.returnType.isDynamic, isTrue); | 208 expect(getterB.returnType.isDynamic, isTrue); |
| 211 | 209 |
| 212 inferrer.inferCompilationUnit(unit); | 210 _runInferrer(unit); |
| 213 | 211 |
| 214 expect(fieldB.type, fieldA.type); | 212 expect(fieldB.type, fieldA.type); |
| 215 expect(getterB.returnType, getterA.returnType); | 213 expect(getterB.returnType, getterA.returnType); |
| 216 } | 214 } |
| 217 | 215 |
| 218 void test_inferCompilationUnit_field_single_final() { | 216 void test_inferCompilationUnit_field_single_final() { |
| 219 InstanceMemberInferrer inferrer = createInferrer; | |
| 220 String fieldName = 'f'; | 217 String fieldName = 'f'; |
| 221 CompilationUnitElement unit = resolve(''' | 218 CompilationUnitElement unit = resolve(''' |
| 222 class A { | 219 class A { |
| 223 final int $fieldName; | 220 final int $fieldName; |
| 224 } | 221 } |
| 225 class B extends A { | 222 class B extends A { |
| 226 final $fieldName; | 223 final $fieldName; |
| 227 } | 224 } |
| 228 '''); | 225 '''); |
| 229 ClassElement classA = unit.getType('A'); | 226 ClassElement classA = unit.getType('A'); |
| 230 FieldElement fieldA = classA.getField(fieldName); | 227 FieldElement fieldA = classA.getField(fieldName); |
| 231 PropertyAccessorElement getterA = classA.getGetter(fieldName); | 228 PropertyAccessorElement getterA = classA.getGetter(fieldName); |
| 232 ClassElement classB = unit.getType('B'); | 229 ClassElement classB = unit.getType('B'); |
| 233 FieldElement fieldB = classB.getField(fieldName); | 230 FieldElement fieldB = classB.getField(fieldName); |
| 234 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 231 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 235 expect(fieldB.type.isDynamic, isTrue); | 232 expect(fieldB.type.isDynamic, isTrue); |
| 236 expect(getterB.returnType.isDynamic, isTrue); | 233 expect(getterB.returnType.isDynamic, isTrue); |
| 237 | 234 |
| 238 inferrer.inferCompilationUnit(unit); | 235 _runInferrer(unit); |
| 239 | 236 |
| 240 expect(fieldB.type, fieldA.type); | 237 expect(fieldB.type, fieldA.type); |
| 241 expect(getterB.returnType, getterA.returnType); | 238 expect(getterB.returnType, getterA.returnType); |
| 242 } | 239 } |
| 243 | 240 |
| 244 void test_inferCompilationUnit_field_single_final_narrowType() { | 241 void test_inferCompilationUnit_field_single_final_narrowType() { |
| 245 InstanceMemberInferrer inferrer = createInferrer; | |
| 246 String fieldName = 'f'; | 242 String fieldName = 'f'; |
| 247 CompilationUnitElement unit = resolve(''' | 243 CompilationUnitElement unit = resolve(''' |
| 248 class A { | 244 class A { |
| 249 final $fieldName; | 245 final $fieldName; |
| 250 } | 246 } |
| 251 class B extends A { | 247 class B extends A { |
| 252 final $fieldName = 0; | 248 final $fieldName = 0; |
| 253 } | 249 } |
| 254 '''); | 250 '''); |
| 255 ClassElement classB = unit.getType('B'); | 251 ClassElement classB = unit.getType('B'); |
| 256 FieldElement fieldB = classB.getField(fieldName); | 252 FieldElement fieldB = classB.getField(fieldName); |
| 257 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 253 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 258 expect(fieldB.type.isDynamic, isTrue); | 254 expect(fieldB.type.isDynamic, isTrue); |
| 259 expect(getterB.returnType.isDynamic, isTrue); | 255 expect(getterB.returnType.isDynamic, isTrue); |
| 260 | 256 |
| 261 inferrer.inferCompilationUnit(unit); | 257 InstanceMemberInferrer inferrer = _runInferrer(unit); |
| 262 | 258 |
| 263 expect(fieldB.type, inferrer.typeProvider.intType); | 259 expect(fieldB.type, inferrer.typeProvider.intType); |
| 264 expect(getterB.returnType, fieldB.type); | 260 expect(getterB.returnType, fieldB.type); |
| 265 } | 261 } |
| 266 | 262 |
| 267 void test_inferCompilationUnit_field_single_generic() { | 263 void test_inferCompilationUnit_field_single_generic() { |
| 268 InstanceMemberInferrer inferrer = createInferrer; | |
| 269 String fieldName = 'f'; | 264 String fieldName = 'f'; |
| 270 CompilationUnitElement unit = resolve(''' | 265 CompilationUnitElement unit = resolve(''' |
| 271 class A<E> { | 266 class A<E> { |
| 272 E $fieldName; | 267 E $fieldName; |
| 273 } | 268 } |
| 274 class B<E> extends A<E> { | 269 class B<E> extends A<E> { |
| 275 var $fieldName; | 270 var $fieldName; |
| 276 } | 271 } |
| 277 '''); | 272 '''); |
| 278 ClassElement classB = unit.getType('B'); | 273 ClassElement classB = unit.getType('B'); |
| 279 DartType typeBE = classB.typeParameters[0].type; | 274 DartType typeBE = classB.typeParameters[0].type; |
| 280 FieldElement fieldB = classB.getField(fieldName); | 275 FieldElement fieldB = classB.getField(fieldName); |
| 281 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 276 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 282 expect(fieldB.type.isDynamic, isTrue); | 277 expect(fieldB.type.isDynamic, isTrue); |
| 283 expect(getterB.returnType.isDynamic, isTrue); | 278 expect(getterB.returnType.isDynamic, isTrue); |
| 284 | 279 |
| 285 inferrer.inferCompilationUnit(unit); | 280 _runInferrer(unit); |
| 286 | 281 |
| 287 expect(fieldB.type, typeBE); | 282 expect(fieldB.type, typeBE); |
| 288 expect(getterB.returnType, typeBE); | 283 expect(getterB.returnType, typeBE); |
| 289 } | 284 } |
| 290 | 285 |
| 291 void test_inferCompilationUnit_field_single_inconsistentAccessors() { | 286 void test_inferCompilationUnit_field_single_inconsistentAccessors() { |
| 292 InstanceMemberInferrer inferrer = createInferrer; | |
| 293 String fieldName = 'f'; | 287 String fieldName = 'f'; |
| 294 CompilationUnitElement unit = resolve(''' | 288 CompilationUnitElement unit = resolve(''' |
| 295 class A { | 289 class A { |
| 296 int get $fieldName => 0; | 290 int get $fieldName => 0; |
| 297 set $fieldName(String value) {} | 291 set $fieldName(String value) {} |
| 298 } | 292 } |
| 299 class B extends A { | 293 class B extends A { |
| 300 var $fieldName; | 294 var $fieldName; |
| 301 } | 295 } |
| 302 '''); | 296 '''); |
| 303 ClassElement classB = unit.getType('B'); | 297 ClassElement classB = unit.getType('B'); |
| 304 FieldElement fieldB = classB.getField(fieldName); | 298 FieldElement fieldB = classB.getField(fieldName); |
| 305 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 299 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 306 expect(fieldB.type.isDynamic, isTrue); | 300 expect(fieldB.type.isDynamic, isTrue); |
| 307 expect(getterB.returnType.isDynamic, isTrue); | 301 expect(getterB.returnType.isDynamic, isTrue); |
| 308 | 302 |
| 309 inferrer.inferCompilationUnit(unit); | 303 _runInferrer(unit); |
| 310 | 304 |
| 311 expect(fieldB.type.isDynamic, isTrue); | 305 expect(fieldB.type.isDynamic, isTrue); |
| 312 expect(getterB.returnType.isDynamic, isTrue); | 306 expect(getterB.returnType.isDynamic, isTrue); |
| 313 } | 307 } |
| 314 | 308 |
| 315 void test_inferCompilationUnit_field_single_noModifiers() { | 309 void test_inferCompilationUnit_field_single_noModifiers() { |
| 316 InstanceMemberInferrer inferrer = createInferrer; | |
| 317 String fieldName = 'f'; | 310 String fieldName = 'f'; |
| 318 CompilationUnitElement unit = resolve(''' | 311 CompilationUnitElement unit = resolve(''' |
| 319 class A { | 312 class A { |
| 320 int $fieldName; | 313 int $fieldName; |
| 321 } | 314 } |
| 322 class B extends A { | 315 class B extends A { |
| 323 var $fieldName; | 316 var $fieldName; |
| 324 } | 317 } |
| 325 '''); | 318 '''); |
| 326 ClassElement classA = unit.getType('A'); | 319 ClassElement classA = unit.getType('A'); |
| 327 FieldElement fieldA = classA.getField(fieldName); | 320 FieldElement fieldA = classA.getField(fieldName); |
| 328 PropertyAccessorElement getterA = classA.getGetter(fieldName); | 321 PropertyAccessorElement getterA = classA.getGetter(fieldName); |
| 329 ClassElement classB = unit.getType('B'); | 322 ClassElement classB = unit.getType('B'); |
| 330 FieldElement fieldB = classB.getField(fieldName); | 323 FieldElement fieldB = classB.getField(fieldName); |
| 331 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 324 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 332 expect(fieldB.type.isDynamic, isTrue); | 325 expect(fieldB.type.isDynamic, isTrue); |
| 333 expect(getterB.returnType.isDynamic, isTrue); | 326 expect(getterB.returnType.isDynamic, isTrue); |
| 334 | 327 |
| 335 inferrer.inferCompilationUnit(unit); | 328 _runInferrer(unit); |
| 336 | 329 |
| 337 expect(fieldB.type, fieldA.type); | 330 expect(fieldB.type, fieldA.type); |
| 338 expect(getterB.returnType, getterA.returnType); | 331 expect(getterB.returnType, getterA.returnType); |
| 339 } | 332 } |
| 340 | 333 |
| 334 void test_inferCompilationUnit_fieldFormal() { |
| 335 String fieldName = 'f'; |
| 336 CompilationUnitElement unit = resolve(''' |
| 337 class A { |
| 338 final $fieldName = 0; |
| 339 A([this.$fieldName = 'hello']); |
| 340 } |
| 341 '''); |
| 342 ClassElement classA = unit.getType('A'); |
| 343 FieldElement fieldA = classA.getField(fieldName); |
| 344 FieldFormalParameterElement paramA = |
| 345 classA.unnamedConstructor.parameters[0]; |
| 346 expect(fieldA.type.isDynamic, isTrue); |
| 347 expect(paramA.type.isDynamic, isTrue); |
| 348 |
| 349 InstanceMemberInferrer inferrer = _runInferrer(unit); |
| 350 |
| 351 DartType intType = inferrer.typeProvider.intType; |
| 352 expect(fieldA.type, intType); |
| 353 expect(paramA.type, intType); |
| 354 } |
| 355 |
| 341 void test_inferCompilationUnit_getter_multiple_different() { | 356 void test_inferCompilationUnit_getter_multiple_different() { |
| 342 InstanceMemberInferrer inferrer = createInferrer; | |
| 343 String getterName = 'g'; | 357 String getterName = 'g'; |
| 344 CompilationUnitElement unit = resolve(''' | 358 CompilationUnitElement unit = resolve(''' |
| 345 class A { | 359 class A { |
| 346 int get $getterName => 0; | 360 int get $getterName => 0; |
| 347 } | 361 } |
| 348 class B { | 362 class B { |
| 349 double get $getterName => 0.0; | 363 double get $getterName => 0.0; |
| 350 } | 364 } |
| 351 class C implements A, B { | 365 class C implements A, B { |
| 352 get $getterName => 0; | 366 get $getterName => 0; |
| 353 } | 367 } |
| 354 '''); | 368 '''); |
| 355 ClassElement classC = unit.getType('C'); | 369 ClassElement classC = unit.getType('C'); |
| 356 FieldElement fieldC = classC.getField(getterName); | 370 FieldElement fieldC = classC.getField(getterName); |
| 357 PropertyAccessorElement getterC = classC.getGetter(getterName); | 371 PropertyAccessorElement getterC = classC.getGetter(getterName); |
| 358 expect(fieldC.type.isDynamic, isTrue); | 372 expect(fieldC.type.isDynamic, isTrue); |
| 359 expect(getterC.returnType.isDynamic, isTrue); | 373 expect(getterC.returnType.isDynamic, isTrue); |
| 360 | 374 |
| 361 inferrer.inferCompilationUnit(unit); | 375 _runInferrer(unit); |
| 362 | 376 |
| 363 expect(fieldC.type.isDynamic, isTrue); | 377 expect(fieldC.type.isDynamic, isTrue); |
| 364 expect(getterC.returnType.isDynamic, isTrue); | 378 expect(getterC.returnType.isDynamic, isTrue); |
| 365 } | 379 } |
| 366 | 380 |
| 367 void test_inferCompilationUnit_getter_multiple_dynamic() { | 381 void test_inferCompilationUnit_getter_multiple_dynamic() { |
| 368 InstanceMemberInferrer inferrer = createInferrer; | |
| 369 String getterName = 'g'; | 382 String getterName = 'g'; |
| 370 CompilationUnitElement unit = resolve(''' | 383 CompilationUnitElement unit = resolve(''' |
| 371 class A { | 384 class A { |
| 372 int get $getterName => 0; | 385 int get $getterName => 0; |
| 373 } | 386 } |
| 374 class B { | 387 class B { |
| 375 get $getterName => 0; | 388 get $getterName => 0; |
| 376 } | 389 } |
| 377 class C implements A, B { | 390 class C implements A, B { |
| 378 get $getterName => 0; | 391 get $getterName => 0; |
| 379 } | 392 } |
| 380 '''); | 393 '''); |
| 381 ClassElement classC = unit.getType('C'); | 394 ClassElement classC = unit.getType('C'); |
| 382 FieldElement fieldC = classC.getField(getterName); | 395 FieldElement fieldC = classC.getField(getterName); |
| 383 PropertyAccessorElement getterC = classC.getGetter(getterName); | 396 PropertyAccessorElement getterC = classC.getGetter(getterName); |
| 384 expect(fieldC.type.isDynamic, isTrue); | 397 expect(fieldC.type.isDynamic, isTrue); |
| 385 expect(getterC.returnType.isDynamic, isTrue); | 398 expect(getterC.returnType.isDynamic, isTrue); |
| 386 | 399 |
| 387 inferrer.inferCompilationUnit(unit); | 400 _runInferrer(unit); |
| 388 | 401 |
| 389 expect(fieldC.type.isDynamic, isTrue); | 402 expect(fieldC.type.isDynamic, isTrue); |
| 390 expect(getterC.returnType.isDynamic, isTrue); | 403 expect(getterC.returnType.isDynamic, isTrue); |
| 391 } | 404 } |
| 392 | 405 |
| 393 void test_inferCompilationUnit_getter_multiple_same() { | 406 void test_inferCompilationUnit_getter_multiple_same() { |
| 394 InstanceMemberInferrer inferrer = createInferrer; | |
| 395 String getterName = 'g'; | 407 String getterName = 'g'; |
| 396 CompilationUnitElement unit = resolve(''' | 408 CompilationUnitElement unit = resolve(''' |
| 397 class A { | 409 class A { |
| 398 String get $getterName => ''; | 410 String get $getterName => ''; |
| 399 } | 411 } |
| 400 class B { | 412 class B { |
| 401 String get $getterName => ''; | 413 String get $getterName => ''; |
| 402 } | 414 } |
| 403 class C implements A, B { | 415 class C implements A, B { |
| 404 get $getterName => ''; | 416 get $getterName => ''; |
| 405 } | 417 } |
| 406 '''); | 418 '''); |
| 407 ClassElement classA = unit.getType('A'); | 419 ClassElement classA = unit.getType('A'); |
| 408 PropertyAccessorElement getterA = classA.getGetter(getterName); | 420 PropertyAccessorElement getterA = classA.getGetter(getterName); |
| 409 DartType expectedType = getterA.returnType; | 421 DartType expectedType = getterA.returnType; |
| 410 ClassElement classC = unit.getType('C'); | 422 ClassElement classC = unit.getType('C'); |
| 411 FieldElement fieldC = classC.getField(getterName); | 423 FieldElement fieldC = classC.getField(getterName); |
| 412 PropertyAccessorElement getterC = classC.getGetter(getterName); | 424 PropertyAccessorElement getterC = classC.getGetter(getterName); |
| 413 expect(fieldC.type.isDynamic, isTrue); | 425 expect(fieldC.type.isDynamic, isTrue); |
| 414 expect(getterC.returnType.isDynamic, isTrue); | 426 expect(getterC.returnType.isDynamic, isTrue); |
| 415 | 427 |
| 416 inferrer.inferCompilationUnit(unit); | 428 _runInferrer(unit); |
| 417 | 429 |
| 418 expect(fieldC.type, expectedType); | 430 expect(fieldC.type, expectedType); |
| 419 expect(getterC.returnType, expectedType); | 431 expect(getterC.returnType, expectedType); |
| 420 } | 432 } |
| 421 | 433 |
| 422 void test_inferCompilationUnit_getter_single() { | 434 void test_inferCompilationUnit_getter_single() { |
| 423 InstanceMemberInferrer inferrer = createInferrer; | |
| 424 String getterName = 'g'; | 435 String getterName = 'g'; |
| 425 CompilationUnitElement unit = resolve(''' | 436 CompilationUnitElement unit = resolve(''' |
| 426 class A { | 437 class A { |
| 427 int get $getterName => 0; | 438 int get $getterName => 0; |
| 428 } | 439 } |
| 429 class B extends A { | 440 class B extends A { |
| 430 get $getterName => 0; | 441 get $getterName => 0; |
| 431 } | 442 } |
| 432 '''); | 443 '''); |
| 433 ClassElement classA = unit.getType('A'); | 444 ClassElement classA = unit.getType('A'); |
| 434 FieldElement fieldA = classA.getField(getterName); | 445 FieldElement fieldA = classA.getField(getterName); |
| 435 PropertyAccessorElement getterA = classA.getGetter(getterName); | 446 PropertyAccessorElement getterA = classA.getGetter(getterName); |
| 436 ClassElement classB = unit.getType('B'); | 447 ClassElement classB = unit.getType('B'); |
| 437 FieldElement fieldB = classB.getField(getterName); | 448 FieldElement fieldB = classB.getField(getterName); |
| 438 PropertyAccessorElement getterB = classB.getGetter(getterName); | 449 PropertyAccessorElement getterB = classB.getGetter(getterName); |
| 439 expect(fieldB.type.isDynamic, isTrue); | 450 expect(fieldB.type.isDynamic, isTrue); |
| 440 expect(getterB.returnType.isDynamic, isTrue); | 451 expect(getterB.returnType.isDynamic, isTrue); |
| 441 | 452 |
| 442 inferrer.inferCompilationUnit(unit); | 453 _runInferrer(unit); |
| 443 | 454 |
| 444 expect(fieldB.type, fieldA.type); | 455 expect(fieldB.type, fieldA.type); |
| 445 expect(getterB.returnType, getterA.returnType); | 456 expect(getterB.returnType, getterA.returnType); |
| 446 } | 457 } |
| 447 | 458 |
| 448 void test_inferCompilationUnit_getter_single_generic() { | 459 void test_inferCompilationUnit_getter_single_generic() { |
| 449 InstanceMemberInferrer inferrer = createInferrer; | |
| 450 String getterName = 'g'; | 460 String getterName = 'g'; |
| 451 CompilationUnitElement unit = resolve(''' | 461 CompilationUnitElement unit = resolve(''' |
| 452 class A<E> { | 462 class A<E> { |
| 453 E get $getterName => 0; | 463 E get $getterName => 0; |
| 454 } | 464 } |
| 455 class B<E> extends A<E> { | 465 class B<E> extends A<E> { |
| 456 get $getterName => 0; | 466 get $getterName => 0; |
| 457 } | 467 } |
| 458 '''); | 468 '''); |
| 459 ClassElement classB = unit.getType('B'); | 469 ClassElement classB = unit.getType('B'); |
| 460 DartType typeBE = classB.typeParameters[0].type; | 470 DartType typeBE = classB.typeParameters[0].type; |
| 461 FieldElement fieldB = classB.getField(getterName); | 471 FieldElement fieldB = classB.getField(getterName); |
| 462 PropertyAccessorElement getterB = classB.getGetter(getterName); | 472 PropertyAccessorElement getterB = classB.getGetter(getterName); |
| 463 expect(fieldB.type.isDynamic, isTrue); | 473 expect(fieldB.type.isDynamic, isTrue); |
| 464 expect(getterB.returnType.isDynamic, isTrue); | 474 expect(getterB.returnType.isDynamic, isTrue); |
| 465 | 475 |
| 466 inferrer.inferCompilationUnit(unit); | 476 _runInferrer(unit); |
| 467 | 477 |
| 468 expect(fieldB.type, typeBE); | 478 expect(fieldB.type, typeBE); |
| 469 expect(getterB.returnType, typeBE); | 479 expect(getterB.returnType, typeBE); |
| 470 } | 480 } |
| 471 | 481 |
| 472 void test_inferCompilationUnit_getter_single_inconsistentAccessors() { | 482 void test_inferCompilationUnit_getter_single_inconsistentAccessors() { |
| 473 InstanceMemberInferrer inferrer = createInferrer; | |
| 474 String getterName = 'g'; | 483 String getterName = 'g'; |
| 475 CompilationUnitElement unit = resolve(''' | 484 CompilationUnitElement unit = resolve(''' |
| 476 class A { | 485 class A { |
| 477 int get $getterName => 0; | 486 int get $getterName => 0; |
| 478 set $getterName(String value) {} | 487 set $getterName(String value) {} |
| 479 } | 488 } |
| 480 class B extends A { | 489 class B extends A { |
| 481 var get $getterName => 1; | 490 var get $getterName => 1; |
| 482 } | 491 } |
| 483 '''); | 492 '''); |
| 484 ClassElement classA = unit.getType('A'); | 493 ClassElement classA = unit.getType('A'); |
| 485 FieldElement fieldA = classA.getField(getterName); | 494 FieldElement fieldA = classA.getField(getterName); |
| 486 PropertyAccessorElement getterA = classA.getGetter(getterName); | 495 PropertyAccessorElement getterA = classA.getGetter(getterName); |
| 487 ClassElement classB = unit.getType('B'); | 496 ClassElement classB = unit.getType('B'); |
| 488 FieldElement fieldB = classB.getField(getterName); | 497 FieldElement fieldB = classB.getField(getterName); |
| 489 PropertyAccessorElement getterB = classB.getGetter(getterName); | 498 PropertyAccessorElement getterB = classB.getGetter(getterName); |
| 490 expect(fieldB.type.isDynamic, isTrue); | 499 expect(fieldB.type.isDynamic, isTrue); |
| 491 expect(getterB.returnType.isDynamic, isTrue); | 500 expect(getterB.returnType.isDynamic, isTrue); |
| 492 | 501 |
| 493 inferrer.inferCompilationUnit(unit); | 502 _runInferrer(unit); |
| 494 | 503 |
| 495 // Expected behavior is that the getter is inferred: getters and setters | 504 // Expected behavior is that the getter is inferred: getters and setters |
| 496 // are treated as independent methods. | 505 // are treated as independent methods. |
| 497 expect(fieldB.type, fieldA.type); | 506 expect(fieldB.type, fieldA.type); |
| 498 expect(getterB.returnType, getterA.returnType); | 507 expect(getterB.returnType, getterA.returnType); |
| 499 } | 508 } |
| 500 | 509 |
| 501 void test_inferCompilationUnit_setter_single() { | |
| 502 InstanceMemberInferrer inferrer = createInferrer; | |
| 503 String setterName = 'g'; | |
| 504 CompilationUnitElement unit = resolve(''' | |
| 505 class A { | |
| 506 set $setterName(int x) {} | |
| 507 } | |
| 508 class B extends A { | |
| 509 set $setterName(x) {} | |
| 510 } | |
| 511 '''); | |
| 512 ClassElement classA = unit.getType('A'); | |
| 513 FieldElement fieldA = classA.getField(setterName); | |
| 514 PropertyAccessorElement setterA = classA.getSetter(setterName); | |
| 515 ClassElement classB = unit.getType('B'); | |
| 516 FieldElement fieldB = classB.getField(setterName); | |
| 517 PropertyAccessorElement setterB = classB.getSetter(setterName); | |
| 518 expect(fieldB.type.isDynamic, isTrue); | |
| 519 expect(setterB.parameters[0].type.isDynamic, isTrue); | |
| 520 | |
| 521 inferrer.inferCompilationUnit(unit); | |
| 522 | |
| 523 expect(fieldB.type, fieldA.type); | |
| 524 expect(setterB.parameters[0].type, setterA.parameters[0].type); | |
| 525 } | |
| 526 | |
| 527 void test_inferCompilationUnit_setter_single_generic() { | |
| 528 InstanceMemberInferrer inferrer = createInferrer; | |
| 529 String setterName = 'g'; | |
| 530 CompilationUnitElement unit = resolve(''' | |
| 531 class A<E> { | |
| 532 set $setterName(E x) {} | |
| 533 } | |
| 534 class B<E> extends A<E> { | |
| 535 set $setterName(x) {} | |
| 536 } | |
| 537 '''); | |
| 538 ClassElement classB = unit.getType('B'); | |
| 539 DartType typeBE = classB.typeParameters[0].type; | |
| 540 FieldElement fieldB = classB.getField(setterName); | |
| 541 PropertyAccessorElement setterB = classB.getSetter(setterName); | |
| 542 expect(fieldB.type.isDynamic, isTrue); | |
| 543 expect(setterB.parameters[0].type.isDynamic, isTrue); | |
| 544 | |
| 545 inferrer.inferCompilationUnit(unit); | |
| 546 | |
| 547 expect(fieldB.type, typeBE); | |
| 548 expect(setterB.parameters[0].type, typeBE); | |
| 549 } | |
| 550 | |
| 551 void test_inferCompilationUnit_setter_single_inconsistentAccessors() { | |
| 552 InstanceMemberInferrer inferrer = createInferrer; | |
| 553 String getterName = 'g'; | |
| 554 CompilationUnitElement unit = resolve(''' | |
| 555 class A { | |
| 556 int get $getterName => 0; | |
| 557 set $getterName(String value) {} | |
| 558 } | |
| 559 class B extends A { | |
| 560 set $getterName(x) {} | |
| 561 } | |
| 562 '''); | |
| 563 ClassElement classA = unit.getType('A'); | |
| 564 PropertyAccessorElement setterA = classA.getSetter(getterName); | |
| 565 ClassElement classB = unit.getType('B'); | |
| 566 FieldElement fieldB = classB.getField(getterName); | |
| 567 PropertyAccessorElement setterB = classB.getSetter(getterName); | |
| 568 expect(fieldB.type.isDynamic, isTrue); | |
| 569 expect(setterB.parameters[0].type.isDynamic, isTrue); | |
| 570 | |
| 571 inferrer.inferCompilationUnit(unit); | |
| 572 | |
| 573 // Expected behavior is that the getter is inferred: getters and setters | |
| 574 // are treated as independent methods. | |
| 575 expect(setterB.parameters[0].type, setterA.parameters[0].type); | |
| 576 | |
| 577 // Note that B's synthetic field type will be String. This matches what | |
| 578 // resolver would do if we explicitly typed the parameter as 'String' | |
| 579 expect(fieldB.type, setterB.parameters[0].type); | |
| 580 } | |
| 581 | |
| 582 void test_inferCompilationUnit_invalid_inheritanceCycle() { | 510 void test_inferCompilationUnit_invalid_inheritanceCycle() { |
| 583 InstanceMemberInferrer inferrer = createInferrer; | |
| 584 CompilationUnitElement unit = resolve(''' | 511 CompilationUnitElement unit = resolve(''' |
| 585 class A extends C {} | 512 class A extends C {} |
| 586 class B extends A {} | 513 class B extends A {} |
| 587 class C extends B {} | 514 class C extends B {} |
| 588 '''); | 515 '''); |
| 589 inferrer.inferCompilationUnit(unit); | 516 _runInferrer(unit); |
| 590 } | 517 } |
| 591 | 518 |
| 592 void test_inferCompilationUnit_method_parameter_multiple_different() { | 519 void test_inferCompilationUnit_method_parameter_multiple_different() { |
| 593 InstanceMemberInferrer inferrer = createInferrer; | |
| 594 String methodName = 'm'; | 520 String methodName = 'm'; |
| 595 CompilationUnitElement unit = resolve(''' | 521 CompilationUnitElement unit = resolve(''' |
| 596 class A { | 522 class A { |
| 597 $methodName(int p) => 0; | 523 $methodName(int p) => 0; |
| 598 } | 524 } |
| 599 class B { | 525 class B { |
| 600 $methodName(double p) => 0; | 526 $methodName(double p) => 0; |
| 601 } | 527 } |
| 602 class C implements A, B { | 528 class C implements A, B { |
| 603 $methodName(p) => 0; | 529 $methodName(p) => 0; |
| 604 } | 530 } |
| 605 '''); | 531 '''); |
| 606 ClassElement classC = unit.getType('C'); | 532 ClassElement classC = unit.getType('C'); |
| 607 MethodElement methodC = classC.getMethod(methodName); | 533 MethodElement methodC = classC.getMethod(methodName); |
| 608 ParameterElement parameterC = methodC.parameters[0]; | 534 ParameterElement parameterC = methodC.parameters[0]; |
| 609 expect(parameterC.type.isDynamic, isTrue); | 535 expect(parameterC.type.isDynamic, isTrue); |
| 610 | 536 |
| 611 inferrer.inferCompilationUnit(unit); | 537 _runInferrer(unit); |
| 612 | 538 |
| 613 expect(parameterC.type.isDynamic, isTrue); | 539 expect(parameterC.type.isDynamic, isTrue); |
| 614 } | 540 } |
| 615 | 541 |
| 616 void test_inferCompilationUnit_method_parameter_multiple_named_different() { | 542 void test_inferCompilationUnit_method_parameter_multiple_named_different() { |
| 617 InstanceMemberInferrer inferrer = createInferrer; | |
| 618 String methodName = 'm'; | 543 String methodName = 'm'; |
| 619 CompilationUnitElement unit = resolve(''' | 544 CompilationUnitElement unit = resolve(''' |
| 620 class A { | 545 class A { |
| 621 $methodName({int p}) => 0; | 546 $methodName({int p}) => 0; |
| 622 } | 547 } |
| 623 class B { | 548 class B { |
| 624 $methodName({int q}) => 0; | 549 $methodName({int q}) => 0; |
| 625 } | 550 } |
| 626 class C implements A, B { | 551 class C implements A, B { |
| 627 $methodName({p}) => 0; | 552 $methodName({p}) => 0; |
| 628 } | 553 } |
| 629 '''); | 554 '''); |
| 630 ClassElement classC = unit.getType('C'); | 555 ClassElement classC = unit.getType('C'); |
| 631 MethodElement methodC = classC.getMethod(methodName); | 556 MethodElement methodC = classC.getMethod(methodName); |
| 632 ParameterElement parameterC = methodC.parameters[0]; | 557 ParameterElement parameterC = methodC.parameters[0]; |
| 633 expect(parameterC.type.isDynamic, isTrue); | 558 expect(parameterC.type.isDynamic, isTrue); |
| 634 | 559 |
| 635 inferrer.inferCompilationUnit(unit); | 560 _runInferrer(unit); |
| 636 | 561 |
| 637 expect(parameterC.type.isDynamic, isTrue); | 562 expect(parameterC.type.isDynamic, isTrue); |
| 638 } | 563 } |
| 639 | 564 |
| 640 void test_inferCompilationUnit_method_parameter_multiple_named_same() { | 565 void test_inferCompilationUnit_method_parameter_multiple_named_same() { |
| 641 InstanceMemberInferrer inferrer = createInferrer; | |
| 642 String methodName = 'm'; | 566 String methodName = 'm'; |
| 643 CompilationUnitElement unit = resolve(''' | 567 CompilationUnitElement unit = resolve(''' |
| 644 class A { | 568 class A { |
| 645 $methodName({int p}) => 0; | 569 $methodName({int p}) => 0; |
| 646 } | 570 } |
| 647 class B { | 571 class B { |
| 648 $methodName({int p}) => 0; | 572 $methodName({int p}) => 0; |
| 649 } | 573 } |
| 650 class C implements A, B { | 574 class C implements A, B { |
| 651 $methodName({p}) => 0; | 575 $methodName({p}) => 0; |
| 652 } | 576 } |
| 653 '''); | 577 '''); |
| 654 ClassElement classA = unit.getType('A'); | 578 ClassElement classA = unit.getType('A'); |
| 655 MethodElement methodA = classA.getMethod(methodName); | 579 MethodElement methodA = classA.getMethod(methodName); |
| 656 ParameterElement parameterA = methodA.parameters[0]; | 580 ParameterElement parameterA = methodA.parameters[0]; |
| 657 DartType expectedType = parameterA.type; | 581 DartType expectedType = parameterA.type; |
| 658 ClassElement classC = unit.getType('C'); | 582 ClassElement classC = unit.getType('C'); |
| 659 MethodElement methodC = classC.getMethod(methodName); | 583 MethodElement methodC = classC.getMethod(methodName); |
| 660 ParameterElement parameterC = methodC.parameters[0]; | 584 ParameterElement parameterC = methodC.parameters[0]; |
| 661 expect(parameterC.type.isDynamic, isTrue); | 585 expect(parameterC.type.isDynamic, isTrue); |
| 662 | 586 |
| 663 inferrer.inferCompilationUnit(unit); | 587 _runInferrer(unit); |
| 664 | 588 |
| 665 expect(parameterC.type, expectedType); | 589 expect(parameterC.type, expectedType); |
| 666 } | 590 } |
| 667 | 591 |
| 668 void test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() { | 592 void test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() { |
| 669 InstanceMemberInferrer inferrer = createInferrer; | |
| 670 String methodName = 'm'; | 593 String methodName = 'm'; |
| 671 CompilationUnitElement unit = resolve(''' | 594 CompilationUnitElement unit = resolve(''' |
| 672 class A { | 595 class A { |
| 673 $methodName({int p}) => 0; | 596 $methodName({int p}) => 0; |
| 674 } | 597 } |
| 675 class B { | 598 class B { |
| 676 $methodName(int p) => 0; | 599 $methodName(int p) => 0; |
| 677 } | 600 } |
| 678 class C implements A, B { | 601 class C implements A, B { |
| 679 $methodName(p) => 0; | 602 $methodName(p) => 0; |
| 680 } | 603 } |
| 681 '''); | 604 '''); |
| 682 ClassElement classC = unit.getType('C'); | 605 ClassElement classC = unit.getType('C'); |
| 683 MethodElement methodC = classC.getMethod(methodName); | 606 MethodElement methodC = classC.getMethod(methodName); |
| 684 ParameterElement parameterC = methodC.parameters[0]; | 607 ParameterElement parameterC = methodC.parameters[0]; |
| 685 expect(parameterC.type.isDynamic, isTrue); | 608 expect(parameterC.type.isDynamic, isTrue); |
| 686 | 609 |
| 687 inferrer.inferCompilationUnit(unit); | 610 _runInferrer(unit); |
| 688 | 611 |
| 689 expect(parameterC.type.isDynamic, isTrue); | 612 expect(parameterC.type.isDynamic, isTrue); |
| 690 } | 613 } |
| 691 | 614 |
| 692 void test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired()
{ | 615 void |
| 693 InstanceMemberInferrer inferrer = createInferrer; | 616 test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired()
{ |
| 694 String methodName = 'm'; | 617 String methodName = 'm'; |
| 695 CompilationUnitElement unit = resolve(''' | 618 CompilationUnitElement unit = resolve(''' |
| 696 class A { | 619 class A { |
| 697 $methodName(int p) => 0; | 620 $methodName(int p) => 0; |
| 698 } | 621 } |
| 699 class B { | 622 class B { |
| 700 $methodName([int p]) => 0; | 623 $methodName([int p]) => 0; |
| 701 } | 624 } |
| 702 class C implements A, B { | 625 class C implements A, B { |
| 703 $methodName(p) => 0; | 626 $methodName(p) => 0; |
| 704 } | 627 } |
| 705 '''); | 628 '''); |
| 706 ClassElement classA = unit.getType('A'); | 629 ClassElement classA = unit.getType('A'); |
| 707 MethodElement methodA = classA.getMethod(methodName); | 630 MethodElement methodA = classA.getMethod(methodName); |
| 708 ParameterElement parameterA = methodA.parameters[0]; | 631 ParameterElement parameterA = methodA.parameters[0]; |
| 709 DartType expectedType = parameterA.type; | 632 DartType expectedType = parameterA.type; |
| 710 ClassElement classC = unit.getType('C'); | 633 ClassElement classC = unit.getType('C'); |
| 711 MethodElement methodC = classC.getMethod(methodName); | 634 MethodElement methodC = classC.getMethod(methodName); |
| 712 ParameterElement parameterC = methodC.parameters[0]; | 635 ParameterElement parameterC = methodC.parameters[0]; |
| 713 expect(parameterC.type.isDynamic, isTrue); | 636 expect(parameterC.type.isDynamic, isTrue); |
| 714 | 637 |
| 715 inferrer.inferCompilationUnit(unit); | 638 _runInferrer(unit); |
| 716 | 639 |
| 717 expect(parameterC.type, expectedType); | 640 expect(parameterC.type, expectedType); |
| 718 } | 641 } |
| 719 | 642 |
| 720 void test_inferCompilationUnit_method_parameter_single_generic() { | 643 void test_inferCompilationUnit_method_parameter_single_generic() { |
| 721 InstanceMemberInferrer inferrer = createInferrer; | |
| 722 String methodName = 'm'; | 644 String methodName = 'm'; |
| 723 CompilationUnitElement unit = resolve(''' | 645 CompilationUnitElement unit = resolve(''' |
| 724 class A<E> { | 646 class A<E> { |
| 725 $methodName(E p) => 0; | 647 $methodName(E p) => 0; |
| 726 } | 648 } |
| 727 class C<E> implements A<E> { | 649 class C<E> implements A<E> { |
| 728 $methodName(p) => 0; | 650 $methodName(p) => 0; |
| 729 } | 651 } |
| 730 '''); | 652 '''); |
| 731 ClassElement classC = unit.getType('C'); | 653 ClassElement classC = unit.getType('C'); |
| 732 DartType typeCE = classC.typeParameters[0].type; | 654 DartType typeCE = classC.typeParameters[0].type; |
| 733 MethodElement methodC = classC.getMethod(methodName); | 655 MethodElement methodC = classC.getMethod(methodName); |
| 734 ParameterElement parameterC = methodC.parameters[0]; | 656 ParameterElement parameterC = methodC.parameters[0]; |
| 735 expect(parameterC.type.isDynamic, isTrue); | 657 expect(parameterC.type.isDynamic, isTrue); |
| 736 expect(methodC.type.typeArguments, [typeCE]); | 658 expect(methodC.type.typeArguments, [typeCE]); |
| 737 | 659 |
| 738 inferrer.inferCompilationUnit(unit); | 660 _runInferrer(unit); |
| 739 | 661 |
| 740 expect(parameterC.type, classC.typeParameters[0].type); | 662 expect(parameterC.type, classC.typeParameters[0].type); |
| 741 expect(methodC.type.typeArguments, [typeCE], | 663 expect(methodC.type.typeArguments, [typeCE], |
| 742 reason: 'function type should still have type arguments'); | 664 reason: 'function type should still have type arguments'); |
| 743 } | 665 } |
| 744 | 666 |
| 745 void test_inferCompilationUnit_method_return_multiple_different() { | 667 void test_inferCompilationUnit_method_return_multiple_different() { |
| 746 InstanceMemberInferrer inferrer = createInferrer; | |
| 747 String methodName = 'm'; | 668 String methodName = 'm'; |
| 748 CompilationUnitElement unit = resolve(''' | 669 CompilationUnitElement unit = resolve(''' |
| 749 class A { | 670 class A { |
| 750 int $methodName() => 0; | 671 int $methodName() => 0; |
| 751 } | 672 } |
| 752 class B { | 673 class B { |
| 753 double $methodName() => 0.0; | 674 double $methodName() => 0.0; |
| 754 } | 675 } |
| 755 class C implements A, B { | 676 class C implements A, B { |
| 756 $methodName() => 0; | 677 $methodName() => 0; |
| 757 } | 678 } |
| 758 '''); | 679 '''); |
| 759 ClassElement classC = unit.getType('C'); | 680 ClassElement classC = unit.getType('C'); |
| 760 MethodElement methodC = classC.getMethod(methodName); | 681 MethodElement methodC = classC.getMethod(methodName); |
| 761 expect(methodC.returnType.isDynamic, isTrue); | 682 expect(methodC.returnType.isDynamic, isTrue); |
| 762 | 683 |
| 763 inferrer.inferCompilationUnit(unit); | 684 _runInferrer(unit); |
| 764 | 685 |
| 765 expect(methodC.returnType.isDynamic, isTrue); | 686 expect(methodC.returnType.isDynamic, isTrue); |
| 766 } | 687 } |
| 767 | 688 |
| 768 void test_inferCompilationUnit_method_return_multiple_different_generic() { | 689 void test_inferCompilationUnit_method_return_multiple_different_generic() { |
| 769 InstanceMemberInferrer inferrer = createInferrer; | |
| 770 String methodName = 'm'; | 690 String methodName = 'm'; |
| 771 CompilationUnitElement unit = resolve(''' | 691 CompilationUnitElement unit = resolve(''' |
| 772 class A<E> { | 692 class A<E> { |
| 773 E $methodName() => null; | 693 E $methodName() => null; |
| 774 } | 694 } |
| 775 class B<E> { | 695 class B<E> { |
| 776 E $methodName() => null; | 696 E $methodName() => null; |
| 777 } | 697 } |
| 778 class C implements A<int>, B<double> { | 698 class C implements A<int>, B<double> { |
| 779 $methodName() => null; | 699 $methodName() => null; |
| 780 } | 700 } |
| 781 '''); | 701 '''); |
| 782 ClassElement classC = unit.getType('C'); | 702 ClassElement classC = unit.getType('C'); |
| 783 MethodElement methodC = classC.getMethod(methodName); | 703 MethodElement methodC = classC.getMethod(methodName); |
| 784 expect(methodC.returnType.isDynamic, isTrue); | 704 expect(methodC.returnType.isDynamic, isTrue); |
| 785 | 705 |
| 786 inferrer.inferCompilationUnit(unit); | 706 _runInferrer(unit); |
| 787 | 707 |
| 788 expect(methodC.returnType.isDynamic, isTrue); | 708 expect(methodC.returnType.isDynamic, isTrue); |
| 789 } | 709 } |
| 790 | 710 |
| 791 void test_inferCompilationUnit_method_return_multiple_dynamic() { | 711 void test_inferCompilationUnit_method_return_multiple_dynamic() { |
| 792 InstanceMemberInferrer inferrer = createInferrer; | |
| 793 String methodName = 'm'; | 712 String methodName = 'm'; |
| 794 CompilationUnitElement unit = resolve(''' | 713 CompilationUnitElement unit = resolve(''' |
| 795 class A { | 714 class A { |
| 796 int $methodName() => 0; | 715 int $methodName() => 0; |
| 797 } | 716 } |
| 798 class B { | 717 class B { |
| 799 $methodName() => 0; | 718 $methodName() => 0; |
| 800 } | 719 } |
| 801 class C implements A, B { | 720 class C implements A, B { |
| 802 $methodName() => 0; | 721 $methodName() => 0; |
| 803 } | 722 } |
| 804 '''); | 723 '''); |
| 805 ClassElement classC = unit.getType('C'); | 724 ClassElement classC = unit.getType('C'); |
| 806 MethodElement methodC = classC.getMethod(methodName); | 725 MethodElement methodC = classC.getMethod(methodName); |
| 807 expect(methodC.returnType.isDynamic, isTrue); | 726 expect(methodC.returnType.isDynamic, isTrue); |
| 808 | 727 |
| 809 inferrer.inferCompilationUnit(unit); | 728 _runInferrer(unit); |
| 810 | 729 |
| 811 expect(methodC.returnType.isDynamic, isTrue); | 730 expect(methodC.returnType.isDynamic, isTrue); |
| 812 } | 731 } |
| 813 | 732 |
| 814 void test_inferCompilationUnit_method_return_multiple_same_generic() { | 733 void test_inferCompilationUnit_method_return_multiple_same_generic() { |
| 815 InstanceMemberInferrer inferrer = createInferrer; | |
| 816 String methodName = 'm'; | 734 String methodName = 'm'; |
| 817 CompilationUnitElement unit = resolve(''' | 735 CompilationUnitElement unit = resolve(''' |
| 818 class A<E> { | 736 class A<E> { |
| 819 E $methodName() => 0; | 737 E $methodName() => 0; |
| 820 } | 738 } |
| 821 class B<E> { | 739 class B<E> { |
| 822 E $methodName() => 0; | 740 E $methodName() => 0; |
| 823 } | 741 } |
| 824 class C<E> implements A<E>, B<E> { | 742 class C<E> implements A<E>, B<E> { |
| 825 $methodName() => 0; | 743 $methodName() => 0; |
| 826 } | 744 } |
| 827 '''); | 745 '''); |
| 828 ClassElement classC = unit.getType('C'); | 746 ClassElement classC = unit.getType('C'); |
| 829 MethodElement methodC = classC.getMethod(methodName); | 747 MethodElement methodC = classC.getMethod(methodName); |
| 830 expect(methodC.returnType.isDynamic, isTrue); | 748 expect(methodC.returnType.isDynamic, isTrue); |
| 831 | 749 |
| 832 inferrer.inferCompilationUnit(unit); | 750 _runInferrer(unit); |
| 833 | 751 |
| 834 expect(methodC.returnType, classC.typeParameters[0].type); | 752 expect(methodC.returnType, classC.typeParameters[0].type); |
| 835 } | 753 } |
| 836 | 754 |
| 837 void test_inferCompilationUnit_method_return_multiple_same_nonVoid() { | 755 void test_inferCompilationUnit_method_return_multiple_same_nonVoid() { |
| 838 InstanceMemberInferrer inferrer = createInferrer; | |
| 839 String methodName = 'm'; | 756 String methodName = 'm'; |
| 840 CompilationUnitElement unit = resolve(''' | 757 CompilationUnitElement unit = resolve(''' |
| 841 class A { | 758 class A { |
| 842 int $methodName() => 0; | 759 int $methodName() => 0; |
| 843 } | 760 } |
| 844 class B { | 761 class B { |
| 845 int $methodName() => 0; | 762 int $methodName() => 0; |
| 846 } | 763 } |
| 847 class C implements A, B { | 764 class C implements A, B { |
| 848 $methodName() => 0; | 765 $methodName() => 0; |
| 849 } | 766 } |
| 850 '''); | 767 '''); |
| 851 ClassElement classA = unit.getType('A'); | 768 ClassElement classA = unit.getType('A'); |
| 852 MethodElement methodA = classA.getMethod(methodName); | 769 MethodElement methodA = classA.getMethod(methodName); |
| 853 DartType expectedType = methodA.returnType; | 770 DartType expectedType = methodA.returnType; |
| 854 ClassElement classC = unit.getType('C'); | 771 ClassElement classC = unit.getType('C'); |
| 855 MethodElement methodC = classC.getMethod(methodName); | 772 MethodElement methodC = classC.getMethod(methodName); |
| 856 expect(methodC.returnType.isDynamic, isTrue); | 773 expect(methodC.returnType.isDynamic, isTrue); |
| 857 | 774 |
| 858 inferrer.inferCompilationUnit(unit); | 775 _runInferrer(unit); |
| 859 | 776 |
| 860 expect(methodC.returnType, expectedType); | 777 expect(methodC.returnType, expectedType); |
| 861 } | 778 } |
| 862 | 779 |
| 863 void test_inferCompilationUnit_method_return_multiple_same_void() { | 780 void test_inferCompilationUnit_method_return_multiple_same_void() { |
| 864 InstanceMemberInferrer inferrer = createInferrer; | |
| 865 String methodName = 'm'; | 781 String methodName = 'm'; |
| 866 CompilationUnitElement unit = resolve(''' | 782 CompilationUnitElement unit = resolve(''' |
| 867 class A { | 783 class A { |
| 868 void $methodName() {}; | 784 void $methodName() {}; |
| 869 } | 785 } |
| 870 class B { | 786 class B { |
| 871 void $methodName() {}; | 787 void $methodName() {}; |
| 872 } | 788 } |
| 873 class C implements A, B { | 789 class C implements A, B { |
| 874 $methodName() {}; | 790 $methodName() {}; |
| 875 } | 791 } |
| 876 '''); | 792 '''); |
| 877 ClassElement classA = unit.getType('A'); | 793 ClassElement classA = unit.getType('A'); |
| 878 MethodElement methodA = classA.getMethod(methodName); | 794 MethodElement methodA = classA.getMethod(methodName); |
| 879 DartType expectedType = methodA.returnType; | 795 DartType expectedType = methodA.returnType; |
| 880 ClassElement classC = unit.getType('C'); | 796 ClassElement classC = unit.getType('C'); |
| 881 MethodElement methodC = classC.getMethod(methodName); | 797 MethodElement methodC = classC.getMethod(methodName); |
| 882 expect(methodC.returnType.isDynamic, isTrue); | 798 expect(methodC.returnType.isDynamic, isTrue); |
| 883 | 799 |
| 884 inferrer.inferCompilationUnit(unit); | 800 _runInferrer(unit); |
| 885 | 801 |
| 886 expect(methodC.returnType, expectedType); | 802 expect(methodC.returnType, expectedType); |
| 887 } | 803 } |
| 888 | 804 |
| 889 void test_inferCompilationUnit_method_return_multiple_void() { | 805 void test_inferCompilationUnit_method_return_multiple_void() { |
| 890 InstanceMemberInferrer inferrer = createInferrer; | |
| 891 String methodName = 'm'; | 806 String methodName = 'm'; |
| 892 CompilationUnitElement unit = resolve(''' | 807 CompilationUnitElement unit = resolve(''' |
| 893 class A { | 808 class A { |
| 894 int $methodName() => 0; | 809 int $methodName() => 0; |
| 895 } | 810 } |
| 896 class B { | 811 class B { |
| 897 void $methodName() => 0; | 812 void $methodName() => 0; |
| 898 } | 813 } |
| 899 class C implements A, B { | 814 class C implements A, B { |
| 900 $methodName() => 0; | 815 $methodName() => 0; |
| 901 } | 816 } |
| 902 '''); | 817 '''); |
| 903 ClassElement classC = unit.getType('C'); | 818 ClassElement classC = unit.getType('C'); |
| 904 MethodElement methodC = classC.getMethod(methodName); | 819 MethodElement methodC = classC.getMethod(methodName); |
| 905 expect(methodC.returnType.isDynamic, isTrue); | 820 expect(methodC.returnType.isDynamic, isTrue); |
| 906 | 821 |
| 907 inferrer.inferCompilationUnit(unit); | 822 _runInferrer(unit); |
| 908 | 823 |
| 909 expect(methodC.returnType.isDynamic, isTrue); | 824 expect(methodC.returnType.isDynamic, isTrue); |
| 910 } | 825 } |
| 911 | 826 |
| 912 void test_inferCompilationUnit_method_return_single() { | 827 void test_inferCompilationUnit_method_return_single() { |
| 913 InstanceMemberInferrer inferrer = createInferrer; | |
| 914 String methodName = 'm'; | 828 String methodName = 'm'; |
| 915 CompilationUnitElement unit = resolve(''' | 829 CompilationUnitElement unit = resolve(''' |
| 916 class A { | 830 class A { |
| 917 int $methodName() => 0; | 831 int $methodName() => 0; |
| 918 } | 832 } |
| 919 class B extends A { | 833 class B extends A { |
| 920 $methodName() => 0; | 834 $methodName() => 0; |
| 921 } | 835 } |
| 922 '''); | 836 '''); |
| 923 ClassElement classA = unit.getType('A'); | 837 ClassElement classA = unit.getType('A'); |
| 924 MethodElement methodA = classA.getMethod(methodName); | 838 MethodElement methodA = classA.getMethod(methodName); |
| 925 ClassElement classB = unit.getType('B'); | 839 ClassElement classB = unit.getType('B'); |
| 926 MethodElement methodB = classB.getMethod(methodName); | 840 MethodElement methodB = classB.getMethod(methodName); |
| 927 expect(methodB.returnType.isDynamic, isTrue); | 841 expect(methodB.returnType.isDynamic, isTrue); |
| 928 | 842 |
| 929 inferrer.inferCompilationUnit(unit); | 843 _runInferrer(unit); |
| 930 | 844 |
| 931 expect(methodB.returnType, methodA.returnType); | 845 expect(methodB.returnType, methodA.returnType); |
| 932 } | 846 } |
| 933 | 847 |
| 934 void test_inferCompilationUnit_method_return_single_generic() { | 848 void test_inferCompilationUnit_method_return_single_generic() { |
| 935 InstanceMemberInferrer inferrer = createInferrer; | |
| 936 String methodName = 'm'; | 849 String methodName = 'm'; |
| 937 CompilationUnitElement unit = resolve(''' | 850 CompilationUnitElement unit = resolve(''' |
| 938 class A<E> { | 851 class A<E> { |
| 939 E $methodName() => 0; | 852 E $methodName() => 0; |
| 940 } | 853 } |
| 941 class B<E> extends A<E> { | 854 class B<E> extends A<E> { |
| 942 $methodName() => 0; | 855 $methodName() => 0; |
| 943 } | 856 } |
| 944 '''); | 857 '''); |
| 945 ClassElement classB = unit.getType('B'); | 858 ClassElement classB = unit.getType('B'); |
| 946 DartType typeBE = classB.typeParameters[0].type; | 859 DartType typeBE = classB.typeParameters[0].type; |
| 947 MethodElement methodB = classB.getMethod(methodName); | 860 MethodElement methodB = classB.getMethod(methodName); |
| 948 expect(methodB.returnType.isDynamic, isTrue); | 861 expect(methodB.returnType.isDynamic, isTrue); |
| 949 expect(methodB.type.typeArguments, [typeBE]); | 862 expect(methodB.type.typeArguments, [typeBE]); |
| 950 | 863 |
| 951 inferrer.inferCompilationUnit(unit); | 864 _runInferrer(unit); |
| 952 | 865 |
| 953 expect(methodB.returnType, classB.typeParameters[0].type); | 866 expect(methodB.returnType, classB.typeParameters[0].type); |
| 954 expect(methodB.type.typeArguments, [typeBE], | 867 expect(methodB.type.typeArguments, [typeBE], |
| 955 reason: 'function type should still have type arguments'); | 868 reason: 'function type should still have type arguments'); |
| 956 } | 869 } |
| 957 | 870 |
| 958 void test_inferCompilationUnit_fieldFormal() { | 871 void test_inferCompilationUnit_setter_single() { |
| 959 InstanceMemberInferrer inferrer = createInferrer; | 872 String setterName = 'g'; |
| 960 String fieldName = 'f'; | |
| 961 CompilationUnitElement unit = resolve(''' | 873 CompilationUnitElement unit = resolve(''' |
| 962 class A { | 874 class A { |
| 963 final $fieldName = 0; | 875 set $setterName(int x) {} |
| 964 A([this.$fieldName = 'hello']); | 876 } |
| 877 class B extends A { |
| 878 set $setterName(x) {} |
| 965 } | 879 } |
| 966 '''); | 880 '''); |
| 967 ClassElement classA = unit.getType('A'); | 881 ClassElement classA = unit.getType('A'); |
| 968 FieldElement fieldA = classA.getField(fieldName); | 882 FieldElement fieldA = classA.getField(setterName); |
| 969 FieldFormalParameterElement paramA = | 883 PropertyAccessorElement setterA = classA.getSetter(setterName); |
| 970 classA.unnamedConstructor.parameters[0]; | 884 ClassElement classB = unit.getType('B'); |
| 971 expect(fieldA.type.isDynamic, isTrue); | 885 FieldElement fieldB = classB.getField(setterName); |
| 972 expect(paramA.type.isDynamic, isTrue); | 886 PropertyAccessorElement setterB = classB.getSetter(setterName); |
| 887 expect(fieldB.type.isDynamic, isTrue); |
| 888 expect(setterB.parameters[0].type.isDynamic, isTrue); |
| 973 | 889 |
| 890 _runInferrer(unit); |
| 891 |
| 892 expect(fieldB.type, fieldA.type); |
| 893 expect(setterB.parameters[0].type, setterA.parameters[0].type); |
| 894 } |
| 895 |
| 896 void test_inferCompilationUnit_setter_single_generic() { |
| 897 String setterName = 'g'; |
| 898 CompilationUnitElement unit = resolve(''' |
| 899 class A<E> { |
| 900 set $setterName(E x) {} |
| 901 } |
| 902 class B<E> extends A<E> { |
| 903 set $setterName(x) {} |
| 904 } |
| 905 '''); |
| 906 ClassElement classB = unit.getType('B'); |
| 907 DartType typeBE = classB.typeParameters[0].type; |
| 908 FieldElement fieldB = classB.getField(setterName); |
| 909 PropertyAccessorElement setterB = classB.getSetter(setterName); |
| 910 expect(fieldB.type.isDynamic, isTrue); |
| 911 expect(setterB.parameters[0].type.isDynamic, isTrue); |
| 912 |
| 913 _runInferrer(unit); |
| 914 |
| 915 expect(fieldB.type, typeBE); |
| 916 expect(setterB.parameters[0].type, typeBE); |
| 917 } |
| 918 |
| 919 void test_inferCompilationUnit_setter_single_inconsistentAccessors() { |
| 920 String getterName = 'g'; |
| 921 CompilationUnitElement unit = resolve(''' |
| 922 class A { |
| 923 int get $getterName => 0; |
| 924 set $getterName(String value) {} |
| 925 } |
| 926 class B extends A { |
| 927 set $getterName(x) {} |
| 928 } |
| 929 '''); |
| 930 ClassElement classA = unit.getType('A'); |
| 931 PropertyAccessorElement setterA = classA.getSetter(getterName); |
| 932 ClassElement classB = unit.getType('B'); |
| 933 FieldElement fieldB = classB.getField(getterName); |
| 934 PropertyAccessorElement setterB = classB.getSetter(getterName); |
| 935 expect(fieldB.type.isDynamic, isTrue); |
| 936 expect(setterB.parameters[0].type.isDynamic, isTrue); |
| 937 |
| 938 _runInferrer(unit); |
| 939 |
| 940 // Expected behavior is that the getter is inferred: getters and setters |
| 941 // are treated as independent methods. |
| 942 expect(setterB.parameters[0].type, setterA.parameters[0].type); |
| 943 |
| 944 // Note that B's synthetic field type will be String. This matches what |
| 945 // resolver would do if we explicitly typed the parameter as 'String' |
| 946 expect(fieldB.type, setterB.parameters[0].type); |
| 947 } |
| 948 |
| 949 InstanceMemberInferrer _runInferrer(CompilationUnitElement unit) { |
| 950 InstanceMemberInferrer inferrer = createInferrer(unit.library); |
| 974 inferrer.inferCompilationUnit(unit); | 951 inferrer.inferCompilationUnit(unit); |
| 975 | 952 return inferrer; |
| 976 DartType intType = inferrer.typeProvider.intType; | |
| 977 expect(fieldA.type, intType); | |
| 978 expect(paramA.type, intType); | |
| 979 } | 953 } |
| 980 } | 954 } |
| 981 | 955 |
| 956 @reflectiveTest |
| 957 class SetFieldTypeTest extends AbstractContextTest { |
| 958 void test_setter_withoutParameter() { |
| 959 CompilationUnitElement unit = _resolve(''' |
| 960 var x = 0; |
| 961 set x() {} |
| 962 '''); |
| 963 TopLevelVariableElement variable = unit.topLevelVariables.single; |
| 964 setFieldType(variable, context.typeProvider.intType); |
| 965 } |
| 966 |
| 967 CompilationUnitElement _resolve(String content) { |
| 968 Source source = addSource('/test.dart', content); |
| 969 return context.resolveCompilationUnit2(source, source).element; |
| 970 } |
| 971 } |
| 972 |
| 982 @reflectiveTest | 973 @reflectiveTest |
| 983 class VariableGathererTest extends AbstractContextTest { | 974 class VariableGathererTest extends AbstractContextTest { |
| 984 void test_creation_withFilter() { | 975 void test_creation_withFilter() { |
| 985 VariableFilter filter = (variable) => true; | 976 VariableFilter filter = (variable) => true; |
| 986 VariableGatherer gatherer = new VariableGatherer(filter); | 977 VariableGatherer gatherer = new VariableGatherer(filter); |
| 987 expect(gatherer, isNotNull); | 978 expect(gatherer, isNotNull); |
| 988 expect(gatherer.filter, filter); | 979 expect(gatherer.filter, filter); |
| 989 } | 980 } |
| 990 | 981 |
| 991 void test_creation_withoutFilter() { | 982 void test_creation_withoutFilter() { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 } | 1031 } |
| 1041 } | 1032 } |
| 1042 } | 1033 } |
| 1043 '''); | 1034 '''); |
| 1044 CompilationUnit unit = context.resolveCompilationUnit2(source, source); | 1035 CompilationUnit unit = context.resolveCompilationUnit2(source, source); |
| 1045 VariableGatherer gatherer = new VariableGatherer(filter); | 1036 VariableGatherer gatherer = new VariableGatherer(filter); |
| 1046 unit.accept(gatherer); | 1037 unit.accept(gatherer); |
| 1047 return gatherer.results; | 1038 return gatherer.results; |
| 1048 } | 1039 } |
| 1049 } | 1040 } |
| OLD | NEW |