Skip to content

Commit dbe2d19

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Keep effective modifiers in ClassElementImpl and MixinElementImpl.
Change-Id: I1ad6558219da1fc700341c18ba682eb12e4d04c7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/440362 Reviewed-by: Samuel Rawlins <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 236e723 commit dbe2d19

File tree

5 files changed

+97
-38
lines changed

5 files changed

+97
-38
lines changed

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

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

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

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

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,13 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
149149
ClassElementImpl(this.reference, this._firstFragment) {
150150
reference.element = this;
151151
firstFragment.element = this;
152+
153+
isAbstract = firstFragment.isAbstract;
154+
isBase = firstFragment.isBase;
155+
isFinal = firstFragment.isFinal;
156+
isInterface = firstFragment.isInterface;
157+
isMixinClass = firstFragment.isMixinClass;
158+
isSealed = firstFragment.isSealed;
152159
}
153160

154161
/// If we can find all possible subtypes of this class, return them.
@@ -269,11 +276,23 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
269276

270277
@override
271278
@trackedIncludedIntoId
272-
bool get isAbstract => firstFragment.isAbstract;
279+
bool get isAbstract {
280+
return hasModifier(Modifier.ABSTRACT);
281+
}
282+
283+
set isAbstract(bool isAbstract) {
284+
setModifier(Modifier.ABSTRACT, isAbstract);
285+
}
273286

274287
@override
275288
@trackedIncludedIntoId
276-
bool get isBase => firstFragment.isBase;
289+
bool get isBase {
290+
return hasModifier(Modifier.BASE);
291+
}
292+
293+
set isBase(bool isBase) {
294+
setModifier(Modifier.BASE, isBase);
295+
}
277296

278297
@override
279298
@trackedIncludedIntoId
@@ -335,23 +354,47 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
335354

336355
@override
337356
@trackedIncludedIntoId
338-
bool get isFinal => firstFragment.isFinal;
357+
bool get isFinal {
358+
return hasModifier(Modifier.FINAL);
359+
}
360+
361+
set isFinal(bool isFinal) {
362+
setModifier(Modifier.FINAL, isFinal);
363+
}
339364

340365
@override
341366
@trackedIncludedIntoId
342-
bool get isInterface => firstFragment.isInterface;
367+
bool get isInterface {
368+
return hasModifier(Modifier.INTERFACE);
369+
}
370+
371+
set isInterface(bool isInterface) {
372+
setModifier(Modifier.INTERFACE, isInterface);
373+
}
343374

344375
@override
345376
@trackedIncludedIntoId
346377
bool get isMixinApplication => firstFragment.isMixinApplication;
347378

348379
@override
349380
@trackedIncludedIntoId
350-
bool get isMixinClass => firstFragment.isMixinClass;
381+
bool get isMixinClass {
382+
return hasModifier(Modifier.MIXIN_CLASS);
383+
}
384+
385+
set isMixinClass(bool isMixinClass) {
386+
setModifier(Modifier.MIXIN_CLASS, isMixinClass);
387+
}
351388

352389
@override
353390
@trackedIncludedIntoId
354-
bool get isSealed => firstFragment.isSealed;
391+
bool get isSealed {
392+
return hasModifier(Modifier.SEALED);
393+
}
394+
395+
set isSealed(bool isSealed) {
396+
setModifier(Modifier.SEALED, isSealed);
397+
}
355398

356399
@override
357400
@trackedIncludedIntoId
@@ -1899,6 +1942,10 @@ abstract class ElementImpl implements Element {
18991942
return isAccessibleIn(library);
19001943
}
19011944

