Skip to content

Commit ebd5b62

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Add DartSdk.languageVersion
Bug: dart-lang/build#2763 (comment) Change-Id: I8232bd395abc9efea0e5c27716450d6a5442b3bb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/156489 Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: William Hesse <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent a99edb8 commit ebd5b62

File tree

19 files changed

+212
-54
lines changed

19 files changed

+212
-54
lines changed

pkg/analysis_server/lib/src/server/driver.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -470,13 +470,14 @@ class Driver implements ServerStarter {
470470
MulticastInstrumentationService(allInstrumentationServices);
471471

472472
instrumentationService.logVersion(
473-
results[TRAIN_USING] != null
474-
? 'training-0'
475-
: _readUuid(instrumentationService),
476-
analysisServerOptions.clientId,
477-
analysisServerOptions.clientVersion,
478-
PROTOCOL_VERSION,
479-
defaultSdk.sdkVersion);
473+
results[TRAIN_USING] != null
474+
? 'training-0'
475+
: _readUuid(instrumentationService),
476+
analysisServerOptions.clientId,
477+
analysisServerOptions.clientVersion,
478+
PROTOCOL_VERSION,
479+
defaultSdk.languageVersion.toString(),
480+
);
480481
AnalysisEngine.instance.instrumentationService = instrumentationService;
481482

482483
int diagnosticServerPort;

