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

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

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

Powered by Google App Engine
This is Rietveld 408576698