Skip to content

Commit c96188b

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Use Reference.elementName, Element.lookupName to fix crash when duplicate declarations.
Bug: #61782 Change-Id: I99ce0e8e0be17678d15b7e1212a0ac04945b80f2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/456802 Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
1 parent 6ccf4eb commit c96188b

File tree

4 files changed

+121
-6
lines changed

4 files changed

+121
-6
lines changed

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ testFineAfterLibraryAnalyzerHook;
107107
// TODO(scheglov): Clean up the list of implicitly analyzed files.
108108
class AnalysisDriver {
109109
/// The version of data format, should be incremented on every format change.
110-
static const int DATA_VERSION = 580;
110+
static const int DATA_VERSION = 581;
111111

112112
/// The number of exception contexts allowed to write. Once this field is
113113
/// zero, we stop writing any new exception contexts in this process.

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -748,12 +748,13 @@ class LibraryManifestBuilder {
748748
}
749749

750750
var reference = exported.reference;
751-
var lookupName = reference.isSetter
752-
? '${reference.name}='.asLookupName
753-
: reference.name.asLookupName;
754-
755751
var element = elementFactory.elementOfReference3(reference);
756752

753+
var lookupName = element.lookupName?.asLookupName;
754+
if (lookupName == null) {
755+
continue;
756+
}
757+
757758
// Skip elements that exist in nowhere.
758759
var elementLibrary = element.library;
759760
if (elementLibrary == null) {

pkg/analyzer/lib/src/summary2/library_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class LibraryBuilder {
132132
var exportedReferences = exportedLibrary.exportedReferences;
133133
for (var exported in exportedReferences) {
134134
var reference = exported.reference;
135-
var name = reference.name;
135+
var name = reference.elementName;
136136
if (reference.isSetter) {
137137
export.addToExportScope('$name=', exported);
138138
} else {

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

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23435,6 +23435,120 @@ class A2 {}
2343523435
);
2343623436
}
2343723437

23438+
test_dependency_export_class_reExport_duplicate() async {
23439+
var a = newFile('$testPackageLibPath/a.dart', r'''
23440+
class A {}
23441+
class A {}
23442+
''');
23443+
23444+
newFile('$testPackageLibPath/test.dart', r'''
23445+
export 'a.dart';
23446+
''');
23447+
23448+
configuration.elementTextConfiguration.withExportScope = true;
23449+
await _runChangeScenario(
23450+
operation: _FineOperationGetTestLibrary(),
23451+
expectedInitialEvents: r'''
23452+
[status] working
23453+
[operation] linkLibraryCycle SDK
23454+
[operation] linkLibraryCycle
23455+
package:test/a.dart
23456+
hashForRequirements: #H0
23457+
declaredConflicts
23458+
A: #M0
23459+
A=: #M0
23460+
exportMapId: #M1
23461+
exportMap
23462+
A: #M0
23463+
A=: #M0
23464+
requirements
23465+
[operation] linkLibraryCycle
23466+
package:test/test.dart
23467+
hashForRequirements: #H1
23468+
exportMapId: #M2
23469+
exportMap
23470+
A: #M0
23471+
reExportMap
23472+
A: #M0
23473+
exportedLibraryUris: package:test/a.dart
23474+
requirements
23475+
exportRequirements
23476+
package:test/test.dart
23477+
exports
23478+
package:test/a.dart
23479+
A: #M0
23480+
[status] idle
23481+
[future] getLibraryByUri T1
23482+
library
23483+
exportedReferences
23484+
exported[(0, 0)] package:test/a.dart::@class::A::@def::1
23485+
exportNamespace
23486+
A: package:test/a.dart::@class::A::@def::1
23487+
''',
23488+
updateFiles: () {
23489+
modifyFile2(a, r'''
23490+
class A {}
23491+
class A {}
23492+
class B {}
23493+
''');
23494+
return [a];
23495+
},
23496+
expectedUpdatedEvents: r'''
23497+
[status] working
23498+
[operation] linkLibraryCycle
23499+
package:test/a.dart
23500+
hashForRequirements: #H2
23501+
declaredConflicts
23502+
A: #M3
23503+
A=: #M3
23504+
declaredClasses
23505+
B: #M4
23506+
interface: #M5
23507+
exportMapId: #M6
23508+
exportMap
23509+
A: #M3
23510+
A=: #M3
23511+
B: #M4
23512+
requirements
23513+
[operation] checkLinkedBundleRequirements
23514+
package:test/test.dart
23515+
exportIdMismatch
23516+
fragmentUri: package:test/test.dart
23517+
exportedUri: package:test/a.dart
23518+
name: A
23519+
expectedId: #M0
23520+
actualId: #M3
23521+
[operation] linkLibraryCycle
23522+
package:test/test.dart
23523+
hashForRequirements: #H3
23524+
exportMapId: #M7
23525+
exportMap
23526+
A: #M3
23527+
B: #M4
23528+
reExportMap
23529+
A: #M3
23530+
B: #M4
23531+
exportedLibraryUris: package:test/a.dart
23532+
requirements
23533+
exportRequirements
23534+
package:test/test.dart
23535+
exports
23536+
package:test/a.dart
23537+
A: #M3
23538+
B: #M4
23539+
[status] idle
23540+
[future] getLibraryByUri T2
23541+
library
23542+
exportedReferences
23543+
exported[(0, 0)] package:test/a.dart::@class::A::@def::1
23544+
exported[(0, 0)] package:test/a.dart::@class::B
23545+
exportNamespace
23546+
A: package:test/a.dart::@class::A::@def::1
23547+
B: package:test/a.dart::@class::B
23548+
''',
23549+
);
23550+
}
23551+
2343823552
test_dependency_export_dynamic() async {
2343923553
configuration
2344023554
..withGetErrorsEvents = false

0 commit comments

Comments
 (0)