| Index: pkg/analyzer/test/src/summary/pub_summary_test.dart
|
| diff --git a/pkg/analyzer/test/src/summary/pub_summary_test.dart b/pkg/analyzer/test/src/summary/pub_summary_test.dart
|
| index 1363fa325376fe430365d778e17128ec3b4fe80b..42432b92a012e2258717f21fcff84f86f6c87a36 100644
|
| --- a/pkg/analyzer/test/src/summary/pub_summary_test.dart
|
| +++ b/pkg/analyzer/test/src/summary/pub_summary_test.dart
|
| @@ -35,7 +35,286 @@ class PubSummaryManagerTest extends AbstractContextTest {
|
| manager = new PubSummaryManager(resourceProvider, '_.temp');
|
| }
|
|
|
| - test_getLinkedBundles_noCycles() async {
|
| + test_getLinkedBundles_hasCycle() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'package:bbb/b.dart';
|
| +class A {}
|
| +int a1;
|
| +B a2;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/bbb/lib/b.dart',
|
| + '''
|
| +import 'package:ccc/c.dart';
|
| +class B {}
|
| +C b;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/ccc/lib/c.dart',
|
| + '''
|
| +import 'package:aaa/a.dart';
|
| +import 'package:ddd/d.dart';
|
| +class C {}
|
| +A c1;
|
| +D c2;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/ddd/lib/d.dart',
|
| + '''
|
| +class D {}
|
| +String d;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
|
| + Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib');
|
| + Folder libFolderD = resourceProvider.newFolder('$CACHE/ddd/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + 'bbb': [libFolderB],
|
| + 'ccc': [libFolderC],
|
| + 'ddd': [libFolderD],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Now we should be able to get linked bundles.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(4));
|
| +
|
| + // package:aaa
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
|
| + expect(linkedPackage.linked.linkedLibraryUris, ['package:aaa/a.dart']);
|
| + _assertHasLinkedVariable(linkedPackage, 'a1', 'int', 'dart:core');
|
| + _assertHasLinkedVariable(linkedPackage, 'a2', 'B', 'package:bbb/b.dart');
|
| + }
|
| +
|
| + // package:bbb
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
|
| + expect(linkedPackage.linked.linkedLibraryUris, ['package:bbb/b.dart']);
|
| + _assertHasLinkedVariable(linkedPackage, 'b', 'C', 'package:ccc/c.dart');
|
| + }
|
| +
|
| + // package:ccc
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
|
| + expect(linkedPackage.linked.linkedLibraryUris, ['package:ccc/c.dart']);
|
| + _assertHasLinkedVariable(linkedPackage, 'c1', 'A', 'package:aaa/a.dart');
|
| + _assertHasLinkedVariable(linkedPackage, 'c2', 'D', 'package:ddd/d.dart');
|
| + }
|
| +
|
| + // package:ddd
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'ddd');
|
| + expect(linkedPackage.linked.linkedLibraryUris, ['package:ddd/d.dart']);
|
| + _assertHasLinkedVariable(linkedPackage, 'd', 'String', 'dart:core');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_missingBundle() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +int a;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/bbb/lib/b.dart',
|
| + '''
|
| +import 'package:ccc/c.dart';
|
| +C b;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + 'bbb': [libFolderB],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Try to link.
|
| + // Only 'aaa' can be linked, because 'bbb' references not available 'ccc'.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(1));
|
| +
|
| + // package:aaa
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
|
| + _assertHasLinkedVariable(linkedPackage, 'a', 'int', 'dart:core');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_missingBundle_chained() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'package:bbb/b.dart';
|
| +int a;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/bbb/lib/b.dart',
|
| + '''
|
| +import 'package:ccc/c.dart';
|
| +int b;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + 'bbb': [libFolderB],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Try to link.
|
| + // No linked libraries, because 'aaa' needs 'bbb', and 'bbb' needs 'ccc'.
|
| + // But 'ccc' is not available, so the whole chain cannot be linked.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, isEmpty);
|
| + }
|
| +
|
| + test_getLinkedBundles_missingLibrary() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'package:bbb/b2.dart';
|
| +int a;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/bbb/lib/b.dart',
|
| + '''
|
| +class B {}
|
| +int b = 42;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + 'bbb': [libFolderB],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Try to link.
|
| + // Only 'bbb', because 'aaa' references 'package:bbb/b2.dart', which does
|
| + // not exist in the bundle 'bbb'.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(1));
|
| +
|
| + // package:bbb
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
|
| + _assertHasLinkedVariable(linkedPackage, 'b', 'int', 'dart:core');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_missingLibrary_hasCycle() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'package:bbb/b.dart';
|
| +int a;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/bbb/lib/b.dart',
|
| + '''
|
| +import 'package:aaa/a.dart';
|
| +import 'package:ccc/c2.dart';
|
| +class B {}
|
| +int b;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/ccc/lib/c.dart',
|
| + '''
|
| +class C {}
|
| +int c;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + Folder libFolderB = resourceProvider.newFolder('$CACHE/bbb/lib');
|
| + Folder libFolderC = resourceProvider.newFolder('$CACHE/ccc/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + 'bbb': [libFolderB],
|
| + 'ccc': [libFolderC],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Try to link.
|
| + // Only 'ccc' is linked.
|
| + // The 'aaa' + 'bbb' cycle cannot be linked because 'bbb' references
|
| + // 'package:ccc/c2.dart', which does not exist in the bundle 'ccc'.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(1));
|
| +
|
| + // package:ccc
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
|
| + _assertHasLinkedVariable(linkedPackage, 'c', 'int', 'dart:core');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_noCycle() async {
|
| resourceProvider.newFile(
|
| '$CACHE/aaa/lib/a.dart',
|
| '''
|
| @@ -75,47 +354,97 @@ A b;
|
| {
|
| LinkedPubPackage linkedPackage = linkedPackages
|
| .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
|
| - PackageBundle unlinked = linkedPackage.unlinked;
|
| - PackageBundle linked = linkedPackage.linked;
|
| - expect(unlinked, isNotNull);
|
| - expect(linked, isNotNull);
|
| - expect(unlinked.unlinkedUnitUris, ['package:aaa/a.dart']);
|
| - expect(linked.linkedLibraryUris, ['package:aaa/a.dart']);
|
| - // Prepare linked `package:aaa/a.dart`.
|
| - UnlinkedUnit unlinkedUnitA = unlinked.unlinkedUnits[0];
|
| - LinkedLibrary linkedLibraryA = linked.linkedLibraries[0];
|
| - LinkedUnit linkedUnitA = linkedLibraryA.units[0];
|
| - // int a;
|
| - {
|
| - UnlinkedVariable a = unlinkedUnitA.variables[0];
|
| - expect(a.name, 'a');
|
| - _assertLinkedNameReference(unlinkedUnitA, linkedLibraryA, linkedUnitA,
|
| - a.type.reference, 'int', 'dart:core');
|
| - }
|
| + _assertHasLinkedVariable(linkedPackage, 'a', 'int', 'dart:core');
|
| }
|
|
|
| // package:bbb
|
| {
|
| LinkedPubPackage linkedPackage = linkedPackages
|
| .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
|
| - PackageBundle unlinked = linkedPackage.unlinked;
|
| - PackageBundle linked = linkedPackage.linked;
|
| - expect(unlinked, isNotNull);
|
| - expect(linked, isNotNull);
|
| - expect(unlinked.unlinkedUnitUris, ['package:bbb/b.dart']);
|
| - expect(linked.linkedLibraryUris, ['package:bbb/b.dart']);
|
| - // Prepare linked `package:bbb/b.dart`.
|
| - UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[0];
|
| - LinkedLibrary linkedLibrary = linked.linkedLibraries[0];
|
| - LinkedUnit linkedUnit = linkedLibrary.units[0];
|
| - // A b;
|
| - {
|
| - UnlinkedVariable b = unlinkedUnit.variables[0];
|
| - expect(b.name, 'b');
|
| - _assertLinkedNameReference(unlinkedUnit, linkedLibrary, linkedUnit,
|
| - b.type.reference, 'A', 'package:aaa/a.dart');
|
| - }
|
| + _assertHasLinkedVariable(linkedPackage, 'b', 'A', 'package:aaa/a.dart');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_noCycle_relativeUri() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'src/a2.dart';
|
| +A a;
|
| +''');
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/src/a2.dart',
|
| + '''
|
| +class A {}
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Link.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(1));
|
| +
|
| + // package:aaa
|
| + {
|
| + LinkedPubPackage linkedPackage = linkedPackages
|
| + .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
|
| + _assertHasLinkedVariable(linkedPackage, 'a', 'A', 'src/a2.dart');
|
| + }
|
| + }
|
| +
|
| + test_getLinkedBundles_wrongScheme() async {
|
| + resourceProvider.newFile(
|
| + '$CACHE/aaa/lib/a.dart',
|
| + '''
|
| +import 'xxx:yyy/zzz.dart';
|
| +Z a;
|
| +''');
|
| +
|
| + // Configure packages resolution.
|
| + Folder libFolderA = resourceProvider.newFolder('$CACHE/aaa/lib');
|
| + context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + sdkResolver,
|
| + resourceResolver,
|
| + new PackageMapUriResolver(resourceProvider, {
|
| + 'aaa': [libFolderA],
|
| + })
|
| + ]);
|
| +
|
| + // Ensure unlinked bundles.
|
| + manager.getUnlinkedBundles(context);
|
| + await manager.onUnlinkedComplete;
|
| +
|
| + // Try to link.
|
| + // The package 'aaa' cannot be linked because it uses not 'dart' or
|
| + // 'package' import URI scheme.
|
| + PackageBundle sdkBundle = getSdkBundle(sdk);
|
| + List<LinkedPubPackage> linkedPackages =
|
| + manager.getLinkedBundles(context, sdkBundle);
|
| + expect(linkedPackages, hasLength(0));
|
| + }
|
| +
|
| + test_getPackageName() {
|
| + String getPackageName(String uriStr) {
|
| + return PubSummaryManager.getPackageName(uriStr);
|
| }
|
| + expect(getPackageName('package:foo/bar.dart'), 'foo');
|
| + expect(getPackageName('package:foo/bar/baz.dart'), 'foo');
|
| + expect(getPackageName('wrong:foo/bar.dart'), isNull);
|
| + expect(getPackageName('package:foo'), isNull);
|
| }
|
|
|
| test_getUnlinkedBundles() async {
|
| @@ -224,18 +553,40 @@ class B {}
|
| expect(folder.getChildAssumingFile(fileName).exists, isTrue);
|
| }
|
|
|
| - void _assertLinkedNameReference(
|
| - UnlinkedUnit unlinkedUnit,
|
| - LinkedLibrary linkedLibrary,
|
| - LinkedUnit linkedUnit,
|
| - int typeNameReference,
|
| - String expectedName,
|
| - String expectedDependencyUri) {
|
| - expect(unlinkedUnit.references[typeNameReference].name, expectedName);
|
| - int typeNameDependency =
|
| - linkedUnit.references[typeNameReference].dependency;
|
| - expect(linkedLibrary.dependencies[typeNameDependency].uri,
|
| - expectedDependencyUri);
|
| + void _assertHasLinkedVariable(
|
| + LinkedPubPackage linkedPackage,
|
| + String variableName,
|
| + String expectedTypeName,
|
| + String expectedTypeNameUri) {
|
| + PackageBundle unlinked = linkedPackage.unlinked;
|
| + PackageBundle linked = linkedPackage.linked;
|
| + expect(unlinked, isNotNull);
|
| + expect(linked, isNotNull);
|
| + for (int i = 0; i < unlinked.unlinkedUnitUris.length; i++) {
|
| + String unlinkedUnitUri = unlinked.unlinkedUnitUris[i];
|
| + UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[i];
|
| + for (UnlinkedVariable v in unlinkedUnit.variables) {
|
| + if (v.name == variableName) {
|
| + int typeNameReference = v.type.reference;
|
| + expect(unlinkedUnit.references[typeNameReference].name,
|
| + expectedTypeName);
|
| + for (int j = 0; j < linked.linkedLibraryUris.length; j++) {
|
| + String linkedLibraryUri = linked.linkedLibraryUris[j];
|
| + if (linkedLibraryUri == unlinkedUnitUri) {
|
| + LinkedLibrary linkedLibrary = linked.linkedLibraries[j];
|
| + LinkedUnit linkedUnit = linkedLibrary.units.single;
|
| + int typeNameDependency =
|
| + linkedUnit.references[typeNameReference].dependency;
|
| + expect(linkedLibrary.dependencies[typeNameDependency].uri,
|
| + expectedTypeNameUri);
|
| + return;
|
| + }
|
| + }
|
| + fail('Cannot find linked unit for $variableName in $linkedPackage');
|
| + }
|
| + }
|
| + }
|
| + fail('Cannot find variable $variableName in $linkedPackage');
|
| }
|
|
|
| /**
|
|
|