Skip to content

Commit 321dfea

Browse files
stereotype441Commit Queue
authored andcommitted
[analyzer/cfe] Always use pre-built SDK for formatting generated files.
Change the following code paths so that they format Dart code by running `tools/sdks/dart-sdk/bin/dart format` as a subprocess: - `generate_messages.dart` (this is the CFE tool that generates `pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart` and `pkg/front_end/lib/src/codes/cfe_codes_generated.dart`). - `generated_files_up_to_date_git_test.dart` (this is a CFE test that verifies that `pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart` and `pkg/front_end/lib/src/codes/cfe_codes_generated.dart` are up to date). - `GeneratedFile.generate` (this is the common method used by most analyzer code generators). - `GeneratedContentExtension.check` (this is used by analyzer tests to verify that generated files are up to date). - `relevance_table_generator.dart` (this is an `analysis_server` tool that generates `relevance_tables*.g.dart` files). Previously, these tools were inconsistent; some of them invoked the formatter through its Dart API, and some of them ran `dart format` as a subprocess via whatever `dart` executable was currently being used for the parent process. This led to a risk that a generated file might be immediately rejected by its own "up to date" test, or by the presubmit script. Standardizing on the use of `tools/sdks/dart-sdk/bin/dart format` (which is what the presubmit script uses) should address this risk. Addresses code review comments: https://dart-review.googlesource.com/c/sdk/+/447920/comment/e9e1aa39_6fffc7e5/. Change-Id: I6a6a69643a69505dc6e30547e0e784358458c357 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448161 Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Jens Johansen <[email protected]>
1 parent a2af8a5 commit 321dfea

File tree

4 files changed

+32
-9
lines changed

4 files changed

+32
-9
lines changed

pkg/analyzer_utilities/lib/generated_content_check.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:async';
22
import 'dart:io';
33

44
import 'package:analyzer_utilities/tools.dart';
5-
import 'package:dart_style/dart_style.dart';
65
import 'package:package_config/package_config.dart';
76
import 'package:path/path.dart';
87
import 'package:pub_semver/pub_semver.dart';
@@ -27,7 +26,7 @@ Future<String> _formatText(String text, {required String pkgPath}) async {
2726
throw StateError('Could not find a Dart language version for "$pkgPath"');
2827
}
2928
var version = Version(languageVersion.major, languageVersion.minor, 0);
30-
return DartFormatter(languageVersion: version).format(text);
29+
return DartFormat.formatString(text, languageVersion: version);
3130
}
3231

3332
extension GeneratedContentExtension on GeneratedContent {

pkg/analyzer_utilities/lib/tools.dart

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ library;
88
import 'dart:async';
99
import 'dart:io';
1010

11+
import 'package:analyzer_testing/package_root.dart';
1112
import 'package:analyzer_utilities/html_dom.dart' as dom;
1213
import 'package:analyzer_utilities/html_generator.dart';
1314
import 'package:analyzer_utilities/text_formatter.dart';
1415
import 'package:collection/collection.dart';
1516
import 'package:path/path.dart';
17+
import 'package:pub_semver/pub_semver.dart';
1618

1719
final RegExp trailingSpacesInLineRegExp = RegExp(r' +$', multiLine: true);
1820
final RegExp trailingWhitespaceRegExp = RegExp(r'[\n ]+$');
@@ -243,13 +245,33 @@ class CodeGeneratorSettings {
243245

244246
/// A utility class for invoking 'dart format'.
245247
class DartFormat {
246-
static String get _dartPath => Platform.resolvedExecutable;
248+
static final String _dartPath =
249+
// TODO(paulberry): check that this is the right path on Windows.
250+
join(packageRoot, '..', 'tools', 'sdks', 'dart-sdk', 'bin', 'dart');
247251

248252
static void formatFile(File file) {
249253
var result = Process.runSync(_dartPath, ['format', file.path]);
250254
_throwIfExitCode(result);
251255
}
252256

257+
static String formatString(String text, {required Version languageVersion}) {
258+
var tempDir = Directory.systemTemp.createTempSync('format');
259+
try {
260+
var file = File(join(tempDir.path, 'input.dart'));
261+
file.writeAsStringSync(text);
262+
var result = Process.runSync(_dartPath, [
263+
'format',
264+
file.path,
265+
'--language-version',
266+
'${languageVersion.major}.${languageVersion.minor}',
267+
]);
268+
_throwIfExitCode(result);
269+
return file.readAsStringSync();
270+
} finally {
271+
tempDir.deleteSync(recursive: true);
272+
}
273+
}
274+
253275
static void _throwIfExitCode(ProcessResult result) {
254276
if (result.exitCode != 0) throw result.stderr as Object;
255277
}

pkg/analyzer_utilities/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ resolution: workspace
1010
# Use 'any' constraints here; we get our versions from the DEPS file.
1111
dependencies:
1212
analyzer: any
13+
analyzer_testing: any
1314
collection: any
14-
dart_style: any
1515
package_config: any
1616
path: any
1717
pub_semver: any

pkg/front_end/test/generated_files_up_to_date_git_test.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import "dart:io" show File, exitCode;
66

7-
import 'package:dart_style/dart_style.dart' show DartFormatter;
7+
import "package:analyzer_utilities/tools.dart" show DartFormat;
88

99
import "../tool/generate_experimental_flags.dart" as generateExperimentalFlags;
1010
import "../tool/generate_messages.dart" as generateMessages;
@@ -133,18 +133,20 @@ void messages() {
133133

134134
Uri generatedFile = generateMessages.computeSharedGeneratedFile(repoDir);
135135
check(
136-
new DartFormatter(
136+
DartFormat.formatString(
137+
messages.sharedMessages,
137138
languageVersion: getPackageVersionFor('_fe_analyzer_shared'),
138-
).format(messages.sharedMessages),
139+
),
139140
generatedFile,
140141
"dart pkg/front_end/tool/generate_messages.dart",
141142
);
142143

143144
Uri cfeGeneratedFile = generateMessages.computeCfeGeneratedFile(repoDir);
144145
check(
145-
new DartFormatter(
146+
DartFormat.formatString(
147+
messages.cfeMessages,
146148
languageVersion: getPackageVersionFor('front_end'),
147-
).format(messages.cfeMessages),
149+
),
148150
cfeGeneratedFile,
149151
"dart pkg/front_end/tool/generate_messages.dart",
150152
);

0 commit comments

Comments
 (0)