Skip to content

Commit aea81bd

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Fix re-re-export TODO in LibraryManifestBuilder.
Change-Id: I37437ca9a652a5deb946403e2806ddffe7b5d47d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449369 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent b43a501 commit aea81bd

File tree

3 files changed

+261
-26
lines changed

3 files changed

+261
-26
lines changed

pkg/analyzer/lib/src/fine/library_manifest.dart

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -605,35 +605,23 @@ class LibraryManifestBuilder {
605605
var element = entry.value;
606606

607607
// Skip elements that exist in nowhere.
608-
var elementLibraryUri = element.library?.uri;
609-
if (elementLibraryUri == null) {
610-
continue;
611-
}
612-
613-
// Skip elements declared in this library.
614-
if (elementLibraryUri == libraryUri) {
608+
var elementLibrary = element.library as LibraryElementImpl?;
609+
if (elementLibrary == null) {
615610
continue;
616611
}
617612

618613
// Skip if the element is declared in this library.
619-
if (element.library == libraryElement) {
614+
if (identical(elementLibrary, libraryElement)) {
620615
continue;
621616
}
622617

623-
// Maybe exported from a library outside the current cycle.
624-
var id = elementFactory.getElementId(element);
618+
// Every library has a manifest at this point.
619+
// We already set manifests for the current cycle.
620+
var elementLibraryManifest = elementLibrary.manifest!;
625621

626-
// If not, then look into new manifest.
627-
if (id == null) {
628-
var newManifest = newManifests[elementLibraryUri];
629-
id ??= newManifest?.getExportedId(name);
630-
// TODO(scheglov): repeat for re-re-exports
631-
}
632-
633-
if (id == null) {
634-
// TODO(scheglov): complete
635-
continue;
636-
}
622+
// We use the manifest of the library that declares this element.
623+
// So, the element must be declared in the manifest.
624+
var id = elementLibraryManifest.getDeclaredId(name)!;
637625
manifest.reExportMap[name] = id;
638626
}
639627
}

pkg/analyzer/lib/src/fine/requirements.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,16 +1938,18 @@ class RequirementsManifest {
19381938
/// requirements to the libraries of this same library cycle. We already
19391939
/// link these libraries together, so only requirements to the previous
19401940
/// libraries are interesting.
1941-
void removeReqForLibs(Set<Uri> bundleLibraryUriList) {
1942-
var uriSet = bundleLibraryUriList.toSet();
1943-
1941+
void removeReqForLibs(Set<Uri> bundleLibraryUriSet) {
19441942
for (var exportRequirement in exportRequirements) {
19451943
exportRequirement.exports.removeWhere((export) {
1946-
return uriSet.contains(export.exportedUri);
1944+
return bundleLibraryUriSet.contains(export.exportedUri);
19471945
});
19481946
}
19491947

1950-
for (var libUri in bundleLibraryUriList) {
1948+
exportRequirements.removeWhere(
1949+
(exportRequirement) => exportRequirement.exports.isEmpty,
1950+
);
1951+
1952+
for (var libUri in bundleLibraryUriSet) {
19511953
libraries.remove(libUri);
19521954
}
19531955
}

pkg/analyzer/test/src/dart/analysis/driver_test.dart

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18897,6 +18897,251 @@ class C {}
1889718897
);
1889818898
}
1889918899

18900+
test_dependency_export_class_reExport_chain_external() async {
18901+
var a = newFile('$testPackageLibPath/a.dart', r'''
18902+
class A1 {}
18903+
class A2 {}
18904+
class A3 {}
18905+
''');
18906+
18907+
newFile('$testPackageLibPath/b.dart', r'''
18908+
export 'a.dart';
18909+
class B {}
18910+
''');
18911+
18912+
newFile('$testPackageLibPath/test.dart', r'''
18913+
export 'b.dart';
18914+
''');
18915+
18916+
configuration.elementTextConfiguration.withExportScope = true;
18917+
await _runChangeScenario(
18918+
operation: _FineOperationGetTestLibrary(),
18919+
expectedInitialEvents: r'''
18920+
[status] working
18921+
[operation] linkLibraryCycle SDK
18922+
[operation] linkLibraryCycle
18923+
package:test/a.dart
18924+
declaredClasses
18925+
A1: #M0
18926+
interface: #M1
18927+
A2: #M2
18928+
interface: #M3
18929+
A3: #M4
18930+
interface: #M5
18931+
requirements
18932+
[operation] linkLibraryCycle
18933+
package:test/b.dart
18934+
declaredClasses
18935+
B: #M6
18936+
interface: #M7
18937+
reExportMap
18938+
A1: #M0
18939+
A2: #M2
18940+
A3: #M4
18941+
requirements
18942+
exportRequirements
18943+
package:test/b.dart
18944+
declaredTopNames: B
18945+
exports
18946+
package:test/a.dart
18947+
A1: #M0
18948+
A2: #M2
18949+
A3: #M4
18950+
[operation] linkLibraryCycle
18951+
package:test/test.dart
18952+
reExportMap
18953+
A1: #M0
18954+
A2: #M2
18955+
A3: #M4
18956+
B: #M6
18957+
requirements
18958+
exportRequirements
18959+
package:test/test.dart
18960+
exports
18961+
package:test/b.dart
18962+
A1: #M0
18963+
A2: #M2
18964+
A3: #M4
18965+
B: #M6
18966+
[status] idle
18967+
[future] getLibraryByUri T1
18968+
library
18969+
exportedReferences
18970+
exported[(0, 0)] package:test/a.dart::@class::A1
18971+
exported[(0, 0)] package:test/a.dart::@class::A2
18972+
exported[(0, 0)] package:test/a.dart::@class::A3
18973+
exported[(0, 0)] package:test/b.dart::@class::B
18974+
exportNamespace
18975+
A1: package:test/a.dart::@class::A1
18976+
A2: package:test/a.dart::@class::A2
18977+
A3: package:test/a.dart::@class::A3
18978+
B: package:test/b.dart::@class::B
18979+
''',
18980+
updateFiles: () {
18981+
modifyFile2(a, r'''
18982+
abstract class A2 {}
18983+
class A3 {}
18984+
''');
18985+
return [a];
18986+
},
18987+
expectedUpdatedEvents: r'''
18988+
[status] working
18989+
[operation] linkLibraryCycle
18990+
package:test/a.dart
18991+
declaredClasses
18992+
A2: #M8
18993+
interface: #M9
18994+
A3: #M4
18995+
interface: #M5
18996+
requirements
18997+
[operation] checkLinkedBundleRequirements
18998+
package:test/b.dart
18999+
exportIdMismatch
19000+
fragmentUri: package:test/b.dart
19001+
exportedUri: package:test/a.dart
19002+
name: A2
19003+
expectedId: #M2
19004+
actualId: #M8
19005+
[operation] linkLibraryCycle
19006+
package:test/b.dart
19007+
declaredClasses
19008+
B: #M6
19009+
interface: #M7
19010+
reExportMap
19011+
A2: #M8
19012+
A3: #M4
19013+
requirements
19014+
exportRequirements
19015+
package:test/b.dart
19016+
declaredTopNames: B
19017+
exports
19018+
package:test/a.dart
19019+
A2: #M8
19020+
A3: #M4
19021+
[operation] checkLinkedBundleRequirements
19022+
package:test/test.dart
19023+
exportIdMismatch
19024+
fragmentUri: package:test/test.dart
19025+
exportedUri: package:test/b.dart
19026+
name: A2
19027+
expectedId: #M2
19028+
actualId: #M8
19029+
[operation] linkLibraryCycle
19030+
package:test/test.dart
19031+
reExportMap
19032+
A2: #M8
19033+
A3: #M4
19034+
B: #M6
19035+
requirements
19036+
exportRequirements
19037+
package:test/test.dart
19038+
exports
19039+
package:test/b.dart
19040+
A2: #M8
19041+
A3: #M4
19042+
B: #M6
19043+
[status] idle
19044+
[future] getLibraryByUri T2
19045+
library
19046+
exportedReferences
19047+
exported[(0, 0)] package:test/a.dart::@class::A2
19048+
exported[(0, 0)] package:test/a.dart::@class::A3
19049+
exported[(0, 0)] package:test/b.dart::@class::B
19050+
exportNamespace
19051+
A2: package:test/a.dart::@class::A2
19052+
A3: package:test/a.dart::@class::A3
19053+
B: package:test/b.dart::@class::B
19054+
''',
19055+
);
19056+
}
19057+
19058+
test_dependency_export_class_reExport_chain_thisCycle() async {
19059+
var a = newFile('$testPackageLibPath/a.dart', r'''
19060+
import 'test.dart';
19061+
class A1 {}
19062+
class A2 {}
19063+
class A3 {}
19064+
''');
19065+
19066+
newFile('$testPackageLibPath/b.dart', r'''
19067+
export 'a.dart';
19068+
class B {}
19069+
''');
19070+
19071+
newFile('$testPackageLibPath/test.dart', r'''
19072+
export 'b.dart';
19073+
''');
19074+
19075+
await _runChangeScenario(
19076+
operation: _FineOperationGetTestLibrary(),
19077+
expectedInitialEvents: r'''
19078+
[status] working
19079+
[operation] linkLibraryCycle SDK
19080+
[operation] linkLibraryCycle
19081+
package:test/a.dart
19082+
declaredClasses
19083+
A1: #M0
19084+
interface: #M1
19085+
A2: #M2
19086+
interface: #M3
19087+
A3: #M4
19088+
interface: #M5
19089+
package:test/b.dart
19090+
declaredClasses
19091+
B: #M6
19092+
interface: #M7
19093+
reExportMap
19094+
A1: #M0
19095+
A2: #M2
19096+
A3: #M4
19097+
package:test/test.dart
19098+
reExportMap
19099+
A1: #M0
19100+
A2: #M2
19101+
A3: #M4
19102+
B: #M6
19103+
requirements
19104+
[status] idle
19105+
[future] getLibraryByUri T1
19106+
library
19107+
''',
19108+
updateFiles: () {
19109+
modifyFile2(a, r'''
19110+
import 'test.dart';
19111+
abstract class A2 {}
19112+
class A3 {}
19113+
''');
19114+
return [a];
19115+
},
19116+
expectedUpdatedEvents: r'''
19117+
[status] working
19118+
[operation] linkLibraryCycle
19119+
package:test/a.dart
19120+
declaredClasses
19121+
A2: #M8
19122+
interface: #M9
19123+
A3: #M4
19124+
interface: #M5
19125+
package:test/b.dart
19126+
declaredClasses
19127+
B: #M6
19128+
interface: #M7
19129+
reExportMap
19130+
A2: #M8
19131+
A3: #M4
19132+
package:test/test.dart
19133+
reExportMap
19134+
A2: #M8
19135+
A3: #M4
19136+
B: #M6
19137+
requirements
19138+
[status] idle
19139+
[future] getLibraryByUri T2
19140+
library
19141+
''',
19142+
);
19143+
}
19144+
1890019145
test_dependency_export_class_reExport_combinatorShow() async {
1890119146
var a = newFile('$testPackageLibPath/a.dart', r'''
1890219147
class A {}

0 commit comments

Comments
 (0)