Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7873dbd

Browse files
committed
Fix for duplicate declarations.
R=brianwilkerson@google.com Change-Id: Ie08b441edc30027ec4c4509f6c77b97d4cf8242d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99723 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent 38049f3 commit 7873dbd

3 files changed

Lines changed: 52 additions & 40 deletions

File tree

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,7 @@ class FileState {
862862
var exports = <String>[];
863863
var imports = <String>['dart:core'];
864864
var parts = <String>[];
865+
var isPartOf = false;
865866
for (var directive in unit.directives) {
866867
if (directive is ExportDirective) {
867868
var uriStr = directive.uri.stringValue;
@@ -878,13 +879,16 @@ class FileState {
878879
if (uriStr != null) {
879880
parts.add(uriStr);
880881
}
882+
} else if (directive is PartOfDirective) {
883+
isPartOf = true;
881884
}
882885
}
883886
return UnlinkedUnit2Builder(
884887
apiSignature: contentSignature,
885888
exports: exports,
886889
imports: imports,
887890
parts: parts,
891+
isPartOf: isPartOf,
888892
);
889893
}
890894

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -555,11 +555,10 @@ class ClassElementImpl extends AbstractClassElementImpl
555555
_constructors = context.getConstructors(linkedNode).map((node) {
556556
var name = node.name?.name ?? '';
557557
var reference = containerRef.getChild(name);
558-
if (reference.element == null) {
559-
reference.node2 = node;
560-
ConstructorElementImpl.forLinkedNode(this, reference, node);
558+
if (reference.hasElementFor(node)) {
559+
return reference.element as ConstructorElement;
561560
}
562-
return reference.element as ConstructorElement;
561+
return ConstructorElementImpl.forLinkedNode(this, reference, node);
563562
}).toList();
564563
}
565564

@@ -882,11 +881,10 @@ class ClassElementImpl extends AbstractClassElementImpl
882881
.map((node) {
883882
var name = node.name.name;
884883
var reference = containerRef.getChild(name);
885-
if (reference.element == null) {
886-
reference.node2 = node;
887-
MethodElementImpl.forLinkedNode(this, reference, node);
884+
if (reference.hasElementFor(node)) {
885+
return reference.element as MethodElement;
888886
}
889-
return reference.element as MethodElement;
887+
return MethodElementImpl.forLinkedNode(this, reference, node);
890888
}).toList();
891889
}
892890

@@ -1712,11 +1710,10 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
17121710
_enums = linkedNode.declarations.whereType<EnumDeclaration>().map((node) {
17131711
var name = node.name.name;
17141712
var reference = containerRef.getChild(name);
1715-
if (reference.element == null) {
1716-
reference.node2 = node;
1717-
EnumElementImpl.forLinkedNode(this, reference, node);
1713+
if (reference.hasElementFor(node)) {
1714+
return reference.element as EnumElementImpl;
17181715
}
1719-
return reference.element as EnumElementImpl;
1716+
return EnumElementImpl.forLinkedNode(this, reference, node);
17201717
}).toList();
17211718
}
17221719

@@ -1750,11 +1747,10 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
17501747
.map((node) {
17511748
var name = node.name.name;
17521749
var reference = containerRef.getChild(name);
1753-
if (reference.element == null) {
1754-
reference.node2 = node;
1755-
FunctionElementImpl.forLinkedNode(this, reference, node);
1750+
if (reference.hasElementFor(node)) {
1751+
return reference.element as FunctionElementImpl;
17561752
}
1757-
return reference.element as FunctionElementImpl;
1753+
return FunctionElementImpl.forLinkedNode(this, reference, node);
17581754
}).toList();
17591755
} else if (_unlinkedUnit != null) {
17601756
_functions = _unlinkedUnit.executables
@@ -1792,11 +1788,10 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
17921788
}
17931789

17941790
var reference = containerRef.getChild(name);
1795-
if (reference.element == null) {
1796-
reference.node2 = node;
1797-
GenericTypeAliasElementImpl.forLinkedNode(this, reference, node);
1791+
if (reference.hasElementFor(node)) {
1792+
return reference.element as GenericTypeAliasElementImpl;
17981793
}
1799-
return reference.element as GenericTypeAliasElement;
1794+
return GenericTypeAliasElementImpl.forLinkedNode(this, reference, node);
18001795
}).toList();
18011796
}
18021797

