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