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

Side by Side Diff: pkg/analyzer/test/src/task/strong_mode_test.dart

Issue 2697443003: Run InstanceMemberInferrerTest with the new analysis driver. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/task/strong_mode_driver_test.dart ('k') | pkg/analyzer/test/src/task/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698