pkg/analysis_server/test/context_manager_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1591,7 +1591,7 @@ abstract class ContextManagerTest with ResourceProviderMixin {
15911591
resourceProvider.newFolder(projPath);
15921592
// Create an SDK in the mock file system.
15931593
MockSdk(resourceProvider: resourceProvider);
1594-
var sdkManager = DartSdkManager(convertPath('/sdk'));
1594+
var sdkManager = DartSdkManager(convertPath(sdkRoot));
15951595
manager = ContextManagerImpl(
15961596
resourceProvider,
15971597
sdkManager,

pkg/analysis_server/test/integration/analysis/get_errors_non_standard_sdk_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class AnalysisDomainGetErrorsTest
2929
Directory(path.join(sdkPath, 'lib', 'async')).createSync(recursive: true);
3030
Directory(path.join(sdkPath, 'lib', 'fake')).createSync(recursive: true);
3131

32+
File(path.join(sdkPath, 'version')).writeAsStringSync('2.10.0');
33+
3234
File(path.join(sdkPath, 'lib', 'core', 'core.dart')).writeAsStringSync(r'''
3335
library dart.core;
3436
import 'dart:async';

pkg/analyzer/lib/dart/sdk/build_sdk_summary.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import 'package:analyzer/src/summary2/link.dart';
2222
import 'package:analyzer/src/summary2/linked_element_factory.dart';
2323
import 'package:analyzer/src/summary2/reference.dart';
2424
import 'package:meta/meta.dart';
25+
import 'package:pub_semver/pub_semver.dart';
2526
import 'package:yaml/yaml.dart';
2627

2728
/// Build summary for SDK at the given [sdkPath].
@@ -44,7 +45,11 @@ Uint8List buildSdkSummary({
4445
var file = resourceProvider.getFile(embedderYamlPath);
4546
var content = file.readAsStringSync();
4647
var map = loadYaml(content) as YamlMap;
47-
var embedderSdk = EmbedderSdk(resourceProvider, {file.parent: map});
48+
var embedderSdk = EmbedderSdk(
49+
resourceProvider,
50+
{file.parent: map},
51+
languageVersion: sdk.languageVersion,
52+
);
4853
for (var library in embedderSdk.sdkLibraries) {
4954
var uriStr = library.shortName;
5055
if (sdk.libraryMap.getLibrary(uriStr) == null) {
@@ -60,6 +65,7 @@ Uint8List buildSdkSummary({
6065
return _Builder(
6166
sdk.context,
6267
sdk.allowedExperimentsJson,
68+
sdk.languageVersion,
6369
librarySources,
6470
).build();
6571
}
@@ -73,11 +79,13 @@ class _Builder {
7379
final List<LinkInputLibrary> inputLibraries = [];
7480

7581
AllowedExperiments allowedExperiments;
82+
Version languageVersion;
7683
final PackageBundleAssembler bundleAssembler = PackageBundleAssembler();
7784

7885
_Builder(
7986
this.context,
8087
this.allowedExperimentsJson,
88+
this.languageVersion,
8189
this.librarySources,
8290
) {
8391
allowedExperiments = _parseAllowedExperiments(allowedExperimentsJson);
@@ -100,6 +108,10 @@ class _Builder {
100108
bundle2: linkResult.bundle,
101109
sdk: PackageBundleSdkBuilder(
102110
allowedExperimentsJson: allowedExperimentsJson,
111+
languageVersion: LinkedLanguageVersionBuilder(
112+
major: languageVersion.major,
113+
minor: languageVersion.minor,
114+
),
103115
),
104116
).toBuffer();
105117

pkg/analyzer/lib/source/embedder.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import 'package:analyzer/src/generated/sdk_io.dart';
1818
import 'package:analyzer/src/generated/source.dart';
1919
import 'package:analyzer/src/generated/source_io.dart' show FileBasedSource;
2020
import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
21+
import 'package:pub_semver/src/version.dart';
2122
import 'package:yaml/yaml.dart';
2223

2324
export 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
@@ -38,12 +39,14 @@ class EmbedderSdk extends AbstractDartSdk {
3839
embedderYamls?.forEach(_processEmbedderYaml);
3940
}
4041

41-
// TODO(danrubel) Determine SDK version
4242
@override
4343
String get allowedExperimentsJson {
4444
return null;
4545
}
4646

47+
@override
48+
Version get languageVersion => throw UnimplementedError();
49+
4750
@override
4851
String get sdkVersion => '0';
4952

pkg/analyzer/lib/src/context/builder.dart

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,20 @@ class ContextBuilder {
225225
resourceProvider: resourceProvider);
226226
}
227227

228+
DartSdk folderSdk;
229+
{
230+
String sdkPath = sdkManager.defaultSdkDirectory;
231+
SdkDescription description = SdkDescription(sdkPath);
232+
folderSdk = sdkManager.getSdk(description, () {
233+
var sdk = FolderBasedDartSdk(
234+
resourceProvider,
235+
resourceProvider.getFolder(sdkPath),
236+
);
237+
sdk.analysisOptions = analysisOptions;
238+
return sdk;
239+
});
240+
}
241+
228242
if (workspace != null) {
229243
var partialSourceFactory = workspace.createSourceFactory(null, null);
230244
var embedderYamlSource = partialSourceFactory.forUri(
@@ -237,22 +251,17 @@ class ContextBuilder {
237251
EmbedderYamlLocator.forLibFolder(libFolder);
238252
Map<Folder, YamlMap> embedderMap = locator.embedderYamls;
239253
if (embedderMap.isNotEmpty) {
240-
EmbedderSdk embedderSdk = EmbedderSdk(resourceProvider, embedderMap);
254+
EmbedderSdk embedderSdk = EmbedderSdk(
255+
resourceProvider,
256+
embedderMap,
257+
languageVersion: folderSdk.languageVersion,
258+
);
241259
return embedderSdk;
242260
}
243261
}
244262
}
245263

246-
String sdkPath = sdkManager.defaultSdkDirectory;
247-
SdkDescription description = SdkDescription(sdkPath);
248-
return sdkManager.getSdk(description, () {
249-
var sdk = FolderBasedDartSdk(
250-
resourceProvider,
251-
resourceProvider.getFolder(sdkPath),
252-
);
253-
sdk.analysisOptions = analysisOptions;
254-
return sdk;
255-
});
264+
return folderSdk;
256265
}
257266

258267
/// Return the analysis options that should be used to analyze code in the

pkg/analyzer/lib/src/dart/sdk/sdk.dart

Lines changed: 38 additions & 1 deletion
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 'dart:collection';
6+
import 'dart:io' as io;
67

78
import 'package:analyzer/dart/analysis/features.dart';
89
import 'package:analyzer/dart/analysis/utilities.dart';
@@ -14,8 +15,16 @@ import 'package:analyzer/src/generated/engine.dart';
1415
import 'package:analyzer/src/generated/java_engine_io.dart';
1516
import 'package:analyzer/src/generated/sdk.dart';
1617
import 'package:analyzer/src/generated/source_io.dart';
18+
import 'package:pub_semver/pub_semver.dart';
1719
import 'package:yaml/yaml.dart';
1820

21+
Version languageVersionFromSdkVersion(String sdkVersionStr) {
22+
var sdkVersionParts = sdkVersionStr.split('.');
23+
var sdkVersionMajor = int.parse(sdkVersionParts[0]);
24+
var sdkVersionMinor = int.parse(sdkVersionParts[1]);
25+
return Version(sdkVersionMajor, sdkVersionMinor, 0);
26+
}
27+
1928
/// An abstract implementation of a Dart SDK in which the available libraries
2029
/// are stored in a library map. Subclasses are responsible for populating the
2130
/// library map.
@@ -197,11 +206,21 @@ class EmbedderSdk extends AbstractDartSdk {
197206
static const String _DART_COLON_PREFIX = 'dart:';
198207

199208
static const String _EMBEDDED_LIB_MAP_KEY = 'embedded_libs';
209+
210+
Version _languageVersion;
211+
200212
final Map<String, String> _urlMappings = HashMap<String, String>();
201213

214+
/// TODO(scheglov) Make [languageVersion] required.
215+
/// https://github.com/dart-lang/sdk/issues/42890
202216
EmbedderSdk(
203-
ResourceProvider resourceProvider, Map<Folder, YamlMap> embedderYamls) {
217+
ResourceProvider resourceProvider,
218+
Map<Folder, YamlMap> embedderYamls, {
219+
Version languageVersion,
220+
}) {
204221
this.resourceProvider = resourceProvider;
222+
this._languageVersion =
223+
languageVersion ?? languageVersionFromSdkVersion(io.Platform.version);
205224
embedderYamls?.forEach(_processEmbedderYaml);
206225
}
207226

@@ -221,6 +240,9 @@ class EmbedderSdk extends AbstractDartSdk {
221240
return null;
222241
}
223242

243+
@override
244+
Version get languageVersion => _languageVersion;
245+
224246
@override
225247
// TODO(danrubel) Determine SDK version
226248
String get sdkVersion => '0';
@@ -364,6 +386,9 @@ class FolderBasedDartSdk extends AbstractDartSdk {
364386
/// discovered.
365387
String _sdkVersion;
366388

389+
/// The cached language version of this SDK.
390+
Version _languageVersion;
391+
367392
/// The file containing the pub executable.
368393
File _pubExecutable;
369394

@@ -395,6 +420,18 @@ class FolderBasedDartSdk extends AbstractDartSdk {
395420
Folder get docDirectory =>
396421
_sdkDirectory.getChildAssumingFolder(_DOCS_DIRECTORY_NAME);
397422

423+
@override
424+
Version get languageVersion {
425+
if (_languageVersion == null) {
426+
var sdkVersionStr = _sdkDirectory
427+
.getChildAssumingFile(_VERSION_FILE_NAME)
428+
.readAsStringSync();
429+
_languageVersion = languageVersionFromSdkVersion(sdkVersionStr);
430+
}
431+
432+
return _languageVersion;
433+
}
434+
398435
/// Return the directory within the SDK directory that contains the libraries.
399436
Folder get libraryDirectory {
400437
return _libraryDirectory ??=

pkg/analyzer/lib/src/generated/sdk.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/ast/visitor.dart';
99
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
1010
import 'package:analyzer/src/generated/source.dart' show Source;
11+
import 'package:pub_semver/pub_semver.dart';
1112

1213
/// A Dart SDK installed in a specified location.
1314
abstract class DartSdk {
@@ -34,6 +35,12 @@ abstract class DartSdk {
3435
/// Return the analysis context used for all of the sources in this [DartSdk].
3536
AnalysisContext get context;
3637

38+
/// Return the language version of this SDK, or throws an exception.
39+
///
40+
/// The language version has only major/minor components, the patch number
41+
/// is always zero, because the patch number does not change the language.
42+
Version get languageVersion;
43+
3744
/// Return a list containing all of the libraries defined in this SDK.
3845
List<SdkLibrary> get sdkLibraries;
3946

pkg/analyzer/lib/src/summary/format.dart

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17792,6 +17792,7 @@ class PackageBundleSdkBuilder extends Object
1779217792
with _PackageBundleSdkMixin
1779317793
implements idl.PackageBundleSdk {
1779417794
String _allowedExperimentsJson;
17795+
LinkedLanguageVersionBuilder _languageVersion;
1779517796

1779617797
@override
1779717798
String get allowedExperimentsJson => _allowedExperimentsJson ??= '';
@@ -17801,27 +17802,49 @@ class PackageBundleSdkBuilder extends Object
1780117802
this._allowedExperimentsJson = value;
1780217803
}
1780317804

17804-
PackageBundleSdkBuilder({String allowedExperimentsJson})
17805-
: _allowedExperimentsJson = allowedExperimentsJson;
17805+
@override
17806+
LinkedLanguageVersionBuilder get languageVersion => _languageVersion;
17807+
17808+
/// The language version of the SDK.
17809+
set languageVersion(LinkedLanguageVersionBuilder value) {
17810+
this._languageVersion = value;
17811+
}
17812+
17813+
PackageBundleSdkBuilder(
17814+
{String allowedExperimentsJson,
17815+
LinkedLanguageVersionBuilder languageVersion})
17816+
: _allowedExperimentsJson = allowedExperimentsJson,
17817+
_languageVersion = languageVersion;
1780617818

1780717819
/// Flush [informative] data recursively.
17808-
void flushInformative() {}
17820+
void flushInformative() {
17821+
_languageVersion?.flushInformative();
17822+
}
1780917823

1781017824
/// Accumulate non-[informative] data into [signature].
1781117825
void collectApiSignature(api_sig.ApiSignature signature) {
1781217826
signature.addString(this._allowedExperimentsJson ?? '');
17827+
signature.addBool(this._languageVersion != null);
17828+
this._languageVersion?.collectApiSignature(signature);
1781317829
}
1781417830

1781517831
fb.Offset finish(fb.Builder fbBuilder) {
1781617832
fb.Offset offset_allowedExperimentsJson;
17833+
fb.Offset offset_languageVersion;
1781717834
if (_allowedExperimentsJson != null) {
1781817835
offset_allowedExperimentsJson =
1781917836
fbBuilder.writeString(_allowedExperimentsJson);
1782017837
}
17838+
if (_languageVersion != null) {
17839+
offset_languageVersion = _languageVersion.finish(fbBuilder);
17840+
}
1782117841
fbBuilder.startTable();
1782217842
if (offset_allowedExperimentsJson != null) {
1782317843
fbBuilder.addOffset(0, offset_allowedExperimentsJson);
1782417844
}
17845+
if (offset_languageVersion != null) {
17846+
fbBuilder.addOffset(1, offset_languageVersion);
17847+
}
1782517848
return fbBuilder.endTable();
1782617849
}
1782717850
}
@@ -17843,13 +17866,21 @@ class _PackageBundleSdkImpl extends Object
1784317866
_PackageBundleSdkImpl(this._bc, this._bcOffset);
1784417867

1784517868
String _allowedExperimentsJson;
17869+
idl.LinkedLanguageVersion _languageVersion;
1784617870

1784717871
@override
1784817872
String get allowedExperimentsJson {
1784917873
_allowedExperimentsJson ??=
1785017874
const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
1785117875
return _allowedExperimentsJson;
1785217876
}
17877+
17878+
@override
17879+
idl.LinkedLanguageVersion get languageVersion {
17880+
_languageVersion ??=
17881+
const _LinkedLanguageVersionReader().vTableGet(_bc, _bcOffset, 1, null);
17882+
return _languageVersion;
17883+
}
1785317884
}
1785417885

1785517886
abstract class _PackageBundleSdkMixin implements idl.PackageBundleSdk {
@@ -17859,12 +17890,16 @@ abstract class _PackageBundleSdkMixin implements idl.PackageBundleSdk {
1785917890
if (allowedExperimentsJson != '') {
1786017891
_result["allowedExperimentsJson"] = allowedExperimentsJson;
1786117892
}
17893+
if (languageVersion != null) {
17894+
_result["languageVersion"] = languageVersion.toJson();
17895+
}
1786217896
return _result;
1786317897
}
1786417898

1786517899
@override
1786617900
Map<String, Object> toMap() => {
1786717901
"allowedExperimentsJson": allowedExperimentsJson,
17902+
"languageVersion": languageVersion,
1786817903
};
1786917904

1787017905
@override

pkg/analyzer/lib/src/summary/format.fbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,9 @@ table PackageBundle {
12741274
table PackageBundleSdk {
12751275
/// The content of the `allowed_experiments.json` from SDK.
12761276
allowedExperimentsJson:string (id: 0);
1277+
1278+
/// The language version of the SDK.
1279+
languageVersion:LinkedLanguageVersion (id: 1);
12771280
}
12781281

12791282
/// Summary information about a top-level type inference error.

pkg/analyzer/lib/src/summary/idl.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,6 +1912,10 @@ abstract class PackageBundleSdk extends base.SummaryClass {
19121912
/// The content of the `allowed_experiments.json` from SDK.
19131913
@Id(0)
19141914
String get allowedExperimentsJson;
1915+
1916+
/// The language version of the SDK.
1917+
@Id(1)
1918+
LinkedLanguageVersion get languageVersion;
19151919
}
19161920

19171921
/// Summary information about a top-level type inference error.

0 commit comments

Comments
 (0)