Skip to content

Commit 0d2bbcb

Browse files
srawlinsCommit Queue
authored andcommitted
DAS plugins: support a dependencies_override section
Fixes #61422 This change provides a mechanism by which a developer hoping to use or try or test plugins can specify a "dependency_overrides" section for the generated pubspec.yaml file. We just copy the contents as text, and paste them into the generated file. Change-Id: I6f85d41f3dfc029e219b644a85ab14f80339342b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/447540 Commit-Queue: Samuel Rawlins <[email protected]> Reviewed-by: Paul Berry <[email protected]>
1 parent a8e19e2 commit 0d2bbcb

File tree

8 files changed

+173
-80
lines changed

8 files changed

+173
-80
lines changed

pkg/analysis_server/lib/src/plugin/plugin_watcher.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class PluginWatcher implements DriverWatcher {
4848
// At some point, we will stop adding legacy plugins to the context root.
4949
_addLegacyPlugins(driver);
5050

51-
if (driver.pluginConfigurations.isEmpty) {
51+
var pluginsOptions = driver.pluginsOptions;
52+
if (pluginsOptions == null || pluginsOptions.configurations.isEmpty) {
5253
// Call the plugin manager "initialized."
5354
if (!manager.initializedCompleter.isCompleted) {
5455
manager.initializedCompleter.complete();
@@ -105,9 +106,14 @@ class PluginWatcher implements DriverWatcher {
105106
}
106107

107108
void _addPlugins(AnalysisDriver driver) {
108-
var pluginConfigurations = driver.pluginConfigurations;
109+
var pluginsOptions = driver.pluginsOptions;
110+
var pluginConfigurations = pluginsOptions?.configurations ?? const [];
111+
var pluginDependencyOverrides = pluginsOptions?.dependencyOverrides;
109112
var contextRoot = driver.analysisContext!.contextRoot;
110-
var packageGenerator = PluginPackageGenerator(pluginConfigurations);
113+
var packageGenerator = PluginPackageGenerator(
114+
configurations: pluginConfigurations,
115+
dependencyOverrides: pluginDependencyOverrides,
116+
);
111117
// The path here just needs to be unique per context root.
112118

113119
var sharedPluginFolder = manager.pluginStateFolder(contextRoot.root.path);
@@ -124,7 +130,7 @@ class PluginWatcher implements DriverWatcher {
124130
.getChildAssumingFile('plugin.dart')
125131
.writeAsStringSync(packageGenerator.generateEntrypoint());
126132
manager.instrumentationService.logInfo(
127-
'Adding ${driver.pluginConfigurations.length} analyzer plugins for '
133+
'Adding ${pluginConfigurations.length} analyzer plugins for '
128134
"context root: '${contextRoot.root.path}'",
129135
);
130136
manager.addPluginToContextRoot(

pkg/analysis_server/lib/src/plugin2/generator.dart

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,15 @@ class PluginPackageGenerator {
1111
///
1212
/// This typically stems from plugin configuration in an analysis options
1313
/// file.
14-
final List<PluginConfiguration> _pluginConfigurations;
14+
final List<PluginConfiguration> _configurations;
1515

16-
PluginPackageGenerator(this._pluginConfigurations);
16+
final String? _dependencyOverrides;
17+
18+
PluginPackageGenerator({
19+
required List<PluginConfiguration> configurations,
20+
String? dependencyOverrides,
21+
}) : _configurations = configurations,
22+
_dependencyOverrides = dependencyOverrides;
1723

1824
/// Generates the Dart entrpoint file which is to be spawned in a Dart
1925
/// isolate by the analysis server.
@@ -22,7 +28,7 @@ class PluginPackageGenerator {
2228
"'package:analysis_server_plugin/src/plugin_server.dart'",
2329
"'package:analyzer/file_system/physical_file_system.dart'",
2430
"'package:analyzer_plugin/src/channel/isolate_channel.dart'",
25-
for (var configuration in _pluginConfigurations)
31+
for (var configuration in _configurations)
2632
"'package:${configuration.name}/main.dart' as ${configuration.name}",
2733
];
2834

@@ -38,7 +44,7 @@ Future<void> main(List<String> args, SendPort sendPort) async {
3844
plugins: [
3945
''');
4046
// TODO(srawlins): Format with the formatter, for readability.
41-
for (var configuration in _pluginConfigurations) {
47+
for (var configuration in _configurations) {
4248
buffer.writeln(' ${configuration.name}.plugin,');
4349
}
4450
buffer.write('''
@@ -68,10 +74,17 @@ dependencies:
6874
analysis_server_plugin: ^0.2.0
6975
''');
7076

71-
for (var configuration in _pluginConfigurations) {
77+
for (var configuration in _configurations) {
7278
buffer.write(configuration.sourceYaml());
7379
}
7480

81+
if (_dependencyOverrides != null) {
82+
buffer.write('''
83+
dependency_overrides:
84+
$_dependencyOverrides
85+
''');
86+
}
87+
7588
return buffer.toString();
7689
}
7790
}

pkg/analysis_server/test/src/plugin2/generator_test.dart

Lines changed: 82 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,18 @@ void main() {
1616
@reflectiveTest
1717
class GeneratorTest {
1818
void test_entrypointImportsPluginEntrypoints() {
19-
var pluginPackageGenerator = PluginPackageGenerator([
20-
PluginConfiguration(
21-
name: 'no_bools',
22-
source: VersionedPluginSource(constraint: '^1.0.0'),
23-
),
24-
PluginConfiguration(
25-
name: 'no_ints',
26-
source: VersionedPluginSource(constraint: '^1.2.0'),
27-
),
28-
]);
19+
var pluginPackageGenerator = PluginPackageGenerator(
20+
configurations: [
21+
PluginConfiguration(
22+
name: 'no_bools',
23+
source: VersionedPluginSource(constraint: '^1.0.0'),
24+
),
25+
PluginConfiguration(
26+
name: 'no_ints',
27+
source: VersionedPluginSource(constraint: '^1.2.0'),
28+
),
29+
],
30+
);
2931
expect(
3032
pluginPackageGenerator.generateEntrypoint(),
3133
contains('''
@@ -36,16 +38,18 @@ import 'package:no_ints/main.dart' as no_ints;
3638
}
3739

3840
void test_entrypointListsPluginInstances() {
39-
var pluginPackageGenerator = PluginPackageGenerator([
40-
PluginConfiguration(
41-
name: 'no_bools',
42-
source: VersionedPluginSource(constraint: '^1.0.0'),
43-
),
44-
PluginConfiguration(
45-
name: 'no_ints',
46-
source: VersionedPluginSource(constraint: '^1.2.0'),
47-
),
48-
]);
41+
var pluginPackageGenerator = PluginPackageGenerator(
42+
configurations: [
43+
PluginConfiguration(
44+
name: 'no_bools',
45+
source: VersionedPluginSource(constraint: '^1.0.0'),
46+
),
47+
PluginConfiguration(
48+
name: 'no_ints',
49+
source: VersionedPluginSource(constraint: '^1.2.0'),
50+
),
51+
],
52+
);
4953
expect(
5054
pluginPackageGenerator.generateEntrypoint(),
5155
contains('''
@@ -57,13 +61,40 @@ import 'package:no_ints/main.dart' as no_ints;
5761
);
5862
}
5963

64+
void test_pubspecContainsDependencyOverrides() {
65+
var pluginPackageGenerator = PluginPackageGenerator(
66+
configurations: [
67+
PluginConfiguration(
68+
name: 'no_bools',
69+
source: VersionedPluginSource(constraint: '^1.0.0'),
70+
),
71+
],
72+
dependencyOverrides: '''
73+
dep_one: 2.0.0
74+
dep_two:
75+
path: /aaa/bbb/ccc
76+
''',
77+
);
78+
expect(
79+
pluginPackageGenerator.generatePubspec(),
80+
contains('''
81+
dependency_overrides:
82+
dep_one: 2.0.0
83+
dep_two:
84+
path: /aaa/bbb/ccc
85+
'''),
86+
);
87+
}
88+
6089
void test_pubspecContainsGitDependencies() {
61-
var pluginPackageGenerator = PluginPackageGenerator([
62-
PluginConfiguration(
63-
name: 'no_bools',
64-
source: GitPluginSource(url: 'https://example.com/example.git'),
65-
),
66-
]);
90+
var pluginPackageGenerator = PluginPackageGenerator(
91+
configurations: [
92+
PluginConfiguration(
93+
name: 'no_bools',
94+
source: GitPluginSource(url: 'https://example.com/example.git'),
95+
),
96+
],
97+
);
6798
expect(
6899
pluginPackageGenerator.generatePubspec(),
69100
contains('''
@@ -75,16 +106,18 @@ import 'package:no_ints/main.dart' as no_ints;
75106
}
76107

77108
void test_pubspecContainsPathDependencies() {
78-
var pluginPackageGenerator = PluginPackageGenerator([
79-
PluginConfiguration(
80-
name: 'no_bools',
81-
source: PathPluginSource(path: '../no_bools_plugin'),
82-
),
83-
PluginConfiguration(
84-
name: 'no_ints',
85-
source: PathPluginSource(path: 'tools/no_ints_plugin'),
86-
),
87-
]);
109+
var pluginPackageGenerator = PluginPackageGenerator(
110+
configurations: [
111+
PluginConfiguration(
112+
name: 'no_bools',
113+
source: PathPluginSource(path: '../no_bools_plugin'),
114+
),
115+
PluginConfiguration(
116+
name: 'no_ints',
117+
source: PathPluginSource(path: 'tools/no_ints_plugin'),
118+
),
119+
],
120+
);
88121
expect(
89122
pluginPackageGenerator.generatePubspec(),
90123
contains('''
@@ -97,7 +130,7 @@ import 'package:no_ints/main.dart' as no_ints;
97130
}
98131

99132
void test_pubspecContainsSdkConstraint() {
100-
var pluginPackageGenerator = PluginPackageGenerator([]);
133+
var pluginPackageGenerator = PluginPackageGenerator(configurations: []);
101134
expect(
102135
pluginPackageGenerator.generatePubspec(),
103136
contains('''
@@ -108,16 +141,18 @@ environment:
108141
}
109142

110143
void test_pubspecContainsVersionedDependencies() {
111-
var pluginPackageGenerator = PluginPackageGenerator([
112-
PluginConfiguration(
113-
name: 'no_bools',
114-
source: VersionedPluginSource(constraint: '^1.0.0'),
115-
),
116-
PluginConfiguration(
117-
name: 'no_ints',
118-
source: VersionedPluginSource(constraint: '^1.2.0'),
119-
),
120-
]);
144+
var pluginPackageGenerator = PluginPackageGenerator(
145+
configurations: [
146+
PluginConfiguration(
147+
name: 'no_bools',
148+
source: VersionedPluginSource(constraint: '^1.0.0'),
149+
),
150+
PluginConfiguration(
151+
name: 'no_ints',
152+
source: VersionedPluginSource(constraint: '^1.2.0'),
153+
),
154+
],
155+
);
121156
expect(
122157
pluginPackageGenerator.generatePubspec(),
123158
contains('''

pkg/analyzer/api.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ package:analyzer/dart/analysis/analysis_options.dart:
319319
formatterOptions (getter: FormatterOptions)
320320
lint (getter: bool)
321321
lintRules (getter: List<AbstractAnalysisRule>)
322-
pluginConfigurations (getter: List<PluginConfiguration>)
322+
pluginConfigurations (getter: List<PluginConfiguration>, deprecated)
323323
strictCasts (getter: bool)
324324
strictInference (getter: bool)
325325
strictRawTypes (getter: bool)

pkg/analyzer/lib/dart/analysis/analysis_options.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@ abstract class AnalysisOptions {
2828
/// legacy plugin, the legacy plugin should be enabled.
2929
List<String> get enabledLegacyPluginNames;
3030

31-
/// Return a list of error processors that are to be used when reporting
32-
/// errors in some analysis context.
31+
/// The list of error processors that are to be used when reporting errors in
32+
/// some analysis context.
3333
List<ErrorProcessor> get errorProcessors;
3434

35-
/// Return a list of exclude patterns used to exclude some sources from
36-
/// analysis.
35+
/// The list of exclude patterns used to exclude some sources from analysis.
3736
List<String> get excludePatterns;
3837

39-
/// Return the options used to control the formatter.
38+
/// The options used to control the formatter.
4039
FormatterOptions get formatterOptions;
4140

4241
/// Whether analysis is to generate lint warnings.
@@ -52,6 +51,7 @@ abstract class AnalysisOptions {
5251
///
5352
/// These are distinct from the legacy plugins found at
5453
/// [enabledLegacyPluginNames].
54+
@Deprecated('This will be removed without replacement')
5555
List<PluginConfiguration> get pluginConfigurations;
5656

5757
/// Whether implicit casts should be reported as potential problems.

0 commit comments

Comments
 (0)