OLD | NEW |
(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 test.src.task.incremental_element_builder_test; |
| 6 |
| 7 import 'package:analyzer/src/generated/ast.dart'; |
| 8 import 'package:analyzer/src/generated/element.dart'; |
| 9 import 'package:analyzer/src/generated/source.dart'; |
| 10 import 'package:analyzer/src/task/incremental_element_builder.dart'; |
| 11 import 'package:unittest/unittest.dart'; |
| 12 |
| 13 import '../../reflective_tests.dart'; |
| 14 import '../../utils.dart'; |
| 15 import '../context/abstract_context.dart'; |
| 16 |
| 17 main() { |
| 18 initializeTestEnvironment(); |
| 19 runReflectiveTests(IncrementalCompilationUnitElementBuilderTest); |
| 20 } |
| 21 |
| 22 @reflectiveTest |
| 23 class IncrementalCompilationUnitElementBuilderTest extends AbstractContextTest { |
| 24 Source source; |
| 25 |
| 26 String oldCode; |
| 27 CompilationUnit oldUnit; |
| 28 CompilationUnitElement unitElement; |
| 29 |
| 30 String newCode; |
| 31 CompilationUnit newUnit; |
| 32 |
| 33 CompilationUnitElementDelta unitDelta; |
| 34 |
| 35 String getNodeText(AstNode node) { |
| 36 return newCode.substring(node.offset, node.end); |
| 37 } |
| 38 |
| 39 test_directives_add() { |
| 40 _buildOldUnit(r''' |
| 41 library test; |
| 42 import 'dart:math'; |
| 43 '''); |
| 44 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 45 _buildNewUnit(r''' |
| 46 library test; |
| 47 import 'dart:async'; |
| 48 import 'dart:math'; |
| 49 '''); |
| 50 List<Directive> newDirectives = newUnit.directives; |
| 51 { |
| 52 Directive newNode = newDirectives[0]; |
| 53 expect(newNode, same(oldDirectives[0])); |
| 54 expect(getNodeText(newNode), "library test;"); |
| 55 LibraryElement element = newNode.element; |
| 56 expect(element, isNotNull); |
| 57 expect(element.nameOffset, newCode.indexOf('test;')); |
| 58 } |
| 59 { |
| 60 Directive newNode = newDirectives[1]; |
| 61 expect(getNodeText(newNode), "import 'dart:async';"); |
| 62 ImportElement element = newNode.element; |
| 63 expect(element, isNull); |
| 64 } |
| 65 { |
| 66 Directive newNode = newDirectives[2]; |
| 67 expect(newNode, same(oldDirectives[1])); |
| 68 expect(getNodeText(newNode), "import 'dart:math';"); |
| 69 ImportElement element = newNode.element; |
| 70 expect(element, isNotNull); |
| 71 expect(element.nameOffset, newCode.indexOf("import 'dart:math';")); |
| 72 } |
| 73 expect(unitDelta.hasDirectiveChange, isTrue); |
| 74 } |
| 75 |
| 76 test_directives_keepOffset_partOf() { |
| 77 String libCode = ''' |
| 78 // comment to shift tokens |
| 79 library my_lib; |
| 80 part 'test.dart'; |
| 81 '''; |
| 82 Source libSource = newSource('/lib.dart', libCode); |
| 83 _buildOldUnit( |
| 84 r''' |
| 85 part of my_lib; |
| 86 class A {} |
| 87 ''', |
| 88 libSource); |
| 89 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 90 _buildNewUnit(r''' |
| 91 part of my_lib; |
| 92 class A {} |
| 93 '''); |
| 94 List<Directive> newDirectives = newUnit.directives; |
| 95 { |
| 96 Directive newNode = newDirectives[0]; |
| 97 expect(newNode, same(oldDirectives[0])); |
| 98 expect(getNodeText(newNode), 'part of my_lib;'); |
| 99 LibraryElement element = newNode.element; |
| 100 expect(element, isNotNull); |
| 101 expect(element.nameOffset, libCode.indexOf('my_lib;')); |
| 102 } |
| 103 } |
| 104 |
| 105 test_directives_remove() { |
| 106 _buildOldUnit(r''' |
| 107 library test; |
| 108 import 'dart:async'; |
| 109 import 'dart:math'; |
| 110 '''); |
| 111 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 112 _buildNewUnit(r''' |
| 113 library test; |
| 114 import 'dart:math'; |
| 115 '''); |
| 116 List<Directive> newDirectives = newUnit.directives; |
| 117 { |
| 118 Directive newNode = newDirectives[0]; |
| 119 expect(newNode, same(oldDirectives[0])); |
| 120 expect(getNodeText(newNode), "library test;"); |
| 121 LibraryElement element = newNode.element; |
| 122 expect(element, isNotNull); |
| 123 expect(element.nameOffset, newCode.indexOf('test;')); |
| 124 } |
| 125 { |
| 126 Directive newNode = newDirectives[1]; |
| 127 expect(newNode, same(oldDirectives[2])); |
| 128 expect(getNodeText(newNode), "import 'dart:math';"); |
| 129 ImportElement element = newNode.element; |
| 130 expect(element, isNotNull); |
| 131 expect(element.nameOffset, newCode.indexOf("import 'dart:math';")); |
| 132 } |
| 133 expect(unitDelta.hasDirectiveChange, isTrue); |
| 134 } |
| 135 |
| 136 test_directives_reorder() { |
| 137 _buildOldUnit(r''' |
| 138 library test; |
| 139 import 'dart:math' as m; |
| 140 import 'dart:async'; |
| 141 '''); |
| 142 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 143 _buildNewUnit(r''' |
| 144 library test; |
| 145 import 'dart:async'; |
| 146 import 'dart:math' as m; |
| 147 '''); |
| 148 List<Directive> newDirectives = newUnit.directives; |
| 149 { |
| 150 Directive newNode = newDirectives[0]; |
| 151 expect(newNode, same(oldDirectives[0])); |
| 152 expect(getNodeText(newNode), "library test;"); |
| 153 LibraryElement element = newNode.element; |
| 154 expect(element, isNotNull); |
| 155 expect(element.nameOffset, newCode.indexOf('test;')); |
| 156 } |
| 157 { |
| 158 Directive newNode = newDirectives[1]; |
| 159 expect(newNode, same(oldDirectives[2])); |
| 160 expect(getNodeText(newNode), "import 'dart:async';"); |
| 161 ImportElement element = newNode.element; |
| 162 expect(element, isNotNull); |
| 163 expect(element.nameOffset, newCode.indexOf("import 'dart:async';")); |
| 164 } |
| 165 { |
| 166 Directive newNode = newDirectives[2]; |
| 167 expect(newNode, same(oldDirectives[1])); |
| 168 expect(getNodeText(newNode), "import 'dart:math' as m;"); |
| 169 ImportElement element = newNode.element; |
| 170 expect(element, isNotNull); |
| 171 expect(element.nameOffset, newCode.indexOf("import 'dart:math' as m;")); |
| 172 expect(element.prefix.nameOffset, newCode.indexOf("m;")); |
| 173 } |
| 174 expect(unitDelta.hasDirectiveChange, isFalse); |
| 175 } |
| 176 |
| 177 test_directives_sameOrder_insertSpaces() { |
| 178 _buildOldUnit(r''' |
| 179 library test; |
| 180 import 'dart:async'; |
| 181 import 'dart:math'; |
| 182 '''); |
| 183 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 184 _buildNewUnit(r''' |
| 185 library test; |
| 186 |
| 187 import 'dart:async' ; |
| 188 import 'dart:math'; |
| 189 '''); |
| 190 List<Directive> newDirectives = newUnit.directives; |
| 191 { |
| 192 Directive newNode = newDirectives[0]; |
| 193 expect(newNode, same(oldDirectives[0])); |
| 194 expect(getNodeText(newNode), "library test;"); |
| 195 LibraryElement element = newNode.element; |
| 196 expect(element, isNotNull); |
| 197 expect(element.nameOffset, newCode.indexOf('test;')); |
| 198 } |
| 199 { |
| 200 Directive newNode = newDirectives[1]; |
| 201 expect(newNode, same(oldDirectives[1])); |
| 202 expect(getNodeText(newNode), "import 'dart:async' ;"); |
| 203 ImportElement element = newNode.element; |
| 204 expect(element, isNotNull); |
| 205 expect(element.nameOffset, newCode.indexOf("import 'dart:async' ;")); |
| 206 } |
| 207 { |
| 208 Directive newNode = newDirectives[2]; |
| 209 expect(newNode, same(oldDirectives[2])); |
| 210 expect(getNodeText(newNode), "import 'dart:math';"); |
| 211 ImportElement element = newNode.element; |
| 212 expect(element, isNotNull); |
| 213 expect(element.nameOffset, newCode.indexOf("import 'dart:math';")); |
| 214 } |
| 215 expect(unitDelta.hasDirectiveChange, isFalse); |
| 216 } |
| 217 |
| 218 test_directives_sameOrder_removeSpaces() { |
| 219 _buildOldUnit(r''' |
| 220 library test; |
| 221 |
| 222 import 'dart:async' ; |
| 223 import 'dart:math'; |
| 224 '''); |
| 225 List<Directive> oldDirectives = oldUnit.directives.toList(); |
| 226 _buildNewUnit(r''' |
| 227 library test; |
| 228 import 'dart:async'; |
| 229 import 'dart:math'; |
| 230 '''); |
| 231 List<Directive> newDirectives = newUnit.directives; |
| 232 { |
| 233 Directive newNode = newDirectives[0]; |
| 234 expect(newNode, same(oldDirectives[0])); |
| 235 expect(getNodeText(newNode), "library test;"); |
| 236 LibraryElement element = newNode.element; |
| 237 expect(element, isNotNull); |
| 238 expect(element.nameOffset, newCode.indexOf('test;')); |
| 239 } |
| 240 { |
| 241 Directive newNode = newDirectives[1]; |
| 242 expect(newNode, same(oldDirectives[1])); |
| 243 expect(getNodeText(newNode), "import 'dart:async';"); |
| 244 ImportElement element = newNode.element; |
| 245 expect(element, isNotNull); |
| 246 expect(element.nameOffset, newCode.indexOf("import 'dart:async';")); |
| 247 } |
| 248 { |
| 249 Directive newNode = newDirectives[2]; |
| 250 expect(newNode, same(oldDirectives[2])); |
| 251 expect(getNodeText(newNode), "import 'dart:math';"); |
| 252 ImportElement element = newNode.element; |
| 253 expect(element, isNotNull); |
| 254 expect(element.nameOffset, newCode.indexOf("import 'dart:math';")); |
| 255 } |
| 256 expect(unitDelta.hasDirectiveChange, isFalse); |
| 257 } |
| 258 |
| 259 test_unitMembers_accessor_add() { |
| 260 _buildOldUnit(r''' |
| 261 get a => 1; |
| 262 '''); |
| 263 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 264 _buildNewUnit(r''' |
| 265 get a => 1; |
| 266 get b => 2; |
| 267 '''); |
| 268 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 269 // nodes |
| 270 FunctionDeclaration node1 = newNodes[0]; |
| 271 FunctionDeclaration node2 = newNodes[1]; |
| 272 expect(node1, same(oldNodes[0])); |
| 273 // elements |
| 274 PropertyAccessorElement elementA = node1.element; |
| 275 PropertyAccessorElement elementB = node2.element; |
| 276 expect(elementA, isNotNull); |
| 277 expect(elementB, isNotNull); |
| 278 expect(elementA.name, 'a'); |
| 279 expect(elementB.name, 'b'); |
| 280 // unit.types |
| 281 expect(unitElement.topLevelVariables, |
| 282 unorderedEquals([elementA.variable, elementB.variable])); |
| 283 expect(unitElement.accessors, unorderedEquals([elementA, elementB])); |
| 284 } |
| 285 |
| 286 test_unitMembers_class_add() { |
| 287 _buildOldUnit(r''' |
| 288 class A {} |
| 289 '''); |
| 290 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 291 _buildNewUnit(r''' |
| 292 class A {} |
| 293 class B {} |
| 294 '''); |
| 295 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 296 // nodes |
| 297 CompilationUnitMember nodeA = newNodes[0]; |
| 298 CompilationUnitMember nodeB = newNodes[1]; |
| 299 expect(nodeA, same(oldNodes[0])); |
| 300 // elements |
| 301 ClassElement elementA = nodeA.element; |
| 302 ClassElement elementB = nodeB.element; |
| 303 expect(elementA, isNotNull); |
| 304 expect(elementB, isNotNull); |
| 305 expect(elementA.name, 'A'); |
| 306 expect(elementB.name, 'B'); |
| 307 // unit.types |
| 308 expect(unitElement.types, unorderedEquals([elementA, elementB])); |
| 309 // verify delta |
| 310 expect(unitDelta.addedDeclarations, unorderedEquals([elementB])); |
| 311 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 312 } |
| 313 |
| 314 test_unitMembers_class_comments() { |
| 315 _buildOldUnit(r''' |
| 316 /// reference [bool] type. |
| 317 class A {} |
| 318 /// reference [int] type. |
| 319 class B {} |
| 320 /// reference [double] and [B] types. |
| 321 class C {} |
| 322 '''); |
| 323 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 324 _buildNewUnit(r''' |
| 325 /// reference [double] and [B] types. |
| 326 class C {} |
| 327 /// reference [bool] type. |
| 328 class A {} |
| 329 /// reference [int] type. |
| 330 class B {} |
| 331 '''); |
| 332 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 333 { |
| 334 CompilationUnitMember newNode = newNodes[0]; |
| 335 expect(newNode, same(oldNodes[2])); |
| 336 expect( |
| 337 getNodeText(newNode), |
| 338 r''' |
| 339 /// reference [double] and [B] types. |
| 340 class C {}'''); |
| 341 ClassElement element = newNode.element; |
| 342 expect(element, isNotNull); |
| 343 expect(element.name, 'C'); |
| 344 expect(element.nameOffset, newCode.indexOf('C {}')); |
| 345 // [double] and [B] are still resolved |
| 346 { |
| 347 var docReferences = newNode.documentationComment.references; |
| 348 expect(docReferences, hasLength(2)); |
| 349 expect(docReferences[0].identifier.staticElement.name, 'double'); |
| 350 expect(docReferences[1].identifier.staticElement, |
| 351 same(newNodes[2].element)); |
| 352 } |
| 353 } |
| 354 { |
| 355 CompilationUnitMember newNode = newNodes[1]; |
| 356 expect(newNode, same(oldNodes[0])); |
| 357 expect( |
| 358 getNodeText(newNode), |
| 359 r''' |
| 360 /// reference [bool] type. |
| 361 class A {}'''); |
| 362 ClassElement element = newNode.element; |
| 363 expect(element, isNotNull); |
| 364 expect(element.name, 'A'); |
| 365 expect(element.nameOffset, newCode.indexOf('A {}')); |
| 366 // [bool] is still resolved |
| 367 { |
| 368 var docReferences = newNode.documentationComment.references; |
| 369 expect(docReferences, hasLength(1)); |
| 370 expect(docReferences[0].identifier.staticElement.name, 'bool'); |
| 371 } |
| 372 } |
| 373 { |
| 374 CompilationUnitMember newNode = newNodes[2]; |
| 375 expect(newNode, same(oldNodes[1])); |
| 376 expect( |
| 377 getNodeText(newNode), |
| 378 r''' |
| 379 /// reference [int] type. |
| 380 class B {}'''); |
| 381 ClassElement element = newNode.element; |
| 382 expect(element, isNotNull); |
| 383 expect(element.name, 'B'); |
| 384 expect(element.nameOffset, newCode.indexOf('B {}')); |
| 385 // [int] is still resolved |
| 386 { |
| 387 var docReferences = newNode.documentationComment.references; |
| 388 expect(docReferences, hasLength(1)); |
| 389 expect(docReferences[0].identifier.staticElement.name, 'int'); |
| 390 } |
| 391 } |
| 392 // verify delta |
| 393 expect(unitDelta.addedDeclarations, unorderedEquals([])); |
| 394 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 395 } |
| 396 |
| 397 test_unitMembers_class_remove() { |
| 398 _buildOldUnit(r''' |
| 399 class A {} |
| 400 class B {} |
| 401 '''); |
| 402 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 403 _buildNewUnit(r''' |
| 404 class A {} |
| 405 '''); |
| 406 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 407 // nodes |
| 408 CompilationUnitMember nodeA = newNodes[0]; |
| 409 CompilationUnitMember nodeB = oldNodes[1]; |
| 410 expect(nodeA, same(oldNodes[0])); |
| 411 // elements |
| 412 ClassElement elementA = nodeA.element; |
| 413 ClassElement elementB = nodeB.element; |
| 414 expect(elementA, isNotNull); |
| 415 expect(elementB, isNotNull); |
| 416 expect(elementA.name, 'A'); |
| 417 expect(elementB.name, 'B'); |
| 418 // unit.types |
| 419 expect(unitElement.types, unorderedEquals([elementA])); |
| 420 // verify delta |
| 421 expect(unitDelta.addedDeclarations, unorderedEquals([])); |
| 422 expect(unitDelta.removedDeclarations, unorderedEquals([elementB])); |
| 423 } |
| 424 |
| 425 test_unitMembers_class_reorder() { |
| 426 _buildOldUnit(r''' |
| 427 class A {} |
| 428 class B {} |
| 429 class C {} |
| 430 '''); |
| 431 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 432 _buildNewUnit(r''' |
| 433 class C {} |
| 434 class A {} |
| 435 class B {} |
| 436 '''); |
| 437 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 438 { |
| 439 CompilationUnitMember newNode = newNodes[0]; |
| 440 expect(newNode, same(oldNodes[2])); |
| 441 expect(getNodeText(newNode), 'class C {}'); |
| 442 ClassElement element = newNode.element; |
| 443 expect(element, isNotNull); |
| 444 expect(element.name, 'C'); |
| 445 expect(element.nameOffset, newCode.indexOf('C {}')); |
| 446 } |
| 447 { |
| 448 CompilationUnitMember newNode = newNodes[1]; |
| 449 expect(newNode, same(oldNodes[0])); |
| 450 expect(getNodeText(newNode), 'class A {}'); |
| 451 ClassElement element = newNode.element; |
| 452 expect(element, isNotNull); |
| 453 expect(element.name, 'A'); |
| 454 expect(element.nameOffset, newCode.indexOf('A {}')); |
| 455 } |
| 456 { |
| 457 CompilationUnitMember newNode = newNodes[2]; |
| 458 expect(newNode, same(oldNodes[1])); |
| 459 expect(getNodeText(newNode), 'class B {}'); |
| 460 ClassElement element = newNode.element; |
| 461 expect(element, isNotNull); |
| 462 expect(element.name, 'B'); |
| 463 expect(element.nameOffset, newCode.indexOf('B {}')); |
| 464 } |
| 465 // verify delta |
| 466 expect(unitDelta.addedDeclarations, unorderedEquals([])); |
| 467 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 468 } |
| 469 |
| 470 test_unitMembers_enum_add() { |
| 471 _buildOldUnit(r''' |
| 472 enum A {A1, A2} |
| 473 '''); |
| 474 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 475 _buildNewUnit(r''' |
| 476 enum A {A1, A2} |
| 477 enum B {B1, B2} |
| 478 '''); |
| 479 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 480 // nodes |
| 481 CompilationUnitMember nodeA = newNodes[0]; |
| 482 CompilationUnitMember nodeB = newNodes[1]; |
| 483 expect(nodeA, same(oldNodes[0])); |
| 484 // elements |
| 485 ClassElement elementA = nodeA.element; |
| 486 ClassElement elementB = nodeB.element; |
| 487 expect(elementA, isNotNull); |
| 488 expect(elementB, isNotNull); |
| 489 expect(elementA.name, 'A'); |
| 490 expect(elementB.name, 'B'); |
| 491 // unit.types |
| 492 expect(unitElement.enums, unorderedEquals([elementA, elementB])); |
| 493 // verify delta |
| 494 expect(unitDelta.addedDeclarations, unorderedEquals([elementB])); |
| 495 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 496 } |
| 497 |
| 498 test_unitMembers_function_add() { |
| 499 _buildOldUnit(r''' |
| 500 a() {} |
| 501 '''); |
| 502 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 503 _buildNewUnit(r''' |
| 504 a() {} |
| 505 b() {} |
| 506 '''); |
| 507 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 508 // nodes |
| 509 CompilationUnitMember nodeA = newNodes[0]; |
| 510 CompilationUnitMember nodeB = newNodes[1]; |
| 511 expect(nodeA, same(oldNodes[0])); |
| 512 // elements |
| 513 FunctionElement elementA = nodeA.element; |
| 514 FunctionElement elementB = nodeB.element; |
| 515 expect(elementA, isNotNull); |
| 516 expect(elementB, isNotNull); |
| 517 expect(elementA.name, 'a'); |
| 518 expect(elementB.name, 'b'); |
| 519 // unit.types |
| 520 expect(unitElement.functions, unorderedEquals([elementA, elementB])); |
| 521 // verify delta |
| 522 expect(unitDelta.addedDeclarations, unorderedEquals([elementB])); |
| 523 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 524 } |
| 525 |
| 526 test_unitMembers_functionTypeAlias_add() { |
| 527 _buildOldUnit(r''' |
| 528 typedef A(); |
| 529 '''); |
| 530 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 531 _buildNewUnit(r''' |
| 532 typedef A(); |
| 533 typedef B(); |
| 534 '''); |
| 535 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 536 // nodes |
| 537 CompilationUnitMember nodeA = newNodes[0]; |
| 538 CompilationUnitMember nodeB = newNodes[1]; |
| 539 expect(nodeA, same(oldNodes[0])); |
| 540 // elements |
| 541 FunctionTypeAliasElement elementA = nodeA.element; |
| 542 FunctionTypeAliasElement elementB = nodeB.element; |
| 543 expect(elementA, isNotNull); |
| 544 expect(elementB, isNotNull); |
| 545 expect(elementA.name, 'A'); |
| 546 expect(elementB.name, 'B'); |
| 547 // unit.types |
| 548 expect( |
| 549 unitElement.functionTypeAliases, unorderedEquals([elementA, elementB])); |
| 550 // verify delta |
| 551 expect(unitDelta.addedDeclarations, unorderedEquals([elementB])); |
| 552 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 553 } |
| 554 |
| 555 test_unitMembers_topLevelVariable() { |
| 556 _buildOldUnit(r''' |
| 557 bool a = 1, b = 2; |
| 558 int c = 3; |
| 559 '''); |
| 560 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 561 _buildNewUnit(r''' |
| 562 int c = 3; |
| 563 |
| 564 bool a =1, b = 2; |
| 565 '''); |
| 566 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 567 { |
| 568 TopLevelVariableDeclaration newNode = newNodes[0]; |
| 569 expect(newNode, same(oldNodes[1])); |
| 570 expect(getNodeText(newNode), 'int c = 3;'); |
| 571 { |
| 572 TopLevelVariableElement element = |
| 573 newNode.variables.variables[0].element; |
| 574 expect(element, isNotNull); |
| 575 expect(element.name, 'c'); |
| 576 expect(element.nameOffset, newCode.indexOf('c = 3')); |
| 577 } |
| 578 } |
| 579 { |
| 580 TopLevelVariableDeclaration newNode = newNodes[1]; |
| 581 expect(newNode, same(oldNodes[0])); |
| 582 expect(getNodeText(newNode), 'bool a =1, b = 2;'); |
| 583 { |
| 584 TopLevelVariableElement element = |
| 585 newNode.variables.variables[0].element; |
| 586 expect(element, isNotNull); |
| 587 expect(element.name, 'a'); |
| 588 expect(element.nameOffset, newCode.indexOf('a =1')); |
| 589 } |
| 590 { |
| 591 TopLevelVariableElement element = |
| 592 newNode.variables.variables[1].element; |
| 593 expect(element, isNotNull); |
| 594 expect(element.name, 'b'); |
| 595 expect(element.nameOffset, newCode.indexOf('b = 2')); |
| 596 } |
| 597 } |
| 598 // verify delta |
| 599 expect(unitDelta.addedDeclarations, unorderedEquals([])); |
| 600 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 601 } |
| 602 |
| 603 test_unitMembers_topLevelVariable_add() { |
| 604 _buildOldUnit(r''' |
| 605 int a, b; |
| 606 '''); |
| 607 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 608 _buildNewUnit(r''' |
| 609 int a, b; |
| 610 int c, d; |
| 611 '''); |
| 612 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 613 // nodes |
| 614 TopLevelVariableDeclaration node1 = newNodes[0]; |
| 615 TopLevelVariableDeclaration node2 = newNodes[1]; |
| 616 expect(node1, same(oldNodes[0])); |
| 617 // elements |
| 618 TopLevelVariableElement elementA = node1.variables.variables[0].element; |
| 619 TopLevelVariableElement elementB = node1.variables.variables[1].element; |
| 620 TopLevelVariableElement elementC = node2.variables.variables[0].element; |
| 621 TopLevelVariableElement elementD = node2.variables.variables[1].element; |
| 622 expect(elementA, isNotNull); |
| 623 expect(elementB, isNotNull); |
| 624 expect(elementC, isNotNull); |
| 625 expect(elementD, isNotNull); |
| 626 expect(elementA.name, 'a'); |
| 627 expect(elementB.name, 'b'); |
| 628 expect(elementC.name, 'c'); |
| 629 expect(elementD.name, 'd'); |
| 630 // unit.types |
| 631 expect(unitElement.topLevelVariables, |
| 632 unorderedEquals([elementA, elementB, elementC, elementD])); |
| 633 expect( |
| 634 unitElement.accessors, |
| 635 unorderedEquals([ |
| 636 elementA.getter, |
| 637 elementA.setter, |
| 638 elementB.getter, |
| 639 elementB.setter, |
| 640 elementC.getter, |
| 641 elementC.setter, |
| 642 elementD.getter, |
| 643 elementD.setter |
| 644 ])); |
| 645 } |
| 646 |
| 647 test_unitMembers_topLevelVariable_final() { |
| 648 _buildOldUnit(r''' |
| 649 final int a = 1; |
| 650 '''); |
| 651 List<CompilationUnitMember> oldNodes = oldUnit.declarations.toList(); |
| 652 _buildNewUnit(r''' |
| 653 final int a = 1; |
| 654 '''); |
| 655 List<CompilationUnitMember> newNodes = newUnit.declarations; |
| 656 { |
| 657 TopLevelVariableDeclaration newNode = newNodes[0]; |
| 658 expect(newNode, same(oldNodes[0])); |
| 659 expect(getNodeText(newNode), 'final int a = 1;'); |
| 660 { |
| 661 TopLevelVariableElement element = |
| 662 newNode.variables.variables[0].element; |
| 663 expect(element, isNotNull); |
| 664 expect(element.name, 'a'); |
| 665 expect(element.nameOffset, newCode.indexOf('a = 1')); |
| 666 } |
| 667 } |
| 668 // verify delta |
| 669 expect(unitDelta.addedDeclarations, unorderedEquals([])); |
| 670 expect(unitDelta.removedDeclarations, unorderedEquals([])); |
| 671 } |
| 672 |
| 673 void _buildNewUnit(String newCode) { |
| 674 this.newCode = newCode; |
| 675 context.setContents(source, newCode); |
| 676 newUnit = context.parseCompilationUnit(source); |
| 677 IncrementalCompilationUnitElementBuilder builder = |
| 678 new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit); |
| 679 builder.build(); |
| 680 unitDelta = builder.unitDelta; |
| 681 expect(newUnit.element, unitElement); |
| 682 } |
| 683 |
| 684 void _buildOldUnit(String oldCode, [Source libSource]) { |
| 685 this.oldCode = oldCode; |
| 686 source = newSource('/test.dart', oldCode); |
| 687 if (libSource == null) { |
| 688 libSource = source; |
| 689 } |
| 690 oldUnit = context.resolveCompilationUnit2(source, libSource); |
| 691 unitElement = oldUnit.element; |
| 692 expect(unitElement, isNotNull); |
| 693 } |
| 694 } |
OLD | NEW |