Issue 211853720. Link default constructors to their references.
Bug: https://buganizer.corp.google.com/issues/211853720
Change-Id: I07a2fbce46ca5f2901e043f80b9f24efe9fe6e43
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/225621
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 4b84ce8..f0d5965 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -957,15 +957,14 @@
element.fields = holder.properties.whereType<FieldElement>().toList();
element.methods = holder.methods;
- var constructors = holder.constructors;
- if (constructors.isEmpty) {
- var containerRef = element.reference!.getChild('@constructor');
- constructors = [
- ConstructorElementImpl('', -1)
- ..isSynthetic = true
- ..reference = containerRef.getChild(''),
- ];
+ if (holder.constructors.isEmpty) {
+ holder.addConstructor(
+ '',
+ ConstructorElementImpl('', -1)..isSynthetic = true,
+ );
}
+
+ var constructors = holder.constructors;
element.constructors = constructors;
// We have all fields and constructors.
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 6040d05..4fb0b3a 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -355,6 +355,19 @@
void _writeConstructorElement(ConstructorElement e) {
e as ConstructorElementImpl;
+ // Check that the reference exists, and filled with the element.
+ var reference = e.reference;
+ if (reference == null) {
+ fail('Every constructor must have a reference.');
+ } else {
+ var classReference = reference.parent!.parent!;
+ // We need this `if` for duplicate declarations.
+ // The reference might be filled by another declaration.
+ if (identical(classReference.element, e.enclosingElement)) {
+ expect(reference.element, same(e));
+ }
+ }
+
_writeIndentedLine(() {
_writeIf(e.isSynthetic, 'synthetic ');
_writeIf(e.isExternal, 'external ');