Skip to content

Commit a0a6fc1

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Move flags into MetadataImpl.
Change-Id: I4086f4155471387133feaa357710c0bd3d7f19a4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/425961 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent 9cbfabf commit a0a6fc1

File tree

4 files changed

+43
-98
lines changed

4 files changed

+43
-98
lines changed

pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ Element convertLibraryFragment(LibraryFragmentImpl fragment) {
139139
path.basename(fragment.source.fullName),
140140
Element.makeFlags(
141141
isPrivate: fragment.isPrivate,
142-
isDeprecated: fragment.hasDeprecated,
142+
isDeprecated: fragment.library.metadata2.hasDeprecated,
143143
),
144144
location: newLocation_fromFragment(fragment),
145145
);

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

Lines changed: 39 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,7 @@ class DynamicElementImpl2 extends TypeDefiningElementImpl2 {
14271427

14281428
@override
14291429
Metadata get metadata2 {
1430-
return MetadataImpl(0, const []);
1430+
return MetadataImpl(const []);
14311431
}
14321432

14331433
@override
@@ -3567,17 +3567,14 @@ mixin FragmentedAnnotatableElementMixin<E extends Fragment>
35673567
return buffer.toString();
35683568
}
35693569

3570-
List<ElementAnnotation> get metadata {
3571-
var result = <ElementAnnotation>[];
3570+
MetadataImpl get metadata2 {
3571+
var annotations = <ElementAnnotationImpl>[];
35723572
for (var fragment in _fragments) {
3573-
result.addAll(fragment.metadataOrEmpty.annotations);
3573+
annotations.addAll((fragment as FragmentImpl).metadata);
35743574
}
3575-
return result;
3575+
return MetadataImpl(annotations);
35763576
}
35773577

3578-
MetadataImpl get metadata2 =>
3579-
MetadataImpl(-1, metadata.cast<ElementAnnotationImpl>());
3580-
35813578
Version? get sinceSdkVersion {
35823579
if (this is Element) {
35833580
return SinceSdkVersionComputer().compute(this as Element);
@@ -3723,10 +3720,6 @@ mixin FragmentedTypeParameterizedElementMixin<
37233720
}
37243721

37253722
abstract class FragmentImpl implements ElementOrMember {
3726-
static const _metadataFlag_isReady = 1 << 0;
3727-
static const _metadataFlag_hasDeprecated = 1 << 1;
3728-
static const _metadataFlag_hasOverride = 1 << 2;
3729-
37303723
static int _NEXT_ID = 0;
37313724

37323725
@override
@@ -3757,9 +3750,6 @@ abstract class FragmentImpl implements ElementOrMember {
37573750
/// A list containing all of the metadata associated with this element.
37583751
List<ElementAnnotationImpl> _metadata = const [];
37593752

3760-
/// Cached flags denoting presence of specific annotations in [_metadata].
3761-
int _metadataFlags = 0;
3762-
37633753
/// The documentation comment for this element.
37643754
String? _docComment;
37653755

@@ -3808,12 +3798,6 @@ abstract class FragmentImpl implements ElementOrMember {
38083798
return enclosingElement3!.enclosingUnit;
38093799
}
38103800

3811-
/// Whether the element has an annotation of the form `@deprecated`
3812-
/// or `@Deprecated('..')`.
3813-
bool get hasDeprecated {
3814-
return (_getMetadataFlags() & _metadataFlag_hasDeprecated) != 0;
3815-
}
3816-
38173801
/// Return an identifier that uniquely identifies this element among the
38183802
/// children of this element's parent.
38193803
String get identifier {
@@ -3866,7 +3850,7 @@ abstract class FragmentImpl implements ElementOrMember {
38663850
_metadata = metadata;
38673851
}
38683852

3869-
MetadataImpl get metadata2 => MetadataImpl(_getMetadataFlags(), metadata);
3853+
MetadataImpl get metadata2 => MetadataImpl(metadata);
38703854

38713855
@override
38723856
String? get name => _name;
@@ -3959,10 +3943,6 @@ abstract class FragmentImpl implements ElementOrMember {
39593943
/// Return `true` if this element has the given [modifier] associated with it.
39603944
bool hasModifier(Modifier modifier) => _modifiers[modifier];
39613945

3962-
void resetMetadataFlags() {
3963-
_metadataFlags = 0;
3964-
}
3965-
39663946
/// Set the code range for this element.
39673947
void setCodeRange(int offset, int length) {
39683948
_codeOffset = offset;
@@ -3979,29 +3959,6 @@ abstract class FragmentImpl implements ElementOrMember {
39793959
String toString() {
39803960
return getDisplayString();
39813961
}
3982-
3983-
/// Return flags that denote presence of a few specific annotations.
3984-
int _getMetadataFlags() {
3985-
var result = _metadataFlags;
3986-
3987-
// Has at least `_metadataFlag_isReady`.
3988-
if (result != 0) {
3989-
return result;
3990-
}
3991-
3992-
var metadata = this.metadata;
3993-
for (var i = 0; i < metadata.length; i++) {
3994-
var annotation = metadata[i];
3995-
if (annotation.isDeprecated) {
3996-
result |= _metadataFlag_hasDeprecated;
3997-
} else if (annotation.isOverride) {
3998-
result |= _metadataFlag_hasOverride;
3999-
}
4000-
}
4001-
4002-
result |= _metadataFlag_isReady;
4003-
return _metadataFlags = result;
4004-
}
40053962
}
40063963

40073964
sealed class FunctionFragmentImpl extends ExecutableFragmentImpl
@@ -5976,7 +5933,7 @@ class LibraryElementImpl extends FragmentImpl
59765933
if (reference is ExportedReferenceExported) {
59775934
for (var location in reference.locations) {
59785935
var export = location.exportOf(this);
5979-
if (!export.hasDeprecated) {
5936+
if (!export.metadata2.hasDeprecated) {
59805937
return false;
59815938
}
59825939
}
@@ -6902,12 +6859,17 @@ class LocalVariableFragmentImpl extends NonParameterVariableFragmentImpl
69026859
}
69036860

69046861
final class MetadataImpl implements Metadata {
6905-
final int _metadataFlags;
6862+
static const _isReady = 1 << 0;
6863+
static const _hasDeprecated = 1 << 1;
6864+
static const _hasOverride = 1 << 2;
6865+
6866+
/// Cached flags denoting presence of specific annotations.
6867+
int _metadataFlags2 = 0;
69066868

69076869
@override
69086870
final List<ElementAnnotationImpl> annotations;
69096871

6910-
MetadataImpl(this._metadataFlags, this.annotations);
6872+
MetadataImpl(this.annotations);
69116873

69126874
@override
69136875
bool get hasAlwaysThrows {
@@ -6935,18 +6897,7 @@ final class MetadataImpl implements Metadata {
69356897

69366898
@override
69376899
bool get hasDeprecated {
6938-
if (_metadataFlags < 0) {
6939-
// TODO(augmentations): Consider optimizing this similar to `ElementImpl`.
6940-
var annotations = this.annotations;
6941-
for (var i = 0; i < annotations.length; i++) {
6942-
var annotation = annotations[i];
6943-
if (annotation.isDeprecated) {
6944-
return true;
6945-
}
6946-
}
6947-
return false;
6948-
}
6949-
return (_metadataFlags & FragmentImpl._metadataFlag_hasDeprecated) != 0;
6900+
return (_getMetadataFlags() & _hasDeprecated) != 0;
69506901
}
69516902

69526903
@override
@@ -7119,18 +7070,7 @@ final class MetadataImpl implements Metadata {
71197070

71207071
@override
71217072
bool get hasOverride {
7122-
if (_metadataFlags < 0) {
7123-
// TODO(augmentations): Consider optimizing this similar to `ElementImpl`.
7124-
var annotations = this.annotations;
7125-
for (var i = 0; i < annotations.length; i++) {
7126-
var annotation = annotations[i];
7127-
if (annotation.isOverride) {
7128-
return true;
7129-
}
7130-
}
7131-
return false;
7132-
}
7133-
return (_metadataFlags & FragmentImpl._metadataFlag_hasOverride) != 0;
7073+
return (_getMetadataFlags() & _hasOverride) != 0;
71347074
}
71357075

71367076
/// Return `true` if this element has an annotation of the form
@@ -7277,6 +7217,28 @@ final class MetadataImpl implements Metadata {
72777217
}
72787218
return false;
72797219
}
7220+
7221+
/// Return flags that denote presence of a few specific annotations.
7222+
int _getMetadataFlags() {
7223+
var result = _metadataFlags2;
7224+
7225+
// Has at least `_metadataFlag_isReady`.
7226+
if (result != 0) {
7227+
return result;
7228+
}
7229+
7230+
for (var i = 0; i < annotations.length; i++) {
7231+
var annotation = annotations[i];
7232+
if (annotation.isDeprecated) {
7233+
result |= _hasDeprecated;
7234+
} else if (annotation.isOverride) {
7235+
result |= _hasOverride;
7236+
}
7237+
}
7238+
7239+
result |= _isReady;
7240+
return _metadataFlags2 = result;
7241+
}
72807242
}
72817243

72827244
/// Common base class for all analyzer-internal classes that implement
@@ -7888,7 +7850,7 @@ class NeverElementImpl2 extends TypeDefiningElementImpl2 {
78887850

78897851
@override
78907852
Metadata get metadata2 {
7891-
return MetadataImpl(0, const []);
7853+
return MetadataImpl(const []);
78927854
}
78937855

78947856
@override
@@ -10534,19 +10496,4 @@ extension on Fragment {
1053410496
_ => null,
1053510497
};
1053610498
}
10537-
10538-
/// The metadata associated with the element or fragment.
10539-
///
10540-
/// If the receiver is an element that has fragments, the list will include
10541-
/// all of the metadata from all of the fragments.
10542-
///
10543-
/// The list will be empty if the receiver does not have any metadata, does
10544-
/// not support metadata, or if the library containing this element has not
10545-
/// yet been fully resolved.
10546-
Metadata get metadataOrEmpty {
10547-
return switch (this) {
10548-
Annotatable(:var metadata2) => metadata2,
10549-
_ => MetadataImpl(-1, const []),
10550-
};
10551-
}
1055210499
}

pkg/analyzer/lib/src/error/best_practices_verifier.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
134134
_nullSafeApiVerifier = NullSafeApiVerifier(_errorReporter, typeSystem),
135135
_widgetPreviewVerifier = WidgetPreviewVerifier(_errorReporter),
136136
_workspacePackage = workspacePackage {
137-
_deprecatedVerifier.pushInDeprecatedValue(_currentLibrary.hasDeprecated);
137+
_deprecatedVerifier.pushInDeprecatedValue(
138+
_currentLibrary.metadata2.hasDeprecated,
139+
);
138140
_inDoNotStoreMember = _currentLibrary.metadata2.hasDoNotStore;
139141
}
140142

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,6 @@ class MetadataResolver extends ThrowingAstVisitor<void> {
9797
@override
9898
void visitExportDirective(covariant ExportDirectiveImpl node) {
9999
node.metadata.accept(this);
100-
// We might have already accessed metadata flags, e.g. `hasDeprecated`,
101-
// before we finished metadata resolution, during `PrefixScope` building.
102-
// So, these flags are not accurate anymore, and we need to reset them.
103-
node.libraryExport!.resetMetadataFlags();
104100
}
105101

106102
@override

0 commit comments

Comments
 (0)