| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |