Index: bin/format.dart |
diff --git a/bin/format.dart b/bin/format.dart |
index a1644b4602ffb0a420cfb5a6ffe8d5e1007d9a5f..d6be2b9900b37a9427507bc13bda2f708f1e6a2c 100644 |
--- a/bin/format.dart |
+++ b/bin/format.dart |
@@ -1,6 +1,13 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'dart:convert'; |
import 'dart:io'; |
import 'package:args/args.dart'; |
+import 'package:dart_style/src/dart_formatter.dart'; |
+import 'package:dart_style/src/formatter_exception.dart'; |
import 'package:dart_style/src/formatter_options.dart'; |
import 'package:dart_style/src/io.dart'; |
@@ -15,13 +22,12 @@ void main(List<String> args) { |
parser.addFlag("dry-run", abbr: "n", negatable: false, |
help: "Show which files would be modified but make no changes."); |
parser.addFlag("overwrite", abbr: "w", negatable: false, |
- help: "Overwrite input files with formatted output.\n" |
- "If unset, prints results to standard output."); |
+ help: "Overwrite input files with formatted output."); |
+ parser.addFlag("machine", abbr: "m", negatable: false, |
+ help: "Produce machine-readable JSON output."); |
parser.addFlag("follow-links", negatable: false, |
help: "Follow links to files and directories.\n" |
"If unset, links will be ignored."); |
- parser.addFlag("machine", abbr: "m", negatable: false, |
- help: "Produce machine-readable JSON output."); |
parser.addFlag("transform", abbr: "t", negatable: false, |
help: "Unused flag for compability with the old formatter."); |
@@ -47,22 +53,29 @@ void main(List<String> args) { |
} |
checkForReporterCollision(String chosen, String other) { |
- if (argResults[other]) { |
- printUsage(parser, |
- "Cannot use --$chosen and --$other at the same time."); |
- exitCode = 64; |
- return; |
- } |
+ if (!argResults[other]) return false; |
+ |
+ printUsage(parser, |
+ "Cannot use --$chosen and --$other at the same time."); |
+ exitCode = 64; |
+ return true; |
} |
var reporter = OutputReporter.print; |
if (argResults["dry-run"]) { |
- checkForReporterCollision("dry-run", "overwrite"); |
- checkForReporterCollision("dry-run", "machine"); |
+ if (checkForReporterCollision("dry-run", "overwrite")) return; |
+ if (checkForReporterCollision("dry-run", "machine")) return; |
reporter = OutputReporter.dryRun; |
} else if (argResults["overwrite"]) { |
- checkForReporterCollision("overwrite", "machine"); |
+ if (checkForReporterCollision("overwrite", "machine")) return; |
+ |
+ if (argResults.rest.isEmpty) { |
+ printUsage(parser, |
+ "Cannot use --overwrite without providing any paths to format."); |
+ exitCode = 64; |
+ return; |
+ } |
reporter = OutputReporter.overwrite; |
} else if (argResults["machine"]) { |
@@ -82,17 +95,41 @@ void main(List<String> args) { |
var followLinks = argResults["follow-links"]; |
+ var options = new FormatterOptions(reporter, |
+ pageWidth: pageWidth, followLinks: followLinks); |
+ |
if (argResults.rest.isEmpty) { |
- printUsage(parser, |
- "Please provide at least one directory or file to format."); |
- exitCode = 64; |
- return; |
+ formatStdin(options); |
+ } else { |
+ formatPaths(options, argResults.rest); |
} |
+} |
- var options = new FormatterOptions(reporter, |
- pageWidth: pageWidth, followLinks: followLinks); |
+/// Reads input from stdin until it's closed, and the formats it. |
+void formatStdin(FormatterOptions options) { |
+ var input = new StringBuffer(); |
+ stdin.transform(new Utf8Decoder()).listen(input.write, onDone: () { |
+ var formatter = new DartFormatter(pageWidth: options.pageWidth); |
+ try { |
+ var source = input.toString(); |
+ var output = formatter.format(source, uri: "stdin"); |
+ options.reporter.showFile(null, "<stdin>", output, |
+ changed: source != output); |
+ return true; |
+ } on FormatterException catch (err) { |
+ stderr.writeln(err.message()); |
+ } catch (err, stack) { |
+ stderr.writeln('''Hit a bug in the formatter when formatting stdin. |
+Please report at: github.com/dart-lang/dart_style/issues |
+$err |
+$stack'''); |
+ } |
+ }); |
+} |
- for (var path in argResults.rest) { |
+/// Formats all of the files and directories given by [paths]. |
+void formatPaths(FormatterOptions options, List<String> paths) { |
+ for (var path in paths) { |
var directory = new Directory(path); |
if (directory.existsSync()) { |
if (!processDirectory(options, directory)) { |
@@ -123,7 +160,7 @@ void printUsage(ArgParser parser, [String error]) { |
output.write("""$message |
-Usage: dartformat [-w] <files or directories...> |
+Usage: dartformat [-n|-w] [files or directories...] |
${parser.usage} |
"""); |