Skip to content

Commit a387b8b

Browse files
scheglovCommit Queue
authored andcommitted
Fine. Tracking for LibraryElementImpl.featureSet and languageVersion.
Change-Id: If5d0e4e4060af91a3e5f315c98bf5c8ce17e0acc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449387 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 6ac7afd commit a387b8b

File tree

9 files changed

+389
-5
lines changed

9 files changed

+389
-5
lines changed

pkg/analyzer/lib/src/binary/binary_reader.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ class SummaryDataReader {
127127
}
128128
}
129129

130+
Uint8List? readOptionalUint8List() {
131+
if (readBool()) {
132+
return readUint8List();
133+
} else {
134+
return null;
135+
}
136+
}
137+
130138
String readStringReference() {
131139
var index = readUint30();
132140
return stringOfIndex(index);

pkg/analyzer/lib/src/binary/binary_writer.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,15 @@ class BufferedSink {
180180
}
181181
}
182182

183+
void writeOptionalUint8List(Uint8List? value) {
184+
if (value != null) {
185+
writeBool(true);
186+
writeUint8List(value);
187+
} else {
188+
writeBool(false);
189+
}
190+
}
191+
183192
/// Write the [value] as UTF8 encoded byte array.
184193
void writeStringUtf8(String value) {
185194
var bytes = const Utf8Encoder().convert(value);

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5917,10 +5917,10 @@ class LibraryElementImpl extends ElementImpl
59175917
late List<ExportedReference> exportedReferences;
59185918

59195919
/// The union of names for all searchable elements in this library.
5920+
@trackedInternal
59205921
ElementNameUnion nameUnion = ElementNameUnion.empty();
59215922

5922-
@override
5923-
final FeatureSet featureSet;
5923+
final FeatureSet _featureSet;
59245924

59255925
/// The entry point for this library, or `null` if this library does not have
59265926
/// an entry point.
@@ -5979,7 +5979,7 @@ class LibraryElementImpl extends ElementImpl
59795979
this._name,
59805980
this._nameOffset,
59815981
this._nameLength,
5982-
this.featureSet,
5982+
this._featureSet,
59835983
);
59845984

59855985
@override
@@ -6129,6 +6129,13 @@ class LibraryElementImpl extends ElementImpl
61296129
_extensionTypes = value;
61306130
}
61316131

6132+
@override
6133+
@trackedDirectly
6134+
FeatureSet get featureSet {
6135+
globalResultRequirements?.record_library_featureSet(element: this);
6136+
return _featureSet;
6137+
}
6138+
61326139
/// Information about why non-promotable private fields in the library are not
61336140
/// promotable.
61346141
///
@@ -6236,7 +6243,9 @@ class LibraryElementImpl extends ElementImpl
62366243
ElementKind get kind => ElementKind.LIBRARY;
62376244

