Skip to content

Commit 3224637

Browse files
pqCommit Queue
authored and
Commit Queue
committed
Reland "options map support scaffolding in driver" (with a re-introduced optional analysisOptions param)
This is a reland of commit 717ce7a with a slight modification to `AnalysisDriver` to allow Google3 clients to pass an analysisOptions object in. The logic to accommodate this is only temporary and will go away as soon as I can update clients to use an options map instead. Original change's description: > options map support scaffolding in driver > > Konstantin and I chatted a bit about this so at least some of it shouldn't be too surprising to him but please do feel free to grab me to chat. > > That said a few pointers would be handy. Notably, this change: > > * introduces a new `SharedOptionsOptionsMap` for use in SDK drivers (and preserve current semantics) > * this is currently public but will be private once driver is more evolved to accommodate multiple options files > * removes the shared `_analysisOptions` from the analysis driver with a baby step to using the one shared in SharedOptionsOptionsMap > * removes context_builder and collection v2 experiments (and tests) > * I'll harvest some more functionality from these in future changes but for now they're distracting and hard to maintain > > This work is all to setup moving analysis options awareness into file state objects which will allow us to remove `sdkVersionConstraint` info from options (finally) and a host of other good stuff (see #54124). > > > > Change-Id: Ic4278184016d1018b4b5b1c6ac5ba9e2546927a5 > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/344860 > Reviewed-by: Brian Wilkerson <[email protected]> > Reviewed-by: Konstantin Shcheglov <[email protected]> > Commit-Queue: Phil Quitslund <[email protected]> Change-Id: Iac9c4eb1aa448f2ca44e32dfb6cdf7cf765b6027 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/344944 Reviewed-by: Konstantin Shcheglov <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent cee5fac commit 3224637

12 files changed

+151
-995
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:typed_data';
66

77
import 'package:analyzer/file_system/file_system.dart';
88
import 'package:analyzer/src/context/packages.dart';
9+
import 'package:analyzer/src/dart/analysis/analysis_options_map.dart';
910
import 'package:analyzer/src/dart/analysis/byte_store.dart';
1011
import 'package:analyzer/src/dart/analysis/driver.dart';
1112
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
@@ -49,6 +50,7 @@ Future<Uint8List> buildSdkSummary({
4950

5051
final logger = PerformanceLog(StringBuffer());
5152
final scheduler = AnalysisDriverScheduler(logger);
53+
final optionsMap = AnalysisOptionsMap.forSharedOptions(AnalysisOptionsImpl());
5254
final analysisDriver = AnalysisDriver(
5355
scheduler: scheduler,
5456
logger: logger,
@@ -57,7 +59,7 @@ Future<Uint8List> buildSdkSummary({
5759
sourceFactory: SourceFactory([
5860
DartUriResolver(sdk),
5961
]),
60-
analysisOptions: AnalysisOptionsImpl(),
62+
analysisOptionsMap: optionsMap,
6163
packages: Packages({}),
6264
);
6365
scheduler.start();

pkg/analyzer/lib/src/clients/build_resolvers/build_resolvers.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
88
import 'package:analyzer/dart/analysis/session.dart';
99
import 'package:analyzer/file_system/file_system.dart';
1010
import 'package:analyzer/src/context/packages.dart';
11+
import 'package:analyzer/src/dart/analysis/analysis_options_map.dart';
1112
import 'package:analyzer/src/dart/analysis/byte_store.dart';
1213
import 'package:analyzer/src/dart/analysis/driver.dart';
1314
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
@@ -53,13 +54,15 @@ AnalysisDriverForPackageBuild createAnalysisDriver({
5354

5455
var logger = PerformanceLog(null);
5556
var scheduler = AnalysisDriverScheduler(logger);
57+
var sharedOptions = analysisOptions as AnalysisOptionsImpl;
58+
var optionsMap = AnalysisOptionsMap.forSharedOptions(sharedOptions);
5659
var driver = AnalysisDriver(
5760
scheduler: scheduler,
5861
logger: logger,
5962
resourceProvider: resourceProvider,
6063
byteStore: byteStore ?? MemoryByteStore(),
6164
sourceFactory: sourceFactory,
62-
analysisOptions: analysisOptions as AnalysisOptionsImpl,
65+
analysisOptionsMap: optionsMap,
6366
externalSummaries: dataStore,
6467
packages: packages,
6568
);

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

Lines changed: 0 additions & 178 deletions
This file was deleted.

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

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,61 @@
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 'package:analyzer/dart/analysis/analysis_options.dart';
65
import 'package:analyzer/file_system/file_system.dart';
6+
import 'package:analyzer/src/clients/build_resolvers/build_resolvers.dart';
77

8-
/// Instances of the class [AnalysisOptionsMap] map [File]s under analysis to their
9-
/// corresponding [AnalysisOptions].
8+
/// Instances of the class [AnalysisOptionsMap] map [File]s under analysis to
9+
/// their corresponding [AnalysisOptions].
1010
class AnalysisOptionsMap {
11-
// TODO(pq): final backing representation TBD.
12-
final List<({Folder folder, AnalysisOptions options})> _entries = [];
11+
final List<OptionsMapEntry> entries = [];
12+
13+
/// Create an empty [AnalysisOptionsMap] instance.
14+
AnalysisOptionsMap();
1315

1416
/// Map this [folder] to the given [options].
1517
void add(Folder folder, AnalysisOptions options) {
16-
_entries.add((folder: folder, options: options));
18+
entries.add(OptionsMapEntry(folder, options));
1719
// Sort entries by (reverse) containment (for now).
18-
_entries.sort((e1, e2) => e1.folder.contains(e2.folder.path) ? 1 : -1);
20+
entries.sort((e1, e2) => e1.folder.contains(e2.folder.path) ? 1 : -1);
1921
}
2022

2123
/// Get the [AnalysisOptions] instance for the given [file] (or `null` if none
2224
/// has been set).
2325
AnalysisOptions? getOptions(File file) {
24-
for (var entry in _entries) {
26+
for (var entry in entries) {
2527
if (entry.folder.contains(file.path)) return entry.options;
2628
}
2729

2830
return null;
2931
}
32+
33+
/// Create an [AnalysisOptionsMap] that holds one set of [sharedOptions] for all
34+
/// associated files.
35+
// TODO(pq): replace w/ a factory constructor when SharedOptionsOptionsMap is made private
36+
static SharedOptionsOptionsMap forSharedOptions(
37+
AnalysisOptionsImpl sharedOptions) =>
38+
SharedOptionsOptionsMap(sharedOptions);
39+
}
40+
41+
/// Instances of [OptionsMapEntry] associate [Folder]s with their
42+
/// corresponding [AnalysisOptions].
43+
class OptionsMapEntry {
44+
/// The folder containing an options file.
45+
final Folder folder;
46+
47+
/// The corresponding options object.
48+
final AnalysisOptions options;
49+
50+
/// Create a new entry for the give [folder] and corresponding [options];
51+
OptionsMapEntry(this.folder, this.options);
52+
}
53+
54+
// TODO(pq): make private when no longer referenced.
55+
class SharedOptionsOptionsMap extends AnalysisOptionsMap {
56+
/// The [entries] list is empty but that's OK. We'll always just return
57+
/// the shared options.
58+
final AnalysisOptionsImpl sharedOptions;
59+
SharedOptionsOptionsMap(this.sharedOptions);
60+
@override
61+
AnalysisOptions getOptions(File file) => sharedOptions;
3062
}

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

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
1111
import 'package:analyzer/src/analysis_options/apply_options.dart';
1212
import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
1313
import 'package:analyzer/src/context/packages.dart';
14+
import 'package:analyzer/src/dart/analysis/analysis_options_map.dart';
1415
import 'package:analyzer/src/dart/analysis/byte_store.dart'
1516
show ByteStore, MemoryByteStore;
17+
import 'package:analyzer/src/dart/analysis/context_root.dart';
1618
import 'package:analyzer/src/dart/analysis/driver.dart'
1719
show
1820
AnalysisDriver,
@@ -128,17 +130,18 @@ class ContextBuilderImpl implements ContextBuilder {
128130
sdk: sdk,
129131
);
130132
}
133+
// TODO(pq): replace w/ a map created directly via `_createOptionsMap`
134+
var analysisOptionsMap = AnalysisOptionsMap.forSharedOptions(options);
131135

132136
final analysisContext =
133137
DriverBasedAnalysisContext(resourceProvider, contextRoot);
134-
135138
var driver = AnalysisDriver(
136139
scheduler: scheduler,
137140
logger: performanceLog,
138141
resourceProvider: resourceProvider,
139142
byteStore: byteStore,
140143
sourceFactory: sourceFactory,
141-
analysisOptions: options,
144+
analysisOptionsMap: analysisOptionsMap,
142145
packages: _createPackageMap(
143146
contextRoot: contextRoot,
144147
),
@@ -165,6 +168,66 @@ class ContextBuilderImpl implements ContextBuilder {
165168
return analysisContext;
166169
}
167170

171+
/// Create an [AnalysisOptionsMap] for the given [contextRoot].
172+
// ignore: unused_element
173+
AnalysisOptionsMap _createOptionsMap(
174+
ContextRoot contextRoot,
175+
SourceFactory sourceFactory,
176+
@Deprecated("Use 'updateAnalysisOptions2' instead")
177+
void Function(AnalysisOptionsImpl p1)? updateAnalysisOptions,
178+
void Function(
179+
{required AnalysisOptionsImpl analysisOptions,
180+
required ContextRoot contextRoot,
181+
required DartSdk sdk})?
182+
updateAnalysisOptions2,
183+
DartSdk sdk) {
184+
var map = AnalysisOptionsMap();
185+
var provider = AnalysisOptionsProvider(sourceFactory);
186+
var pubspecFile = _findPubspecFile(contextRoot);
187+
188+
void updateOptions(AnalysisOptionsImpl options) {
189+
if (pubspecFile != null) {
190+
var extractor = SdkConstraintExtractor(pubspecFile);
191+
var sdkVersionConstraint = extractor.constraint();
192+
if (sdkVersionConstraint != null) {
193+
// TODO(pq): remove
194+
// ignore: deprecated_member_use_from_same_package
195+
options.sdkVersionConstraint = sdkVersionConstraint;
196+
}
197+
}
198+
if (updateAnalysisOptions != null) {
199+
updateAnalysisOptions(options);
200+
} else if (updateAnalysisOptions2 != null) {
201+
updateAnalysisOptions2(
202+
analysisOptions: options,
203+
contextRoot: contextRoot,
204+
sdk: sdk,
205+
);
206+
}
207+
}
208+
209+
var optionsMappings =
210+
(contextRoot as ContextRootImpl).optionsFileMap.entries;
211+
212+
// If there are no options files, we still want to propagate sdk constraints
213+
// and options updates to the context root.
214+
if (optionsMappings.isEmpty) {
215+
var options = AnalysisOptionsImpl();
216+
updateOptions(options);
217+
map.add(contextRoot.root, options);
218+
} else {
219+
for (var entry in optionsMappings) {
220+
var options = AnalysisOptionsImpl();
221+
var optionsYaml = provider.getOptionsFromFile(entry.value);
222+
options.applyOptions(optionsYaml);
223+
updateOptions(options);
224+
map.add(entry.key, options);
225+
}
226+
}
227+
228+
return map;
229+
}
230+
168231
/// Return [Packages] to analyze the [contextRoot].
169232
///
170233
// TODO(scheglov): Get [Packages] from [Workspace]?

0 commit comments

Comments
 (0)