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

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

Issue 2834773003: Remove the limited invalidation feature. (Closed)
Patch Set: Created 3 years, 8 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library analyzer.test.src.task.incremental_element_builder_test;
6
7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
9 import 'package:analyzer/dart/element/element.dart';
10 import 'package:analyzer/dart/element/visitor.dart';
11 import 'package:analyzer/src/dart/ast/utilities.dart';
12 import 'package:analyzer/src/dart/element/element.dart';
13 import 'package:analyzer/src/generated/engine.dart';
14 import 'package:analyzer/src/generated/source.dart';
15 import 'package:analyzer/src/task/dart.dart';
16 import 'package:analyzer/src/task/incremental_element_builder.dart';
17 import 'package:analyzer/task/dart.dart';
18 import 'package:test/test.dart';
19 import 'package:test_reflective_loader/test_reflective_loader.dart';
20
21 import '../context/abstract_context.dart';
22
23 main() {
24 defineReflectiveSuite(() {
25 defineReflectiveTests(IncrementalCompilationUnitElementBuilderTest);
26 });
27 }
28
29 @reflectiveTest
30 class IncrementalCompilationUnitElementBuilderTest extends AbstractContextTest {
31 Source source;
32
33 String oldCode;
34 CompilationUnit oldUnit;
35 CompilationUnitElement unitElement;
36
37 String newCode;
38 CompilationUnit newUnit;
39
40 CompilationUnitElementDelta unitDelta;
41
42 String getNodeText(AstNode node) {
43 return newCode.substring(node.offset, node.end);
44 }
45
46 test_classDelta_annotation_add() {
47 var helper = new _ClassDeltaHelper('A');
48 _buildOldUnit(r'''
49 class A {}
50 ''');
51 helper.initOld(oldUnit);
52 expect(helper.element.metadata, isEmpty);
53 _buildNewUnit(r'''
54 @deprecated
55 class A {}
56 ''');
57 helper.initNew(newUnit, unitDelta);
58 expect(helper.delta.hasAnnotationChanges, isTrue);
59 expect(helper.element.metadata, hasLength(1));
60 }
61
62 test_classDelta_annotation_remove() {
63 var helper = new _ClassDeltaHelper('A');
64 _buildOldUnit(r'''
65 @deprecated
66 class A {}
67 ''');
68 helper.initOld(oldUnit);
69 expect(helper.element.metadata, hasLength(1));
70 _buildNewUnit(r'''
71 class A {}
72 ''');
73 helper.initNew(newUnit, unitDelta);
74 expect(helper.delta.hasAnnotationChanges, isTrue);
75 expect(helper.element.metadata, isEmpty);
76 }
77
78 test_classDelta_constructor_0to1() {
79 var helper = new _ClassDeltaHelper('A');
80 _buildOldUnit(r'''
81 class A {
82 }
83 ''');
84 helper.initOld(oldUnit);
85 ConstructorElement oldConstructorElement =
86 helper.element.unnamedConstructor;
87 _buildNewUnit(r'''
88 class A {
89 A.a();
90 }
91 ''');
92 helper.initNew(newUnit, unitDelta);
93 // nodes
94 ClassMember newConstructorNode = helper.newMembers[0];
95 // elements
96 ConstructorElement newConstructorElement = newConstructorNode.element;
97 expect(newConstructorElement, isNotNull);
98 expect(newConstructorElement.name, 'a');
99 // classElement.constructors
100 ClassElement classElement = helper.element;
101 expect(classElement.constructors, [newConstructorElement]);
102 // verify delta
103 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
104 expect(helper.delta.addedConstructors,
105 unorderedEquals([newConstructorElement]));
106 expect(helper.delta.removedConstructors,
107 unorderedEquals([oldConstructorElement]));
108 expect(helper.delta.addedAccessors, isEmpty);
109 expect(helper.delta.removedAccessors, isEmpty);
110 expect(helper.delta.addedMethods, isEmpty);
111 expect(helper.delta.removedMethods, isEmpty);
112 }
113
114 test_classDelta_constructor_1to0() {
115 var helper = new _ClassDeltaHelper('A');
116 _buildOldUnit(r'''
117 class A {
118 A.a();
119 }
120 ''');
121 helper.initOld(oldUnit);
122 ConstructorElement oldElementA = helper.element.getNamedConstructor('a');
123 _buildNewUnit(r'''
124 class A {
125 }
126 ''');
127 helper.initNew(newUnit, unitDelta);
128 // classElement.constructors
129 ClassElement classElement = helper.element;
130 {
131 List<ConstructorElement> constructors = classElement.constructors;
132 expect(constructors, hasLength(1));
133 expect(constructors[0].isDefaultConstructor, isTrue);
134 expect(constructors[0].isSynthetic, isTrue);
135 }
136 // verify delta
137 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
138 expect(helper.delta.addedConstructors,
139 unorderedEquals([classElement.unnamedConstructor]));
140 expect(helper.delta.removedConstructors, unorderedEquals([oldElementA]));
141 expect(helper.delta.addedAccessors, isEmpty);
142 expect(helper.delta.removedAccessors, isEmpty);
143 expect(helper.delta.addedMethods, isEmpty);
144 expect(helper.delta.removedMethods, isEmpty);
145 }
146
147 test_classDelta_constructor_1to1_unnamed_addParameter() {
148 var helper = new _ClassDeltaHelper('A');
149 _buildOldUnit(r'''
150 class A {
151 A();
152 }
153 ''');
154 helper.initOld(oldUnit);
155 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
156 _buildNewUnit(r'''
157 class A {
158 A(int p);
159 }
160 ''');
161 helper.initNew(newUnit, unitDelta);
162 ClassElement classElement = helper.element;
163 ConstructorElement newConstructor = classElement.unnamedConstructor;
164 expect(classElement.constructors, [newConstructor]);
165 // verify delta
166 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
167 expect(helper.delta.addedConstructors, unorderedEquals([newConstructor]));
168 expect(helper.delta.removedConstructors, unorderedEquals([oldConstructor]));
169 expect(helper.delta.addedAccessors, isEmpty);
170 expect(helper.delta.removedAccessors, isEmpty);
171 expect(helper.delta.addedMethods, isEmpty);
172 expect(helper.delta.removedMethods, isEmpty);
173 }
174
175 test_classDelta_constructor_1to1_unnamed_removeParameter() {
176 var helper = new _ClassDeltaHelper('A');
177 _buildOldUnit(r'''
178 class A {
179 final int a;
180 final int b;
181 A(this.a, this.b);
182 }
183 ''');
184 helper.initOld(oldUnit);
185 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
186 _buildNewUnit(r'''
187 class A {
188 final int a;
189 final int b;
190 A(this.a);
191 }
192 ''');
193 helper.initNew(newUnit, unitDelta);
194 ClassElement classElement = helper.element;
195 ConstructorElement newConstructor = classElement.unnamedConstructor;
196 expect(classElement.constructors, [newConstructor]);
197 // verify delta
198 expect(helper.delta.hasUnnamedConstructorChange, isTrue);
199 expect(helper.delta.addedConstructors, unorderedEquals([newConstructor]));
200 expect(helper.delta.removedConstructors, unorderedEquals([oldConstructor]));
201 expect(helper.delta.addedAccessors, isEmpty);
202 expect(helper.delta.removedAccessors, isEmpty);
203 expect(helper.delta.addedMethods, isEmpty);
204 expect(helper.delta.removedMethods, isEmpty);
205 }
206
207 test_classDelta_constructor_1to2() {
208 var helper = new _ClassDeltaHelper('A');
209 _buildOldUnit(r'''
210 class A {
211 A.a();
212 }
213 ''');
214 helper.initOld(oldUnit);
215 _buildNewUnit(r'''
216 class A {
217 A.a();
218 A.b();
219 }
220 ''');
221 helper.initNew(newUnit, unitDelta);
222 // nodes
223 ClassMember nodeA = helper.newMembers[0];
224 ClassMember nodeB = helper.newMembers[1];
225 expect(nodeA, same(helper.oldMembers[0]));
226 // elements
227 ConstructorElement elementA = nodeA.element;
228 ConstructorElement elementB = nodeB.element;
229 expect(elementA, isNotNull);
230 expect(elementB, isNotNull);
231 expect(elementA.name, 'a');
232 expect(elementB.name, 'b');
233 // classElement.constructors
234 ClassElement classElement = helper.element;
235 expect(classElement.constructors, [elementA, elementB]);
236 // verify delta
237 expect(helper.delta.addedConstructors, unorderedEquals([elementB]));
238 expect(helper.delta.removedConstructors, unorderedEquals([]));
239 expect(helper.delta.addedAccessors, isEmpty);
240 expect(helper.delta.removedAccessors, isEmpty);
241 expect(helper.delta.addedMethods, isEmpty);
242 expect(helper.delta.removedMethods, isEmpty);
243 }
244
245 test_classDelta_constructor_2to1() {
246 var helper = new _ClassDeltaHelper('A');
247 _buildOldUnit(r'''
248 class A {
249 A.a();
250 A.b();
251 }
252 ''');
253 helper.initOld(oldUnit);
254 ConstructorElement oldElementA = helper.element.getNamedConstructor('a');
255 _buildNewUnit(r'''
256 class A {
257 A.b();
258 }
259 ''');
260 helper.initNew(newUnit, unitDelta);
261 expect(helper.delta.hasUnnamedConstructorChange, isFalse);
262 // nodes
263 ClassMember nodeB = helper.newMembers[0];
264 expect(nodeB, same(helper.oldMembers[1]));
265 // elements
266 ConstructorElement elementB = nodeB.element;
267 expect(elementB, isNotNull);
268 expect(elementB.name, 'b');
269 // classElement.constructors
270 ClassElement classElement = helper.element;
271 expect(classElement.constructors, [elementB]);
272 // verify delta
273 expect(helper.delta.addedConstructors, unorderedEquals([]));
274 expect(helper.delta.removedConstructors, unorderedEquals([oldElementA]));
275 expect(helper.delta.addedAccessors, isEmpty);
276 expect(helper.delta.removedAccessors, isEmpty);
277 expect(helper.delta.addedMethods, isEmpty);
278 expect(helper.delta.removedMethods, isEmpty);
279 }
280
281 test_classDelta_constructor_2to2_reorder() {
282 var helper = new _ClassDeltaHelper('A');
283 _buildOldUnit(r'''
284 class A {
285 A.a();
286 A.b();
287 }
288 ''');
289 helper.initOld(oldUnit);
290 _buildNewUnit(r'''
291 class A {
292 A.b();
293 A.a();
294 }
295 ''');
296 helper.initNew(newUnit, unitDelta);
297 // nodes
298 ClassMember nodeB = helper.newMembers[0];
299 ClassMember nodeA = helper.newMembers[1];
300 expect(nodeB, same(helper.oldMembers[1]));
301 expect(nodeA, same(helper.oldMembers[0]));
302 // elements
303 ConstructorElement elementB = nodeB.element;
304 ConstructorElement elementA = nodeA.element;
305 expect(elementB, isNotNull);
306 expect(elementA, isNotNull);
307 expect(elementB.name, 'b');
308 expect(elementA.name, 'a');
309 // classElement.constructors
310 ClassElement classElement = helper.element;
311 expect(classElement.constructors, [elementB, elementA]);
312 // verify delta
313 expect(helper.delta.addedConstructors, isEmpty);
314 expect(helper.delta.removedConstructors, isEmpty);
315 expect(helper.delta.addedAccessors, isEmpty);
316 expect(helper.delta.removedAccessors, isEmpty);
317 expect(helper.delta.addedMethods, isEmpty);
318 expect(helper.delta.removedMethods, isEmpty);
319 }
320
321 test_classDelta_constructor_fieldReference_initializer() {
322 var helper = new _ClassDeltaHelper('A');
323 _buildOldUnit(r'''
324 class A {
325 final int f;
326 A() : f = 1 {}
327 }
328 ''');
329 helper.initOld(oldUnit);
330 _buildNewUnit(r'''
331 class A {
332 final int f;
333 A() : f = 1;
334 }
335 ''');
336 helper.initNew(newUnit, unitDelta);
337 }
338
339 test_classDelta_constructor_fieldReference_parameter() {
340 var helper = new _ClassDeltaHelper('A');
341 _buildOldUnit(r'''
342 class A {
343 final int f;
344 A(this.f) {}
345 }
346 ''');
347 helper.initOld(oldUnit);
348 _buildNewUnit(r'''
349 class A {
350 final int f;
351 A(this.f);
352 }
353 ''');
354 helper.initNew(newUnit, unitDelta);
355 }
356
357 test_classDelta_constructor_fieldReference_parameter_default() {
358 var helper = new _ClassDeltaHelper('A');
359 _buildOldUnit(r'''
360 class A {
361 final int f;
362 A([this.f = 1]) {}
363 }
364 ''');
365 helper.initOld(oldUnit);
366 _buildNewUnit(r'''
367 class A {
368 final int f;
369 A([this.f = 1]);
370 }
371 ''');
372 helper.initNew(newUnit, unitDelta);
373 }
374
375 test_classDelta_duplicate_constructor() {
376 var helper = new _ClassDeltaHelper('A');
377 _buildOldUnit(r'''
378 class A {
379 A() {}
380 }
381 ''');
382 helper.initOld(oldUnit);
383 _buildNewUnit(r'''
384 class A {
385 A() {}
386 A() {}
387 }
388 ''');
389 helper.initNew(newUnit, unitDelta);
390 // nodes
391 ConstructorDeclaration oldNode = helper.oldMembers[0];
392 ConstructorDeclaration newNode1 = helper.newMembers[0];
393 ConstructorDeclaration newNode2 = helper.newMembers[1];
394 // elements
395 ConstructorElement oldElement = oldNode.element;
396 ConstructorElement newElement1 = newNode1.element;
397 ConstructorElement newElement2 = newNode2.element;
398 expect(newElement1, same(oldElement));
399 expect(newElement2, isNot(same(oldElement)));
400 expect(oldElement.name, '');
401 expect(newElement1.name, '');
402 expect(newElement2.name, '');
403 // verify delta
404 expect(helper.delta.addedConstructors, unorderedEquals([newElement2]));
405 expect(helper.delta.removedConstructors, isEmpty);
406 expect(helper.delta.addedAccessors, isEmpty);
407 expect(helper.delta.removedAccessors, isEmpty);
408 expect(helper.delta.addedMethods, isEmpty);
409 expect(helper.delta.removedMethods, isEmpty);
410 }
411
412 test_classDelta_duplicate_method() {
413 var helper = new _ClassDeltaHelper('A');
414 _buildOldUnit(r'''
415 class A {
416 m() {}
417 }
418 ''');
419 helper.initOld(oldUnit);
420 _buildNewUnit(r'''
421 class A {
422 m() {}
423 m() {}
424 }
425 ''');
426 helper.initNew(newUnit, unitDelta);
427 // nodes
428 MethodDeclaration oldNode = helper.oldMembers[0];
429 MethodDeclaration newNode1 = helper.newMembers[0];
430 MethodDeclaration newNode2 = helper.newMembers[1];
431 // elements
432 MethodElement oldElement = oldNode.element;
433 MethodElement newElement1 = newNode1.element;
434 MethodElement newElement2 = newNode2.element;
435 expect(newElement1, same(oldElement));
436 expect(newElement2, isNot(same(oldElement)));
437 expect(oldElement.name, 'm');
438 expect(newElement1.name, 'm');
439 expect(newElement2.name, 'm');
440 // verify delta
441 expect(helper.delta.addedConstructors, isEmpty);
442 expect(helper.delta.removedConstructors, isEmpty);
443 expect(helper.delta.addedAccessors, isEmpty);
444 expect(helper.delta.removedAccessors, isEmpty);
445 expect(helper.delta.addedMethods, unorderedEquals([newElement2]));
446 expect(helper.delta.removedMethods, isEmpty);
447 }
448
449 test_classDelta_field_add() {
450 var helper = new _ClassDeltaHelper('A');
451 _buildOldUnit(r'''
452 class A {
453 int aaa;
454 }
455 ''');
456 helper.initOld(oldUnit);
457 _buildNewUnit(r'''
458 class A {
459 int aaa;
460 int bbb;
461 }
462 ''');
463 helper.initNew(newUnit, unitDelta);
464 // nodes
465 FieldDeclaration nodeA = helper.newMembers[0];
466 FieldDeclaration newNodeB = helper.newMembers[1];
467 List<VariableDeclaration> fieldsA = nodeA.fields.variables;
468 List<VariableDeclaration> newFieldsB = newNodeB.fields.variables;
469 expect(nodeA, same(helper.oldMembers[0]));
470 expect(newFieldsB, hasLength(1));
471 // elements
472 FieldElement fieldElementA = fieldsA[0].name.staticElement;
473 FieldElement newFieldElementB = newFieldsB[0].name.staticElement;
474 expect(newFieldElementB.name, 'bbb');
475 // members
476 ClassElement classElement = helper.element;
477 expect(classElement.fields, [fieldElementA, newFieldElementB]);
478 // verify delta
479 expect(helper.delta.hasAnnotationChanges, isFalse);
480 expect(helper.delta.addedConstructors, isEmpty);
481 expect(helper.delta.removedConstructors, isEmpty);
482 expect(helper.delta.addedAccessors,
483 unorderedEquals([newFieldElementB.getter, newFieldElementB.setter]));
484 expect(helper.delta.removedAccessors, isEmpty);
485 expect(helper.delta.addedMethods, isEmpty);
486 expect(helper.delta.removedMethods, isEmpty);
487 }
488
489 test_classDelta_field_remove() {
490 var helper = new _ClassDeltaHelper('A');
491 _buildOldUnit(r'''
492 class A {
493 int aaa;
494 int bbb;
495 }
496 ''');
497 helper.initOld(oldUnit);
498 _buildNewUnit(r'''
499 class A {
500 int aaa;
501 }
502 ''');
503 helper.initNew(newUnit, unitDelta);
504 // nodes
505 FieldDeclaration nodeA = helper.newMembers[0];
506 FieldDeclaration oldNodeB = helper.oldMembers[1];
507 List<VariableDeclaration> oldFieldsB = oldNodeB.fields.variables;
508 expect(nodeA, same(helper.oldMembers[0]));
509 // elements
510 FieldElement oldFieldElementB = oldFieldsB[0].name.staticElement;
511 expect(oldFieldElementB.name, 'bbb');
512 // verify delta
513 expect(helper.delta.addedConstructors, isEmpty);
514 expect(helper.delta.removedConstructors, isEmpty);
515 expect(helper.delta.addedAccessors, isEmpty);
516 expect(helper.delta.removedAccessors,
517 unorderedEquals([oldFieldElementB.getter, oldFieldElementB.setter]));
518 expect(helper.delta.addedMethods, isEmpty);
519 expect(helper.delta.removedMethods, isEmpty);
520 }
521
522 test_classDelta_field_syntheticAndNot_renameNonSynthetic() {
523 var helper = new _ClassDeltaHelper('A');
524 _buildOldUnit(r'''
525 class A {
526 int foo;
527 int get foo => 1;
528 }
529 ''');
530 helper.initOld(oldUnit);
531 FieldDeclaration oldFieldDeclNode = helper.oldMembers[0];
532 VariableDeclaration oldFieldNode = oldFieldDeclNode.fields.variables.single;
533 FieldElement oldFieldElement = oldFieldNode.name.staticElement;
534 _buildNewUnit(r'''
535 class A {
536 int _foo;
537 int get foo => 1;
538 }
539 ''');
540 helper.initNew(newUnit, unitDelta);
541 // nodes
542 FieldDeclaration newFieldDeclNode = helper.newMembers[0];
543 VariableDeclaration newFieldNode = newFieldDeclNode.fields.variables.single;
544 MethodDeclaration getterNode = helper.newMembers[1];
545 expect(getterNode, same(helper.oldMembers[1]));
546 // elements
547 FieldElement newFieldElement = newFieldNode.name.staticElement;
548 PropertyAccessorElement getterElement = getterNode.element;
549 expect(newFieldElement.name, '_foo');
550 expect(helper.element.fields,
551 [same(newFieldElement), same(getterElement.variable)]);
552 expect(helper.element.accessors, [
553 same(newFieldElement.getter),
554 same(newFieldElement.setter),
555 same(getterElement)
556 ]);
557 // verify delta
558 expect(helper.delta.addedConstructors, isEmpty);
559 expect(helper.delta.removedConstructors, isEmpty);
560 expect(helper.delta.addedAccessors,
561 unorderedEquals([newFieldElement.getter, newFieldElement.setter]));
562 expect(helper.delta.removedAccessors,
563 [oldFieldElement.getter, oldFieldElement.setter]);
564 expect(helper.delta.addedMethods, isEmpty);
565 expect(helper.delta.removedMethods, isEmpty);
566 }
567
568 test_classDelta_getter_add() {
569 var helper = new _ClassDeltaHelper('A');
570 _buildOldUnit(r'''
571 class A {
572 int get aaa => 1;
573 }
574 ''');
575 helper.initOld(oldUnit);
576 _buildNewUnit(r'''
577 class A {
578 int get aaa => 1;
579 int get bbb => 2;
580 }
581 ''');
582 helper.initNew(newUnit, unitDelta);
583 // nodes
584 MethodDeclaration nodeA = helper.oldMembers[0];
585 MethodDeclaration newNodeB = helper.newMembers[1];
586 expect(nodeA, same(helper.oldMembers[0]));
587 // elements
588 PropertyAccessorElement elementA = nodeA.element;
589 PropertyAccessorElement newElementB = newNodeB.element;
590 expect(elementA, isNotNull);
591 expect(elementA.name, 'aaa');
592 expect(newElementB, isNotNull);
593 expect(newElementB.name, 'bbb');
594 expect(helper.element.accessors, [elementA, newElementB]);
595 // verify delta
596 expect(helper.delta.addedConstructors, isEmpty);
597 expect(helper.delta.removedConstructors, isEmpty);
598 expect(helper.delta.addedAccessors, unorderedEquals([newElementB]));
599 expect(helper.delta.removedAccessors, isEmpty);
600 expect(helper.delta.addedMethods, isEmpty);
601 expect(helper.delta.removedMethods, isEmpty);
602 }
603
604 test_classDelta_getter_remove() {
605 var helper = new _ClassDeltaHelper('A');
606 _buildOldUnit(r'''
607 class A {
608 int get aaa => 1;
609 int get bbb => 2;
610 }
611 ''');
612 helper.initOld(oldUnit);
613 _buildNewUnit(r'''
614 class A {
615 int get aaa => 1;
616 }
617 ''');
618 helper.initNew(newUnit, unitDelta);
619 // nodes
620 MethodDeclaration nodeA = helper.oldMembers[0];
621 MethodDeclaration oldNodeB = helper.oldMembers[1];
622 expect(nodeA, same(helper.oldMembers[0]));
623 // elements
624 PropertyAccessorElement elementA = nodeA.element;
625 PropertyAccessorElement oldElementB = oldNodeB.element;
626 expect(elementA, isNotNull);
627 expect(elementA.name, 'aaa');
628 // verify delta
629 expect(helper.delta.addedConstructors, isEmpty);
630 expect(helper.delta.removedConstructors, isEmpty);
631 expect(helper.delta.addedAccessors, isEmpty);
632 expect(helper.delta.removedAccessors, unorderedEquals([oldElementB]));
633 expect(helper.delta.addedMethods, isEmpty);
634 expect(helper.delta.removedMethods, isEmpty);
635 }
636
637 test_classDelta_method_add() {
638 var helper = new _ClassDeltaHelper('A');
639 _buildOldUnit(r'''
640 class A {
641 aaa() {}
642 }
643 ''');
644 helper.initOld(oldUnit);
645 _buildNewUnit(r'''
646 class A {
647 aaa() {}
648 bbb() {}
649 }
650 ''');
651 helper.initNew(newUnit, unitDelta);
652 // nodes
653 ClassMember nodeA = helper.oldMembers[0];
654 ClassMember newNodeB = helper.newMembers[1];
655 expect(nodeA, same(helper.oldMembers[0]));
656 // elements
657 MethodElement elementA = nodeA.element;
658 MethodElement newElementB = newNodeB.element;
659 expect(elementA, isNotNull);
660 expect(elementA.name, 'aaa');
661 expect(newElementB, isNotNull);
662 expect(newElementB.name, 'bbb');
663 expect(helper.element.methods, [elementA, newElementB]);
664 // verify delta
665 expect(helper.delta.addedConstructors, isEmpty);
666 expect(helper.delta.removedConstructors, isEmpty);
667 expect(helper.delta.addedAccessors, isEmpty);
668 expect(helper.delta.removedAccessors, isEmpty);
669 expect(helper.delta.addedMethods, unorderedEquals([newElementB]));
670 expect(helper.delta.removedMethods, isEmpty);
671 }
672
673 test_classDelta_method_addParameter() {
674 var helper = new _ClassDeltaHelper('A');
675 _buildOldUnit(r'''
676 class A {
677 aaa() {}
678 bbb() {}
679 }
680 ''');
681 helper.initOld(oldUnit);
682 _buildNewUnit(r'''
683 class A {
684 aaa(int p) {}
685 bbb() {}
686 }
687 ''');
688 helper.initNew(newUnit, unitDelta);
689 // nodes
690 ClassMember oldNodeA = helper.oldMembers[0];
691 ClassMember newNodeA = helper.newMembers[0];
692 ClassMember nodeB = helper.newMembers[1];
693 expect(newNodeA, isNot(same(oldNodeA)));
694 expect(nodeB, same(helper.oldMembers[1]));
695 // elements
696 MethodElement oldElementA = oldNodeA.element;
697 MethodElement newElementA = newNodeA.element;
698 MethodElement elementB = nodeB.element;
699 expect(newElementA, isNotNull);
700 expect(newElementA.name, 'aaa');
701 expect(oldElementA.parameters, hasLength(0));
702 expect(newElementA.parameters, hasLength(1));
703 expect(elementB, isNotNull);
704 expect(elementB.name, 'bbb');
705 expect(helper.element.methods, [newElementA, elementB]);
706 // verify delta
707 expect(helper.delta.addedConstructors, isEmpty);
708 expect(helper.delta.removedConstructors, isEmpty);
709 expect(helper.delta.addedAccessors, isEmpty);
710 expect(helper.delta.removedAccessors, isEmpty);
711 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
712 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
713 }
714
715 test_classDelta_method_async_addStar() {
716 var helper = new _ClassDeltaHelper('A');
717 _buildOldUnit(r'''
718 class A {
719 Stream test() async {}
720 }
721 ''');
722 helper.initOld(oldUnit);
723 _buildNewUnit(r'''
724 class A {
725 Stream test() async* {}
726 }
727 ''');
728 helper.initNew(newUnit, unitDelta);
729 // nodes
730 ClassMember oldNodeA = helper.oldMembers[0];
731 ClassMember newNodeA = helper.newMembers[0];
732 expect(newNodeA, isNot(same(oldNodeA)));
733 // elements
734 MethodElement oldElement = oldNodeA.element;
735 MethodElement newElement = newNodeA.element;
736 expect(newElement, isNotNull);
737 expect(newElement.name, 'test');
738 expect(oldElement.isAsynchronous, isTrue);
739 expect(oldElement.isGenerator, isFalse);
740 expect(newElement.isAsynchronous, isTrue);
741 expect(newElement.isGenerator, isTrue);
742 expect(helper.element.methods, [newElement]);
743 // verify delta
744 expect(helper.delta.addedConstructors, isEmpty);
745 expect(helper.delta.removedConstructors, isEmpty);
746 expect(helper.delta.addedAccessors, isEmpty);
747 expect(helper.delta.removedAccessors, isEmpty);
748 expect(helper.delta.addedMethods, unorderedEquals([newElement]));
749 expect(helper.delta.removedMethods, unorderedEquals([oldElement]));
750 }
751
752 test_classDelta_method_changeName() {
753 var helper = new _ClassDeltaHelper('A');
754 _buildOldUnit(r'''
755 class A {
756 aaa(int ap) {
757 int av = 1;
758 af(afp) {}
759 }
760 bbb(int bp) {
761 int bv = 1;
762 bf(bfp) {}
763 }
764 }
765 ''');
766 helper.initOld(oldUnit);
767 ConstructorElement oldConstructor = helper.element.unnamedConstructor;
768 _buildNewUnit(r'''
769 class A {
770 aaa2(int ap) {
771 int av = 1;
772 af(afp) {}
773 }
774 bbb(int bp) {
775 int bv = 1;
776 bf(bfp) {}
777 }
778 }
779 ''');
780 helper.initNew(newUnit, unitDelta);
781 expect(helper.element.unnamedConstructor, same(oldConstructor));
782 // nodes
783 ClassMember oldNodeA = helper.oldMembers[0];
784 ClassMember newNodeA = helper.newMembers[0];
785 ClassMember nodeB = helper.newMembers[1];
786 expect(nodeB, same(helper.oldMembers[1]));
787 // elements
788 MethodElement oldElementA = oldNodeA.element;
789 MethodElement newElementA = newNodeA.element;
790 MethodElement elementB = nodeB.element;
791 expect(newElementA, isNotNull);
792 expect(newElementA.name, 'aaa2');
793 expect(elementB, isNotNull);
794 expect(elementB.name, 'bbb');
795 expect(helper.element.methods, [newElementA, elementB]);
796 // verify delta
797 expect(helper.delta.addedConstructors, isEmpty);
798 expect(helper.delta.removedConstructors, isEmpty);
799 expect(helper.delta.addedAccessors, isEmpty);
800 expect(helper.delta.removedAccessors, isEmpty);
801 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
802 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
803 }
804
805 test_classDelta_method_remove() {
806 var helper = new _ClassDeltaHelper('A');
807 _buildOldUnit(r'''
808 class A {
809 aaa() {}
810 bbb() {}
811 }
812 ''');
813 helper.initOld(oldUnit);
814 _buildNewUnit(r'''
815 class A {
816 aaa() {}
817 }
818 ''');
819 helper.initNew(newUnit, unitDelta);
820 // nodes
821 ClassMember nodeA = helper.oldMembers[0];
822 ClassMember oldNodeB = helper.oldMembers[1];
823 expect(nodeA, same(helper.oldMembers[0]));
824 // elements
825 MethodElement elementA = nodeA.element;
826 MethodElement oldElementB = oldNodeB.element;
827 expect(elementA, isNotNull);
828 expect(elementA.name, 'aaa');
829 // verify delta
830 expect(helper.delta.addedConstructors, isEmpty);
831 expect(helper.delta.removedConstructors, isEmpty);
832 expect(helper.delta.addedAccessors, isEmpty);
833 expect(helper.delta.removedAccessors, isEmpty);
834 expect(helper.delta.addedMethods, isEmpty);
835 expect(helper.delta.removedMethods, unorderedEquals([oldElementB]));
836 }
837
838 test_classDelta_method_removeParameter() {
839 var helper = new _ClassDeltaHelper('A');
840 _buildOldUnit(r'''
841 class A {
842 aaa(int p) {}
843 bbb() {}
844 }
845 ''');
846 helper.initOld(oldUnit);
847 _buildNewUnit(r'''
848 class A {
849 aaa() {}
850 bbb() {}
851 }
852 ''');
853 helper.initNew(newUnit, unitDelta);
854 // nodes
855 ClassMember oldNodeA = helper.oldMembers[0];
856 ClassMember newNodeA = helper.newMembers[0];
857 ClassMember nodeB = helper.newMembers[1];
858 expect(newNodeA, isNot(same(oldNodeA)));
859 expect(nodeB, same(helper.oldMembers[1]));
860 // elements
861 MethodElement oldElementA = oldNodeA.element;
862 MethodElement newElementA = newNodeA.element;
863 MethodElement elementB = nodeB.element;
864 expect(newElementA, isNotNull);
865 expect(newElementA.name, 'aaa');
866 expect(oldElementA.parameters, hasLength(1));
867 expect(newElementA.parameters, hasLength(0));
868 expect(elementB, isNotNull);
869 expect(elementB.name, 'bbb');
870 expect(helper.element.methods, [newElementA, elementB]);
871 // verify delta
872 expect(helper.delta.addedConstructors, isEmpty);
873 expect(helper.delta.removedConstructors, isEmpty);
874 expect(helper.delta.addedAccessors, isEmpty);
875 expect(helper.delta.removedAccessors, isEmpty);
876 expect(helper.delta.addedMethods, unorderedEquals([newElementA]));
877 expect(helper.delta.removedMethods, unorderedEquals([oldElementA]));
878 }
879
880 test_classDelta_newOrder() {
881 var helper = new _ClassDeltaHelper('A');
882 _buildOldUnit(r'''
883 class A {
884 bbb() {}
885 }
886 ''');
887 helper.initOld(oldUnit);
888 _buildNewUnit(r'''
889 class A {
890 aaa() {}
891 bbb() {}
892 ccc() {}
893 }
894 ''');
895 helper.initNew(newUnit, unitDelta);
896 // nodes
897 ClassMember newNodeA = helper.newMembers[0];
898 ClassMember nodeB = helper.oldMembers[0];
899 ClassMember newNodeC = helper.newMembers[2];
900 expect(nodeB, same(helper.oldMembers[0]));
901 // elements
902 MethodElement newElementA = newNodeA.element;
903 MethodElement elementB = nodeB.element;
904 MethodElement newElementC = newNodeC.element;
905 expect(newElementA, isNotNull);
906 expect(newElementA.name, 'aaa');
907 expect(elementB, isNotNull);
908 expect(elementB.name, 'bbb');
909 expect(newElementC, isNotNull);
910 expect(newElementC.name, 'ccc');
911 expect(helper.element.methods, [newElementA, elementB, newElementC]);
912 // verify delta
913 expect(helper.delta.addedConstructors, isEmpty);
914 expect(helper.delta.removedConstructors, isEmpty);
915 expect(helper.delta.addedAccessors, isEmpty);
916 expect(helper.delta.removedAccessors, isEmpty);
917 expect(
918 helper.delta.addedMethods, unorderedEquals([newElementA, newElementC]));
919 expect(helper.delta.removedMethods, isEmpty);
920 }
921
922 test_classDelta_null_abstractKeyword_add() {
923 _verifyNoClassDeltaForTheLast(
924 r'''
925 class A {}
926 ''',
927 r'''
928 abstract class A {}
929 ''');
930 }
931
932 test_classDelta_null_abstractKeyword_remove() {
933 _verifyNoClassDeltaForTheLast(
934 r'''
935 abstract class A {}
936 ''',
937 r'''
938 class A {}
939 ''');
940 }
941
942 test_classDelta_null_extendsClause_add() {
943 _verifyNoClassDeltaForTheLast(
944 r'''
945 class A {}
946 class B {}
947 ''',
948 r'''
949 class A {}
950 class B extends A {}
951 ''');
952 }
953
954 test_classDelta_null_extendsClause_change() {
955 _verifyNoClassDeltaForTheLast(
956 r'''
957 class A1 {}
958 class A2 {}
959 class B extends A1 {}
960 ''',
961 r'''
962 class A1 {}
963 class A2 {}
964 class B extends A2 {}
965 ''');
966 }
967
968 test_classDelta_null_extendsClause_remove() {
969 _verifyNoClassDeltaForTheLast(
970 r'''
971 class A {}
972 class B extends A {}
973 ''',
974 r'''
975 class A {}
976 class B {}
977 ''');
978 }
979
980 test_classDelta_null_implementsClause_add() {
981 _verifyNoClassDeltaForTheLast(
982 r'''
983 class A {}
984 class B {}
985 ''',
986 r'''
987 class A {}
988 class B implements A {}
989 ''');
990 }
991
992 test_classDelta_null_implementsClause_change() {
993 _verifyNoClassDeltaForTheLast(
994 r'''
995 class A1 {}
996 class A2 {}
997 class B implements A1 {}
998 ''',
999 r'''
1000 class A1 {}
1001 class A2 {}
1002 class B implements A2 {}
1003 ''');
1004 }
1005
1006 test_classDelta_null_implementsClause_remove() {
1007 _verifyNoClassDeltaForTheLast(
1008 r'''
1009 class A {}
1010 class B implements A {}
1011 ''',
1012 r'''
1013 class A {}
1014 class B {}
1015 ''');
1016 }
1017
1018 test_classDelta_null_typeParameters_change() {
1019 _verifyNoClassDeltaForTheLast(
1020 r'''
1021 class A {}
1022 class B<T> {}
1023 ''',
1024 r'''
1025 class A {}
1026 class B<T extends A> {}
1027 ''');
1028 }
1029
1030 test_classDelta_null_withClause_add() {
1031 _verifyNoClassDeltaForTheLast(
1032 r'''
1033 class A {}
1034 class M {}
1035 class B extends A {}
1036 ''',
1037 r'''
1038 class A {}
1039 class M {}
1040 class B extends A with M {}
1041 ''');
1042 }
1043
1044 test_classDelta_null_withClause_change1() {
1045 _verifyNoClassDeltaForTheLast(
1046 r'''
1047 class A {}
1048 class M1 {}
1049 class M2 {}
1050 class B extends A with M1 {}
1051 ''',
1052 r'''
1053 class A {}
1054 class M1 {}
1055 class M2 {}
1056 class B extends A with M2 {}
1057 ''');
1058 }
1059
1060 test_classDelta_null_withClause_change2() {
1061 _verifyNoClassDeltaForTheLast(
1062 r'''
1063 class A {}
1064 class M1 {}
1065 class M2 {}
1066 class B extends A with M1, M2 {}
1067 ''',
1068 r'''
1069 class A {}
1070 class M1 {}
1071 class M2 {}
1072 class B extends A with M2, M1 {}
1073 ''');
1074 }
1075
1076 test_classDelta_null_withClause_remove() {
1077 _verifyNoClassDeltaForTheLast(
1078 r'''
1079 class A {}
1080 class M {}
1081 class B extends A with M {}
1082 ''',
1083 r'''
1084 class A {}
1085 class M {}
1086 class B extends A {}
1087 ''');
1088 }
1089
1090 test_classDelta_setter_add() {
1091 var helper = new _ClassDeltaHelper('A');
1092 _buildOldUnit(r'''
1093 class A {
1094 void set aaa(int pa) {}
1095 }
1096 ''');
1097 helper.initOld(oldUnit);
1098 _buildNewUnit(r'''
1099 class A {
1100 void set aaa(int pa) {}
1101 void set bbb(int pb) {}
1102 }
1103 ''');
1104 helper.initNew(newUnit, unitDelta);
1105 // nodes
1106 MethodDeclaration nodeA = helper.oldMembers[0];
1107 MethodDeclaration newNodeB = helper.newMembers[1];
1108 expect(nodeA, same(helper.oldMembers[0]));
1109 // elements
1110 PropertyAccessorElement elementA = nodeA.element;
1111 PropertyAccessorElement newElementB = newNodeB.element;
1112 expect(elementA, isNotNull);
1113 expect(elementA.name, 'aaa=');
1114 expect(newElementB, isNotNull);
1115 expect(newElementB.name, 'bbb=');
1116 expect(helper.element.accessors, [elementA, newElementB]);
1117 // verify delta
1118 expect(helper.delta.addedConstructors, isEmpty);
1119 expect(helper.delta.removedConstructors, isEmpty);
1120 expect(helper.delta.addedAccessors, unorderedEquals([newElementB]));
1121 expect(helper.delta.removedAccessors, isEmpty);
1122 expect(helper.delta.addedMethods, isEmpty);
1123 expect(helper.delta.removedMethods, isEmpty);
1124 }
1125
1126 test_classDelta_setter_remove() {
1127 var helper = new _ClassDeltaHelper('A');
1128 _buildOldUnit(r'''
1129 class A {
1130 void set aaa(int pa) {}
1131 void set bbb(int pb) {}
1132 }
1133 ''');
1134 helper.initOld(oldUnit);
1135 _buildNewUnit(r'''
1136 class A {
1137 void set aaa(int pa) {}
1138 }
1139 ''');
1140 helper.initNew(newUnit, unitDelta);
1141 // nodes
1142 MethodDeclaration nodeA = helper.oldMembers[0];
1143 MethodDeclaration oldNodeB = helper.oldMembers[1];
1144 expect(nodeA, same(helper.oldMembers[0]));
1145 // elements
1146 PropertyAccessorElement elementA = nodeA.element;
1147 PropertyAccessorElement oldElementB = oldNodeB.element;
1148 expect(elementA, isNotNull);
1149 expect(elementA.name, 'aaa=');
1150 // verify delta
1151 expect(helper.delta.addedConstructors, isEmpty);
1152 expect(helper.delta.removedConstructors, isEmpty);
1153 expect(helper.delta.addedAccessors, isEmpty);
1154 expect(helper.delta.removedAccessors, unorderedEquals([oldElementB]));
1155 expect(helper.delta.addedMethods, isEmpty);
1156 expect(helper.delta.removedMethods, isEmpty);
1157 }
1158
1159 test_classDelta_typeParameter_same() {
1160 _buildOldUnit(r'''
1161 class A<T> {
1162 m() {}
1163 }
1164 ''');
1165 _buildNewUnit(r'''
1166 class A<T> {
1167 m2() {}
1168 }
1169 ''');
1170 }
1171
1172 test_directives_add() {
1173 _buildOldUnit(r'''
1174 library test;
1175 import 'dart:math';
1176 ''');
1177 List<Directive> oldDirectives = oldUnit.directives.toList();
1178 _buildNewUnit(r'''
1179 library test;
1180 import 'dart:async';
1181 import 'dart:math';
1182 ''');
1183 List<Directive> newDirectives = newUnit.directives;
1184 {
1185 Directive newNode = newDirectives[0];
1186 expect(newNode, same(oldDirectives[0]));
1187 expect(getNodeText(newNode), "library test;");
1188 LibraryElement element = newNode.element;
1189 expect(element, isNotNull);
1190 expect(element.nameOffset, newCode.indexOf('test;'));
1191 }
1192 {
1193 Directive newNode = newDirectives[1];
1194 expect(getNodeText(newNode), "import 'dart:async';");
1195 ImportElement element = newNode.element;
1196 expect(element, isNull);
1197 }
1198 {
1199 Directive newNode = newDirectives[2];
1200 expect(newNode, same(oldDirectives[1]));
1201 expect(getNodeText(newNode), "import 'dart:math';");
1202 ImportElement element = newNode.element;
1203 expect(element, isNotNull);
1204 expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
1205 }
1206 expect(unitDelta.hasDirectiveChange, isTrue);
1207 }
1208
1209 test_directives_keepOffset_partOf() {
1210 String libCode = '''
1211 // comment to shift tokens
1212 library my_lib;
1213 part 'test.dart';
1214 ''';
1215 Source libSource = newSource('/lib.dart', libCode);
1216 _buildOldUnit(
1217 r'''
1218 part of my_lib;
1219 class A {}
1220 ''',
1221 libSource);
1222 List<Directive> oldDirectives = oldUnit.directives.toList();
1223 _buildNewUnit(r'''
1224 part of my_lib;
1225 class A {}
1226 ''');
1227 List<Directive> newDirectives = newUnit.directives;
1228 {
1229 Directive newNode = newDirectives[0];
1230 expect(newNode, same(oldDirectives[0]));
1231 expect(getNodeText(newNode), 'part of my_lib;');
1232 LibraryElement element = newNode.element;
1233 expect(element, isNotNull);
1234 expect(element.nameOffset, libCode.indexOf('my_lib;'));
1235 }
1236 }
1237
1238 test_directives_library_updateOffset() {
1239 _buildOldUnit(r'''
1240 #!/bin/sh
1241 library my_lib;
1242 class A {}
1243 ''');
1244 LibraryDirective libraryDirective = oldUnit.directives.single;
1245 // Set the LibraryElement and check that its nameOffset is correct.
1246 libraryDirective.element =
1247 new LibraryElementImpl.forNode(context, libraryDirective.name);
1248 expect(
1249 resolutionMap.elementDeclaredByDirective(libraryDirective).nameOffset,
1250 libraryDirective.name.offset);
1251 // Update and check again that the nameOffset is correct.
1252 _buildNewUnit(r'''
1253 #!/bin/sh
1254
1255 library my_lib;
1256 class A {}
1257 ''');
1258 expect(
1259 resolutionMap.elementDeclaredByDirective(libraryDirective).nameOffset,
1260 libraryDirective.name.offset);
1261 }
1262
1263 test_directives_remove() {
1264 _buildOldUnit(r'''
1265 library test;
1266 import 'dart:async';
1267 import 'dart:math';
1268 ''');
1269 List<Directive> oldDirectives = oldUnit.directives.toList();
1270 _buildNewUnit(r'''
1271 library test;
1272 import 'dart:math';
1273 ''');
1274 List<Directive> newDirectives = newUnit.directives;
1275 {
1276 Directive newNode = newDirectives[0];
1277 expect(newNode, same(oldDirectives[0]));
1278 expect(getNodeText(newNode), "library test;");
1279 LibraryElement element = newNode.element;
1280 expect(element, isNotNull);
1281 expect(element.nameOffset, newCode.indexOf('test;'));
1282 }
1283 {
1284 Directive newNode = newDirectives[1];
1285 expect(newNode, same(oldDirectives[2]));
1286 expect(getNodeText(newNode), "import 'dart:math';");
1287 ImportElement element = newNode.element;
1288 expect(element, isNotNull);
1289 expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
1290 }
1291 expect(unitDelta.hasDirectiveChange, isTrue);
1292 }
1293
1294 test_directives_reorder() {
1295 _buildOldUnit(r'''
1296 library test;
1297 import 'dart:math' as m;
1298 import 'dart:async';
1299 ''');
1300 List<Directive> oldDirectives = oldUnit.directives.toList();
1301 _buildNewUnit(r'''
1302 library test;
1303 import 'dart:async';
1304 import 'dart:math' as m;
1305 ''');
1306 List<Directive> newDirectives = newUnit.directives;
1307 {
1308 Directive newNode = newDirectives[0];
1309 expect(newNode, same(oldDirectives[0]));
1310 expect(getNodeText(newNode), "library test;");
1311 LibraryElement element = newNode.element;
1312 expect(element, isNotNull);
1313 expect(element.nameOffset, newCode.indexOf('test;'));
1314 }
1315 {
1316 Directive newNode = newDirectives[1];
1317 expect(newNode, same(oldDirectives[2]));
1318 expect(getNodeText(newNode), "import 'dart:async';");
1319 ImportElement element = newNode.element;
1320 expect(element, isNotNull);
1321 expect(element.nameOffset, newCode.indexOf("import 'dart:async';"));
1322 }
1323 {
1324 Directive newNode = newDirectives[2];
1325 expect(newNode, same(oldDirectives[1]));
1326 expect(getNodeText(newNode), "import 'dart:math' as m;");
1327 ImportElement element = newNode.element;
1328 expect(element, isNotNull);
1329 expect(element.nameOffset, newCode.indexOf("import 'dart:math' as m;"));
1330 expect(element.prefix.nameOffset, newCode.indexOf("m;"));
1331 }
1332 expect(unitDelta.hasDirectiveChange, isFalse);
1333 }
1334
1335 test_directives_sameImportPrefix_sameOrder() {
1336 _buildOldUnit(r'''
1337 import 'test1.dart' as m;
1338 import 'test2.dart' as m;
1339 ''');
1340 List<Directive> oldDirectives = oldUnit.directives.toList();
1341 ImportDirective import1 = oldDirectives[0];
1342 ImportDirective import2 = oldDirectives[1];
1343 ImportElementImpl importElement1 = new ImportElementImpl(import1.offset);
1344 ImportElementImpl importElement2 = new ImportElementImpl(import2.offset);
1345 PrefixElement prefixElement = new PrefixElementImpl.forNode(import1.prefix);
1346 importElement1.prefix = prefixElement;
1347 importElement2.prefix = prefixElement;
1348 import1.element = importElement1;
1349 import2.element = importElement2;
1350 import1.prefix.staticElement = prefixElement;
1351 import2.prefix.staticElement = prefixElement;
1352 _buildNewUnit(r'''
1353 import 'test1.dart' as m;
1354 import 'test2.dart' as m;
1355 class A {}
1356 ''');
1357 int expectedPrefixOffset = 23;
1358 expect(resolutionMap.staticElementForIdentifier(import1.prefix).nameOffset,
1359 expectedPrefixOffset);
1360 expect(resolutionMap.staticElementForIdentifier(import2.prefix).nameOffset,
1361 expectedPrefixOffset);
1362 expect(importElement1.prefix.nameOffset, expectedPrefixOffset);
1363 expect(importElement2.prefix.nameOffset, expectedPrefixOffset);
1364 }
1365
1366 test_directives_sameOrder_insertSpaces() {
1367 _buildOldUnit(r'''
1368 library test;
1369 import 'dart:async';
1370 import 'dart:math';
1371 ''');
1372 List<Directive> oldDirectives = oldUnit.directives.toList();
1373 _buildNewUnit(r'''
1374 library test;
1375
1376 import 'dart:async' ;
1377 import 'dart:math';
1378 ''');
1379 List<Directive> newDirectives = newUnit.directives;
1380 {
1381 Directive newNode = newDirectives[0];
1382 expect(newNode, same(oldDirectives[0]));
1383 expect(getNodeText(newNode), "library test;");
1384 LibraryElement element = newNode.element;
1385 expect(element, isNotNull);
1386 expect(element.nameOffset, newCode.indexOf('test;'));
1387 }
1388 {
1389 Directive newNode = newDirectives[1];
1390 expect(newNode, same(oldDirectives[1]));
1391 expect(getNodeText(newNode), "import 'dart:async' ;");
1392 ImportElement element = newNode.element;
1393 expect(element, isNotNull);
1394 expect(element.nameOffset, newCode.indexOf("import 'dart:async' ;"));
1395 }
1396 {
1397 Directive newNode = newDirectives[2];
1398 expect(newNode, same(oldDirectives[2]));
1399 expect(getNodeText(newNode), "import 'dart:math';");
1400 ImportElement element = newNode.element;
1401 expect(element, isNotNull);
1402 expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
1403 }
1404 expect(unitDelta.hasDirectiveChange, isFalse);
1405 }
1406
1407 test_directives_sameOrder_removeSpaces() {
1408 _buildOldUnit(r'''
1409 library test;
1410
1411 import 'dart:async' ;
1412 import 'dart:math';
1413 ''');
1414 List<Directive> oldDirectives = oldUnit.directives.toList();
1415 _buildNewUnit(r'''
1416 library test;
1417 import 'dart:async';
1418 import 'dart:math';
1419 ''');
1420 List<Directive> newDirectives = newUnit.directives;
1421 {
1422 Directive newNode = newDirectives[0];
1423 expect(newNode, same(oldDirectives[0]));
1424 expect(getNodeText(newNode), "library test;");
1425 LibraryElement element = newNode.element;
1426 expect(element, isNotNull);
1427 expect(element.nameOffset, newCode.indexOf('test;'));
1428 }
1429 {
1430 Directive newNode = newDirectives[1];
1431 expect(newNode, same(oldDirectives[1]));
1432 expect(getNodeText(newNode), "import 'dart:async';");
1433 ImportElement element = newNode.element;
1434 expect(element, isNotNull);
1435 expect(element.nameOffset, newCode.indexOf("import 'dart:async';"));
1436 }
1437 {
1438 Directive newNode = newDirectives[2];
1439 expect(newNode, same(oldDirectives[2]));
1440 expect(getNodeText(newNode), "import 'dart:math';");
1441 ImportElement element = newNode.element;
1442 expect(element, isNotNull);
1443 expect(element.nameOffset, newCode.indexOf("import 'dart:math';"));
1444 }
1445 expect(unitDelta.hasDirectiveChange, isFalse);
1446 }
1447
1448 test_unitMembers_accessor_add() {
1449 _buildOldUnit(r'''
1450 get a => 1;
1451 ''');
1452 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1453 _buildNewUnit(r'''
1454 get a => 1;
1455 get b => 2;
1456 ''');
1457 List<CompilationUnitMember> newNodes = newUnit.declarations;
1458 // nodes
1459 FunctionDeclaration node1 = newNodes[0];
1460 FunctionDeclaration node2 = newNodes[1];
1461 expect(node1, same(oldNodes[0]));
1462 // elements
1463 PropertyAccessorElement elementA = node1.element;
1464 PropertyAccessorElement elementB = node2.element;
1465 expect(elementA, isNotNull);
1466 expect(elementB, isNotNull);
1467 expect(elementA.name, 'a');
1468 expect(elementB.name, 'b');
1469 // unit.types
1470 expect(
1471 unitElement.topLevelVariables, [elementA.variable, elementB.variable]);
1472 expect(unitElement.accessors, [elementA, elementB]);
1473 }
1474
1475 test_unitMembers_class_add() {
1476 _buildOldUnit(r'''
1477 class A {}
1478 ''');
1479 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1480 _buildNewUnit(r'''
1481 class A {}
1482 class B {}
1483 ''');
1484 List<CompilationUnitMember> newNodes = newUnit.declarations;
1485 // nodes
1486 CompilationUnitMember nodeA = newNodes[0];
1487 CompilationUnitMember nodeB = newNodes[1];
1488 expect(nodeA, same(oldNodes[0]));
1489 // elements
1490 ClassElement elementA = nodeA.element;
1491 ClassElement elementB = nodeB.element;
1492 expect(elementA, isNotNull);
1493 expect(elementB, isNotNull);
1494 expect(elementA.name, 'A');
1495 expect(elementB.name, 'B');
1496 // unit.types
1497 expect(unitElement.types, [elementA, elementB]);
1498 // verify delta
1499 expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
1500 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1501 }
1502
1503 test_unitMembers_class_comments() {
1504 _buildOldUnit(r'''
1505 /// reference [bool] type.
1506 class A {}
1507 /// reference [int] type.
1508 class B {}
1509 /// reference [double] and [B] types.
1510 class C {}
1511 ''');
1512 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1513 _buildNewUnit(r'''
1514 /// reference [double] and [B] types.
1515 class C {}
1516 /// reference [bool] type.
1517 class A {}
1518 /// reference [int] type.
1519 class B {}
1520 ''');
1521 List<CompilationUnitMember> newNodes = newUnit.declarations;
1522 {
1523 CompilationUnitMember newNode = newNodes[0];
1524 expect(newNode, same(oldNodes[2]));
1525 expect(
1526 getNodeText(newNode),
1527 r'''
1528 /// reference [double] and [B] types.
1529 class C {}''');
1530 ClassElement element = newNode.element;
1531 expect(element, isNotNull);
1532 expect(element.name, 'C');
1533 expect(element.nameOffset, newCode.indexOf('C {}'));
1534 // [double] and [B] are still resolved
1535 {
1536 var docReferences = newNode.documentationComment.references;
1537 expect(docReferences, hasLength(2));
1538 expect(
1539 resolutionMap
1540 .staticElementForIdentifier(docReferences[0].identifier)
1541 .name,
1542 'double');
1543 expect(docReferences[1].identifier.staticElement,
1544 same(newNodes[2].element));
1545 }
1546 }
1547 {
1548 CompilationUnitMember newNode = newNodes[1];
1549 expect(newNode, same(oldNodes[0]));
1550 expect(
1551 getNodeText(newNode),
1552 r'''
1553 /// reference [bool] type.
1554 class A {}''');
1555 ClassElement element = newNode.element;
1556 expect(element, isNotNull);
1557 expect(element.name, 'A');
1558 expect(element.nameOffset, newCode.indexOf('A {}'));
1559 // [bool] is still resolved
1560 {
1561 var docReferences = newNode.documentationComment.references;
1562 expect(docReferences, hasLength(1));
1563 expect(
1564 resolutionMap
1565 .staticElementForIdentifier(docReferences[0].identifier)
1566 .name,
1567 'bool');
1568 }
1569 }
1570 {
1571 CompilationUnitMember newNode = newNodes[2];
1572 expect(newNode, same(oldNodes[1]));
1573 expect(
1574 getNodeText(newNode),
1575 r'''
1576 /// reference [int] type.
1577 class B {}''');
1578 ClassElement element = newNode.element;
1579 expect(element, isNotNull);
1580 expect(element.name, 'B');
1581 expect(element.nameOffset, newCode.indexOf('B {}'));
1582 // [int] is still resolved
1583 {
1584 var docReferences = newNode.documentationComment.references;
1585 expect(docReferences, hasLength(1));
1586 expect(
1587 resolutionMap
1588 .staticElementForIdentifier(docReferences[0].identifier)
1589 .name,
1590 'int');
1591 }
1592 }
1593 // verify delta
1594 expect(unitDelta.addedDeclarations, unorderedEquals([]));
1595 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1596 }
1597
1598 test_unitMembers_class_remove() {
1599 _buildOldUnit(r'''
1600 class A {}
1601 class B {}
1602 ''');
1603 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1604 _buildNewUnit(r'''
1605 class A {}
1606 ''');
1607 List<CompilationUnitMember> newNodes = newUnit.declarations;
1608 // nodes
1609 CompilationUnitMember nodeA = newNodes[0];
1610 CompilationUnitMember nodeB = oldNodes[1];
1611 expect(nodeA, same(oldNodes[0]));
1612 // elements
1613 ClassElement elementA = nodeA.element;
1614 ClassElement elementB = nodeB.element;
1615 expect(elementA, isNotNull);
1616 expect(elementB, isNotNull);
1617 expect(elementA.name, 'A');
1618 expect(elementB.name, 'B');
1619 // unit.types
1620 expect(unitElement.types, [elementA]);
1621 // verify delta
1622 expect(unitDelta.addedDeclarations, unorderedEquals([]));
1623 expect(unitDelta.removedDeclarations, unorderedEquals([elementB]));
1624 }
1625
1626 test_unitMembers_class_reorder() {
1627 _buildOldUnit(r'''
1628 class A {}
1629 class B {}
1630 class C {}
1631 ''');
1632 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1633 _buildNewUnit(r'''
1634 class C {}
1635 class A {}
1636 class B {}
1637 ''');
1638 List<CompilationUnitMember> newNodes = newUnit.declarations;
1639 {
1640 CompilationUnitMember newNode = newNodes[0];
1641 expect(newNode, same(oldNodes[2]));
1642 expect(getNodeText(newNode), 'class C {}');
1643 ClassElement element = newNode.element;
1644 expect(element, isNotNull);
1645 expect(element.name, 'C');
1646 expect(element.nameOffset, newCode.indexOf('C {}'));
1647 }
1648 {
1649 CompilationUnitMember newNode = newNodes[1];
1650 expect(newNode, same(oldNodes[0]));
1651 expect(getNodeText(newNode), 'class A {}');
1652 ClassElement element = newNode.element;
1653 expect(element, isNotNull);
1654 expect(element.name, 'A');
1655 expect(element.nameOffset, newCode.indexOf('A {}'));
1656 }
1657 {
1658 CompilationUnitMember newNode = newNodes[2];
1659 expect(newNode, same(oldNodes[1]));
1660 expect(getNodeText(newNode), 'class B {}');
1661 ClassElement element = newNode.element;
1662 expect(element, isNotNull);
1663 expect(element.name, 'B');
1664 expect(element.nameOffset, newCode.indexOf('B {}'));
1665 }
1666 // verify delta
1667 expect(unitDelta.addedDeclarations, unorderedEquals([]));
1668 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1669 }
1670
1671 test_unitMembers_enum_add() {
1672 _buildOldUnit(r'''
1673 enum A {A1, A2}
1674 ''');
1675 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1676 _buildNewUnit(r'''
1677 enum A {A1, A2}
1678 enum B {B1, B2}
1679 ''');
1680 List<CompilationUnitMember> newNodes = newUnit.declarations;
1681 // nodes
1682 CompilationUnitMember nodeA = newNodes[0];
1683 CompilationUnitMember nodeB = newNodes[1];
1684 expect(nodeA, same(oldNodes[0]));
1685 // elements
1686 ClassElement elementA = nodeA.element;
1687 ClassElement elementB = nodeB.element;
1688 expect(elementA, isNotNull);
1689 expect(elementB, isNotNull);
1690 expect(elementA.name, 'A');
1691 expect(elementB.name, 'B');
1692 expect(elementA.fields.map((f) => f.name),
1693 unorderedEquals(['index', 'values', 'A1', 'A2']));
1694 expect(elementA.accessors.map((a) => a.name),
1695 unorderedEquals(['index', 'values', 'A1', 'A2']));
1696 expect(elementB.fields.map((f) => f.name),
1697 unorderedEquals(['index', 'values', 'B1', 'B2']));
1698 expect(elementB.accessors.map((a) => a.name),
1699 unorderedEquals(['index', 'values', 'B1', 'B2']));
1700 // unit.types
1701 expect(unitElement.enums, [elementA, elementB]);
1702 // verify delta
1703 expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
1704 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1705 }
1706
1707 test_unitMembers_function_add() {
1708 _buildOldUnit(r'''
1709 a() {}
1710 ''');
1711 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1712 _buildNewUnit(r'''
1713 a() {}
1714 b() {}
1715 ''');
1716 List<CompilationUnitMember> newNodes = newUnit.declarations;
1717 // nodes
1718 CompilationUnitMember nodeA = newNodes[0];
1719 CompilationUnitMember nodeB = newNodes[1];
1720 expect(nodeA, same(oldNodes[0]));
1721 // elements
1722 FunctionElement elementA = nodeA.element;
1723 FunctionElement elementB = nodeB.element;
1724 expect(elementA, isNotNull);
1725 expect(elementB, isNotNull);
1726 expect(elementA.name, 'a');
1727 expect(elementB.name, 'b');
1728 // unit.types
1729 expect(unitElement.functions, [elementA, elementB]);
1730 // verify delta
1731 expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
1732 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1733 }
1734
1735 test_unitMembers_functionTypeAlias_add() {
1736 _buildOldUnit(r'''
1737 typedef A();
1738 ''');
1739 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1740 _buildNewUnit(r'''
1741 typedef A();
1742 typedef B();
1743 ''');
1744 List<CompilationUnitMember> newNodes = newUnit.declarations;
1745 // nodes
1746 CompilationUnitMember nodeA = newNodes[0];
1747 CompilationUnitMember nodeB = newNodes[1];
1748 expect(nodeA, same(oldNodes[0]));
1749 // elements
1750 FunctionTypeAliasElement elementA = nodeA.element;
1751 FunctionTypeAliasElement elementB = nodeB.element;
1752 expect(elementA, isNotNull);
1753 expect(elementB, isNotNull);
1754 expect(elementA.name, 'A');
1755 expect(elementB.name, 'B');
1756 // unit.types
1757 expect(unitElement.functionTypeAliases, [elementA, elementB]);
1758 // verify delta
1759 expect(unitDelta.addedDeclarations, unorderedEquals([elementB]));
1760 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1761 }
1762
1763 test_unitMembers_newOrder() {
1764 _buildOldUnit(r'''
1765 int b;
1766 ''');
1767 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1768 _buildNewUnit(r'''
1769 int a;
1770 int b;
1771 int c;
1772 ''');
1773 List<CompilationUnitMember> newNodes = newUnit.declarations;
1774 // nodes
1775 TopLevelVariableDeclaration node1 = newNodes[0];
1776 TopLevelVariableDeclaration node2 = newNodes[1];
1777 TopLevelVariableDeclaration node3 = newNodes[2];
1778 expect(node2, same(oldNodes[0]));
1779 // elements
1780 TopLevelVariableElement elementA = node1.variables.variables[0].element;
1781 TopLevelVariableElement elementB = node2.variables.variables[0].element;
1782 TopLevelVariableElement elementC = node3.variables.variables[0].element;
1783 expect(elementA, isNotNull);
1784 expect(elementB, isNotNull);
1785 expect(elementC, isNotNull);
1786 expect(elementA.name, 'a');
1787 expect(elementB.name, 'b');
1788 expect(elementC.name, 'c');
1789 // unit.types
1790 expect(unitElement.topLevelVariables, [elementA, elementB, elementC]);
1791 expect(unitElement.accessors, [
1792 elementA.getter,
1793 elementA.setter,
1794 elementB.getter,
1795 elementB.setter,
1796 elementC.getter,
1797 elementC.setter,
1798 ]);
1799 }
1800
1801 test_unitMembers_topLevelVariable() {
1802 _buildOldUnit(r'''
1803 bool a = 1, b = 2;
1804 int c = 3;
1805 ''');
1806 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1807 _buildNewUnit(r'''
1808 int c = 3;
1809
1810 bool a =1, b = 2;
1811 ''');
1812 List<CompilationUnitMember> newNodes = newUnit.declarations;
1813 {
1814 TopLevelVariableDeclaration newNode = newNodes[0];
1815 expect(newNode, same(oldNodes[1]));
1816 expect(getNodeText(newNode), 'int c = 3;');
1817 {
1818 TopLevelVariableElement element =
1819 newNode.variables.variables[0].element;
1820 expect(element, isNotNull);
1821 expect(element.name, 'c');
1822 expect(element.nameOffset, newCode.indexOf('c = 3'));
1823 }
1824 }
1825 {
1826 TopLevelVariableDeclaration newNode = newNodes[1];
1827 expect(newNode, same(oldNodes[0]));
1828 expect(getNodeText(newNode), 'bool a =1, b = 2;');
1829 {
1830 TopLevelVariableElement element =
1831 newNode.variables.variables[0].element;
1832 expect(element, isNotNull);
1833 expect(element.name, 'a');
1834 expect(element.nameOffset, newCode.indexOf('a =1'));
1835 }
1836 {
1837 TopLevelVariableElement element =
1838 newNode.variables.variables[1].element;
1839 expect(element, isNotNull);
1840 expect(element.name, 'b');
1841 expect(element.nameOffset, newCode.indexOf('b = 2'));
1842 }
1843 }
1844 // verify delta
1845 expect(unitDelta.addedDeclarations, unorderedEquals([]));
1846 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1847 }
1848
1849 test_unitMembers_topLevelVariable_add() {
1850 _buildOldUnit(r'''
1851 int a, b;
1852 ''');
1853 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1854 _buildNewUnit(r'''
1855 int a, b;
1856 int c, d;
1857 ''');
1858 List<CompilationUnitMember> newNodes = newUnit.declarations;
1859 // nodes
1860 TopLevelVariableDeclaration node1 = newNodes[0];
1861 TopLevelVariableDeclaration node2 = newNodes[1];
1862 expect(node1, same(oldNodes[0]));
1863 // elements
1864 TopLevelVariableElement elementA = node1.variables.variables[0].element;
1865 TopLevelVariableElement elementB = node1.variables.variables[1].element;
1866 TopLevelVariableElement elementC = node2.variables.variables[0].element;
1867 TopLevelVariableElement elementD = node2.variables.variables[1].element;
1868 expect(elementA, isNotNull);
1869 expect(elementB, isNotNull);
1870 expect(elementC, isNotNull);
1871 expect(elementD, isNotNull);
1872 expect(elementA.name, 'a');
1873 expect(elementB.name, 'b');
1874 expect(elementC.name, 'c');
1875 expect(elementD.name, 'd');
1876 // unit.types
1877 expect(unitElement.topLevelVariables,
1878 [elementA, elementB, elementC, elementD]);
1879 expect(unitElement.accessors, [
1880 elementA.getter,
1881 elementA.setter,
1882 elementB.getter,
1883 elementB.setter,
1884 elementC.getter,
1885 elementC.setter,
1886 elementD.getter,
1887 elementD.setter
1888 ]);
1889 }
1890
1891 test_unitMembers_topLevelVariable_final() {
1892 _buildOldUnit(r'''
1893 final int a = 1;
1894 ''');
1895 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList();
1896 _buildNewUnit(r'''
1897 final int a = 1;
1898 ''');
1899 List<CompilationUnitMember> newNodes = newUnit.declarations;
1900 {
1901 TopLevelVariableDeclaration newNode = newNodes[0];
1902 expect(newNode, same(oldNodes[0]));
1903 expect(getNodeText(newNode), 'final int a = 1;');
1904 {
1905 TopLevelVariableElement element =
1906 newNode.variables.variables[0].element;
1907 expect(element, isNotNull);
1908 expect(element.name, 'a');
1909 expect(element.nameOffset, newCode.indexOf('a = 1'));
1910 }
1911 }
1912 // verify delta
1913 expect(unitDelta.addedDeclarations, unorderedEquals([]));
1914 expect(unitDelta.removedDeclarations, unorderedEquals([]));
1915 }
1916
1917 test_update_addIdentifier_beforeConstructorWithComment() {
1918 _buildOldUnit(r'''
1919 class A {
1920 /// CCC
1921 A();
1922 }
1923 ''');
1924 _buildNewUnit(r'''
1925 class A {
1926 b
1927
1928 /// CCC
1929 A();
1930 }
1931 ''');
1932 }
1933
1934 test_update_annotation_add() {
1935 _buildOldUnit(r'''
1936 const myAnnotation = const Object();
1937 foo() {}
1938 ''');
1939 _buildNewUnit(r'''
1940 const myAnnotation = const Object();
1941 @myAnnotation
1942 foo() {}
1943 ''');
1944 }
1945
1946 test_update_beforeClassWithDelta_nameOffset() {
1947 _buildOldUnit(r'''
1948 class A {}
1949
1950 class B {
1951 A a;
1952 }
1953 ''');
1954 _buildNewUnit(r'''
1955 class A2 {}
1956
1957 class B {
1958 A2 a;
1959 }
1960 ''');
1961 }
1962
1963 test_update_changeDuplicatingOffsetsMapping() {
1964 _buildOldUnit(r'''
1965 class A {
1966 m() {
1967 }
1968 }
1969
1970 /// X
1971 class C {}
1972 ''');
1973 _buildNewUnit(r'''
1974 class A {
1975 m2() {
1976 b
1977 }
1978 }
1979
1980 /// X
1981 class C {}
1982 ''');
1983 }
1984
1985 test_update_closuresOfSyntheticInitializer() {
1986 _buildOldUnit(r'''
1987 f1() {
1988 print(1);
1989 }
1990 f2() {
1991 B b = new B((C c) {});
1992 }
1993 ''');
1994 _buildNewUnit(r'''
1995 f1() {
1996 print(12);
1997 }
1998 f2() {
1999 B b = new B((C c) {});
2000 }
2001 ''');
2002 }
2003
2004 test_update_commentReference_empty() {
2005 _buildOldUnit(r'''
2006 /// Empty [] reference.
2007 class A {}
2008 ''');
2009 _buildNewUnit(r'''
2010 /// Empty [] reference.
2011 class A {}
2012 ''');
2013 }
2014
2015 test_update_commentReference_multipleCommentTokens() {
2016 _buildOldUnit(r'''
2017 class A {
2018 /// C1 [C2]
2019 /// C3 [C4]
2020 /// C5 [C6]
2021 void m() {}
2022 }
2023 ''');
2024 _buildNewUnit(r'''
2025 class A {
2026 int field;
2027
2028 /// C1 [C2]
2029 /// C3 [C4]
2030 /// C5 [C6]
2031 void m() {}
2032 }
2033 ''');
2034 }
2035
2036 test_update_commentReference_new() {
2037 _buildOldUnit(r'''
2038 /// Comment reference with new [new A].
2039 class A {}
2040 ''');
2041 _buildNewUnit(r'''
2042 class B {}
2043 /// Comment reference with new [new A].
2044 class A {}
2045 ''');
2046 }
2047
2048 test_update_commentReference_notClosed() {
2049 _buildOldUnit(r'''
2050 /// [c)
2051 class A {}
2052 ''');
2053 _buildNewUnit(r'''
2054 int a;
2055 /// [c)
2056 class A {}
2057 ''');
2058 }
2059
2060 test_update_element_implicitAccessors_classField() {
2061 _buildOldUnit(r'''
2062 // 0
2063 class A {
2064 var F = 0;
2065 }
2066 ''');
2067 _materializeLazyElements(unitElement);
2068 _buildNewUnit(r'''
2069 // 012
2070 class A {
2071 var F = 0;
2072 }
2073 ''');
2074 }
2075
2076 test_update_element_implicitAccessors_topLevelVariable() {
2077 _buildOldUnit(r'''
2078 var A = 0;
2079 var B = 1;
2080 ''');
2081 _materializeLazyElements(unitElement);
2082 _buildNewUnit(r'''
2083 var B = 1;
2084 ''');
2085 }
2086
2087 test_update_parseError_diffPlus_removeOne() {
2088 _buildOldUnit(r'''
2089 class C {
2090 + /// comment
2091 + String field;
2092 }
2093 ''');
2094 _buildNewUnit(r'''
2095 class C {
2096 + /// comment
2097 String field;
2098 }
2099 ''');
2100 }
2101
2102 test_update_rewrittenConstructorName() {
2103 _buildOldUnit(r'''
2104 class A {
2105 A();
2106 A.named();
2107 }
2108
2109 foo() {}
2110
2111 main() {
2112 new A();
2113 new A.named();
2114 }
2115 ''');
2116 _buildNewUnit(r'''
2117 class A {
2118 A();
2119 A.named();
2120 }
2121
2122 bar() {}
2123
2124 main() {
2125 new A();
2126 new A.named();
2127 }
2128 ''');
2129 }
2130
2131 void _buildNewUnit(String newCode) {
2132 this.newCode = newCode;
2133 AnalysisOptionsImpl analysisOptions = context.analysisOptions;
2134 analysisOptions.finerGrainedInvalidation = false;
2135 try {
2136 context.setContents(source, newCode);
2137 newUnit = context.parseCompilationUnit(source);
2138 IncrementalCompilationUnitElementBuilder builder =
2139 new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit);
2140 builder.build();
2141 unitDelta = builder.unitDelta;
2142 expect(newUnit.element, unitElement);
2143 // Flush all tokens, ASTs and elements.
2144 context.analysisCache.flush((target, result) {
2145 return result == TOKEN_STREAM ||
2146 result == PARSED_UNIT ||
2147 RESOLVED_UNIT_RESULTS.contains(result) ||
2148 LIBRARY_ELEMENT_RESULTS.contains(result);
2149 });
2150 // Compute a new AST with built elements.
2151 CompilationUnit newUnitFull = context.computeResult(
2152 new LibrarySpecificUnit(source, source), RESOLVED_UNIT1);
2153 expect(newUnitFull, isNot(same(newUnit)));
2154 new _BuiltElementsValidator().isEqualNodes(newUnitFull, newUnit);
2155 } finally {
2156 analysisOptions.finerGrainedInvalidation = true;
2157 }
2158 }
2159
2160 void _buildOldUnit(String oldCode, [Source libSource]) {
2161 this.oldCode = oldCode;
2162 source = newSource('/test.dart', oldCode);
2163 if (libSource == null) {
2164 libSource = source;
2165 }
2166 oldUnit = context.resolveCompilationUnit2(source, libSource);
2167 unitElement = oldUnit.element;
2168 expect(unitElement, isNotNull);
2169 }
2170
2171 void _materializeLazyElements(CompilationUnitElement unitElement) {
2172 unitElement.accept(new _MaterializeLazyElementsVisitor());
2173 }
2174
2175 void _verifyNoClassDeltaForTheLast(String oldCode, String newCode) {
2176 _buildOldUnit(oldCode);
2177 List<CompilationUnitMember> oldMembers = oldUnit.declarations.toList();
2178 Element oldElementLast = oldMembers.last.element;
2179 _buildNewUnit(newCode);
2180 List<CompilationUnitMember> newMembers = newUnit.declarations;
2181 Element newElementLast = newMembers.last.element;
2182 expect(newElementLast, isNot(same(oldElementLast)));
2183 expect(unitDelta.classDeltas, isEmpty);
2184 expect(unitDelta.removedDeclarations, unorderedEquals([oldElementLast]));
2185 expect(unitDelta.addedDeclarations, unorderedEquals([newElementLast]));
2186 }
2187 }
2188
2189 /**
2190 * Compares tokens and ASTs, and built elements of declared identifiers.
2191 */
2192 class _BuiltElementsValidator extends AstComparator {
2193 final Set visited = new Set.identity();
2194
2195 @override
2196 bool isEqualNodes(AstNode expected, AstNode actual) {
2197 // Elements of nodes which are children of ClassDeclaration(s) must be
2198 // linked to the corresponding ClassElement(s).
2199 if (actual is TypeParameter) {
2200 TypeParameterElement element = actual.element;
2201 ClassDeclaration classNode = actual.parent.parent;
2202 expect(element.enclosingElement, same(classNode.element));
2203 } else if (actual is FieldDeclaration) {
2204 for (VariableDeclaration field in actual.fields.variables) {
2205 Element element = field.element;
2206 ClassDeclaration classNode = actual.parent;
2207 expect(element.enclosingElement, same(classNode.element));
2208 }
2209 } else if (actual is ClassMember) {
2210 Element element = actual.element;
2211 ClassDeclaration classNode = actual.parent;
2212 expect(element.enclosingElement, same(classNode.element));
2213 }
2214 // Field elements referenced by field formal parameters of constructors
2215 // must by fields of the enclosing class element.
2216 if (actual is FieldFormalParameter) {
2217 FieldFormalParameterElement parameterElement = actual.element;
2218 FieldElement element = parameterElement.field;
2219 ClassDeclaration classNode =
2220 actual.getAncestor((n) => n is ClassDeclaration);
2221 expect(element.enclosingElement, same(classNode.element));
2222 }
2223 // ElementAnnotationImpl must use the enclosing CompilationUnitElement.
2224 if (actual is Annotation) {
2225 AstNode parent = actual.parent;
2226 if (parent is Declaration) {
2227 ElementAnnotationImpl actualElement = actual.elementAnnotation;
2228 CompilationUnitElement enclosingUnitElement = resolutionMap
2229 .elementDeclaredByDeclaration(parent)
2230 .getAncestor((a) => a is CompilationUnitElement);
2231 expect(actualElement.compilationUnit, same(enclosingUnitElement));
2232 }
2233 }
2234 // Identifiers like 'a.b' in 'new a.b()' might be rewritten if resolver
2235 // sees that 'a' is actually a class name, so 'b' is a constructor name.
2236 //
2237 if (expected is ConstructorName && actual is ConstructorName) {
2238 Identifier expectedTypeName = expected.type.name;
2239 Identifier actualTypeName = actual.type.name;
2240 if (expectedTypeName is PrefixedIdentifier &&
2241 actualTypeName is SimpleIdentifier) {
2242 return isEqualNodes(expectedTypeName.prefix, actualTypeName) &&
2243 isEqualNodes(expectedTypeName.identifier, actual.name);
2244 }
2245 }
2246 // Compare nodes.
2247 bool result = super.isEqualNodes(expected, actual);
2248 if (!result) {
2249 fail('|$actual| != expected |$expected|');
2250 }
2251 // Verify that declared identifiers have equal elements.
2252 if (expected is SimpleIdentifier && actual is SimpleIdentifier) {
2253 if (expected.inDeclarationContext()) {
2254 expect(actual.inDeclarationContext(), isTrue);
2255 Element expectedElement = expected.staticElement;
2256 Element actualElement = actual.staticElement;
2257 _verifyElement(
2258 expectedElement, actualElement, 'staticElement ($expectedElement)');
2259 }
2260 }
2261 return true;
2262 }
2263
2264 void _verifyElement(Element expected, Element actual, String desc) {
2265 if (!visited.add(expected)) {
2266 return;
2267 }
2268 if (expected == null && actual == null) {
2269 return;
2270 }
2271 // Prefixes are built later.
2272 if (actual is PrefixElement) {
2273 return;
2274 }
2275 // Compare properties.
2276 _verifyEqual('$desc name', expected.name, actual.name);
2277 _verifyEqual('$desc nameOffset', expected.nameOffset, actual.nameOffset);
2278 _verifyEqual('$desc isSynthetic', expected.isSynthetic, actual.isSynthetic);
2279 if (expected is ElementImpl && actual is ElementImpl) {
2280 _verifyEqual('$desc codeOffset', expected.codeOffset, actual.codeOffset);
2281 _verifyEqual('$desc codeLength', expected.codeLength, actual.codeLength);
2282 }
2283 if (expected is LocalElement && actual is LocalElement) {
2284 _verifyEqual(
2285 '$desc visibleRange', expected.visibleRange, actual.visibleRange);
2286 }
2287 _verifyEqual('$desc documentationComment', expected.documentationComment,
2288 actual.documentationComment);
2289 {
2290 var expectedEnclosing = expected.enclosingElement;
2291 var actualEnclosing = actual.enclosingElement;
2292 if (expectedEnclosing != null) {
2293 expect(actualEnclosing, isNotNull, reason: '$desc enclosingElement');
2294 _verifyElement(expectedEnclosing, actualEnclosing,
2295 '${expectedEnclosing.name}.$desc');
2296 }
2297 }
2298 // Compare implicit accessors.
2299 if (expected is PropertyInducingElement &&
2300 actual is PropertyInducingElement &&
2301 !expected.isSynthetic) {
2302 _verifyElement(expected.getter, actual.getter, '$desc getter');
2303 _verifyElement(expected.setter, actual.setter, '$desc setter');
2304 }
2305 // Compare implicit properties.
2306 if (expected is PropertyAccessorElement &&
2307 actual is PropertyAccessorElement &&
2308 !expected.isSynthetic) {
2309 _verifyElement(expected.variable, actual.variable, '$desc variable');
2310 }
2311 // Compare parameters.
2312 if (expected is ExecutableElement && actual is ExecutableElement) {
2313 List<ParameterElement> actualParameters = actual.parameters;
2314 List<ParameterElement> expectedParameters = expected.parameters;
2315 expect(actualParameters, hasLength(expectedParameters.length));
2316 for (int i = 0; i < expectedParameters.length; i++) {
2317 _verifyElement(
2318 expectedParameters[i], actualParameters[i], '$desc parameters[$i]');
2319 }
2320 }
2321 }
2322
2323 void _verifyEqual(String name, expected, actual) {
2324 if (actual != expected) {
2325 fail('$name\nExpected: $expected\n Actual: $actual');
2326 }
2327 }
2328 }
2329
2330 class _ClassDeltaHelper {
2331 final String name;
2332
2333 ClassElementDelta delta;
2334 ClassElementImpl element;
2335 int oldVersion;
2336 List<ClassMember> oldMembers;
2337 List<ClassMember> newMembers;
2338
2339 _ClassDeltaHelper(this.name);
2340
2341 void initNew(CompilationUnit newUnit, CompilationUnitElementDelta unitDelta) {
2342 expect(element.version, isNot(oldVersion));
2343 ClassDeclaration newClass = _findClassNode(newUnit, name);
2344 expect(newClass, isNotNull);
2345 newMembers = newClass.members.toList();
2346 delta = unitDelta.classDeltas[name];
2347 expect(delta, isNotNull, reason: 'No delta for class: $name');
2348 }
2349
2350 void initOld(CompilationUnit oldUnit) {
2351 ClassDeclaration oldClass = _findClassNode(oldUnit, name);
2352 expect(oldClass, isNotNull);
2353 element = oldClass.element;
2354 oldVersion = element.version;
2355 oldMembers = oldClass.members.toList();
2356 }
2357
2358 ClassDeclaration _findClassNode(CompilationUnit unit, String name) =>
2359 unit.declarations.singleWhere((unitMember) =>
2360 unitMember is ClassDeclaration && unitMember.name.name == name);
2361 }
2362
2363 class _MaterializeLazyElementsVisitor extends GeneralizingElementVisitor {
2364 @override
2365 visitExecutableElement(ExecutableElement element) {
2366 element.parameters;
2367 super.visitExecutableElement(element);
2368 }
2369 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/context/context_test.dart ('k') | pkg/analyzer/test/src/task/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698