62386245
@override
6246+
@trackedDirectly
62396247
LibraryLanguageVersion get languageVersion {
6248+
globalResultRequirements?.record_library_languageVersion(element: this);
62406249
return _languageVersion ??= LibraryLanguageVersion(
62416250
package: ExperimentStatus.currentVersion,
62426251
override: null,

pkg/analyzer/lib/src/fine/library_manifest.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data';
77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/src/binary/binary_reader.dart';
99
import 'package:analyzer/src/binary/binary_writer.dart';
10+
import 'package:analyzer/src/dart/analysis/experiments.dart';
1011
import 'package:analyzer/src/dart/analysis/file_state.dart';
1112
import 'package:analyzer/src/dart/element/element.dart';
1213
import 'package:analyzer/src/fine/lookup_name.dart';
@@ -22,7 +23,9 @@ import 'package:collection/collection.dart';
2223

2324
/// The manifest of a single library.
2425
class LibraryManifest {
25-
String? name;
26+
final String? name;
27+
final Uint8List featureSet;
28+
final ManifestLibraryLanguageVersion languageVersion;
2629

2730
/// The names that are re-exported by this library.
2831
/// This does not include names that are declared in this library.
@@ -47,6 +50,8 @@ class LibraryManifest {
4750

4851
LibraryManifest({
4952
required this.name,
53+
required this.featureSet,
54+
required this.languageVersion,
5055
required this.reExportMap,
5156
required this.reExportDeprecatedOnly,
5257
required this.declaredClasses,
@@ -65,6 +70,8 @@ class LibraryManifest {
6570
factory LibraryManifest.read(SummaryDataReader reader) {
6671
return LibraryManifest(
6772
name: reader.readOptionalStringUtf8(),
73+
featureSet: reader.readUint8List(),
74+
languageVersion: ManifestLibraryLanguageVersion.read(reader),
6875
reExportMap: reader.readLookupNameToIdMap(),
6976
reExportDeprecatedOnly: reader.readLookupNameSet(),
7077
declaredClasses: reader.readLookupNameMap(
@@ -143,6 +150,8 @@ class LibraryManifest {
143150

144151
void write(BufferedSink sink) {
145152
sink.writeOptionalStringUtf8(name);
153+
sink.writeUint8List(featureSet);
154+
languageVersion.write(sink);
146155
reExportMap.write(sink);
147156
reExportDeprecatedOnly.write(sink);
148157
declaredClasses.write(sink);
@@ -852,6 +861,10 @@ class LibraryManifestBuilder {
852861

853862
var newManifest = LibraryManifest(
854863
name: libraryElement.name.nullIfEmpty,
864+
featureSet: (libraryElement.featureSet as ExperimentStatus).toStorage(),
865+
languageVersion: ManifestLibraryLanguageVersion.encode(
866+
libraryElement.languageVersion,
867+
),
855868
reExportMap: {},
856869
reExportDeprecatedOnly: <LookupName>{},
857870
declaredClasses: newClassItems,
@@ -1070,6 +1083,8 @@ class LibraryManifestBuilder {
10701083
return inputManifests[uri] ??
10711084
LibraryManifest(
10721085
name: null,
1086+
featureSet: Uint8List(0),
1087+
languageVersion: ManifestLibraryLanguageVersion.empty(),
10731088
reExportMap: {},
10741089
reExportDeprecatedOnly: <LookupName>{},
10751090
declaredClasses: {},

pkg/analyzer/lib/src/fine/manifest_item.dart

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/ast/ast.dart';
6+
import 'package:analyzer/dart/element/element.dart';
67
import 'package:analyzer/src/binary/binary_reader.dart';
78
import 'package:analyzer/src/binary/binary_writer.dart';
89
import 'package:analyzer/src/dart/element/element.dart';
@@ -15,6 +16,7 @@ import 'package:analyzer/src/fine/manifest_type.dart';
1516
import 'package:analyzer/src/utilities/extensions/collection.dart';
1617
import 'package:collection/collection.dart';
1718
import 'package:meta/meta.dart';
19+
import 'package:pub_semver/pub_semver.dart';
1820

1921
class ClassItem extends InterfaceItem<ClassElementImpl> {
2022
ClassItem({
@@ -1016,6 +1018,82 @@ sealed class ManifestItem<E extends ElementImpl> {
10161018
}
10171019
}
10181020

1021+
class ManifestLibraryLanguageVersion {
1022+
final Version packageVersion;
1023+
final Version? overrideVersion;
1024+
1025+
ManifestLibraryLanguageVersion({
1026+
required this.packageVersion,
1027+
required this.overrideVersion,
1028+
});
1029+
1030+
ManifestLibraryLanguageVersion.empty()
1031+
: packageVersion = Version.none,
1032+
overrideVersion = null;
1033+
1034+
factory ManifestLibraryLanguageVersion.encode(
1035+
LibraryLanguageVersion languageVersion,
1036+
) {
1037+
return ManifestLibraryLanguageVersion(
1038+
packageVersion: languageVersion.package,
1039+
overrideVersion: languageVersion.override,
1040+
);
1041+
}
1042+
1043+
factory ManifestLibraryLanguageVersion.read(SummaryDataReader reader) {
1044+
return ManifestLibraryLanguageVersion(
1045+
packageVersion: _readVersion(reader),
1046+
overrideVersion: reader.readOptionalObject(() => _readVersion(reader)),
1047+
);
1048+
}
1049+
1050+
@override
1051+
int get hashCode {
1052+
return Object.hash(packageVersion, overrideVersion);
1053+
}
1054+
1055+
@override
1056+
bool operator ==(Object other) {
1057+
return other is ManifestLibraryLanguageVersion &&
1058+
packageVersion == other.packageVersion &&
1059+
overrideVersion == other.overrideVersion;
1060+
}
1061+
1062+
@override
1063+
String toString() {
1064+
var result = '(package: $packageVersion';
1065+
if (overrideVersion case var overrideVersion?) {
1066+
result += ', override: $overrideVersion';
1067+
}
1068+
result += ')';
1069+
return result;
1070+
}
1071+
1072+
void write(BufferedSink sink) {
1073+
_writeVersion(sink, packageVersion);
1074+
sink.writeOptionalObject(overrideVersion, (it) => _writeVersion(sink, it));
1075+
}
1076+
1077+
static ManifestLibraryLanguageVersion? readOptional(
1078+
SummaryDataReader reader,
1079+
) {
1080+
return reader.readOptionalObject(
1081+
() => ManifestLibraryLanguageVersion.read(reader),
1082+
);
1083+
}
1084+
1085+
static Version _readVersion(SummaryDataReader reader) {
1086+
var major = reader.readUint30();
1087+
var minor = reader.readUint30();
1088+
return Version(major, minor, 0);
1089+
}
1090+
1091+
static void _writeVersion(BufferedSink sink, Version version) {
1092+
sink.writeUint30(version.major);
1093+
sink.writeUint30(version.minor);
1094+
}
1095+
}
1096+
10191097
class ManifestMetadata {
10201098
final List<ManifestAnnotation> annotations;
10211099

pkg/analyzer/lib/src/fine/requirement_failure.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:typed_data';
6+
57
import 'package:analyzer/src/fine/lookup_name.dart';
68
import 'package:analyzer/src/fine/manifest_id.dart';
9+
import 'package:analyzer/src/fine/manifest_item.dart';
710
import 'package:analyzer/src/fine/requirements.dart';
811

912
final class ExportCountMismatch extends ExportFailure {
@@ -295,6 +298,36 @@ class LibraryChildrenIdsMismatch extends RequirementFailure {
295298
}
296299
}
297300

301+
class LibraryFeatureSetMismatch extends RequirementFailure {
302+
final Uri libraryUri;
303+
final Uint8List? expected;
304+
final Uint8List? actual;
305+
306+
LibraryFeatureSetMismatch({
307+
required this.libraryUri,
308+
required this.expected,
309+
required this.actual,
310+
});
311+
312+
@override
313+
String toString() {
314+
return 'LibraryFeatureSetMismatch(libraryUri: $libraryUri, '
315+
'expected: $expected, actual: $actual)';
316+
}
317+
}
318+
319+
class LibraryLanguageVersionMismatch extends RequirementFailure {
320+
final Uri libraryUri;
321+
final ManifestLibraryLanguageVersion expected;
322+
final ManifestLibraryLanguageVersion actual;
323+
324+
LibraryLanguageVersionMismatch({
325+
required this.libraryUri,
326+
required this.expected,
327+
required this.actual,
328+
});
329+
}
330+
298331
class LibraryMissing extends RequirementFailure {
299332
final Uri uri;
300333

0 commit comments

Comments
 (0)