1945+
void readModifiers(SummaryDataReader reader) {
1946+
_modifiers = EnumSet(reader.readInt64());
1947+
}
1948+
19021949
/// Update [modifier] of this element to [value].
19031950
void setModifier(Modifier modifier, bool value) {
19041951
_modifiers = _modifiers.updated(modifier, value);
@@ -1957,6 +2004,10 @@ abstract class ElementImpl implements Element {
19572004
void visitChildren2<T>(ElementVisitor2<T> visitor) {
19582005
visitChildren(visitor);
19592006
}
2007+
2008+
void writeModifiers(BufferedSink writer) {
2009+
_modifiers.write(writer);
2010+
}
19602011
}
19612012

19622013
class EnumElementImpl extends InterfaceElementImpl implements EnumElement {
@@ -3820,7 +3871,7 @@ class GenericFunctionTypeElementImpl extends FunctionTypedElementImpl
38203871

38213872
@override
38223873
List<FormalParameterElement> get formalParameters =>
3823-
_wrappedElement.formalParameters
3874+
_wrappedElement.formalParameters
38243875
.map((fragment) => fragment.element)
38253876
.toList();
38263877

@@ -7671,6 +7722,8 @@ class MixinElementImpl extends InterfaceElementImpl implements MixinElement {
76717722
MixinElementImpl(this.reference, this.firstFragment) {
76727723
reference.element = this;
76737724
firstFragment.element = this;
7725+
7726+
isBase = firstFragment.isBase;
76747727
}
76757728

76767729
@override
@@ -7686,7 +7739,13 @@ class MixinElementImpl extends InterfaceElementImpl implements MixinElement {
76867739
}
76877740

76887741
@override
7689-
bool get isBase => firstFragment.isBase;
7742+
bool get isBase {
7743+
return hasModifier(Modifier.BASE);
7744+
}
7745+
7746+
set isBase(bool isBase) {
7747+
setModifier(Modifier.BASE, isBase);
7748+
}
76907749

76917750
@override
76927751
ElementKind get kind => ElementKind.MIXIN;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ class LibraryReader {
266266
var fragments = _readFragmentsById<ClassFragmentImpl>();
267267
// TODO(scheglov): link fragments.
268268
var element = ClassElementImpl(reference, fragments.first);
269+
element.readModifiers(_reader);
269270

270271
// Configure for reading members lazily.
271272
_lazyRead((offset) {
@@ -974,6 +975,7 @@ class LibraryReader {
974975
var fragments = _readFragmentsById<MixinFragmentImpl>();
975976
// TODO(scheglov): link fragments.
976977
var element = MixinElementImpl(reference, fragments.first);
978+
element.readModifiers(_reader);
977979

978980
// TODO(scheglov): consider reading lazily
979981
for (var fragment in element.fragments) {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class BundleWriter {
151151
_sink.writeList(element.fragments, (fragment) {
152152
_writeFragmentId(fragment);
153153
});
154+
element.writeModifiers(_sink);
154155

155156
// We read members lazily.
156157
_writeForLazyRead(() {
@@ -571,6 +572,7 @@ class BundleWriter {
571572
_sink.writeList(element.fragments, (fragment) {
572573
_writeFragmentId(fragment);
573574
});
575+
element.writeModifiers(_sink);
574576

575577
// TODO(scheglov): consider reading lazily
576578
_resolutionSink.withTypeParameters(element.typeParameters, () {

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

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -660,75 +660,71 @@ class InstanceMemberInferrer {
660660
var interfaces = classElement.interfaces;
661661
var mixins = classElement.mixins;
662662

663-
if (mixins.any((type) => type.elementImpl.isFinal)) {
663+
if (mixins.any((type) => type.element.isFinal)) {
664664
// A sealed declaration is considered 'final' if it has a direct
665665
// superclass which is 'final'.
666-
classElement.isFinal = true;
666+
classElement.element.isFinal = true;
667667
return;
668668
}
669669

670670
if (supertype != null) {
671-
if (supertype.elementImpl.isFinal) {
671+
if (supertype.element.isFinal) {
672672
// A sealed declaration is considered 'final' if it has a direct
673673
// superclass which is 'final'.
674-
classElement.isFinal = true;
674+
classElement.element.isFinal = true;
675675
return;
676676
}
677-
if (supertype.elementImpl.isBase) {
677+
if (supertype.element.isBase) {
678678
// A sealed declaration is considered 'final' if it has a
679679
// direct superclass which is 'interface' and it has a direct
680680
// superinterface which is 'base'.
681-
if (mixins.any((type) => type.elementImpl.isInterface)) {
682-
classElement.isFinal = true;
681+
if (mixins.any((type) => type.element.isInterface)) {
682+
classElement.element.isFinal = true;
683683
return;
684684
}
685685

686686
// Otherwise, a sealed declaration is considered 'base' if it has a
687687
// direct superinterface which is 'base' or 'final'.
688-
classElement.isBase = true;
688+
classElement.element.isBase = true;
689689
return;
690690
}
691-
if (supertype.elementImpl.isInterface) {
691+
if (supertype.element.isInterface) {
692692
// A sealed declaration is considered 'final' if it has a
693693
// direct superclass which is 'interface' and it has a direct
694694
// superinterface which is 'base'.
695-
if (interfaces.any((type) => type.elementImpl.isBase) ||
696-
mixins.any((type) => type.elementImpl.isBase)) {
697-
classElement.isFinal = true;
695+
if (interfaces.any((type) => type.element.isBase) ||
696+
mixins.any((type) => type.element.isBase)) {
697+
classElement.element.isFinal = true;
698698
return;
699699
}
700700

701701
// Otherwise, a sealed declaration is considered 'interface' if it has a
702702
// direct superclass which is 'interface'
703-
classElement.isInterface = true;
703+
classElement.element.isInterface = true;
704704
return;
705705
}
706706
}
707707

708-
if (interfaces.any(
709-
(type) => type.elementImpl.isBase || type.elementImpl.isFinal,
710-
) ||
711-
mixins.any(
712-
(type) => type.elementImpl.isBase || type.elementImpl.isFinal,
713-
)) {
708+
if (interfaces.any((type) => type.element.isBase || type.element.isFinal) ||
709+
mixins.any((type) => type.element.isBase || type.element.isFinal)) {
714710
// A sealed declaration is considered 'base' if it has a direct
715711
// superinterface which is 'base' or 'final'.
716-
classElement.isBase = true;
712+
classElement.element.isBase = true;
717713
return;
718714
}
719715

720-
if (mixins.any((type) => type.elementImpl.isInterface)) {
716+
if (mixins.any((type) => type.element.isInterface)) {
721717
// A sealed declaration is considered 'final' if it has a
722718
// direct superclass which is 'interface' and it has a direct
723719
// superinterface which is 'base'.
724-
if (interfaces.any((type) => type.elementImpl.isBase)) {
725-
classElement.isFinal = true;
720+
if (interfaces.any((type) => type.element.isBase)) {
721+
classElement.element.isFinal = true;
726722
return;
727723
}
728724

729725
// Otherwise, a sealed declaration is considered 'interface' if it has a
730726
// direct superclass which is 'interface'
731-
classElement.isInterface = true;
727+
classElement.element.isInterface = true;
732728
return;
733729
}
734730
}
@@ -789,12 +785,12 @@ class InstanceMemberInferrer {
789785
/// A class of exception that is not used anywhere else.
790786
class _CycleException implements Exception {}
791787

792-
extension on InterfaceFragmentImpl {
788+
extension on InterfaceElementImpl {
793789
bool get isBase {
794790
switch (this) {
795-
case ClassFragmentImpl self:
791+
case ClassElementImpl self:
796792
return self.isBase;
797-
case MixinFragmentImpl self:
793+
case MixinElementImpl self:
798794
return self.isBase;
799795
default:
800796
return false;
@@ -803,7 +799,7 @@ extension on InterfaceFragmentImpl {
803799

804800
bool get isFinal {
805801
switch (this) {
806-
case ClassFragmentImpl self:
802+
case ClassElementImpl self:
807803
return self.isFinal;
808804
default:
809805
return false;
@@ -812,7 +808,7 @@ extension on InterfaceFragmentImpl {
812808

813809
bool get isInterface {
814810
switch (this) {
815-
case ClassFragmentImpl self:
811+
case ClassElementImpl self:
816812
return self.isInterface;
817813
default:
818814
return false;

0 commit comments

Comments
 (0)