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

Side by Side Diff: packages/analyzer/test/src/task/incremental_element_builder_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.incremental_element_builder_test; 5 library analyzer.test.src.task.incremental_element_builder_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/visitor.dart';
10 import 'package:analyzer/src/dart/ast/utilities.dart';
11 import 'package:analyzer/src/dart/element/element.dart';
12 import 'package:analyzer/src/generated/engine.dart';
9 import 'package:analyzer/src/generated/source.dart'; 13 import 'package:analyzer/src/generated/source.dart';
14 import 'package:analyzer/src/task/dart.dart';
10 import 'package:analyzer/src/task/incremental_element_builder.dart'; 15 import 'package:analyzer/src/task/incremental_element_builder.dart';
16 import 'package:analyzer/task/dart.dart';
17 import 'package:test_reflective_loader/test_reflective_loader.dart';
11 import 'package:unittest/unittest.dart'; 18 import 'package:unittest/unittest.dart';
12 19
13 import '../../reflective_tests.dart';
14 import '../../utils.dart'; 20 import '../../utils.dart';
15 import '../context/abstract_context.dart'; 21 import '../context/abstract_context.dart';
16 22
17 main() { 23 main() {
18 initializeTestEnvironment(); 24 initializeTestEnvironment();
19 runReflectiveTests(IncrementalCompilationUnitElementBuilderTest); 25 defineReflectiveTests(IncrementalCompilationUnitElementBuilderTest);
20 } 26 }
21 27
22 @reflectiveTest 28 @reflectiveTest
23 class IncrementalCompilationUnitElementBuilderTest extends AbstractContextTest { 29 class IncrementalCompilationUnitElementBuilderTest extends AbstractContextTest {
24 Source source; 30 Source source;
25 31
26 String oldCode; 32 String oldCode;
27 CompilationUnit oldUnit; 33 CompilationUnit oldUnit;
28 CompilationUnitElement unitElement; 34 CompilationUnitElement unitElement;
29 35
30 String newCode; 36 String newCode;
31 CompilationUnit newUnit; 37 CompilationUnit newUnit;
32 38
33 CompilationUnitElementDelta unitDelta; 39 CompilationUnitElementDelta unitDelta;
34 40
35 String getNodeText(AstNode node) { 41 String getNodeText(AstNode node) {
36 return newCode.substring(node.offset, node.end); 42 return newCode.substring(node.offset, node.end);
37 } 43 }
38 44
45 test_classDelta_annotation_add() {
46 var helper = new _ClassDeltaHelper('A');
47 _buildOldUnit(r'''
48 class A {}
49 ''');
50 helper.initOld(oldUnit);
51 expect(helper.element.metadata, isEmpty);
52 _buildNewUnit(r'''
53 @deprecated
54 class A {}
55 ''');
56 helper.initNew(newUnit, unitDelta);
57 expect(helper.delta.hasAnnotationChanges, isTrue);
58 expect(helper.element.metadata, hasLength(1));
59 }
60
61 test_classDelta_annotation_remove() {
62 var helper = new _ClassDeltaHelper('A');
63 _buildOldUnit(r'''
64 @deprecated
65 class A {}
66 ''');
67 helper.initOld(oldUnit);
68 expect(helper.element.metadata, hasLength(1));
69 _buildNewUnit(r'''
70 class A {}
71 ''');
72 helper.initNew(newUnit, unitDelta);
73 expect(helper.delta.hasAnnotationChanges, isTrue);
74 expect(helper.element.metadata, isEmpty);
75 }
76
77 test_classDelta_constructor_0to1() {
78 var helper = new _ClassDeltaHelper('A');
79 _buildOldUnit(r'''
80 class A {
81 }
82 ''');
83 helper.initOld(oldUnit);
84 ConstructorElement oldConstructorElement =
85 helper.element.unnamedConstructor;
86 _buildNewUnit(r'''
87 class A {
88 A.a();
89 }
90 ''');
91 helper.initNew(newUnit, unitDelta);
92 // nodes
93 ClassMember newConstructorNode = helper.newMembers[0];
94 // elements
95 ConstructorElement newConstructorElement = newConstructorNode.element;
96 expect(newConstructorElement, isNotNull);
97 expect(newConstructorElement.name, 'a');
98 // classElement.constructors
99 ClassElement classElement = helper.element;
100 expect(classElement.constructors, unorderedEquals([newConstructorElement]));
101 // verify delta
102 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
103 expect(helper.delta.addedConstructors,
104 unorderedEquals([newConstructorElement]));
105 expect(helper.delta.removedConstructors,
106 unorderedEquals([oldConstructorElement]));
107 expect(helper.delta.addedAccessors, isEmpty);
108 expect(helper.delta.removedAccessors, isEmpty);
109 expect(helper.delta.addedMethods, isEmpty);
110 expect(helper.delta.removedMethods, isEmpty);
111 }
112
113 test_classDelta_constructor_1to0() {
114 var helper = new _ClassDeltaHelper('A');
115 _buildOldUnit(r'''
116 class A {
117 A.a();
118 }
119 ''');
120 helper.initOld(oldUnit);
121 ConstructorElement oldElementA = helper.element.getNamedConstructor('a');
122 _buildNewUnit(r'''
123 class A {
124 }
125 ''');
126 helper.initNew(newUnit, unitDelta);
127 // classElement.constructors
128 ClassElement classElement = helper.element;
129 {
130 List<ConstructorElement> constructors = classElement.constructors;
131 expect(constructors, hasLength(1));
132 expect(constructors[0].isDefaultConstructor, isTrue);
133 expect(constructors[0].isSynthetic, isTrue);
134 }
135 // verify delta
136 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
137 expect(helper.delta.addedConstructors,
138 unorderedEquals([classElement.unnamedConstructor]));
139 expect(helper.delta.removedConstructors, unorderedEquals([oldElementA]));
140 expect(helper.delta.addedAccessors, isEmpty);
141 expect(helper.delta.removedAccessors, isEmpty);
142 expect(helper.delta.addedMethods, isEmpty);
143 expect(helper.delta.removedMethods, isEmpty);
144 }
145
146 test_classDelta_constructor_1to1_unnamed_addParameter() {
147 var helper = new _ClassDeltaHelper('A');
148 _buildOldUnit(r'''
149 class A {
150 A();
151 }
152 ''');
153 helper.initOld(oldUnit);
154 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
155 _buildNewUnit(r'''
156 class A {
157 A(int p);
158 }
159 ''');
160 helper.initNew(newUnit, unitDelta);
161 ClassElement classElement = helper.element;
162 ConstructorElement newConstructor = classElement.unnamedConstructor;
163 expect(classElement.constructors, [newConstructor]);
164 // verify delta
165 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
166 expect(helper.delta.addedConstructors, unorderedEquals([newConstructor]));
167 expect(helper.delta.removedConstructors, unorderedEquals([oldConstructor]));
168 expect(helper.delta.addedAccessors, isEmpty);
169 expect(helper.delta.removedAccessors, isEmpty);
170 expect(helper.delta.addedMethods, isEmpty);
171 expect(helper.delta.removedMethods, isEmpty);
172 }
173
174 test_classDelta_constructor_1to1_unnamed_removeParameter() {
175 var helper = new _ClassDeltaHelper('A');
176 _buildOldUnit(r'''
177 class A {
178 final int a;
179 final int b;
180 A(this.a, this.b);
181 }
182 ''');
183 helper.initOld(oldUnit);
184 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
185 _buildNewUnit(r'''
186 class A {
187 final int a;
188 final int b;
189 A(this.a);
190 }
191 ''');
192 helper.initNew(newUnit, unitDelta);
193 ClassElement classElement = helper.element;
194 ConstructorElement newConstructor = classElement.unnamedConstructor;
195 expect(classElement.constructors, [newConstructor]);
196 // verify delta
197 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
198 expect(helper.delta.addedConstructors, unorderedEquals([newConstructor]));
199 expect(helper.delta.removedConstructors, unorderedEquals([oldConstructor]));
200 expect(helper.delta.addedAccessors, isEmpty);
201 expect(helper.delta.removedAccessors, isEmpty);
202 expect(helper.delta.addedMethods, isEmpty);
203 expect(helper.delta.removedMethods, isEmpty);
204 }
205
206 test_classDelta_constructor_1to2() {
207 var helper = new _ClassDeltaHelper('A');
208 _buildOldUnit(r'''
209 class A {
210 A.a();
211 }
212 ''');
213 helper.initOld(oldUnit);
214 _buildNewUnit(r'''
215 class A {
216 A.a();
217 A.b();
218 }
219 ''');
220 helper.initNew(newUnit, unitDelta);
221 // nodes
222 ClassMember nodeA = helper.newMembers[0];
223 ClassMember nodeB = helper.newMembers[1];
224 expect(nodeA, same(helper.oldMembers[0]));
225 // elements
226 ConstructorElement elementA = nodeA.element;
227 ConstructorElement elementB = nodeB.element;
228 expect(elementA, isNotNull);
229 expect(elementB, isNotNull);
230 expect(elementA.name, 'a');
231 expect(elementB.name, 'b');
232 // classElement.constructors
233 ClassElement classElement = helper.element;
234 expect(classElement.constructors, unorderedEquals([elementA, elementB]));
235 // verify delta
236 expect(helper.delta.addedConstructors, unorderedEquals([elementB]));
237 expect(helper.delta.removedConstructors, unorderedEquals([]));
238 expect(helper.delta.addedAccessors, isEmpty);
239 expect(helper.delta.removedAccessors, isEmpty);
240 expect(helper.delta.addedMethods, isEmpty);
241 expect(helper.delta.removedMethods, isEmpty);
242 }
243
244 test_classDelta_constructor_2to1() {
245 var helper = new _ClassDeltaHelper('A');
246 _buildOldUnit(r'''
247 class A {
248 A.a();
249 A.b();
250 }
251 ''');
252 helper.initOld(oldUnit);
253 ConstructorElement oldElementA = helper.element.getNamedConstructor('a');
254 _buildNewUnit(r'''
255 class A {
256 A.b();
257 }
258 ''');
259 helper.initNew(newUnit, unitDelta);
260 expect(helper.delta.hasUnnamedConstructorChange, isFalse);
261 // nodes
262 ClassMember nodeB = helper.newMembers[0];
263 expect(nodeB, same(helper.oldMembers[1]));
264 // elements
265 ConstructorElement elementB = nodeB.element;
266 expect(elementB, isNotNull);
267 expect(elementB.name, 'b');
268 // classElement.constructors
269 ClassElement classElement = helper.element;
270 expect(classElement.constructors, unorderedEquals([elementB]));
271 // verify delta
272 expect(helper.delta.addedConstructors, unorderedEquals([]));
273 expect(helper.delta.removedConstructors, unorderedEquals([oldElementA]));
274 expect(helper.delta.addedAccessors, isEmpty);
275 expect(helper.delta.removedAccessors, isEmpty);
276 expect(helper.delta.addedMethods, isEmpty);
277 expect(helper.delta.removedMethods, isEmpty);
278 }
279
280 test_classDelta_constructor_2to2_reorder() {
281 var helper = new _ClassDeltaHelper('A');
282 _buildOldUnit(r'''
283 class A {
284 A.a();
285 A.b();
286 }
287 ''');
288 helper.initOld(oldUnit);
289 _buildNewUnit(r'''
290 class A {
291 A.b();
292 A.a();
293 }
294 ''');
295 helper.initNew(newUnit, unitDelta);
296 // nodes
297 ClassMember nodeB = helper.newMembers[0];
298 ClassMember nodeA = helper.newMembers[1];
299 expect(nodeB, same(helper.oldMembers[1]));
300 expect(nodeA, same(helper.oldMembers[0]));
301 // elements
302 ConstructorElement elementB = nodeB.element;
303 ConstructorElement elementA = nodeA.element;
304 expect(elementB, isNotNull);
305 expect(elementA, isNotNull);
306 expect(elementB.name, 'b');
307 expect(elementA.name, 'a');
308 // classElement.constructors
309 ClassElement classElement = helper.element;
310 expect(classElement.constructors, unorderedEquals([elementB, elementA]));
311 // verify delta
312 expect(helper.delta.addedConstructors, isEmpty);
313 expect(helper.delta.removedConstructors, isEmpty);
314 expect(helper.delta.addedAccessors, isEmpty);
315 expect(helper.delta.removedAccessors, isEmpty);
316 expect(helper.delta.addedMethods, isEmpty);
317 expect(helper.delta.removedMethods, isEmpty);
318 }
319
320 test_classDelta_constructor_fieldReference_initializer() {
321 var helper = new _ClassDeltaHelper('A');
322 _buildOldUnit(r'''
323 class A {
324 final int f;
325 A() : f = 1 {}
326 }
327 ''');
328 helper.initOld(oldUnit);
329 _buildNewUnit(r'''
330 class A {
331 final int f;
332 A() : f = 1;
333 }
334 ''');
335 helper.initNew(newUnit, unitDelta);
336 }
337
338 test_classDelta_constructor_fieldReference_parameter() {
339 var helper = new _ClassDeltaHelper('A');
340 _buildOldUnit(r'''
341 class A {
342 final int f;
343 A(this.f) {}
344 }
345 ''');
346 helper.initOld(oldUnit);
347 _buildNewUnit(r'''
348 class A {
349 final int f;
350 A(this.f);
351 }
352 ''');
353 helper.initNew(newUnit, unitDelta);
354 }
355
356 test_classDelta_constructor_fieldReference_parameter_default() {
357 var helper = new _ClassDeltaHelper('A');
358 _buildOldUnit(r'''
359 class A {
360 final int f;
361 A([this.f = 1]) {}
362 }
363 ''');
364 helper.initOld(oldUnit);
365 _buildNewUnit(r'''
366 class A {
367 final int f;
368 A([this.f = 1]);
369 }
370 ''');
371 helper.initNew(newUnit, unitDelta);
372 }
373
374 test_classDelta_duplicate_constructor() {
375 var helper = new _ClassDeltaHelper('A');
376 _buildOldUnit(r'''
377 class A {
378 A() {}
379 }
380 ''');
381 helper.initOld(oldUnit);
382 _buildNewUnit(r'''
383 class A {
384 A() {}
385 A() {}
386 }
387 ''');
388 helper.initNew(newUnit, unitDelta);
389 // nodes
390 ConstructorDeclaration oldNode = helper.oldMembers[0];
391 ConstructorDeclaration newNode1 = helper.newMembers[0];
392 ConstructorDeclaration newNode2 = helper.newMembers[1];
393 // elements
394 ConstructorElement oldElement = oldNode.element;
395 ConstructorElement newElement1 = newNode1.element;
396 ConstructorElement newElement2 = newNode2.element;
397 expect(newElement1, same(oldElement));
398 expect(newElement2, isNot(same(oldElement)));
399 expect(oldElement.name, '');
400 expect(newElement1.name, '');
401 expect(newElement2.name, '');
402 // verify delta
403 expect(helper.delta.addedConstructors, unorderedEquals([newElement2]));
404 expect(helper.delta.removedConstructors, isEmpty);
405 expect(helper.delta.addedAccessors, isEmpty);
406 expect(helper.delta.removedAccessors, isEmpty);
407 expect(helper.delta.addedMethods, isEmpty);
408 expect(helper.delta.removedMethods, isEmpty);
409 }
410
411 test_classDelta_duplicate_method() {
412 var helper = new _ClassDeltaHelper('A');
413 _buildOldUnit(r'''
414 class A {
415 m() {}
416 }
417 ''');
418 helper.initOld(oldUnit);
419 _buildNewUnit(r'''
420 class A {
421 m() {}
422 m() {}
423 }
424 ''');
425 helper.initNew(newUnit, unitDelta);
426 // nodes
427 MethodDeclaration oldNode = helper.oldMembers[0];
428 MethodDeclaration newNode1 = helper.newMembers[0];
429 MethodDeclaration newNode2 = helper.newMembers[1];
430 // elements
431 MethodElement oldElement = oldNode.element;
432 MethodElement newElement1 = newNode1.element;
433 MethodElement newElement2 = newNode2.element;
434 expect(newElement1, same(oldElement));
435 expect(newElement2, isNot(same(oldElement)));
436 expect(oldElement.name, 'm');
437 expect(newElement1.name, 'm');
438 expect(newElement2.name, 'm');
439 // verify delta
440 expect(helper.delta.addedConstructors, isEmpty);
441 expect(helper.delta.removedConstructors, isEmpty);
442 expect(helper.delta.addedAccessors, isEmpty);
443 expect(helper.delta.removedAccessors, isEmpty);
444 expect(helper.delta.addedMethods, unorderedEquals([newElement2]));
445 expect(helper.delta.removedMethods, isEmpty);
446 }
447
448 test_classDelta_field_add() {
449 var helper = new _ClassDeltaHelper('A');
450 _buildOldUnit(r'''
451 class A {
452 int aaa;
453 }
454 ''');
455 helper.initOld(oldUnit);
456 _buildNewUnit(r'''
457 class A {
458 int aaa;
459 int bbb;
460 }
461 ''');
462 helper.initNew(newUnit, unitDelta);
463 // nodes
464 FieldDeclaration nodeA = helper.newMembers[0];
465 FieldDeclaration newNodeB = helper.newMembers[1];
466 List<VariableDeclaration> newFieldsB = newNodeB.fields.variables;
467 expect(nodeA, same(helper.oldMembers[0]));
468 expect(newFieldsB, hasLength(1));
469 // elements
470 FieldElement newFieldElementB = newFieldsB[0].name.staticElement;
471 expect(newFieldElementB.name, 'bbb');
472 // verify delta
473 expect(helper.delta.hasAnnotationChanges, isFalse);
474 expect(helper.delta.addedConstructors, isEmpty);
475 expect(helper.delta.removedConstructors, isEmpty);
476 expect(helper.delta.addedAccessors,
477 unorderedEquals([newFieldElementB.getter, newFieldElementB.setter]));
478 expect(helper.delta.removedAccessors, isEmpty);
479 expect(helper.delta.addedMethods, isEmpty);
480 expect(helper.delta.removedMethods, isEmpty);
481 }
482
483 test_classDelta_field_remove() {
484 var helper = new _ClassDeltaHelper('A');
485 _buildOldUnit(r'''
486 class A {
487 int aaa;
488 int bbb;
489 }
490 ''');
491 helper.initOld(oldUnit);
492 _buildNewUnit(r'''
493 class A {
494 int aaa;
495 }
496 ''');
497 helper.initNew(newUnit, unitDelta);
498 // nodes
499 FieldDeclaration nodeA = helper.newMembers[0];
500 FieldDeclaration oldNodeB = helper.oldMembers[1];
501 List<VariableDeclaration> oldFieldsB = oldNodeB.fields.variables;
502 expect(nodeA, same(helper.oldMembers[0]));
503 // elements
504 FieldElement oldFieldElementB = oldFieldsB[0].name.staticElement;
505 expect(oldFieldElementB.name, 'bbb');
506 // verify delta
507 expect(helper.delta.addedConstructors, isEmpty);
508 expect(helper.delta.removedConstructors, isEmpty);
509 expect(helper.delta.addedAccessors, isEmpty);
510 expect(helper.delta.removedAccessors,
511 unorderedEquals([oldFieldElementB.getter, oldFieldElementB.setter]));
512 expect(helper.delta.addedMethods, isEmpty);
513 expect(helper.delta.removedMethods, isEmpty);
514 }
515
516 test_classDelta_field_syntheticAndNot_renameNonSynthetic() {
517 var helper = new _ClassDeltaHelper('A');
518 _buildOldUnit(r'''
519 class A {
520 int foo;
521 int get foo => 1;
522 }
523 ''');
524 helper.initOld(oldUnit);
525 FieldDeclaration oldFieldDeclNode = helper.oldMembers[0];
526 VariableDeclaration oldFieldNode = oldFieldDeclNode.fields.variables.single;
527 FieldElement oldFieldElement = oldFieldNode.name.staticElement;
528 _buildNewUnit(r'''
529 class A {
530 int _foo;
531 int get foo => 1;
532 }
533 ''');
534 helper.initNew(newUnit, unitDelta);
535 // nodes
536 FieldDeclaration newFieldDeclNode = helper.newMembers[0];
537 VariableDeclaration newFieldNode = newFieldDeclNode.fields.variables.single;
538 MethodDeclaration getterNode = helper.newMembers[1];
539 expect(getterNode, same(helper.oldMembers[1]));
540 // elements
541 FieldElement newFieldElement = newFieldNode.name.staticElement;
542 PropertyAccessorElement getterElement = getterNode.element;
543 expect(newFieldElement.name, '_foo');
544 expect(
545 helper.element.fields,
546 unorderedMatches(
547 [same(newFieldElement), same(getterElement.variable)]));
548 expect(
549 helper.element.accessors,
550 unorderedMatches([
551 same(newFieldElement.getter),
552 same(newFieldElement.setter),
553 same(getterElement)
554 ]));
555 // verify delta
556 expect(helper.delta.addedConstructors, isEmpty);
557 expect(helper.delta.removedConstructors, isEmpty);
558 expect(helper.delta.addedAccessors,
559 unorderedEquals([newFieldElement.getter, newFieldElement.setter]));
560 expect(helper.delta.removedAccessors,
561 [oldFieldElement.getter, oldFieldElement.setter]);
562 expect(helper.delta.addedMethods, isEmpty);
563 expect(helper.delta.removedMethods, isEmpty);
564 }
565
566 test_classDelta_getter_add() {
567 var helper = new _ClassDeltaHelper('A');
568 _buildOldUnit(r'''
569 class A {
570 int get aaa => 1;
571 }
572 ''');
573 helper.initOld(oldUnit);
574 _buildNewUnit(r'''
575 class A {
576 int get aaa => 1;
577 int get bbb => 2;
578 }
579 ''');
580 helper.initNew(newUnit, unitDelta);
581 // nodes
582 MethodDeclaration nodeA = helper.oldMembers[0];
583 MethodDeclaration newNodeB = helper.newMembers[1];
584 expect(nodeA, same(helper.oldMembers[0]));
585 // elements
586 PropertyAccessorElement elementA = nodeA.element;
587 PropertyAccessorElement newElementB = newNodeB.element;
588 expect(elementA, isNotNull);
589 expect(elementA.name, 'aaa');
590 expect(newElementB, isNotNull);
591 expect(newElementB.name, 'bbb');
592 // verify delta
593 expect(helper.delta.addedConstructors, isEmpty);
594 expect(helper.delta.removedConstructors, isEmpty);
595 expect(helper.delta.addedAccessors, unorderedEquals([newElementB]));
596 expect(helper.delta.removedAccessors, isEmpty);
597 expect(helper.delta.addedMethods, isEmpty);
598 expect(helper.delta.removedMethods, isEmpty);
599 }
600
601 test_classDelta_getter_remove() {
602 var helper = new _ClassDeltaHelper('A');
603 _buildOldUnit(r'''
604 class A {
605 int get aaa => 1;
606 int get bbb => 2;
607 }
608 ''');
609 helper.initOld(oldUnit);
610 _buildNewUnit(r'''
611 class A {
612 int get aaa => 1;
613 }
614 ''');
615 helper.initNew(newUnit, unitDelta);
616 // nodes
617 MethodDeclaration nodeA = helper.oldMembers[0];
618 MethodDeclaration oldNodeB = helper.oldMembers[1];
619 expect(nodeA, same(helper.oldMembers[0]));
620 // elements
621 PropertyAccessorElement elementA = nodeA.element;
622 PropertyAccessorElement oldElementB = oldNodeB.element;
623 expect(elementA, isNotNull);
624 expect(elementA.name, 'aaa');
625 // verify delta
626 expect(helper.delta.addedConstructors, isEmpty);
627 expect(helper.delta.removedConstructors, isEmpty);
628 expect(helper.delta.addedAccessors, isEmpty);
629 expect(helper.delta.removedAccessors, unorderedEquals([oldElementB]));
630 expect(helper.delta.addedMethods, isEmpty);
631 expect(helper.delta.removedMethods, isEmpty);
632 }
633
634 test_classDelta_method_add() {
635 var helper = new _ClassDeltaHelper('A');
636 _buildOldUnit(r'''
637 class A {
638 aaa() {}
639 }
640 ''');
641 helper.initOld(oldUnit);
642 _buildNewUnit(r'''
643 class A {
644 aaa() {}
645 bbb() {}
646 }
647 ''');
648 helper.initNew(newUnit, unitDelta);
649 // nodes
650 ClassMember nodeA = helper.oldMembers[0];
651 ClassMember newNodeB = helper.newMembers[1];
652 expect(nodeA, same(helper.oldMembers[0]));
653 // elements
654 MethodElement elementA = nodeA.element;
655 MethodElement newElementB = newNodeB.element;
656 expect(elementA, isNotNull);
657 expect(elementA.name, 'aaa');
658 expect(newElementB, isNotNull);
659 expect(newElementB.name, 'bbb');
660 // verify delta
661 expect(helper.delta.addedConstructors, isEmpty);
662 expect(helper.delta.removedConstructors, isEmpty);
663 expect(helper.delta.addedAccessors, isEmpty);
664 expect(helper.delta.removedAccessors, isEmpty);
665 expect(helper.delta.addedMethods, unorderedEquals([newElementB]));
666 expect(helper.delta.removedMethods, isEmpty);
667 }
668
669 test_classDelta_method_addParameter() {
670 var helper = new _ClassDeltaHelper('A');
671 _buildOldUnit(r'''
672 class A {
673 aaa() {}
674 bbb() {}
675 }
676 ''');
677 helper.initOld(oldUnit);
678 _buildNewUnit(r'''
679 class A {
680 aaa(int p) {}
681 bbb() {}
682 }
683 ''');
684 helper.initNew(newUnit, unitDelta);
685 // nodes
686 ClassMember oldNodeA = helper.oldMembers[0];
687 ClassMember newNodeA = helper.newMembers[0];
688 ClassMember nodeB = helper.newMembers[1];
689 expect(newNodeA, isNot(same(oldNodeA)));
690 expect(nodeB, same(helper.oldMembers[1]));
691 // elements
692 MethodElement oldElementA = oldNodeA.element;
693 MethodElement newElementA = newNodeA.element;
694 MethodElement elementB = nodeB.element;
695 expect(newElementA, isNotNull);
696 expect(newElementA.name, 'aaa');
697 expect(oldElementA.parameters, hasLength(0));
698 expect(newElementA.parameters, hasLength(1));
699 expect(elementB, isNotNull);
700 expect(elementB.name, 'bbb');
701 // verify delta
702 expect(helper.delta.addedConstructors, isEmpty);
703 expect(helper.delta.removedConstructors, isEmpty);
704 expect(helper.delta.addedAccessors, isEmpty);
705 expect(helper.delta.removedAccessors, isEmpty);
706 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
707 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
708 }
709
710 test_classDelta_method_changeName() {
711 var helper = new _ClassDeltaHelper('A');
712 _buildOldUnit(r'''
713 class A {
714 aaa(int ap) {
715 int av = 1;
716 af(afp) {}
717 }
718 bbb(int bp) {
719 int bv = 1;
720 bf(bfp) {}
721 }
722 }
723 ''');
724 helper.initOld(oldUnit);
725 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
726 _buildNewUnit(r'''
727 class A {
728 aaa2(int ap) {
729 int av = 1;
730 af(afp) {}
731 }
732 bbb(int bp) {
733 int bv = 1;
734 bf(bfp) {}
735 }
736 }
737 ''');
738 helper.initNew(newUnit, unitDelta);
739 expect(helper.element.unnamedConstructor, same(oldConstructor));
740 // nodes
741 ClassMember oldNodeA = helper.oldMembers[0];
742 ClassMember newNodeA = helper.newMembers[0];
743 ClassMember nodeB = helper.newMembers[1];
744 expect(nodeB, same(helper.oldMembers[1]));
745 // elements
746 MethodElement oldElementA = oldNodeA.element;
747 MethodElement newElementA = newNodeA.element;
748 MethodElement elementB = nodeB.element;
749 expect(newElementA, isNotNull);
750 expect(newElementA.name, 'aaa2');
751 expect(elementB, isNotNull);
752 expect(elementB.name, 'bbb');
753 // verify delta
754 expect(helper.delta.addedConstructors, isEmpty);
755 expect(helper.delta.removedConstructors, isEmpty);
756 expect(helper.delta.addedAccessors, isEmpty);
757 expect(helper.delta.removedAccessors, isEmpty);
758 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
759 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
760 }
761
762 test_classDelta_method_remove() {
763 var helper = new _ClassDeltaHelper('A');
764 _buildOldUnit(r'''
765 class A {
766 aaa() {}
767 bbb() {}
768 }
769 ''');
770 helper.initOld(oldUnit);
771 _buildNewUnit(r'''
772 class A {
773 aaa() {}
774 }
775 ''');
776 helper.initNew(newUnit, unitDelta);
777 // nodes
778 ClassMember nodeA = helper.oldMembers[0];
779 ClassMember oldNodeB = helper.oldMembers[1];
780 expect(nodeA, same(helper.oldMembers[0]));
781 // elements
782 MethodElement elementA = nodeA.element;
783 MethodElement oldElementB = oldNodeB.element;
784 expect(elementA, isNotNull);
785 expect(elementA.name, 'aaa');
786 // verify delta
787 expect(helper.delta.addedConstructors, isEmpty);
788 expect(helper.delta.removedConstructors, isEmpty);
789 expect(helper.delta.addedAccessors, isEmpty);
790 expect(helper.delta.removedAccessors, isEmpty);
791 expect(helper.delta.addedMethods, isEmpty);
792 expect(helper.delta.removedMethods, unorderedEquals([oldElementB]));
793 }
794
795 test_classDelta_method_removeParameter() {
796 var helper = new _ClassDeltaHelper('A');
797 _buildOldUnit(r'''
798 class A {
799 aaa(int p) {}
800 bbb() {}
801 }
802 ''');
803 helper.initOld(oldUnit);
804 _buildNewUnit(r'''
805 class A {
806 aaa() {}
807 bbb() {}
808 }
809 ''');
810 helper.initNew(newUnit, unitDelta);
811 // nodes
812 ClassMember oldNodeA = helper.oldMembers[0];
813 ClassMember newNodeA = helper.newMembers[0];
814 ClassMember nodeB = helper.newMembers[1];
815 expect(newNodeA, isNot(same(oldNodeA)));
816 expect(nodeB, same(helper.oldMembers[1]));
817 // elements
818 MethodElement oldElementA = oldNodeA.element;
819 MethodElement newElementA = newNodeA.element;
820 MethodElement elementB = nodeB.element;
821 expect(newElementA, isNotNull);
822 expect(newElementA.name, 'aaa');
823 expect(oldElementA.parameters, hasLength(1));
824 expect(newElementA.parameters, hasLength(0));
825 expect(elementB, isNotNull);
826 expect(elementB.name, 'bbb');
827 // verify delta
828 expect(helper.delta.addedConstructors, isEmpty);
829 expect(helper.delta.removedConstructors, isEmpty);
830 expect(helper.delta.addedAccessors, isEmpty);
831 expect(helper.delta.removedAccessors, isEmpty);
832 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
833 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
834 }
835
836 test_classDelta_null_abstractKeyword_add() {
837 _verifyNoClassDeltaForTheLast(
838 r'''
839 class A {}
840 ''',
841 r'''
842 abstract class A {}
843 ''');
844 }
845
846 test_classDelta_null_abstractKeyword_remove() {
847 _verifyNoClassDeltaForTheLast(
848 r'''
849 abstract class A {}
850 ''',
851 r'''
852 class A {}
853 ''');
854 }
855
856 test_classDelta_null_extendsClause_add() {
857 _verifyNoClassDeltaForTheLast(
858 r'''
859 class A {}
860 class B {}
861 ''',
862 r'''
863 class A {}
864 class B extends A {}
865 ''');
866 }
867
868 test_classDelta_null_extendsClause_change() {
869 _verifyNoClassDeltaForTheLast(
870 r'''
871 class A1 {}
872 class A2 {}
873 class B extends A1 {}
874 ''',
875 r'''
876 class A1 {}
877 class A2 {}
878 class B extends A2 {}
879 ''');
880 }
881
882 test_classDelta_null_extendsClause_remove() {
883 _verifyNoClassDeltaForTheLast(
884 r'''
885 class A {}
886 class B extends A {}
887 ''',
888 r'''
889 class A {}
890 class B {}
891 ''');
892 }
893
894 test_classDelta_null_implementsClause_add() {
895 _verifyNoClassDeltaForTheLast(
896 r'''
897 class A {}
898 class B {}
899 ''',
900 r'''
901 class A {}
902 class B implements A {}
903 ''');
904 }
905
906 test_classDelta_null_implementsClause_change() {
907 _verifyNoClassDeltaForTheLast(
908 r'''
909 class A1 {}
910 class A2 {}
911 class B implements A1 {}
912 ''',
913 r'''
914 class A1 {}
915 class A2 {}
916 class B implements A2 {}
917 ''');
918 }
919
920 test_classDelta_null_implementsClause_remove() {
921 _verifyNoClassDeltaForTheLast(
922 r'''
923 class A {}
924 class B implements A {}
925 ''',
926 r'''
927 class A {}
928 class B {}
929 ''');
930 }
931
932 test_classDelta_null_typeParameters_change() {
933 _verifyNoClassDeltaForTheLast(
934 r'''
935 class A {}
936 class B<T> {}
937 ''',
938 r'''
939 class A {}
940 class B<T extends A> {}
941 ''');
942 }
943
944 test_classDelta_null_withClause_add() {
945 _verifyNoClassDeltaForTheLast(
946 r'''
947 class A {}
948 class M {}
949 class B extends A {}
950 ''',
951 r'''
952 class A {}
953 class M {}
954 class B extends A with M {}
955 ''');
956 }
957
958 test_classDelta_null_withClause_change1() {
959 _verifyNoClassDeltaForTheLast(
960 r'''
961 class A {}
962 class M1 {}
963 class M2 {}
964 class B extends A with M1 {}
965 ''',
966 r'''
967 class A {}
968 class M1 {}
969 class M2 {}
970 class B extends A with M2 {}
971 ''');
972 }
973
974 test_classDelta_null_withClause_change2() {
975 _verifyNoClassDeltaForTheLast(
976 r'''
977 class A {}
978 class M1 {}
979 class M2 {}
980 class B extends A with M1, M2 {}
981 ''',
982 r'''
983 class A {}
984 class M1 {}
985 class M2 {}
986 class B extends A with M2, M1 {}
987 ''');
988 }
989
990 test_classDelta_null_withClause_remove() {
991 _verifyNoClassDeltaForTheLast(
992 r'''
993 class A {}
994 class M {}
995 class B extends A with M {}
996 ''',
997 r'''
998 class A {}
999 class M {}
1000 class B extends A {}
1001 ''');
1002 }
1003
1004 test_classDelta_setter_add() {
1005 var helper = new _ClassDeltaHelper('A');
1006 _buildOldUnit(r'''
1007 class A {
1008 void set aaa(int pa) {}
1009 }
1010 ''');
1011 helper.initOld(oldUnit);
1012 _buildNewUnit(r'''
1013 class A {
1014 void set aaa(int pa) {}
1015 void set bbb(int pb) {}
1016 }
1017 ''');
1018 helper.initNew(newUnit, unitDelta);
1019 // nodes
1020 MethodDeclaration nodeA = helper.oldMembers[0];
1021 MethodDeclaration newNodeB = helper.newMembers[1];
1022 expect(nodeA, same(helper.oldMembers[0]));
1023 // elements
1024 PropertyAccessorElement elementA = nodeA.element;
1025 PropertyAccessorElement newElementB = newNodeB.element;
1026 expect(elementA, isNotNull);
1027 expect(elementA.name, 'aaa=');
1028 expect(newElementB, isNotNull);
1029 expect(newElementB.name, 'bbb=');
1030 // verify delta
1031 expect(helper.delta.addedConstructors, isEmpty);
1032 expect(helper.delta.removedConstructors, isEmpty);
1033 expect(helper.delta.addedAccessors, unorderedEquals([newElementB]));
1034 expect(helper.delta.removedAccessors, isEmpty);
1035 expect(helper.delta.addedMethods, isEmpty);
1036 expect(helper.delta.removedMethods, isEmpty);
1037 }
1038
1039 test_classDelta_setter_remove() {
1040 var helper = new _ClassDeltaHelper('A');
1041 _buildOldUnit(r'''
1042 class A {
1043 void set aaa(int pa) {}
1044 void set bbb(int pb) {}
1045 }
1046 ''');
1047 helper.initOld(oldUnit);
1048 _buildNewUnit(r'''
1049 class A {
1050 void set aaa(int pa) {}
1051 }
1052 ''');
1053 helper.initNew(newUnit, unitDelta);
1054 // nodes
1055 MethodDeclaration nodeA = helper.oldMembers[0];
1056 MethodDeclaration oldNodeB = helper.oldMembers[1];
1057 expect(nodeA, same(helper.oldMembers[0]));
1058 // elements
1059 PropertyAccessorElement elementA = nodeA.element;
1060 PropertyAccessorElement oldElementB = oldNodeB.element;
1061 expect(elementA, isNotNull);
1062 expect(elementA.name, 'aaa=');
1063 // verify delta
1064 expect(helper.delta.addedConstructors, isEmpty);
1065 expect(helper.delta.removedConstructors, isEmpty);
1066 expect(helper.delta.addedAccessors, isEmpty);
1067 expect(helper.delta.removedAccessors, unorderedEquals([oldElementB]));
1068 expect(helper.delta.addedMethods, isEmpty);
1069 expect(helper.delta.removedMethods, isEmpty);
1070 }
1071
1072 test_classDelta_typeParameter_same() {
1073 _buildOldUnit(r'''
1074 class A<T> {
1075 m() {}
1076 }
1077 ''');
1078 _buildNewUnit(r'''
1079 class A<T> {
1080 m2() {}
1081 }
1082 ''');
1083 }
1084
39 test_directives_add() { 1085 test_directives_add() {
40 _buildOldUnit(r''' 1086 _buildOldUnit(r'''
41 library test; 1087 library test;
42 import 'dart:math'; 1088 import 'dart:math';
43 '''); 1089 ''');
44 List<Directive> oldDirectives = oldUnit.directives.toList(); 1090 List<Directive> oldDirectives = oldUnit.directives.toList();
45 _buildNewUnit(r''' 1091 _buildNewUnit(r'''
46 library test; 1092 library test;
47 import 'dart:async'; 1093 import 'dart:async';
48 import 'dart:math'; 1094 import 'dart:math';
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 { 1141 {
96 Directive newNode = newDirectives[0]; 1142 Directive newNode = newDirectives[0];
97 expect(newNode, same(oldDirectives[0])); 1143 expect(newNode, same(oldDirectives[0]));
98 expect(getNodeText(newNode), 'part of my_lib;'); 1144 expect(getNodeText(newNode), 'part of my_lib;');
99 LibraryElement element = newNode.element; 1145 LibraryElement element = newNode.element;
100 expect(element, isNotNull); 1146 expect(element, isNotNull);
101 expect(element.nameOffset, libCode.indexOf('my_lib;')); 1147 expect(element.nameOffset, libCode.indexOf('my_lib;'));
102 } 1148 }
103 } 1149 }
104 1150
1151 test_directives_library_updateOffset() {
1152 _buildOldUnit(r'''
1153 #!/bin/sh
1154 library my_lib;
1155 class A {}
1156 ''');
1157 LibraryDirective libraryDirective = oldUnit.directives.single;
1158 // Set the LibraryElement and check that its nameOffset is correct.
1159 libraryDirective.element =
1160 new LibraryElementImpl.forNode(context, libraryDirective.name);
1161 expect(libraryDirective.element.nameOffset, libraryDirective.name.offset);
1162 // Update and check again that the nameOffset is correct.
1163 _buildNewUnit(r'''
1164 #!/bin/sh
1165
1166 library my_lib;
1167 class A {}
1168 ''');
1169 expect(libraryDirective.element.nameOffset, libraryDirective.name.offset);
1170 }
1171
105 test_directives_remove() { 1172 test_directives_remove() {
106 _buildOldUnit(r''' 1173 _buildOldUnit(r'''
107 library test; 1174 library test;
108 import 'dart:async'; 1175 import 'dart:async';
109 import 'dart:math'; 1176 import 'dart:math';
110 '''); 1177 ''');
111 List<Directive> oldDirectives = oldUnit.directives.toList(); 1178 List<Directive> oldDirectives = oldUnit.directives.toList();
112 _buildNewUnit(r''' 1179 _buildNewUnit(r'''
113 library test; 1180 library test;
114 import 'dart:math'; 1181 import 'dart:math';
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 expect(newNode, same(oldDirectives[1])); 1234 expect(newNode, same(oldDirectives[1]));
168 expect(getNodeText(newNode), "import 'dart:math' as m;"); 1235 expect(getNodeText(newNode), "import 'dart:math' as m;");
169 ImportElement element = newNode.element; 1236 ImportElement element = newNode.element;
170 expect(element, isNotNull); 1237 expect(element, isNotNull);
171 expect(element.nameOffset, newCode.indexOf("import 'dart:math' as m;")); 1238 expect(element.nameOffset, newCode.indexOf("import 'dart:math' as m;"));
172 expect(element.prefix.nameOffset, newCode.indexOf("m;")); 1239 expect(element.prefix.nameOffset, newCode.indexOf("m;"));
173 } 1240 }
174 expect(unitDelta.hasDirectiveChange, isFalse); 1241 expect(unitDelta.hasDirectiveChange, isFalse);
175 } 1242 }
176 1243
1244 test_directives_sameImportPrefix_sameOrder() {
1245 _buildOldUnit(r'''
1246 import 'test1.dart' as m;
1247 import 'test2.dart' as m;
1248 ''');
1249 List<Directive> oldDirectives = oldUnit.directives.toList();
1250 ImportDirective import1 = oldDirectives[0];
1251 ImportDirective import2 = oldDirectives[1];
1252 ImportElementImpl importElement1 = new ImportElementImpl(import1.offset);
1253 ImportElementImpl importElement2 = new ImportElementImpl(import2.offset);
1254 PrefixElement prefixElement = new PrefixElementImpl.forNode(import1.prefix);
1255 importElement1.prefix = prefixElement;
1256 importElement2.prefix = prefixElement;
1257 import1.element = importElement1;
1258 import2.element = importElement2;
1259 import1.prefix.staticElement = prefixElement;
1260 import2.prefix.staticElement = prefixElement;
1261 _buildNewUnit(r'''
1262 import 'test1.dart' as m;
1263 import 'test2.dart' as m;
1264 class A {}
1265 ''');
1266 int expectedPrefixOffset = 23;
1267 expect(import1.prefix.staticElement.nameOffset, expectedPrefixOffset);
1268 expect(import2.prefix.staticElement.nameOffset, expectedPrefixOffset);
1269 expect(importElement1.prefix.nameOffset, expectedPrefixOffset);
1270 expect(importElement2.prefix.nameOffset, expectedPrefixOffset);
1271 }
1272
177 test_directives_sameOrder_insertSpaces() { 1273 test_directives_sameOrder_insertSpaces() {
178 _buildOldUnit(r''' 1274 _buildOldUnit(r'''
179 library test; 1275 library test;
180 import 'dart:async'; 1276 import 'dart:async';
181 import 'dart:math'; 1277 import 'dart:math';
182 '''); 1278 ''');
183 List<Directive> oldDirectives = oldUnit.directives.toList(); 1279 List<Directive> oldDirectives = oldUnit.directives.toList();
184 _buildNewUnit(r''' 1280 _buildNewUnit(r'''
185 library test; 1281 library test;
186 1282
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 CompilationUnitMember nodeA = newNodes[0]; 1577 CompilationUnitMember nodeA = newNodes[0];
482 CompilationUnitMember nodeB = newNodes[1]; 1578 CompilationUnitMember nodeB = newNodes[1];
483 expect(nodeA, same(oldNodes[0])); 1579 expect(nodeA, same(oldNodes[0]));
484 // elements 1580 // elements
485 ClassElement elementA = nodeA.element; 1581 ClassElement elementA = nodeA.element;
486 ClassElement elementB = nodeB.element; 1582 ClassElement elementB = nodeB.element;
487 expect(elementA, isNotNull); 1583 expect(elementA, isNotNull);
488 expect(elementB, isNotNull); 1584 expect(elementB, isNotNull);
489 expect(elementA.name, 'A'); 1585 expect(elementA.name, 'A');
490 expect(elementB.name, 'B'); 1586 expect(elementB.name, 'B');
1587 expect(elementA.fields.map((f) => f.name),
1588 unorderedEquals(['index', 'values', 'A1', 'A2']));
1589 expect(elementA.accessors.map((a) => a.name),
1590 unorderedEquals(['index', 'values', 'A1', 'A2']));
1591 expect(elementB.fields.map((f) => f.name),
1592 unorderedEquals(['index', 'values', 'B1', 'B2']));
1593 expect(elementB.accessors.map((a) => a.name),
1594 unorderedEquals(['index', 'values', 'B1', 'B2']));
491 // unit.types 1595 // unit.types
492 expect(unitElement.enums, unorderedEquals([elementA, elementB])); 1596 expect(unitElement.enums, unorderedEquals([elementA, elementB]));
493 // verify delta 1597 // verify delta
494 expect(unitDelta.addedDeclarations, unorderedEquals([elementB])); 1598 expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
495 expect(unitDelta.removedDeclarations, unorderedEquals([])); 1599 expect(unitDelta.removedDeclarations, unorderedEquals([]));
496 } 1600 }
497 1601
498 test_unitMembers_function_add() { 1602 test_unitMembers_function_add() {
499 _buildOldUnit(r''' 1603 _buildOldUnit(r'''
500 a() {} 1604 a() {}
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 expect(element, isNotNull); 1767 expect(element, isNotNull);
664 expect(element.name, 'a'); 1768 expect(element.name, 'a');
665 expect(element.nameOffset, newCode.indexOf('a = 1')); 1769 expect(element.nameOffset, newCode.indexOf('a = 1'));
666 } 1770 }
667 } 1771 }
668 // verify delta 1772 // verify delta
669 expect(unitDelta.addedDeclarations, unorderedEquals([])); 1773 expect(unitDelta.addedDeclarations, unorderedEquals([]));
670 expect(unitDelta.removedDeclarations, unorderedEquals([])); 1774 expect(unitDelta.removedDeclarations, unorderedEquals([]));
671 } 1775 }
672 1776
1777 test_update_addIdentifier_beforeConstructorWithComment() {
1778 _buildOldUnit(r'''
1779 class A {
1780 /// CCC
1781 A();
1782 }
1783 ''');
1784 _buildNewUnit(r'''
1785 class A {
1786 b
1787
1788 /// CCC
1789 A();
1790 }
1791 ''');
1792 }
1793
1794 test_update_annotation_add() {
1795 _buildOldUnit(r'''
1796 const myAnnotation = const Object();
1797 foo() {}
1798 ''');
1799 _buildNewUnit(r'''
1800 const myAnnotation = const Object();
1801 @myAnnotation
1802 foo() {}
1803 ''');
1804 }
1805
1806 test_update_beforeClassWithDelta_nameOffset() {
1807 _buildOldUnit(r'''
1808 class A {}
1809
1810 class B {
1811 A a;
1812 }
1813 ''');
1814 _buildNewUnit(r'''
1815 class A2 {}
1816
1817 class B {
1818 A2 a;
1819 }
1820 ''');
1821 }
1822
1823 test_update_changeDuplicatingOffsetsMapping() {
1824 _buildOldUnit(r'''
1825 class A {
1826 m() {
1827 }
1828 }
1829
1830 /// X
1831 class C {}
1832 ''');
1833 _buildNewUnit(r'''
1834 class A {
1835 m2() {
1836 b
1837 }
1838 }
1839
1840 /// X
1841 class C {}
1842 ''');
1843 }
1844
1845 test_update_closuresOfSyntheticInitializer() {
1846 _buildOldUnit(r'''
1847 f1() {
1848 print(1);
1849 }
1850 f2() {
1851 B b = new B((C c) {});
1852 }
1853 ''');
1854 _buildNewUnit(r'''
1855 f1() {
1856 print(12);
1857 }
1858 f2() {
1859 B b = new B((C c) {});
1860 }
1861 ''');
1862 }
1863
1864 test_update_commentReference_empty() {
1865 _buildOldUnit(r'''
1866 /// Empty [] reference.
1867 class A {}
1868 ''');
1869 _buildNewUnit(r'''
1870 /// Empty [] reference.
1871 class A {}
1872 ''');
1873 }
1874
1875 test_update_commentReference_multipleCommentTokens() {
1876 _buildOldUnit(r'''
1877 class A {
1878 /// C1 [C2]
1879 /// C3 [C4]
1880 /// C5 [C6]
1881 void m() {}
1882 }
1883 ''');
1884 _buildNewUnit(r'''
1885 class A {
1886 int field;
1887
1888 /// C1 [C2]
1889 /// C3 [C4]
1890 /// C5 [C6]
1891 void m() {}
1892 }
1893 ''');
1894 }
1895
1896 test_update_commentReference_new() {
1897 _buildOldUnit(r'''
1898 /// Comment reference with new [new A].
1899 class A {}
1900 ''');
1901 _buildNewUnit(r'''
1902 class B {}
1903 /// Comment reference with new [new A].
1904 class A {}
1905 ''');
1906 }
1907
1908 test_update_commentReference_notClosed() {
1909 _buildOldUnit(r'''
1910 /// [c)
1911 class A {}
1912 ''');
1913 _buildNewUnit(r'''
1914 int a;
1915 /// [c)
1916 class A {}
1917 ''');
1918 }
1919
1920 test_update_element_implicitAccessors_classField() {
1921 _buildOldUnit(r'''
1922 // 0
1923 class A {
1924 var F = 0;
1925 }
1926 ''');
1927 _materializeLazyElements(unitElement);
1928 _buildNewUnit(r'''
1929 // 012
1930 class A {
1931 var F = 0;
1932 }
1933 ''');
1934 }
1935
1936 test_update_element_implicitAccessors_topLevelVariable() {
1937 _buildOldUnit(r'''
1938 var A = 0;
1939 var B = 1;
1940 ''');
1941 _materializeLazyElements(unitElement);
1942 _buildNewUnit(r'''
1943 var B = 1;
1944 ''');
1945 }
1946
1947 test_update_parseError_diffPlus_removeOne() {
1948 _buildOldUnit(r'''
1949 class C {
1950 + /// comment
1951 + String field;
1952 }
1953 ''');
1954 _buildNewUnit(r'''
1955 class C {
1956 + /// comment
1957 String field;
1958 }
1959 ''');
1960 }
1961
1962 test_update_rewrittenConstructorName() {
1963 _buildOldUnit(r'''
1964 class A {
1965 A();
1966 A.named();
1967 }
1968
1969 foo() {}
1970
1971 main() {
1972 new A();
1973 new A.named();
1974 }
1975 ''');
1976 _buildNewUnit(r'''
1977 class A {
1978 A();
1979 A.named();
1980 }
1981
1982 bar() {}
1983
1984 main() {
1985 new A();
1986 new A.named();
1987 }
1988 ''');
1989 }
1990
673 void _buildNewUnit(String newCode) { 1991 void _buildNewUnit(String newCode) {
674 this.newCode = newCode; 1992 this.newCode = newCode;
675 context.setContents(source, newCode); 1993 AnalysisOptionsImpl analysisOptions = context.analysisOptions;
676 newUnit = context.parseCompilationUnit(source); 1994 analysisOptions.finerGrainedInvalidation = false;
677 IncrementalCompilationUnitElementBuilder builder = 1995 try {
678 new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit); 1996 context.setContents(source, newCode);
679 builder.build(); 1997 newUnit = context.parseCompilationUnit(source);
680 unitDelta = builder.unitDelta; 1998 IncrementalCompilationUnitElementBuilder builder =
681 expect(newUnit.element, unitElement); 1999 new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit);
2000 builder.build();
2001 unitDelta = builder.unitDelta;
2002 expect(newUnit.element, unitElement);
2003 // Flush all tokens, ASTs and elements.
2004 context.analysisCache.flush((target, result) {
2005 return result == TOKEN_STREAM ||
2006 result == PARSED_UNIT ||
2007 RESOLVED_UNIT_RESULTS.contains(result) ||
2008 LIBRARY_ELEMENT_RESULTS.contains(result);
2009 });
2010 // Compute a new AST with built elements.
2011 CompilationUnit newUnitFull = context.computeResult(
2012 new LibrarySpecificUnit(source, source), RESOLVED_UNIT1);
2013 expect(newUnitFull, isNot(same(newUnit)));
2014 new _BuiltElementsValidator().isEqualNodes(newUnitFull, newUnit);
2015 } finally {
2016 analysisOptions.finerGrainedInvalidation = true;
2017 }
682 } 2018 }
683 2019
684 void _buildOldUnit(String oldCode, [Source libSource]) { 2020 void _buildOldUnit(String oldCode, [Source libSource]) {
685 this.oldCode = oldCode; 2021 this.oldCode = oldCode;
686 source = newSource('/test.dart', oldCode); 2022 source = newSource('/test.dart', oldCode);
687 if (libSource == null) { 2023 if (libSource == null) {
688 libSource = source; 2024 libSource = source;
689 } 2025 }
690 oldUnit = context.resolveCompilationUnit2(source, libSource); 2026 oldUnit = context.resolveCompilationUnit2(source, libSource);
691 unitElement = oldUnit.element; 2027 unitElement = oldUnit.element;
692 expect(unitElement, isNotNull); 2028 expect(unitElement, isNotNull);
693 } 2029 }
694 } 2030
2031 void _materializeLazyElements(CompilationUnitElement unitElement) {
2032 unitElement.accept(new _MaterializeLazyElementsVisitor());
2033 }
2034
2035 void _verifyNoClassDeltaForTheLast(String oldCode, String newCode) {
2036 _buildOldUnit(oldCode);
2037 List<CompilationUnitMember> oldMembers = oldUnit.declarations.toList();
2038 Element oldElementLast = oldMembers.last.element;
2039 _buildNewUnit(newCode);
2040 List<CompilationUnitMember> newMembers = newUnit.declarations;
2041 Element newElementLast = newMembers.last.element;
2042 expect(newElementLast, isNot(same(oldElementLast)));
2043 expect(unitDelta.classDeltas, isEmpty);
2044 expect(unitDelta.removedDeclarations, unorderedEquals([oldElementLast]));
2045 expect(unitDelta.addedDeclarations, unorderedEquals([newElementLast]));
2046 }
2047 }
2048
2049 /**
2050 * Compares tokens and ASTs, and built elements of declared identifiers.
2051 */
2052 class _BuiltElementsValidator extends AstComparator {
2053 final Set visited = new Set.identity();
2054
2055 @override
2056 bool isEqualNodes(AstNode expected, AstNode actual) {
2057 // Elements of nodes which are children of ClassDeclaration(s) must be
2058 // linked to the corresponding ClassElement(s).
2059 if (actual is TypeParameter) {
2060 TypeParameterElement element = actual.element;
2061 ClassDeclaration classNode = actual.parent.parent;
2062 expect(element.enclosingElement, same(classNode.element));
2063 } else if (actual is FieldDeclaration) {
2064 for (VariableDeclaration field in actual.fields.variables) {
2065 Element element = field.element;
2066 ClassDeclaration classNode = actual.parent;
2067 expect(element.enclosingElement, same(classNode.element));
2068 }
2069 } else if (actual is ClassMember) {
2070 Element element = actual.element;
2071 ClassDeclaration classNode = actual.parent;
2072 expect(element.enclosingElement, same(classNode.element));
2073 }
2074 // Field elements referenced by field formal parameters of constructors
2075 // must by fields of the enclosing class element.
2076 if (actual is FieldFormalParameter) {
2077 FieldFormalParameterElement parameterElement = actual.element;
2078 FieldElement element = parameterElement.field;
2079 ClassDeclaration classNode =
2080 actual.getAncestor((n) => n is ClassDeclaration);
2081 expect(element.enclosingElement, same(classNode.element));
2082 }
2083 // ElementAnnotationImpl must use the enclosing CompilationUnitElement.
2084 if (actual is Annotation) {
2085 AstNode parent = actual.parent;
2086 if (parent is Declaration) {
2087 ElementAnnotationImpl actualElement = actual.elementAnnotation;
2088 CompilationUnitElement enclosingUnitElement =
2089 parent.element.getAncestor((a) => a is CompilationUnitElement);
2090 expect(actualElement.compilationUnit, same(enclosingUnitElement));
2091 }
2092 }
2093 // Identifiers like 'a.b' in 'new a.b()' might be rewritten if resolver
2094 // sees that 'a' is actually a class name, so 'b' is a constructor name.
2095 //
2096 if (expected is ConstructorName && actual is ConstructorName) {
2097 Identifier expectedTypeName = expected.type.name;
2098 Identifier actualTypeName = actual.type.name;
2099 if (expectedTypeName is PrefixedIdentifier &&
2100 actualTypeName is SimpleIdentifier) {
2101 return isEqualNodes(expectedTypeName.prefix, actualTypeName) &&
2102 isEqualNodes(expectedTypeName.identifier, actual.name);
2103 }
2104 }
2105 // Compare nodes.
2106 bool result = super.isEqualNodes(expected, actual);
2107 if (!result) {
2108 fail('|$actual| != expected |$expected|');
2109 }
2110 // Verify that declared identifiers have equal elements.
2111 if (expected is SimpleIdentifier && actual is SimpleIdentifier) {
2112 if (expected.inDeclarationContext()) {
2113 expect(actual.inDeclarationContext(), isTrue);
2114 Element expectedElement = expected.staticElement;
2115 Element actualElement = actual.staticElement;
2116 _verifyElement(
2117 expectedElement, actualElement, 'staticElement ($expectedElement)');
2118 }
2119 }
2120 return true;
2121 }
2122
2123 void _verifyElement(Element expected, Element actual, String desc) {
2124 if (!visited.add(expected)) {
2125 return;
2126 }
2127 if (expected == null && actual == null) {
2128 return;
2129 }
2130 // Prefixes are built later.
2131 if (actual is PrefixElement) {
2132 return;
2133 }
2134 // Compare properties.
2135 _verifyEqual('$desc name', expected.name, actual.name);
2136 _verifyEqual('$desc nameOffset', expected.nameOffset, actual.nameOffset);
2137 _verifyEqual('$desc isSynthetic', expected.isSynthetic, actual.isSynthetic);
2138 if (expected is ElementImpl && actual is ElementImpl) {
2139 _verifyEqual('$desc codeOffset', expected.codeOffset, actual.codeOffset);
2140 _verifyEqual('$desc codeLength', expected.codeLength, actual.codeLength);
2141 }
2142 if (expected is LocalElement && actual is LocalElement) {
2143 _verifyEqual(
2144 '$desc visibleRange', expected.visibleRange, actual.visibleRange);
2145 }
2146 _verifyEqual('$desc documentationComment', expected.documentationComment,
2147 actual.documentationComment);
2148 {
2149 var expectedEnclosing = expected.enclosingElement;
2150 var actualEnclosing = actual.enclosingElement;
2151 if (expectedEnclosing != null) {
2152 expect(actualEnclosing, isNotNull, reason: '$desc enclosingElement');
2153 _verifyElement(expectedEnclosing, actualEnclosing,
2154 '${expectedEnclosing.name}.$desc');
2155 }
2156 }
2157 // Compare implicit accessors.
2158 if (expected is PropertyInducingElement &&
2159 actual is PropertyInducingElement &&
2160 !expected.isSynthetic) {
2161 _verifyElement(expected.getter, actual.getter, '$desc getter');
2162 _verifyElement(expected.setter, actual.setter, '$desc setter');
2163 }
2164 // Compare implicit properties.
2165 if (expected is PropertyAccessorElement &&
2166 actual is PropertyAccessorElement &&
2167 !expected.isSynthetic) {
2168 _verifyElement(expected.variable, actual.variable, '$desc variable');
2169 }
2170 // Compare parameters.
2171 if (expected is ExecutableElement && actual is ExecutableElement) {
2172 List<ParameterElement> actualParameters = actual.parameters;
2173 List<ParameterElement> expectedParameters = expected.parameters;
2174 expect(actualParameters, hasLength(expectedParameters.length));
2175 for (int i = 0; i < expectedParameters.length; i++) {
2176 _verifyElement(
2177 expectedParameters[i], actualParameters[i], '$desc parameters[$i]');
2178 }
2179 }
2180 }
2181
2182 void _verifyEqual(String name, expected, actual) {
2183 if (actual != expected) {
2184 fail('$name\nExpected: $expected\n Actual: $actual');
2185 }
2186 }
2187 }
2188
2189 class _ClassDeltaHelper {
2190 final String name;
2191
2192 ClassElementDelta delta;
2193 ClassElementImpl element;
2194 int oldVersion;
2195 List<ClassMember> oldMembers;
2196 List<ClassMember> newMembers;
2197
2198 _ClassDeltaHelper(this.name);
2199
2200 void initNew(CompilationUnit newUnit, CompilationUnitElementDelta unitDelta) {
2201 expect(element.version, isNot(oldVersion));
2202 ClassDeclaration newClass = _findClassNode(newUnit, name);
2203 expect(newClass, isNotNull);
2204 newMembers = newClass.members.toList();
2205 delta = unitDelta.classDeltas[name];
2206 expect(delta, isNotNull, reason: 'No delta for class: $name');
2207 }
2208
2209 void initOld(CompilationUnit oldUnit) {
2210 ClassDeclaration oldClass = _findClassNode(oldUnit, name);
2211 expect(oldClass, isNotNull);
2212 element = oldClass.element;
2213 oldVersion = element.version;
2214 oldMembers = oldClass.members.toList();
2215 }
2216
2217 ClassDeclaration _findClassNode(CompilationUnit unit, String name) =>
2218 unit.declarations.singleWhere((unitMember) =>
2219 unitMember is ClassDeclaration && unitMember.name.name == name);
2220 }
2221
2222 class _MaterializeLazyElementsVisitor extends GeneralizingElementVisitor {
2223 @override
2224 visitExecutableElement(ExecutableElement element) {
2225 element.parameters;
2226 super.visitExecutableElement(element);
2227 }
2228 }
OLDNEW
« no previous file with comments | « packages/analyzer/test/src/task/html_work_manager_test.dart ('k') | packages/analyzer/test/src/task/inputs_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698