Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1abce6d

Browse files
author
Dart CI
committed
Version 2.10.0-115.0.dev
Merge commit '16140ad7162cd309373a7743090f185e3872e9e6' into 'dev'
2 parents e6aa072 + 16140ad commit 1abce6d

File tree

21 files changed

+3821
-3423
lines changed

21 files changed

+3821
-3423
lines changed

pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import 'package:analysis_server/src/services/correction/fix/data_driven/change.d
66
import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
77
import 'package:meta/meta.dart';
88

9-
/// The behavior common to all of the data used to construct fixes.
9+
/// A description of a set of changes to a single element of the API.
1010
class Transform {
1111
/// The human-readable title describing the transform.
1212
final String title;
1313

14+
/// The date on which the API was changed.
15+
final DateTime date;
16+
1417
/// The element being transformed.
1518
final ElementDescriptor element;
1619

@@ -20,7 +23,10 @@ class Transform {
2023
/// Initialize a newly created transform to describe a transformation of the
2124
/// [element].
2225
Transform(
23-
{@required this.title, @required this.element, @required this.changes});
26+
{@required this.title,
27+
this.date,
28+
@required this.element,
29+
@required this.changes});
2430

2531
/// Return `true` if this transform can be applied to fix an issue related to
2632
/// an element with the given [name] in a library that imports the

pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_parser.dart

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class TransformSetParser {
2323
static const String _classKey = 'class';
2424
static const String _constantKey = 'constant';
2525
static const String _constructorKey = 'constructor';
26+
static const String _dateKey = 'date';
2627
static const String _elementKey = 'element';
2728
static const String _enumKey = 'enum';
2829
static const String _extensionKey = 'extension';
@@ -299,6 +300,33 @@ class TransformSetParser {
299300
}
300301
}
301302

303+
/// Translate the [node] into a date. Return the resulting date, or `null`
304+
/// if the [node] does not represent a valid date. If the [node] is not
305+
/// valid, use the name of the associated [key] to report the error.
306+
DateTime _translateDate(YamlNode node, String key) {
307+
if (node is YamlScalar) {
308+
var value = node.value;
309+
if (value is String) {
310+
try {
311+
return DateTime.parse(value);
312+
} on FormatException {
313+
// Fall through to report the invalid value.
314+
}
315+
}
316+
_reportError(TransformSetErrorCode.invalidValue, node,
317+
[key, 'Date', _nodeType(node)]);
318+
return null;
319+
} else if (node == null) {
320+
// TODO(brianwilkerson) Report the missing YAML. For the best UX we
321+
// probably need to pass in the code to report.
322+
return null;
323+
} else {
324+
_reportError(TransformSetErrorCode.invalidValue, node,
325+
[key, 'Date', _nodeType(node)]);
326+
return null;
327+
}
328+
}
329+
302330
/// Translate the [node] into an element descriptor. Return the resulting
303331
/// descriptor, or `null` if the [node] does not represent a valid element
304332
/// descriptor. If the [node] is not valid, use the name of the associated
@@ -463,9 +491,15 @@ class TransformSetParser {
463491
/// is not valid, use the name of the associated [key] to report the error.
464492
Transform _translateTransform(YamlNode node, String key) {
465493
if (node is YamlMap) {
466-
_reportUnsupportedKeys(node, const {_changesKey, _elementKey, _titleKey});
494+
_reportUnsupportedKeys(
495+
node, const {_changesKey, _dateKey, _elementKey, _titleKey});
467496
var title = _translateString(node.valueAt(_titleKey), _titleKey);
497+
var date = _translateDate(node.valueAt(_dateKey), _dateKey);
468498
var element = _translateElement(node.valueAt(_elementKey), _elementKey);
499+
if (element == null) {
500+
// The error has already been reported.
501+
return null;
502+
}
469503
var changes = _translateList(
470504
node.valueAt(_changesKey), _changesKey, _translateChange);
471505
if (changes == null) {
@@ -476,7 +510,8 @@ class TransformSetParser {
476510
changes.add(ModifyParameters(modifications: _parameterModifications));
477511
_parameterModifications = null;
478512
}
479-
return Transform(title: title, element: element, changes: changes);
513+
return Transform(
514+
title: title, date: date, element: element, changes: changes);
480515
} else if (node == null) {
481516
// TODO(brianwilkerson) Report the missing YAML.
482517
return null;
@@ -492,19 +527,23 @@ class TransformSetParser {
492527
TransformSet _translateTransformSet(YamlNode node) {
493528
if (node is YamlMap) {
494529
_reportUnsupportedKeys(node, const {_transformsKey, _versionKey});
495-
var set = TransformSet();
496-
// TODO(brianwilkerson) Version information is currently being ignored,
497-
// but needs to be used to select a translator.
498530
var version = _translateInteger(node.valueAt(_versionKey), _versionKey);
499-
if (version != currentVersion) {
500-
// TODO(brianwilkerson) Report the unsupported version.
531+
if (version == null) {
532+
// The error has already been reported.
533+
return null;
534+
} else if (version > currentVersion) {
535+
// TODO(brianwilkerson) Report that the version is unsupported.
536+
return null;
501537
}
538+
// TODO(brianwilkerson) Version information is currently being ignored,
539+
// but needs to be used to select a translator.
502540
var transformations = _translateList(
503541
node.valueAt(_transformsKey), _transformsKey, _translateTransform);
504542
if (transformations == null) {
505543
// The error has already been reported.
506544
return null;
507545
}
546+
var set = TransformSet();
508547
for (var transform in transformations) {
509548
set.addTransform(transform);
510549
}

pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/invalid_value_test.dart

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,11 @@ transforms:
2222
- title: 'Rename A'
2323
element:
2424
uris: ['test.dart']
25-
components:
26-
- 'A'
25+
class: 'A'
2726
changes:
2827
- 'rename'
2928
''', [
30-
error(TransformSetErrorCode.invalidValue, 123, 8),
29+
error(TransformSetErrorCode.invalidValue, 110, 8),
3130
]);
3231
}
3332

@@ -52,8 +51,7 @@ transforms:
5251
- title: 'Rename A'
5352
element:
5453
uris: ['test.dart']
55-
components:
56-
- 'A'
54+
class: 'A'
5755
changes:
5856
- kind: 'rename'
5957
newName: 'B'
@@ -69,8 +67,7 @@ transforms:
6967
- title: 'Rename A'
7068
element:
7169
uris: ['test.dart']
72-
components:
73-
- 'A'
70+
class: 'A'
7471
changes:
7572
- kind: 'rename'
7673
newName: 'B'
@@ -95,8 +92,7 @@ transforms:
9592
- title: 0
9693
element:
9794
uris: ['test.dart']
98-
components:
99-
- 'A'
95+
class: 'A'
10096
changes:
10197
- kind: 'rename'
10298
newName: 'B'
@@ -112,8 +108,7 @@ transforms:
112108
- title: []
113109
element:
114110
uris: ['test.dart']
115-
components:
116-
- 'A'
111+
class: 'A'
117112
changes:
118113
- kind: 'rename'
119114
newName: 'B'
@@ -147,15 +142,14 @@ transforms:
147142
- title: 'Rename A'
148143
element:
149144
uris: ['test.dart']
150-
components:
151-
- 'A'
145+
class: 'A'
152146
changes:
153147
- kind: 'addTypeParameter'
154148
index: 1
155149
name: 'T'
156150
value: 'int'
157151
''', [
158-
error(TransformSetErrorCode.invalidValue, 192, 5),
152+
error(TransformSetErrorCode.invalidValue, 179, 5),
159153
]);
160154
}
161155
}

pkg/analysis_server/test/src/services/correction/fix/data_driven/diagnostics/unsupported_key_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@ transforms:
2323
element:
2424
uris:
2525
- 'test.dart'
26-
components:
27-
- 'A'
26+
class: 'A'
2827
changes:
2928
- kind: 'rename'
3029
oldName: 'A'
3130
newName: 'B'
3231
''', [
33-
error(TransformSetErrorCode.unsupportedKey, 150, 7),
32+
error(TransformSetErrorCode.unsupportedKey, 137, 7),
3433
]);
3534
}
3635
}

pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,24 @@ transforms:
216216
expect(parameter.index, 2);
217217
}
218218

219+
void test_date() {
220+
parse('''
221+
version: 1
222+
transforms:
223+
- title: 'Rename g'
224+
date: 2020-09-10
225+
element:
226+
uris: ['test.dart']
227+
getter: 'g'
228+
changes: []
229+
''');
230+
var transforms = result.transformsFor('g', ['test.dart']);
231+
expect(transforms, hasLength(1));
232+
var transform = transforms[0];
233+
expect(transform.title, 'Rename g');
234+
expect(transform.changes, isEmpty);
235+
}
236+
219237
void test_element_getter_inMixin() {
220238
parse('''
221239
version: 1

pkg/analyzer/lib/src/dart/micro/library_analyzer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ class LibraryAnalyzer {
277277
typeSystem: _typeSystem,
278278
inheritanceManager: _inheritance,
279279
analysisOptions: _context.analysisOptions,
280-
workspacePackage: null, // TODO(scheglov) implement it
280+
workspacePackage: _library.workspacePackage,
281281
),
282282
);
283283

pkg/analyzer/lib/src/dart/micro/library_graph.dart

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ import 'package:analyzer/src/summary/link.dart' as graph
3030
show DependencyWalker, Node;
3131
import 'package:analyzer/src/summary2/informative_data.dart';
3232
import 'package:analyzer/src/util/performance/operation_performance.dart';
33+
import 'package:analyzer/src/workspace/workspace.dart';
3334
import 'package:collection/collection.dart';
3435
import 'package:convert/convert.dart';
3536
import 'package:meta/meta.dart';
37+
import 'package:pub_semver/pub_semver.dart';
3638

3739
/// Ensure that the [FileState.libraryCycle] for the [file] and anything it
3840
/// depends on is computed.
@@ -53,6 +55,24 @@ class FileState {
5355
/// The [Source] of the file with the [uri].
5456
final Source source;
5557

58+
/// The [WorkspacePackage] that contains this file.
59+
///
60+
/// It might be `null` if the file is outside of the workspace.
61+
final WorkspacePackage workspacePackage;
62+
63+
/// The [FeatureSet] for all files in the analysis context.
64+
///
65+
/// Usually it is the feature set of the latest language version, plus
66+
/// possibly additional enabled experiments (from the analysis options file,
67+
/// or from SDK allowed experiments).
68+
///
69+
/// This feature set is then restricted, with the [_packageLanguageVersion],
70+
/// or with a `@dart` language override token in the file header.
71+
final FeatureSet _contextFeatureSet;
72+
73+
/// The language version for the package that contains this file.
74+
final Version _packageLanguageVersion;
75+
5676
/// Files that reference this file.
5777
final List<FileState> referencingFiles = [];
5878

@@ -70,7 +90,15 @@ class FileState {
7090
UnlinkedUnit2 unlinked2;
7191
LibraryCycle _libraryCycle;
7292

73-
FileState._(this._fsState, this.path, this.uri, this.source);
93+
FileState._(
94+
this._fsState,
95+
this.path,
96+
this.uri,
97+
this.source,
98+
this.workspacePackage,
99+
this._contextFeatureSet,
100+
this._packageLanguageVersion,
101+
);
74102

75103
List<int> get apiSignature => _apiSignature;
76104

@@ -135,14 +163,14 @@ class FileState {
135163

136164
CompilationUnit parse(AnalysisErrorListener errorListener, String content) {
137165
AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
138-
FeatureSet featureSet =
139-
_fsState.featureSetProvider.getFeatureSet(path, uri);
140166

141167
CharSequenceReader reader = CharSequenceReader(content);
142168
Scanner scanner = Scanner(source, reader, errorListener)
143169
..configureFeatures(
144-
featureSetForOverriding: featureSet,
145-
featureSet: featureSet,
170+
featureSetForOverriding: _contextFeatureSet,
171+
featureSet: _contextFeatureSet.restrictToVersion(
172+
_packageLanguageVersion,
173+
),
146174
);
147175
Token token = scanner.tokenize(reportScannerErrors: false);
148176
LineInfo lineInfo = LineInfo(scanner.lineStarts);
@@ -415,6 +443,7 @@ class FileSystemState {
415443
final ResourceProvider _resourceProvider;
416444
final CiderByteStore _byteStore;
417445
final SourceFactory _sourceFactory;
446+
final Workspace _workspace;
418447
final AnalysisOptions _analysisOptions;
419448
final Uint32List _linkedSalt;
420449

@@ -440,6 +469,7 @@ class FileSystemState {
440469
this._resourceProvider,
441470
this._byteStore,
442471
this._sourceFactory,
472+
this._workspace,
443473
this._analysisOptions,
444474
this._linkedSalt,
445475
this.featureSetProvider,
@@ -470,6 +500,21 @@ class FileSystemState {
470500
}
471501
}
472502

503+
FeatureSet contextFeatureSet(
504+
String path,
505+
Uri uri,
506+
WorkspacePackage workspacePackage,
507+
) {
508+
var workspacePackageExperiments = workspacePackage?.enabledExperiments;
509+
if (workspacePackageExperiments != null) {
510+
return featureSetProvider.featureSetForExperiments(
511+
workspacePackageExperiments,
512+
);
513+
}
514+
515+
return featureSetProvider.getFeatureSet(path, uri);
516+
}
517+
473518
FileState getFileForPath({
474519
@required String path,
475520
@required OperationPerformanceImpl performance,
@@ -482,7 +527,12 @@ class FileSystemState {
482527
);
483528

484529
var source = _sourceFactory.forUri2(uri);
485-
file = FileState._(this, path, uri, source);
530+
var workspacePackage = _workspace?.findPackageFor(path);
531+
var featureSet = contextFeatureSet(path, uri, workspacePackage);
532+
var packageLanguageVersion =
533+
featureSetProvider.getLanguageVersion(path, uri);
534+
file = FileState._(this, path, uri, source, workspacePackage, featureSet,
535+
packageLanguageVersion);
486536

487537
_pathToFile[path] = file;
488538
_uriToFile[uri] = file;
@@ -508,7 +558,13 @@ class FileSystemState {
508558
}
509559
var path = source.fullName;
510560

511-
file = FileState._(this, path, uri, source);
561+
var workspacePackage = _workspace?.findPackageFor(path);
562+
var featureSet = contextFeatureSet(path, uri, workspacePackage);
563+
var packageLanguageVersion =
564+
featureSetProvider.getLanguageVersion(path, uri);
565+
566+
file = FileState._(this, path, uri, source, workspacePackage, featureSet,
567+
packageLanguageVersion);
512568
_pathToFile[path] = file;
513569
_uriToFile[uri] = file;
514570

0 commit comments

Comments
 (0)