Skip to content

Commit 74a2bc7

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Add reference for MixinElement2.
Change-Id: I8cce4acc8f499754ff8d5e96930ae1b5d86943a6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/392061 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 00a5041 commit 74a2bc7

30 files changed

+421
-231
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ import 'package:meta/meta.dart';
9696
// TODO(scheglov): Clean up the list of implicitly analyzed files.
9797
class AnalysisDriver {
9898
/// The version of data format, should be incremented on every format change.
99-
static const int DATA_VERSION = 403;
99+
static const int DATA_VERSION = 404;
100100

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

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

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,19 @@ abstract class AugmentedInterfaceElementImpl
175175

176176
class AugmentedMixinElementImpl extends AugmentedInterfaceElementImpl
177177
with MaybeAugmentedMixinElementMixin {
178+
@override
179+
final Reference reference;
180+
178181
@override
179182
final MixinElementImpl declaration;
180183

181184
@override
182185
List<InterfaceType> superclassConstraints = [];
183186

184-
AugmentedMixinElementImpl(this.declaration);
187+
AugmentedMixinElementImpl(this.reference, this.declaration) {
188+
reference.element2 = this;
189+
declaration.augmentedInternal = this;
190+
}
185191
}
186192

187193
class BindPatternVariableElementImpl extends PatternVariableElementImpl
@@ -7202,6 +7208,9 @@ mixin MaybeAugmentedMixinElementMixin on MaybeAugmentedInterfaceElementMixin
72027208
@override
72037209
bool get isBase => declaration.isBase;
72047210

7211+
/// See [ElementImpl2.reference].
7212+
Reference get reference;
7213+
72057214
@override
72067215
T? accept2<T>(ElementVisitor2<T> visitor) {
72077216
return visitor.visitMixinElement(this);
@@ -7737,21 +7746,14 @@ class MixinElementImpl extends ClassOrMixinElementImpl
77377746
/// The list will be empty if this class is not a mixin declaration.
77387747
late List<String> superInvokedNames;
77397748

7740-
late MaybeAugmentedMixinElementMixin augmentedInternal =
7741-
NotAugmentedMixinElementImpl(this);
7749+
late MaybeAugmentedMixinElementMixin augmentedInternal;
77427750

77437751
/// Initialize a newly created class element to have the given [name] at the
77447752
/// given [offset] in the file that contains the declaration of this element.
77457753
MixinElementImpl(super.name, super.offset);
77467754

77477755
@override
77487756
MaybeAugmentedMixinElementMixin get augmented {
7749-
if (isAugmentation) {
7750-
if (augmentationTarget case var augmentationTarget?) {
7751-
return augmentationTarget.augmented;
7752-
}
7753-
}
7754-
77557757
linkedData?.read(this);
77567758
return augmentedInternal;
77577759
}
@@ -7771,7 +7773,7 @@ class MixinElementImpl extends ClassOrMixinElementImpl
77717773
}
77727774

77737775
@override
7774-
MixinElement2 get element => super.element as MixinElement2;
7776+
MaybeAugmentedMixinElementMixin get element => augmented;
77757777

77767778
@override
77777779
bool get isBase {
@@ -8468,10 +8470,16 @@ abstract class NotAugmentedInterfaceElementImpl
84688470

84698471
class NotAugmentedMixinElementImpl extends NotAugmentedInterfaceElementImpl
84708472
with MaybeAugmentedMixinElementMixin {
8473+
@override
8474+
final Reference reference;
8475+
84718476
@override
84728477
final MixinElementImpl element;
84738478

8474-
NotAugmentedMixinElementImpl(this.element);
8479+
NotAugmentedMixinElementImpl(this.reference, this.element) {
8480+
reference.element2 = this;
8481+
declaration.augmentedInternal = this;
8482+
}
84758483

84768484
@override
84778485
MixinElementImpl get declaration => element;
@@ -8483,7 +8491,7 @@ class NotAugmentedMixinElementImpl extends NotAugmentedInterfaceElementImpl
84838491

84848492
@override
84858493
AugmentedMixinElementImpl toAugmented() {
8486-
var augmented = AugmentedMixinElementImpl(declaration);
8494+
var augmented = AugmentedMixinElementImpl(reference, declaration);
84878495
declaration.augmentedInternal = augmented;
84888496
return augmented;
84898497
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,13 +344,18 @@ abstract class InstanceElementBuilder<F extends InstanceElementImpl>
344344
class MixinElementBuilder extends InstanceElementBuilder<MixinElementImpl> {
345345
MixinElementBuilder({
346346
required super.firstFragment,
347+
required MaybeAugmentedMixinElementMixin element,
347348
}) {
349+
firstFragment.augmentedInternal = element;
348350
addFields(firstFragment.fields);
349351
addAccessors(firstFragment.accessors);
350352
addMethods(firstFragment.methods);
351353
}
352354

353355
void augment(MixinElementImpl fragment) {
356+
lastFragment.augmentation = fragment;
357+
lastFragment = fragment;
358+
354359
var element = _ensureAugmented();
355360
fragment.augmentedInternal = firstFragment.augmentedInternal;
356361

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1369,12 +1369,24 @@ class LibraryReader {
13691369
) {
13701370
var resolutionOffset = _baseResolutionOffset + _reader.readUInt30();
13711371
var reference = _readReference();
1372+
1373+
var reference2 = _readReference();
1374+
var isAugmented = _reader.readBool();
1375+
13721376
var fragmentName = _readFragmentName();
13731377
var name = fragmentName?.name ?? '';
13741378

13751379
var element = MixinElementImpl(name, -1);
13761380
element.name2 = fragmentName;
13771381

1382+
if (reference2.element2 case MaybeAugmentedMixinElementMixin element2?) {
1383+
element.augmentedInternal = element2;
1384+
} else if (isAugmented) {
1385+
AugmentedMixinElementImpl(reference2, element);
1386+
} else {
1387+
NotAugmentedMixinElementImpl(reference2, element);
1388+
}
1389+
13781390
var linkedData = MixinElementLinkedData(
13791391
reference: reference,
13801392
libraryReader: this,
@@ -1931,7 +1943,7 @@ class MixinElementLinkedData extends ElementLinkedData<MixinElementImpl> {
19311943

19321944
if (element.augmentationTarget == null) {
19331945
if (reader.readBool()) {
1934-
var augmented = AugmentedMixinElementImpl(element);
1946+
var augmented = element.augmentedInternal as AugmentedMixinElementImpl;
19351947
element.augmentedInternal = augmented;
19361948
augmented.superclassConstraints = reader._readInterfaceTypeList();
19371949
augmented.interfaces = reader._readInterfaceTypeList();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,8 @@ class BundleWriter {
542542
_sink.writeUInt30(_resolutionSink.offset);
543543

544544
_writeReference(element);
545+
_writeReference2(element.augmented.reference);
546+
_sink.writeBool(element.augmentedInternal is AugmentedMixinElementImpl);
545547
_writeFragmentName(element.name2);
546548
MixinElementFlags.write(_sink, element);
547549
_resolutionSink._writeAnnotationList(element.metadata);

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

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,51 +1107,77 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
11071107
var name = nameToken.lexeme;
11081108
var fragmentName = _buildFragmentName(nameToken);
11091109

1110-
var element = MixinElementImpl(name, nameToken.offset);
1111-
element.name2 = fragmentName;
1112-
element.isAugmentation = node.augmentKeyword != null;
1113-
element.isBase = node.baseKeyword != null;
1114-
element.metadata = _buildAnnotations(node.metadata);
1115-
_setCodeRange(element, node);
1116-
_setDocumentation(element, node);
1110+
var fragment = MixinElementImpl(name, nameToken.offset);
1111+
fragment.name2 = fragmentName;
1112+
fragment.isAugmentation = node.augmentKeyword != null;
1113+
fragment.isBase = node.baseKeyword != null;
1114+
fragment.metadata = _buildAnnotations(node.metadata);
1115+
_setCodeRange(fragment, node);
1116+
_setDocumentation(fragment, node);
11171117

1118-
node.declaredElement = element;
1119-
_linker.elementNodes[element] = node;
1118+
node.declaredElement = fragment;
1119+
_linker.elementNodes[fragment] = node;
11201120

11211121
var refName = fragmentName?.name ?? '${_nextUnnamedId++}';
1122-
var reference = _enclosingContext.addMixin(refName, element);
1123-
if (!element.isAugmentation) {
1122+
var reference = _enclosingContext.addMixin(refName, fragment);
1123+
if (!fragment.isAugmentation) {
11241124
_libraryBuilder.declare(name, reference);
11251125
}
11261126

1127-
var holder = _EnclosingContext(reference, element);
1127+
var holder = _EnclosingContext(reference, fragment);
11281128
_withEnclosing(holder, () {
11291129
node.typeParameters?.accept(this);
11301130
_visitPropertyFirst<FieldDeclaration>(node.members);
11311131
});
1132-
element.typeParameters = holder.typeParameters;
1133-
element.accessors = holder.propertyAccessors;
1134-
element.fields = holder.fields;
1135-
element.methods = holder.methods;
1132+
fragment.typeParameters = holder.typeParameters;
1133+
fragment.accessors = holder.propertyAccessors;
1134+
fragment.fields = holder.fields;
1135+
fragment.methods = holder.methods;
11361136

11371137
node.onClause?.accept(this);
11381138
node.implementsClause?.accept(this);
11391139

1140-
_libraryBuilder.updateAugmentationTarget(name, element);
1140+
// TODO(scheglov): remove it eventually
1141+
_libraryBuilder.updateAugmentationTarget0(name, fragment);
11411142

1142-
if (element.augmentationTarget != null) {
1143-
switch (_libraryBuilder.getElementBuilder(name)) {
1144-
case MixinElementBuilder builder:
1145-
builder.augment(element);
1146-
}
1143+
var elementBuilder = _libraryBuilder.getElementBuilder(name);
1144+
elementBuilder?.setPreviousFor(fragment);
1145+
1146+
// If the fragment is an augmentation, and the corresponding builder
1147+
// has correct type, add the fragment to the builder. Otherwise, create
1148+
// a new builder.
1149+
if (fragment.isAugmentation && elementBuilder is MixinElementBuilder) {
1150+
elementBuilder.augment(fragment);
11471151
} else {
1152+
var libraryRef = _libraryBuilder.reference;
1153+
var containerRef = libraryRef.getChild('@mixin');
1154+
var elementReference = containerRef.addChild(refName);
1155+
var element = NotAugmentedMixinElementImpl(elementReference, fragment);
1156+
11481157
_libraryBuilder.putElementBuilder(
11491158
name,
11501159
MixinElementBuilder(
1151-
firstFragment: element,
1160+
firstFragment: fragment,
1161+
element: element,
11521162
),
11531163
);
11541164
}
1165+
1166+
// _libraryBuilder.updateAugmentationTarget(name, element);
1167+
//
1168+
// if (element.augmentationTarget != null) {
1169+
// switch (_libraryBuilder.getElementBuilder(name)) {
1170+
// case MixinElementBuilder builder:
1171+
// builder.augment(element);
1172+
// }
1173+
// } else {
1174+
// _libraryBuilder.putElementBuilder(
1175+
// name,
1176+
// MixinElementBuilder(
1177+
// firstFragment: element,
1178+
// ),
1179+
// );
1180+
// }
11551181
}
11561182

11571183
@override

pkg/analyzer/test/generated/elements_types_mixin.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ mixin ElementsTypesMixin {
414414
List<InterfaceType> interfaces = const [],
415415
}) {
416416
var element = MixinElementImpl(name, 0);
417+
NotAugmentedMixinElementImpl(Reference.root(), element);
417418
element.isAugmentation = isAugmentation;
418419
element.enclosingElement3 = testLibrary.definingCompilationUnit;
419420
element.typeParameters = typeParameters;
@@ -663,7 +664,7 @@ extension MixinElementImplExtension on MixinElementImpl {
663664
void addAugmentations(List<MixinElementImpl> augmentations) {
664665
expect(this.augmented, TypeMatcher<NotAugmentedMixinElementImpl>());
665666

666-
var augmented = AugmentedMixinElementImpl(this);
667+
var augmented = AugmentedMixinElementImpl(Reference.root(), this);
667668
augmentedInternal = augmented;
668669

669670
var augmentationTarget = this;

pkg/analyzer/test/src/dart/resolution/enum_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ WithClause
538538
NamedType
539539
name: M
540540
element: <testLibraryFragment>::@mixin::M
541-
element2: <testLibraryFragment>::@mixin::M#element
541+
element2: <testLibrary>::@mixin::M
542542
type: M
543543
''');
544544
}
@@ -569,12 +569,12 @@ WithClause
569569
type: int
570570
rightBracket: >
571571
element: <testLibraryFragment>::@mixin::M1
572-
element2: <testLibraryFragment>::@mixin::M1#element
572+
element2: <testLibrary>::@mixin::M1
573573
type: M1<int>
574574
NamedType
575575
name: M2
576576
element: <testLibraryFragment>::@mixin::M2
577-
element2: <testLibraryFragment>::@mixin::M2#element
577+
element2: <testLibrary>::@mixin::M2
578578
type: M2<int>
579579
''');
580580
}

pkg/analyzer/test/src/dart/resolution/extension_method_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ extension E on M {}
535535
NamedType
536536
name: M
537537
element: <testLibraryFragment>::@mixin::M
538-
element2: <testLibraryFragment>::@mixin::M#element
538+
element2: <testLibrary>::@mixin::M
539539
type: M
540540
''');
541541
}
@@ -654,7 +654,7 @@ extension on M {}
654654
NamedType
655655
name: M
656656
element: <testLibraryFragment>::@mixin::M
657-
element2: <testLibraryFragment>::@mixin::M#element
657+
element2: <testLibrary>::@mixin::M
658658
type: M
659659
''');
660660
}

pkg/analyzer/test/src/dart/resolution/mixin_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ WithClause
3030
NamedType
3131
name: M
3232
element: <testLibraryFragment>::@mixin::M
33-
element2: <testLibraryFragment>::@mixin::M#element
33+
element2: <testLibrary>::@mixin::M
3434
type: M
3535
''');
3636
}
@@ -49,7 +49,7 @@ WithClause
4949
NamedType
5050
name: M
5151
element: <testLibraryFragment>::@mixin::M
52-
element2: <testLibraryFragment>::@mixin::M#element
52+
element2: <testLibrary>::@mixin::M
5353
type: M
5454
''');
5555
}

0 commit comments

Comments
 (0)