[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 <paulberry@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
diff --git a/pkg/analyzer_utilities/lib/generated_content_check.dart b/pkg/analyzer_utilities/lib/generated_content_check.dart
index 72207db..28d70d5 100644
--- a/pkg/analyzer_utilities/lib/generated_content_check.dart
+++ b/pkg/analyzer_utilities/lib/generated_content_check.dart
@@ -2,7 +2,6 @@
import 'dart:io';
import 'package:analyzer_utilities/tools.dart';
-import 'package:dart_style/dart_style.dart';
import 'package:package_config/package_config.dart';
import 'package:path/path.dart';
import 'package:pub_semver/pub_semver.dart';
@@ -27,7 +26,7 @@
throw StateError('Could not find a Dart language version for "$pkgPath"');
}
var version = Version(languageVersion.major, languageVersion.minor, 0);
- return DartFormatter(languageVersion: version).format(text);
+ return DartFormat.formatString(text, languageVersion: version);
}
extension GeneratedContentExtension on GeneratedContent {
diff --git a/pkg/analyzer_utilities/lib/tools.dart b/pkg/analyzer_utilities/lib/tools.dart
index daaab21..a552628 100644
--- a/pkg/analyzer_utilities/lib/tools.dart
+++ b/pkg/analyzer_utilities/lib/tools.dart
@@ -8,11 +8,13 @@
import 'dart:async';
import 'dart:io';
+import 'package:analyzer_testing/package_root.dart';
import 'package:analyzer_utilities/html_dom.dart' as dom;
import 'package:analyzer_utilities/html_generator.dart';
import 'package:analyzer_utilities/text_formatter.dart';
import 'package:collection/collection.dart';
import 'package:path/path.dart';
+import 'package:pub_semver/pub_semver.dart';
final RegExp trailingSpacesInLineRegExp = RegExp(r' +$', multiLine: true);
final RegExp trailingWhitespaceRegExp = RegExp(r'[\n ]+$');
@@ -243,13 +245,33 @@
/// A utility class for invoking 'dart format'.
class DartFormat {
- static String get _dartPath => Platform.resolvedExecutable;
+ static final String _dartPath =
+ // TODO(paulberry): check that this is the right path on Windows.
+ join(packageRoot, '..', 'tools', 'sdks', 'dart-sdk', 'bin', 'dart');
static void formatFile(File file) {
var result = Process.runSync(_dartPath, ['format', file.path]);
_throwIfExitCode(result);
}
+ static String formatString(String text, {required Version languageVersion}) {
+ var tempDir = Directory.systemTemp.createTempSync('format');
+ try {
+ var file = File(join(tempDir.path, 'input.dart'));
+ file.writeAsStringSync(text);
+ var result = Process.runSync(_dartPath, [
+ 'format',
+ file.path,
+ '--language-version',
+ '${languageVersion.major}.${languageVersion.minor}',
+ ]);
+ _throwIfExitCode(result);
+ return file.readAsStringSync();
+ } finally {
+ tempDir.deleteSync(recursive: true);
+ }
+ }
+
static void _throwIfExitCode(ProcessResult result) {
if (result.exitCode != 0) throw result.stderr as Object;
}
diff --git a/pkg/analyzer_utilities/pubspec.yaml b/pkg/analyzer_utilities/pubspec.yaml
index 35984ca..e473975 100644
--- a/pkg/analyzer_utilities/pubspec.yaml
+++ b/pkg/analyzer_utilities/pubspec.yaml
@@ -10,8 +10,8 @@
# Use 'any' constraints here; we get our versions from the DEPS file.
dependencies:
analyzer: any
+ analyzer_testing: any
collection: any
- dart_style: any
package_config: any
path: any
pub_semver: any
diff --git a/pkg/front_end/test/generated_files_up_to_date_git_test.dart b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
index 74a8116..88da3e7 100644
--- a/pkg/front_end/test/generated_files_up_to_date_git_test.dart
+++ b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
@@ -4,7 +4,7 @@
import "dart:io" show File, exitCode;
-import 'package:dart_style/dart_style.dart' show DartFormatter;
+import "package:analyzer_utilities/tools.dart" show DartFormat;
import "../tool/generate_experimental_flags.dart" as generateExperimentalFlags;
import "../tool/generate_messages.dart" as generateMessages;
@@ -133,18 +133,20 @@
Uri generatedFile = generateMessages.computeSharedGeneratedFile(repoDir);
check(
- new DartFormatter(
+ DartFormat.formatString(
+ messages.sharedMessages,
languageVersion: getPackageVersionFor('_fe_analyzer_shared'),
- ).format(messages.sharedMessages),
+ ),
generatedFile,
"dart pkg/front_end/tool/generate_messages.dart",
);
Uri cfeGeneratedFile = generateMessages.computeCfeGeneratedFile(repoDir);
check(
- new DartFormatter(
+ DartFormat.formatString(
+ messages.cfeMessages,
languageVersion: getPackageVersionFor('front_end'),
- ).format(messages.cfeMessages),
+ ),
cfeGeneratedFile,
"dart pkg/front_end/tool/generate_messages.dart",
);