@@ -1851,11 +1846,10 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
18511846
return _mixins = declarations.whereType<MixinDeclaration>().map((node) {
18521847
var name = node.name.name;
18531848
var reference = containerRef.getChild(name);
1854-
if (reference.element == null) {
1855-
reference.node2 = node;
1856-
MixinElementImpl.forLinkedNode(this, reference, node);
1849+
if (reference.hasElementFor(node)) {
1850+
return reference.element as MixinElementImpl;
18571851
}
1858-
return reference.element as MixinElementImpl;
1852+
return MixinElementImpl.forLinkedNode(this, reference, node);
18591853
}).toList();
18601854
}
18611855

@@ -1954,11 +1948,13 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl
19541948
continue;
19551949
}
19561950
var reference = containerRef.getChild(name);
1957-
if (reference.element == null) {
1958-
reference.node2 = node;
1959-
ClassElementImpl.forLinkedNode(this, reference, node);
1951+
if (reference.hasElementFor(node)) {
1952+
_types.add(reference.element);
1953+
} else {
1954+
_types.add(
1955+
ClassElementImpl.forLinkedNode(this, reference, node),
1956+
);
19601957
}
1961-
_types.add(reference.element);
19621958
}
19631959
return _types;
19641960
}
@@ -3232,7 +3228,7 @@ abstract class ElementImpl implements Element {
32323228
/// Initialize from linked node.
32333229
ElementImpl.forLinkedNode(
32343230
this._enclosingElement, this.reference, this.linkedNode) {
3235-
reference?.element = this;
3231+
reference?.element ??= this;
32363232
}
32373233

32383234
/// Initialize a newly created element to have the given [name].
@@ -4295,9 +4291,7 @@ abstract class ExecutableElementImpl extends ElementImpl
42954291
ExecutableElementImpl.forLinkedNode(
42964292
ElementImpl enclosing, Reference reference, AstNode linkedNode)
42974293
: serializedExecutable = null,
4298-
super.forLinkedNode(enclosing, reference, linkedNode) {
4299-
reference.element = this;
4300-
}
4294+
super.forLinkedNode(enclosing, reference, linkedNode);
43014295

43024296
/// Initialize a newly created executable element to have the given [name].
43034297
ExecutableElementImpl.forNode(Identifier name)
@@ -8413,15 +8407,14 @@ class ParameterElementImpl extends VariableElementImpl
84138407
} else {
84148408
var name = node.identifier.name;
84158409
var reference = containerRef.getChild(name);
8416-
if (reference.element == null) {
8417-
reference.node2 = node;
8418-
ParameterElementImpl.forLinkedNodeFactory(
8419-
enclosing,
8420-
reference,
8421-
node,
8422-
);
8410+
if (reference.hasElementFor(node)) {
8411+
return reference.element as ParameterElement;
84238412
}
8424-
return reference.element as ParameterElement;
8413+
return ParameterElementImpl.forLinkedNodeFactory(
8414+
enclosing,
8415+
reference,
8416+
node,
8417+
);
84258418
}
84268419
}
84278420
}).toList();

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,20 @@ class Reference {
8484
return map[name] ??= new Reference._(this, name);
8585
}
8686

87+
/// If the reference has element, and it is for the [node], return `true`.
88+
///
89+
/// The element might be not `null`, but the node is different in case of
90+
/// duplicate declarations.
91+
bool hasElementFor(AstNode node) {
92+
if (element != null && node2 == node) {
93+
return true;
94+
} else {
95+
if (node == null) {
96+
node2 = node;
97+
}
98+
return false;
99+
}
100+
}
101+
87102
String toString() => parent == null ? 'root' : '$parent::$name';
88103
}

0 commit comments

Comments
 (0)