| 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 analyzer.test.src.summary.summary_common; | 5 library analyzer.test.src.summary.summary_common; |
| 6 | 6 |
| 7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
| 8 import 'package:analyzer/dart/ast/ast.dart'; | 8 import 'package:analyzer/dart/ast/ast.dart'; |
| 9 import 'package:analyzer/error/listener.dart'; | 9 import 'package:analyzer/error/listener.dart'; |
| 10 import 'package:analyzer/src/dart/scanner/reader.dart'; | 10 import 'package:analyzer/src/dart/scanner/reader.dart'; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 * `part` declarations that deliberately refer to non-existent files. | 134 * `part` declarations that deliberately refer to non-existent files. |
| 135 */ | 135 */ |
| 136 bool allowMissingFiles = false; | 136 bool allowMissingFiles = false; |
| 137 | 137 |
| 138 /** | 138 /** |
| 139 * Get access to the linked defining compilation unit. | 139 * Get access to the linked defining compilation unit. |
| 140 */ | 140 */ |
| 141 LinkedUnit get definingUnit => linked.units[0]; | 141 LinkedUnit get definingUnit => linked.units[0]; |
| 142 | 142 |
| 143 /** | 143 /** |
| 144 * `true` if the linked portion of the summary is expected to contain | |
| 145 * absolute URIs. This happens because the element model doesn't (yet) store | |
| 146 * enough information to recover relative URIs, TODO(paulberry): fix this. | |
| 147 */ | |
| 148 bool get expectAbsoluteUrisInDependencies; | |
| 149 | |
| 150 /** | |
| 151 * Get access to the linked summary that results from serializing and | 144 * Get access to the linked summary that results from serializing and |
| 152 * then deserializing the library under test. | 145 * then deserializing the library under test. |
| 153 */ | 146 */ |
| 154 LinkedLibrary get linked; | 147 LinkedLibrary get linked; |
| 155 | 148 |
| 156 /** | 149 /** |
| 157 * `true` if the linked portion of the summary only contains prelinked data. | 150 * `true` if the linked portion of the summary only contains prelinked data. |
| 158 * This happens because we don't yet have a full linker; only a prelinker. | 151 * This happens because we don't yet have a full linker; only a prelinker. |
| 159 */ | 152 */ |
| 160 bool get skipFullyLinkedData; | 153 bool get skipFullyLinkedData; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 : isNot(contains(constCycleSlot))); | 203 : isNot(contains(constCycleSlot))); |
| 211 } | 204 } |
| 212 } | 205 } |
| 213 | 206 |
| 214 /** | 207 /** |
| 215 * Verify that the [dependency]th element of the dependency table represents | 208 * Verify that the [dependency]th element of the dependency table represents |
| 216 * a file reachable via the given [absoluteUri] and [relativeUri]. | 209 * a file reachable via the given [absoluteUri] and [relativeUri]. |
| 217 */ | 210 */ |
| 218 void checkDependency(int dependency, String absoluteUri, String relativeUri) { | 211 void checkDependency(int dependency, String absoluteUri, String relativeUri) { |
| 219 expect(dependency, new isInstanceOf<int>()); | 212 expect(dependency, new isInstanceOf<int>()); |
| 220 if (expectAbsoluteUrisInDependencies) { | 213 if (dependency >= linked.numPrelinkedDependencies) { |
| 221 // The element model doesn't (yet) store enough information to recover | |
| 222 // relative URIs, so we have to use the absolute URI. | |
| 223 // TODO(paulberry): fix this. | |
| 224 expect(linked.dependencies[dependency].uri, absoluteUri); | |
| 225 } else if (dependency >= linked.numPrelinkedDependencies) { | |
| 226 // Fully-linked dependencies are always absolute URIs. | 214 // Fully-linked dependencies are always absolute URIs. |
| 227 expect(linked.dependencies[dependency].uri, absoluteUri); | 215 expect(linked.dependencies[dependency].uri, absoluteUri); |
| 228 } else { | 216 } else { |
| 229 expect(linked.dependencies[dependency].uri, relativeUri); | 217 expect(linked.dependencies[dependency].uri, relativeUri); |
| 230 } | 218 } |
| 231 } | 219 } |
| 232 | 220 |
| 233 /** | 221 /** |
| 234 * Verify that the given [dependency] lists the given [absoluteUris] or | 222 * Verify that the given [dependency] lists the given |
| 235 * [relativeUris] as its parts. | 223 * [relativeUris] as its parts. |
| 236 */ | 224 */ |
| 237 void checkDependencyParts(LinkedDependency dependency, | 225 void checkDependencyParts( |
| 238 List<String> absoluteUris, List<String> relativeUris) { | 226 LinkedDependency dependency, List<String> relativeUris) { |
| 239 if (expectAbsoluteUrisInDependencies) { | |
| 240 // The element model doesn't (yet) store enough information to recover | |
| 241 // relative URIs, so we have to use the absolute URI. | |
| 242 // TODO(paulberry): fix this. | |
| 243 relativeUris = absoluteUris; | |
| 244 } | |
| 245 expect(dependency.parts, relativeUris); | 227 expect(dependency.parts, relativeUris); |
| 246 } | 228 } |
| 247 | 229 |
| 248 /** | 230 /** |
| 249 * Check that the given [documentationComment] matches the first | 231 * Check that the given [documentationComment] matches the first |
| 250 * Javadoc-style comment found in [text]. | 232 * Javadoc-style comment found in [text]. |
| 251 * | 233 * |
| 252 * Note that the algorithm for finding the Javadoc-style comment in [text] is | 234 * Note that the algorithm for finding the Javadoc-style comment in [text] is |
| 253 * a simple-minded text search; it is easily confused by corner cases such as | 235 * a simple-minded text search; it is easily confused by corner cases such as |
| 254 * strings containing comments, nested comments, etc. | 236 * strings containing comments, nested comments, etc. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 // Exported names must come from other libraries. | 270 // Exported names must come from other libraries. |
| 289 expect(exportName.dependency, isNot(0)); | 271 expect(exportName.dependency, isNot(0)); |
| 290 checkDependency(exportName.dependency, absoluteUri, relativeUri); | 272 checkDependency(exportName.dependency, absoluteUri, relativeUri); |
| 291 expect(exportName.name, expectedName); | 273 expect(exportName.name, expectedName); |
| 292 expect(exportName.kind, expectedKind); | 274 expect(exportName.kind, expectedKind); |
| 293 expect(exportName.unit, expectedTargetUnit); | 275 expect(exportName.unit, expectedTargetUnit); |
| 294 } | 276 } |
| 295 | 277 |
| 296 /** | 278 /** |
| 297 * Verify that the dependency table contains an entry for a file reachable | 279 * Verify that the dependency table contains an entry for a file reachable |
| 298 * via the given [absoluteUri] and [relativeUri]. If [fullyLinked] is | 280 * via the given [relativeUri]. If [fullyLinked] is |
| 299 * `true`, then the dependency should be a fully-linked dependency; otherwise | 281 * `true`, then the dependency should be a fully-linked dependency; otherwise |
| 300 * it should be a prelinked dependency. | 282 * it should be a prelinked dependency. |
| 301 * | 283 * |
| 302 * The index of the [LinkedDependency] is returned. | 284 * The index of the [LinkedDependency] is returned. |
| 303 */ | 285 */ |
| 304 int checkHasDependency(String absoluteUri, String relativeUri, | 286 int checkHasDependency(String relativeUri, {bool fullyLinked: false}) { |
| 305 {bool fullyLinked: false}) { | |
| 306 if (expectAbsoluteUrisInDependencies) { | |
| 307 // The element model doesn't (yet) store enough information to recover | |
| 308 // relative URIs, so we have to use the absolute URI. | |
| 309 // TODO(paulberry): fix this. | |
| 310 relativeUri = absoluteUri; | |
| 311 } | |
| 312 List<String> found = <String>[]; | 287 List<String> found = <String>[]; |
| 313 for (int i = 0; i < linked.dependencies.length; i++) { | 288 for (int i = 0; i < linked.dependencies.length; i++) { |
| 314 LinkedDependency dep = linked.dependencies[i]; | 289 LinkedDependency dep = linked.dependencies[i]; |
| 315 if (dep.uri == relativeUri) { | 290 if (dep.uri == relativeUri) { |
| 316 if (fullyLinked) { | 291 if (fullyLinked) { |
| 317 expect(i, greaterThanOrEqualTo(linked.numPrelinkedDependencies)); | 292 expect(i, greaterThanOrEqualTo(linked.numPrelinkedDependencies)); |
| 318 } else { | 293 } else { |
| 319 expect(i, lessThan(linked.numPrelinkedDependencies)); | 294 expect(i, lessThan(linked.numPrelinkedDependencies)); |
| 320 } | 295 } |
| 321 return i; | 296 return i; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 352 // A slot id should have been assigned but it should not be associated | 327 // A slot id should have been assigned but it should not be associated |
| 353 // with any type. | 328 // with any type. |
| 354 expect(slotId, isNot(0)); | 329 expect(slotId, isNot(0)); |
| 355 expect(getTypeRefForSlot(slotId, linkedSourceUnit: linkedSourceUnit), | 330 expect(getTypeRefForSlot(slotId, linkedSourceUnit: linkedSourceUnit), |
| 356 isNull); | 331 isNull); |
| 357 } | 332 } |
| 358 } | 333 } |
| 359 | 334 |
| 360 /** | 335 /** |
| 361 * Verify that the dependency table *does not* contain any entries for a file | 336 * Verify that the dependency table *does not* contain any entries for a file |
| 362 * reachable via the given [absoluteUri] and [relativeUri]. | 337 * reachable via the given [relativeUri]. |
| 363 */ | 338 */ |
| 364 void checkLacksDependency(String absoluteUri, String relativeUri) { | 339 void checkLacksDependency(String relativeUri) { |
| 365 if (expectAbsoluteUrisInDependencies) { | |
| 366 // The element model doesn't (yet) store enough information to recover | |
| 367 // relative URIs, so we have to use the absolute URI. | |
| 368 // TODO(paulberry): fix this. | |
| 369 relativeUri = absoluteUri; | |
| 370 } | |
| 371 for (LinkedDependency dep in linked.dependencies) { | 340 for (LinkedDependency dep in linked.dependencies) { |
| 372 if (dep.uri == relativeUri) { | 341 if (dep.uri == relativeUri) { |
| 373 fail('Unexpected dependency found: $relativeUri'); | 342 fail('Unexpected dependency found: $relativeUri'); |
| 374 } | 343 } |
| 375 } | 344 } |
| 376 } | 345 } |
| 377 | 346 |
| 378 /** | 347 /** |
| 379 * Verify that the given [typeRef] represents the type `dynamic`. | 348 * Verify that the given [typeRef] represents the type `dynamic`. |
| 380 */ | 349 */ |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 unlinkedSourceUnit: unlinkedSourceUnit); | 582 unlinkedSourceUnit: unlinkedSourceUnit); |
| 614 } | 583 } |
| 615 | 584 |
| 616 /** | 585 /** |
| 617 * Verify that the given [typeRef] represents the type `void`. | 586 * Verify that the given [typeRef] represents the type `void`. |
| 618 */ | 587 */ |
| 619 void checkVoidTypeRef(EntityRef typeRef) { | 588 void checkVoidTypeRef(EntityRef typeRef) { |
| 620 checkTypeRef(typeRef, null, null, 'void'); | 589 checkTypeRef(typeRef, null, null, 'void'); |
| 621 } | 590 } |
| 622 | 591 |
| 592 fail_invalid_prefix_dynamic() { |
| 593 // if (checkAstDerivedData) { |
| 594 // // TODO(paulberry): get this to work properly. |
| 595 // return; |
| 596 // } |
| 597 var t = serializeTypeText('dynamic.T', allowErrors: true); |
| 598 checkUnresolvedTypeRef(t, 'dynamic', 'T'); |
| 599 } |
| 600 |
| 601 fail_invalid_prefix_type_parameter() { |
| 602 // if (checkAstDerivedData) { |
| 603 // // TODO(paulberry): get this to work properly. |
| 604 // return; |
| 605 // } |
| 606 checkUnresolvedTypeRef( |
| 607 serializeClassText('class C<T> { T.U x; }', allowErrors: true) |
| 608 .fields[0] |
| 609 .type, |
| 610 'T', |
| 611 'U'); |
| 612 } |
| 613 |
| 614 fail_invalid_prefix_void() { |
| 615 // if (checkAstDerivedData) { |
| 616 // // TODO(paulberry): get this to work properly. |
| 617 // return; |
| 618 // } |
| 619 checkUnresolvedTypeRef( |
| 620 serializeTypeText('void.T', allowErrors: true), 'void', 'T'); |
| 621 } |
| 622 |
| 623 /** | 623 /** |
| 624 * Find the class with the given [className] in the summary, and return its | 624 * Find the class with the given [className] in the summary, and return its |
| 625 * [UnlinkedClass] data structure. If [unit] is not given, the class is | 625 * [UnlinkedClass] data structure. If [unit] is not given, the class is |
| 626 * looked for in the defining compilation unit. | 626 * looked for in the defining compilation unit. |
| 627 */ | 627 */ |
| 628 UnlinkedClass findClass(String className, | 628 UnlinkedClass findClass(String className, |
| 629 {bool failIfAbsent: false, UnlinkedUnit unit}) { | 629 {bool failIfAbsent: false, UnlinkedUnit unit}) { |
| 630 unit ??= unlinkedUnits[0]; | 630 unit ??= unlinkedUnits[0]; |
| 631 UnlinkedClass result; | 631 UnlinkedClass result; |
| 632 for (UnlinkedClass cls in unit.classes) { | 632 for (UnlinkedClass cls in unit.classes) { |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1356 addNamedSource('/a.dart', 'class C { D d; } class D {}'); | 1356 addNamedSource('/a.dart', 'class C { D d; } class D {}'); |
| 1357 // The closure has type `() => D`; `D` is defined in a library that is | 1357 // The closure has type `() => D`; `D` is defined in a library that is |
| 1358 // imported. | 1358 // imported. |
| 1359 UnlinkedExecutable executable = serializeExecutableText( | 1359 UnlinkedExecutable executable = serializeExecutableText( |
| 1360 'import "a.dart"; f() { print((() => new C().d)()); }'); | 1360 'import "a.dart"; f() { print((() => new C().d)()); }'); |
| 1361 expect(executable.localFunctions, hasLength(1)); | 1361 expect(executable.localFunctions, hasLength(1)); |
| 1362 expect(executable.localFunctions[0].returnType, isNull); | 1362 expect(executable.localFunctions[0].returnType, isNull); |
| 1363 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, | 1363 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, |
| 1364 absUri('/a.dart'), 'a.dart', 'D', | 1364 absUri('/a.dart'), 'a.dart', 'D', |
| 1365 onlyInStrongMode: false); | 1365 onlyInStrongMode: false); |
| 1366 checkHasDependency(absUri('/a.dart'), 'a.dart', fullyLinked: false); | 1366 checkHasDependency('a.dart', fullyLinked: false); |
| 1367 } | 1367 } |
| 1368 | 1368 |
| 1369 test_closure_executable_with_return_type_from_closure() { | 1369 test_closure_executable_with_return_type_from_closure() { |
| 1370 if (skipFullyLinkedData) { | 1370 if (skipFullyLinkedData) { |
| 1371 return; | 1371 return; |
| 1372 } | 1372 } |
| 1373 // The closure has type `() => () => int`, where the `() => int` part refers | 1373 // The closure has type `() => () => int`, where the `() => int` part refers |
| 1374 // to the nested closure. | 1374 // to the nested closure. |
| 1375 UnlinkedExecutable executable = serializeExecutableText(''' | 1375 UnlinkedExecutable executable = serializeExecutableText(''' |
| 1376 f() { | 1376 f() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1401 // The closure has type `() => D`; `D` is defined in a library that is not | 1401 // The closure has type `() => D`; `D` is defined in a library that is not |
| 1402 // imported. | 1402 // imported. |
| 1403 UnlinkedExecutable executable = serializeExecutableText( | 1403 UnlinkedExecutable executable = serializeExecutableText( |
| 1404 'import "a.dart"; f() { print((() => new C().d)()); }'); | 1404 'import "a.dart"; f() { print((() => new C().d)()); }'); |
| 1405 expect(executable.localFunctions, hasLength(1)); | 1405 expect(executable.localFunctions, hasLength(1)); |
| 1406 expect(executable.localFunctions[0].returnType, isNull); | 1406 expect(executable.localFunctions[0].returnType, isNull); |
| 1407 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, | 1407 checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot, |
| 1408 absUri('/b.dart'), 'b.dart', 'D', | 1408 absUri('/b.dart'), 'b.dart', 'D', |
| 1409 onlyInStrongMode: false); | 1409 onlyInStrongMode: false); |
| 1410 if (!skipFullyLinkedData) { | 1410 if (!skipFullyLinkedData) { |
| 1411 checkHasDependency(absUri('/b.dart'), 'b.dart', fullyLinked: true); | 1411 checkHasDependency('b.dart', fullyLinked: true); |
| 1412 } | 1412 } |
| 1413 } | 1413 } |
| 1414 | 1414 |
| 1415 test_constExpr_binary_add() { | 1415 test_constExpr_binary_add() { |
| 1416 UnlinkedVariable variable = serializeVariableText('const v = 1 + 2;'); | 1416 UnlinkedVariable variable = serializeVariableText('const v = 1 + 2;'); |
| 1417 _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [ | 1417 _assertUnlinkedConst(variable.initializer.bodyExpr, operators: [ |
| 1418 UnlinkedConstOperation.pushInt, | 1418 UnlinkedConstOperation.pushInt, |
| 1419 UnlinkedConstOperation.pushInt, | 1419 UnlinkedConstOperation.pushInt, |
| 1420 UnlinkedConstOperation.add | 1420 UnlinkedConstOperation.add |
| 1421 ], ints: [ | 1421 ], ints: [ |
| (...skipping 3270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4692 } | 4692 } |
| 4693 | 4693 |
| 4694 test_dependencies_export_to_export_unused() { | 4694 test_dependencies_export_to_export_unused() { |
| 4695 addNamedSource('/a.dart', 'export "b.dart";'); | 4695 addNamedSource('/a.dart', 'export "b.dart";'); |
| 4696 addNamedSource('/b.dart', ''); | 4696 addNamedSource('/b.dart', ''); |
| 4697 serializeLibraryText('export "a.dart";'); | 4697 serializeLibraryText('export "a.dart";'); |
| 4698 // The main test library depends on b.dart, even though it doesn't | 4698 // The main test library depends on b.dart, even though it doesn't |
| 4699 // re-export any names defined in b.dart, because a change to b.dart might | 4699 // re-export any names defined in b.dart, because a change to b.dart might |
| 4700 // cause it to start exporting a name that the main test library *does* | 4700 // cause it to start exporting a name that the main test library *does* |
| 4701 // use. | 4701 // use. |
| 4702 checkHasDependency(absUri('/b.dart'), 'b.dart'); | 4702 checkHasDependency('b.dart'); |
| 4703 } | 4703 } |
| 4704 | 4704 |
| 4705 test_dependencies_export_unused() { | 4705 test_dependencies_export_unused() { |
| 4706 addNamedSource('/a.dart', ''); | 4706 addNamedSource('/a.dart', ''); |
| 4707 serializeLibraryText('export "a.dart";'); | 4707 serializeLibraryText('export "a.dart";'); |
| 4708 // The main test library depends on a.dart, even though it doesn't | 4708 // The main test library depends on a.dart, even though it doesn't |
| 4709 // re-export any names defined in a.dart, because a change to a.dart might | 4709 // re-export any names defined in a.dart, because a change to a.dart might |
| 4710 // cause it to start exporting a name that the main test library *will* | 4710 // cause it to start exporting a name that the main test library *will* |
| 4711 // re-export. | 4711 // re-export. |
| 4712 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4712 checkHasDependency('a.dart'); |
| 4713 } | 4713 } |
| 4714 | 4714 |
| 4715 test_dependencies_import_to_export() { | 4715 test_dependencies_import_to_export() { |
| 4716 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); | 4716 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); |
| 4717 addNamedSource('/b.dart', 'library b;'); | 4717 addNamedSource('/b.dart', 'library b;'); |
| 4718 serializeLibraryText('import "a.dart"; A a;'); | 4718 serializeLibraryText('import "a.dart"; A a;'); |
| 4719 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4719 checkHasDependency('a.dart'); |
| 4720 // The main test library depends on b.dart, because names defined in | 4720 // The main test library depends on b.dart, because names defined in |
| 4721 // b.dart are exported by a.dart. | 4721 // b.dart are exported by a.dart. |
| 4722 checkHasDependency(absUri('/b.dart'), 'b.dart'); | 4722 checkHasDependency('b.dart'); |
| 4723 } | 4723 } |
| 4724 | 4724 |
| 4725 test_dependencies_import_to_export_in_subdirs_absolute_export() { | 4725 test_dependencies_import_to_export_in_subdirs_absolute_export() { |
| 4726 addNamedSource('/a/a.dart', | 4726 addNamedSource('/a/a.dart', |
| 4727 'library a; export "${absUri('/a/b/b.dart')}"; class A {}'); | 4727 'library a; export "${absUri('/a/b/b.dart')}"; class A {}'); |
| 4728 addNamedSource('/a/b/b.dart', 'library b;'); | 4728 addNamedSource('/a/b/b.dart', 'library b;'); |
| 4729 serializeLibraryText('import "a/a.dart"; A a;'); | 4729 serializeLibraryText('import "a/a.dart"; A a;'); |
| 4730 checkHasDependency(absUri('/a/a.dart'), 'a/a.dart'); | 4730 checkHasDependency('a/a.dart'); |
| 4731 // The main test library depends on b.dart, because names defined in | 4731 // The main test library depends on b.dart, because names defined in |
| 4732 // b.dart are exported by a.dart. | 4732 // b.dart are exported by a.dart. |
| 4733 checkHasDependency(absUri('/a/b/b.dart'), absUri('/a/b/b.dart')); | 4733 checkHasDependency(absUri('/a/b/b.dart')); |
| 4734 } | 4734 } |
| 4735 | 4735 |
| 4736 test_dependencies_import_to_export_in_subdirs_absolute_import() { | 4736 test_dependencies_import_to_export_in_subdirs_absolute_import() { |
| 4737 addNamedSource('/a/a.dart', 'library a; export "b/b.dart"; class A {}'); | 4737 addNamedSource('/a/a.dart', 'library a; export "b/b.dart"; class A {}'); |
| 4738 addNamedSource('/a/b/b.dart', 'library b;'); | 4738 addNamedSource('/a/b/b.dart', 'library b;'); |
| 4739 serializeLibraryText('import "${absUri('/a/a.dart')}"; A a;'); | 4739 serializeLibraryText('import "${absUri('/a/a.dart')}"; A a;'); |
| 4740 checkHasDependency(absUri('/a/a.dart'), absUri('/a/a.dart')); | 4740 checkHasDependency(absUri('/a/a.dart')); |
| 4741 // The main test library depends on b.dart, because names defined in | 4741 // The main test library depends on b.dart, because names defined in |
| 4742 // b.dart are exported by a.dart. | 4742 // b.dart are exported by a.dart. |
| 4743 checkHasDependency(absUri('/a/b/b.dart'), absUri('/a/b/b.dart')); | 4743 checkHasDependency(absUri('/a/b/b.dart')); |
| 4744 } | 4744 } |
| 4745 | 4745 |
| 4746 test_dependencies_import_to_export_in_subdirs_relative() { | 4746 test_dependencies_import_to_export_in_subdirs_relative() { |
| 4747 addNamedSource('/a/a.dart', 'library a; export "b/b.dart"; class A {}'); | 4747 addNamedSource('/a/a.dart', 'library a; export "b/b.dart"; class A {}'); |
| 4748 addNamedSource('/a/b/b.dart', 'library b;'); | 4748 addNamedSource('/a/b/b.dart', 'library b;'); |
| 4749 serializeLibraryText('import "a/a.dart"; A a;'); | 4749 serializeLibraryText('import "a/a.dart"; A a;'); |
| 4750 checkHasDependency(absUri('/a/a.dart'), 'a/a.dart'); | 4750 checkHasDependency('a/a.dart'); |
| 4751 // The main test library depends on b.dart, because names defined in | 4751 // The main test library depends on b.dart, because names defined in |
| 4752 // b.dart are exported by a.dart. | 4752 // b.dart are exported by a.dart. |
| 4753 checkHasDependency(absUri('/a/b/b.dart'), 'a/b/b.dart'); | 4753 checkHasDependency('a/b/b.dart'); |
| 4754 } | 4754 } |
| 4755 | 4755 |
| 4756 test_dependencies_import_to_export_loop() { | 4756 test_dependencies_import_to_export_loop() { |
| 4757 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); | 4757 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); |
| 4758 addNamedSource('/b.dart', 'library b; export "a.dart";'); | 4758 addNamedSource('/b.dart', 'library b; export "a.dart";'); |
| 4759 serializeLibraryText('import "a.dart"; A a;'); | 4759 serializeLibraryText('import "a.dart"; A a;'); |
| 4760 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4760 checkHasDependency('a.dart'); |
| 4761 // Serialization should have been able to walk the transitive export | 4761 // Serialization should have been able to walk the transitive export |
| 4762 // dependencies to b.dart without going into an infinite loop. | 4762 // dependencies to b.dart without going into an infinite loop. |
| 4763 checkHasDependency(absUri('/b.dart'), 'b.dart'); | 4763 checkHasDependency('b.dart'); |
| 4764 } | 4764 } |
| 4765 | 4765 |
| 4766 test_dependencies_import_to_export_transitive_closure() { | 4766 test_dependencies_import_to_export_transitive_closure() { |
| 4767 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); | 4767 addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}'); |
| 4768 addNamedSource('/b.dart', 'library b; export "c.dart";'); | 4768 addNamedSource('/b.dart', 'library b; export "c.dart";'); |
| 4769 addNamedSource('/c.dart', 'library c;'); | 4769 addNamedSource('/c.dart', 'library c;'); |
| 4770 serializeLibraryText('import "a.dart"; A a;'); | 4770 serializeLibraryText('import "a.dart"; A a;'); |
| 4771 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4771 checkHasDependency('a.dart'); |
| 4772 // The main test library depends on c.dart, because names defined in | 4772 // The main test library depends on c.dart, because names defined in |
| 4773 // c.dart are exported by b.dart and then re-exported by a.dart. | 4773 // c.dart are exported by b.dart and then re-exported by a.dart. |
| 4774 checkHasDependency(absUri('/c.dart'), 'c.dart'); | 4774 checkHasDependency('c.dart'); |
| 4775 } | 4775 } |
| 4776 | 4776 |
| 4777 test_dependencies_import_to_export_unused() { | 4777 test_dependencies_import_to_export_unused() { |
| 4778 addNamedSource('/a.dart', 'export "b.dart";'); | 4778 addNamedSource('/a.dart', 'export "b.dart";'); |
| 4779 addNamedSource('/b.dart', ''); | 4779 addNamedSource('/b.dart', ''); |
| 4780 serializeLibraryText('import "a.dart";', allowErrors: true); | 4780 serializeLibraryText('import "a.dart";', allowErrors: true); |
| 4781 // The main test library depends on b.dart, even though it doesn't use any | 4781 // The main test library depends on b.dart, even though it doesn't use any |
| 4782 // names defined in b.dart, because a change to b.dart might cause it to | 4782 // names defined in b.dart, because a change to b.dart might cause it to |
| 4783 // start exporting a name that the main test library *does* use. | 4783 // start exporting a name that the main test library *does* use. |
| 4784 checkHasDependency(absUri('/b.dart'), 'b.dart'); | 4784 checkHasDependency('b.dart'); |
| 4785 } | 4785 } |
| 4786 | 4786 |
| 4787 test_dependencies_import_transitive_closure() { | 4787 test_dependencies_import_transitive_closure() { |
| 4788 addNamedSource( | 4788 addNamedSource( |
| 4789 '/a.dart', 'library a; import "b.dart"; class A extends B {}'); | 4789 '/a.dart', 'library a; import "b.dart"; class A extends B {}'); |
| 4790 addNamedSource('/b.dart', 'library b; class B {}'); | 4790 addNamedSource('/b.dart', 'library b; class B {}'); |
| 4791 serializeLibraryText('import "a.dart"; A a;'); | 4791 serializeLibraryText('import "a.dart"; A a;'); |
| 4792 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4792 checkHasDependency('a.dart'); |
| 4793 // The main test library doesn't depend on b.dart, because no change to | 4793 // The main test library doesn't depend on b.dart, because no change to |
| 4794 // b.dart can possibly affect the serialized element model for it. | 4794 // b.dart can possibly affect the serialized element model for it. |
| 4795 checkLacksDependency(absUri('/b.dart'), 'b.dart'); | 4795 checkLacksDependency('b.dart'); |
| 4796 } | 4796 } |
| 4797 | 4797 |
| 4798 test_dependencies_import_unused() { | 4798 test_dependencies_import_unused() { |
| 4799 addNamedSource('/a.dart', ''); | 4799 addNamedSource('/a.dart', ''); |
| 4800 serializeLibraryText('import "a.dart";', allowErrors: true); | 4800 serializeLibraryText('import "a.dart";', allowErrors: true); |
| 4801 // The main test library depends on a.dart, even though it doesn't use any | 4801 // The main test library depends on a.dart, even though it doesn't use any |
| 4802 // names defined in a.dart, because a change to a.dart might cause it to | 4802 // names defined in a.dart, because a change to a.dart might cause it to |
| 4803 // start exporting a name that the main test library *does* use. | 4803 // start exporting a name that the main test library *does* use. |
| 4804 checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4804 checkHasDependency('a.dart'); |
| 4805 } | 4805 } |
| 4806 | 4806 |
| 4807 test_dependencies_parts() { | 4807 test_dependencies_parts() { |
| 4808 addNamedSource( | 4808 addNamedSource( |
| 4809 '/a.dart', 'library a; part "b.dart"; part "c.dart"; class A {}'); | 4809 '/a.dart', 'library a; part "b.dart"; part "c.dart"; class A {}'); |
| 4810 addNamedSource('/b.dart', 'part of a;'); | 4810 addNamedSource('/b.dart', 'part of a;'); |
| 4811 addNamedSource('/c.dart', 'part of a;'); | 4811 addNamedSource('/c.dart', 'part of a;'); |
| 4812 serializeLibraryText('import "a.dart"; A a;'); | 4812 serializeLibraryText('import "a.dart"; A a;'); |
| 4813 int dep = checkHasDependency(absUri('/a.dart'), 'a.dart'); | 4813 int dep = checkHasDependency('a.dart'); |
| 4814 checkDependencyParts(linked.dependencies[dep], | 4814 checkDependencyParts(linked.dependencies[dep], ['b.dart', 'c.dart']); |
| 4815 [absUri('/b.dart'), absUri('/c.dart')], ['b.dart', 'c.dart']); | |
| 4816 } | 4815 } |
| 4817 | 4816 |
| 4818 test_dependencies_parts_relative_to_importing_library() { | 4817 test_dependencies_parts_relative_to_importing_library() { |
| 4819 addNamedSource('/a/b.dart', 'export "c/d.dart";'); | 4818 addNamedSource('/a/b.dart', 'export "c/d.dart";'); |
| 4820 addNamedSource('/a/c/d.dart', | 4819 addNamedSource('/a/c/d.dart', |
| 4821 'library d; part "e/f.dart"; part "g/h.dart"; class D {}'); | 4820 'library d; part "e/f.dart"; part "g/h.dart"; class D {}'); |
| 4822 addNamedSource('/a/c/e/f.dart', 'part of d;'); | 4821 addNamedSource('/a/c/e/f.dart', 'part of d;'); |
| 4823 addNamedSource('/a/c/g/h.dart', 'part of d;'); | 4822 addNamedSource('/a/c/g/h.dart', 'part of d;'); |
| 4824 serializeLibraryText('import "a/b.dart"; D d;'); | 4823 serializeLibraryText('import "a/b.dart"; D d;'); |
| 4825 int dep = checkHasDependency(absUri('/a/c/d.dart'), 'a/c/d.dart'); | 4824 int dep = checkHasDependency('a/c/d.dart'); |
| 4826 checkDependencyParts( | 4825 checkDependencyParts( |
| 4827 linked.dependencies[dep], | 4826 linked.dependencies[dep], ['a/c/e/f.dart', 'a/c/g/h.dart']); |
| 4828 [absUri('/a/c/e/f.dart'), absUri('/a/c/g/h.dart')], | |
| 4829 ['a/c/e/f.dart', 'a/c/g/h.dart']); | |
| 4830 } | 4827 } |
| 4831 | 4828 |
| 4832 test_elements_in_part() { | 4829 test_elements_in_part() { |
| 4833 addNamedSource( | 4830 addNamedSource( |
| 4834 '/part1.dart', | 4831 '/part1.dart', |
| 4835 ''' | 4832 ''' |
| 4836 part of my.lib; | 4833 part of my.lib; |
| 4837 | 4834 |
| 4838 class C {} | 4835 class C {} |
| 4839 enum E { v } | 4836 enum E { v } |
| (...skipping 2945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7785 test_implicit_dependencies_follow_other_dependencies() { | 7782 test_implicit_dependencies_follow_other_dependencies() { |
| 7786 if (skipFullyLinkedData) { | 7783 if (skipFullyLinkedData) { |
| 7787 return; | 7784 return; |
| 7788 } | 7785 } |
| 7789 addNamedSource('/a.dart', 'import "b.dart"; class C {} D f() => null;'); | 7786 addNamedSource('/a.dart', 'import "b.dart"; class C {} D f() => null;'); |
| 7790 addNamedSource('/b.dart', 'class D {}'); | 7787 addNamedSource('/b.dart', 'class D {}'); |
| 7791 serializeLibraryText('import "a.dart"; final x = f(); C y;'); | 7788 serializeLibraryText('import "a.dart"; final x = f(); C y;'); |
| 7792 // The dependency on b.dart is implicit, so it should be placed at the end | 7789 // The dependency on b.dart is implicit, so it should be placed at the end |
| 7793 // of the dependency list, after a.dart, even though the code that refers | 7790 // of the dependency list, after a.dart, even though the code that refers |
| 7794 // to b.dart comes before the code that refers to a.dart. | 7791 // to b.dart comes before the code that refers to a.dart. |
| 7795 int aDep = | 7792 int aDep = checkHasDependency('a.dart', fullyLinked: false); |
| 7796 checkHasDependency(absUri('/a.dart'), 'a.dart', fullyLinked: false); | 7793 int bDep = checkHasDependency('b.dart', fullyLinked: true); |
| 7797 int bDep = | |
| 7798 checkHasDependency(absUri('/b.dart'), 'b.dart', fullyLinked: true); | |
| 7799 expect(aDep, lessThan(bDep)); | 7794 expect(aDep, lessThan(bDep)); |
| 7800 } | 7795 } |
| 7801 | 7796 |
| 7802 test_import_configurations() { | 7797 test_import_configurations() { |
| 7803 addNamedSource('/foo.dart', 'bar() {}'); | 7798 addNamedSource('/foo.dart', 'bar() {}'); |
| 7804 addNamedSource('/foo_io.dart', 'bar() {}'); | 7799 addNamedSource('/foo_io.dart', 'bar() {}'); |
| 7805 addNamedSource('/foo_html.dart', 'bar() {}'); | 7800 addNamedSource('/foo_html.dart', 'bar() {}'); |
| 7806 String libraryText = r''' | 7801 String libraryText = r''' |
| 7807 import 'foo.dart' | 7802 import 'foo.dart' |
| 7808 if (dart.library.io) 'foo_io.dart' | 7803 if (dart.library.io) 'foo_io.dart' |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8372 // The synthetic executable for `v` has type `() => D`; `D` is defined in | 8367 // The synthetic executable for `v` has type `() => D`; `D` is defined in |
| 8373 // a library that is imported. Note: `v` is mis-typed as `int` to prevent | 8368 // a library that is imported. Note: `v` is mis-typed as `int` to prevent |
| 8374 // type propagation, which would complicate the test. | 8369 // type propagation, which would complicate the test. |
| 8375 UnlinkedVariable variable = serializeVariableText( | 8370 UnlinkedVariable variable = serializeVariableText( |
| 8376 'import "a.dart"; int v = new C().d;', | 8371 'import "a.dart"; int v = new C().d;', |
| 8377 allowErrors: true); | 8372 allowErrors: true); |
| 8378 expect(variable.initializer.returnType, isNull); | 8373 expect(variable.initializer.returnType, isNull); |
| 8379 checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot, | 8374 checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot, |
| 8380 absUri('/a.dart'), 'a.dart', 'D', | 8375 absUri('/a.dart'), 'a.dart', 'D', |
| 8381 onlyInStrongMode: false); | 8376 onlyInStrongMode: false); |
| 8382 checkHasDependency(absUri('/a.dart'), 'a.dart', fullyLinked: false); | 8377 checkHasDependency('a.dart', fullyLinked: false); |
| 8383 } | 8378 } |
| 8384 | 8379 |
| 8385 test_initializer_executable_with_return_type_from_closure() { | 8380 test_initializer_executable_with_return_type_from_closure() { |
| 8386 if (skipFullyLinkedData) { | 8381 if (skipFullyLinkedData) { |
| 8387 return; | 8382 return; |
| 8388 } | 8383 } |
| 8389 // The synthetic executable for `v` has type `() => () => int`, where the | 8384 // The synthetic executable for `v` has type `() => () => int`, where the |
| 8390 // `() => int` part refers to the closure declared inside the initializer | 8385 // `() => int` part refers to the closure declared inside the initializer |
| 8391 // for v. Note: `v` is mis-typed as `int` to prevent type propagation, | 8386 // for v. Note: `v` is mis-typed as `int` to prevent type propagation, |
| 8392 // which would complicate the test. | 8387 // which would complicate the test. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8483 // a library that is not imported. Note: `v` is mis-typed as `int` to | 8478 // a library that is not imported. Note: `v` is mis-typed as `int` to |
| 8484 // prevent type propagation, which would complicate the test. | 8479 // prevent type propagation, which would complicate the test. |
| 8485 UnlinkedVariable variable = serializeVariableText( | 8480 UnlinkedVariable variable = serializeVariableText( |
| 8486 'import "a.dart"; int v = new C().d;', | 8481 'import "a.dart"; int v = new C().d;', |
| 8487 allowErrors: true); | 8482 allowErrors: true); |
| 8488 expect(variable.initializer.returnType, isNull); | 8483 expect(variable.initializer.returnType, isNull); |
| 8489 checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot, | 8484 checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot, |
| 8490 absUri('/b.dart'), 'b.dart', 'D', | 8485 absUri('/b.dart'), 'b.dart', 'D', |
| 8491 onlyInStrongMode: false); | 8486 onlyInStrongMode: false); |
| 8492 if (!skipFullyLinkedData) { | 8487 if (!skipFullyLinkedData) { |
| 8493 checkHasDependency(absUri('/b.dart'), 'b.dart', fullyLinked: true); | 8488 checkHasDependency('b.dart', fullyLinked: true); |
| 8494 } | 8489 } |
| 8495 } | 8490 } |
| 8496 | 8491 |
| 8497 fail_invalid_prefix_dynamic() { | |
| 8498 // if (checkAstDerivedData) { | |
| 8499 // // TODO(paulberry): get this to work properly. | |
| 8500 // return; | |
| 8501 // } | |
| 8502 var t = serializeTypeText('dynamic.T', allowErrors: true); | |
| 8503 checkUnresolvedTypeRef(t, 'dynamic', 'T'); | |
| 8504 } | |
| 8505 | |
| 8506 fail_invalid_prefix_type_parameter() { | |
| 8507 // if (checkAstDerivedData) { | |
| 8508 // // TODO(paulberry): get this to work properly. | |
| 8509 // return; | |
| 8510 // } | |
| 8511 checkUnresolvedTypeRef( | |
| 8512 serializeClassText('class C<T> { T.U x; }', allowErrors: true) | |
| 8513 .fields[0] | |
| 8514 .type, | |
| 8515 'T', | |
| 8516 'U'); | |
| 8517 } | |
| 8518 | |
| 8519 fail_invalid_prefix_void() { | |
| 8520 // if (checkAstDerivedData) { | |
| 8521 // // TODO(paulberry): get this to work properly. | |
| 8522 // return; | |
| 8523 // } | |
| 8524 checkUnresolvedTypeRef( | |
| 8525 serializeTypeText('void.T', allowErrors: true), 'void', 'T'); | |
| 8526 } | |
| 8527 | |
| 8528 test_library_documented() { | 8492 test_library_documented() { |
| 8529 String text = ''' | 8493 String text = ''' |
| 8530 // Extra comment so doc comment offset != 0 | 8494 // Extra comment so doc comment offset != 0 |
| 8531 /** | 8495 /** |
| 8532 * Docs | 8496 * Docs |
| 8533 */ | 8497 */ |
| 8534 library foo;'''; | 8498 library foo;'''; |
| 8535 serializeLibraryText(text); | 8499 serializeLibraryText(text); |
| 8536 expect(unlinkedUnits[0].libraryDocumentationComment, isNotNull); | 8500 expect(unlinkedUnits[0].libraryDocumentationComment, isNotNull); |
| 8537 checkDocumentationComment( | 8501 checkDocumentationComment( |
| (...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10337 class _PrefixExpectation { | 10301 class _PrefixExpectation { |
| 10338 final ReferenceKind kind; | 10302 final ReferenceKind kind; |
| 10339 final String name; | 10303 final String name; |
| 10340 final String absoluteUri; | 10304 final String absoluteUri; |
| 10341 final String relativeUri; | 10305 final String relativeUri; |
| 10342 final int numTypeParameters; | 10306 final int numTypeParameters; |
| 10343 | 10307 |
| 10344 _PrefixExpectation(this.kind, this.name, | 10308 _PrefixExpectation(this.kind, this.name, |
| 10345 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0}); | 10309 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0}); |
| 10346 } | 10310 } |
| OLD | NEW |