Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1023)

Unified Diff: pkg/status_file/lib/status_file.dart

Issue 2984203002: Move the status file parser into its own package. (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/status_file/lib/src/expression.dart ('k') | pkg/status_file/pubspec.yaml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/status_file/lib/status_file.dart
diff --git a/tools/testing/dart/status_file.dart b/pkg/status_file/lib/status_file.dart
similarity index 73%
rename from tools/testing/dart/status_file.dart
rename to pkg/status_file/lib/status_file.dart
index df64025ba03e3a67f922954f6c305aef7e3a2c99..d6cd7f362166c4016a54cb5f970cca4e1a13c8ec 100644
--- a/tools/testing/dart/status_file.dart
+++ b/pkg/status_file/lib/status_file.dart
@@ -4,10 +4,11 @@
import 'dart:io';
+import 'package:path/path.dart' as p;
+
import 'environment.dart';
import 'expectation.dart';
-import 'path.dart';
-import 'status_expression.dart';
+import 'src/expression.dart';
/// Matches the header that begins a new section, like:
///
@@ -46,6 +47,8 @@ class StatusFile {
final List<StatusSection> sections = [];
/// Parses the status file at [_path].
+ ///
+ /// Throws a [SyntaxError] if the file could not be parsed.
StatusFile.read(this._path) {
var lines = new File(_path).readAsLinesSync();
@@ -58,14 +61,7 @@ class StatusFile {
lineNumber++;
fail(String message, [List<String> errors]) {
- print('$message in "$_shortPath" line $lineNumber:\n$line');
-
- if (errors != null) {
- for (var error in errors) {
- print("- ${error.replaceAll('\n', '\n ')}");
- }
- }
- exit(1);
+ throw new SyntaxError(_shortPath, lineNumber, line, message, errors);
}
// Strip off the comment and whitespace.
@@ -85,17 +81,7 @@ class StatusFile {
var match = _sectionPattern.firstMatch(source);
if (match != null) {
try {
- var condition = Expression.parse(match[1].trim());
-
- var errors = <String>[];
- condition.validate(errors);
-
- if (errors.isNotEmpty) {
- var s = errors.length > 1 ? "s" : "";
- fail('Validation error$s', errors);
- }
-
- section = new StatusSection(condition);
+ section = new StatusSection(Expression.parse(match[1].trim()));
sections.add(section);
} on FormatException {
fail("Status expression syntax error");
@@ -135,12 +121,31 @@ class StatusFile {
}
}
+ /// Validates that the variables and values used in all of the section
+ /// condition expressions are defined in [environment].
+ ///
+ /// Throws a [SyntaxError] on the first found error.
+ void validate(Environment environment) {
+ // TODO(rnystrom): It would be more useful if it reported all of the errors
+ // instead of stopping on the first.
+ for (var section in sections) {
+ if (section._condition == null) continue;
+
+ var errors = <String>[];
+ section._condition.validate(environment, errors);
+
+ if (errors.isNotEmpty) {
+ var s = errors.length > 1 ? "s" : "";
+ throw new SyntaxError(_shortPath, section.lineNumber,
+ "[ ${section._condition} ]", 'Validation error$s', errors);
+ }
+ }
+ }
+
/// Gets the path to this status file relative to the Dart repo root.
String get _shortPath {
- var repoRoot = new Path(Platform.script
- .toFilePath(windows: Platform.operatingSystem == "windows"))
- .join(new Path("../../../../"));
- return new Path(_path).relativeTo(repoRoot).toString();
+ var repoRoot = p.join(p.dirname(p.fromUri(Platform.script)), "../../../");
+ return p.normalize(p.relative(_path, from: repoRoot));
}
/// Returns the issue number embedded in [comment] or `null` if there is none.
@@ -154,7 +159,7 @@ class StatusFile {
String toString() {
var buffer = new StringBuffer();
for (var section in sections) {
- buffer.writeln("[${section._condition}]");
+ buffer.writeln("[ ${section._condition} ]");
for (var entry in section.entries) {
buffer.write("${entry.path}: ${entry.expectations.join(', ')}");
@@ -196,3 +201,28 @@ class StatusEntry {
StatusEntry(this.path, this.expectations, this.issue);
}
+
+/// Error thrown when a parse or validation error occurs in a [StatusFile].
+class SyntaxError implements Exception {
+ final String file;
+ final int lineNumber;
+ final String line;
+ final String message;
+ final List<String> errors;
+
+ SyntaxError(this.file, this.lineNumber, this.line, this.message, this.errors);
+
+ String toString() {
+ var buffer = new StringBuffer();
+ buffer.writeln('$message in "$file" line $lineNumber:');
+ buffer.writeln(line);
+
+ if (errors != null) {
+ for (var error in errors) {
+ buffer.writeln("- ${error.replaceAll('\n', '\n ')}");
+ }
+ }
+
+ return buffer.toString().trimRight();
+ }
+}
« no previous file with comments | « pkg/status_file/lib/src/expression.dart ('k') | pkg/status_file/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698