diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart index 94dd366fd7..37f8f69201 100644 --- a/bin/dartdoc.dart +++ b/bin/dartdoc.dart @@ -40,7 +40,7 @@ main(List arguments) async { Directory sdkDir = getSdkDir(); if (sdkDir == null) { - stderr.write(" Error: unable to locate the Dart SDK."); + stderr.writeln(" Error: unable to locate the Dart SDK."); exit(1); } @@ -55,14 +55,14 @@ main(List arguments) async { var readme = args['sdk-readme']; if (readme != null && !(new File(readme).existsSync())) { - stderr.write( + stderr.writeln( " fatal error: unable to locate the SDK description file at $readme."); exit(1); } Directory inputDir = new Directory(args['input']); if (!inputDir.existsSync()) { - stderr.write( + stderr.writeln( " fatal error: unable to locate the input directory at ${inputDir.path}."); exit(1); } @@ -77,7 +77,7 @@ main(List arguments) async { args['header'].map(_resolveTildePath).toList() as List; for (String headerFilePath in headerFilePaths) { if (!new File(headerFilePath).existsSync()) { - stderr.write( + stderr.writeln( " fatal error: unable to locate header file: ${headerFilePath}."); exit(1); } @@ -87,7 +87,7 @@ main(List arguments) async { args['footer'].map(_resolveTildePath).toList() as List; for (String footerFilePath in footerFilePaths) { if (!new File(footerFilePath).existsSync()) { - stderr.write( + stderr.writeln( " fatal error: unable to locate footer file: ${footerFilePath}."); exit(1); } @@ -97,7 +97,7 @@ main(List arguments) async { args['footer-text'].map(_resolveTildePath).toList() as List; for (String footerFilePath in footerTextFilePaths) { if (!new File(footerFilePath).existsSync()) { - stderr.write( + stderr.writeln( " fatal error: unable to locate footer-text file: ${footerFilePath}."); exit(1); } @@ -111,7 +111,7 @@ main(List arguments) async { if (args.rest.isNotEmpty) { var unknownArgs = args.rest.join(' '); - stderr.write( + stderr.writeln( ' fatal error: detected unknown command-line argument(s): $unknownArgs'); _printUsageAndExit(parser, exitCode: 1); } diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index b0026ce6a9..43c0a6dcd4 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -21,6 +21,7 @@ import 'package:analyzer/src/generated/java_io.dart'; import 'package:analyzer/src/generated/sdk.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer/src/generated/source_io.dart'; +import 'package:dartdoc/src/utils.dart'; import 'package:html/dom.dart' show Element, Document; import 'package:html/parser.dart' show parse; import 'package:package_config/discovery.dart' as package_config; @@ -173,9 +174,6 @@ class DartDoc { } package = new Package(libraries, packageMeta, warningOptions); - print( - '\ngenerating docs for libraries ${package.libraries.map((Library l) => l.name).join(', ')}\n'); - // Go through docs of every model element in package to prebuild the macros index // TODO(jcollins-g): move index building into a cached-on-demand generation // like most other bits in [Package]. @@ -189,14 +187,21 @@ class DartDoc { writtenFiles.addAll(generator.writtenFiles.map(path.normalize)); } - verifyLinks(package, outputDir.path); - double seconds = _stopwatch.elapsedMilliseconds / 1000.0; print( - "\nDocumented ${package.libraries.length} librar${package.libraries.length == 1 ? 'y' : 'ies'} " - "in ${seconds.toStringAsFixed(1)} seconds."); - print( - "Finished with: ${package.packageWarningCounter.warningCount} warnings, ${package.packageWarningCounter.errorCount} errors"); + "documented ${package.libraries.length} librar${package.libraries.length == 1 ? 'y' : 'ies'} " + "in ${seconds.toStringAsFixed(1)} seconds"); + print(''); + + verifyLinks(package, outputDir.path); + int warnings = package.packageWarningCounter.warningCount; + int errors = package.packageWarningCounter.errorCount; + if (warnings == 0 && errors == 0) { + print("no issues found"); + } else { + print("found ${warnings} ${pluralize('warning', warnings)} " + "and ${errors} ${pluralize('error', errors)}"); + } if (package.libraries.isEmpty) { throw new DartDocFailure( @@ -351,7 +356,7 @@ class DartDoc { final Set visited = new Set(); final String start = 'index.html'; visited.add(start); - stdout.write('\nvalidating docs'); + print('validating docs...'); _doCheck(package, origin, visited, start); _doOrphanCheck(package, origin, visited); } @@ -510,9 +515,10 @@ class DartDoc { ..sort(); double seconds = _stopwatch.elapsedMilliseconds / 1000.0; - print("Parsed ${libraries.length} " - "file${libraries.length == 1 ? '' : 's'} in " - "${seconds.toStringAsFixed(1)} seconds.\n"); + print("parsed ${libraries.length} ${pluralize('file', libraries.length)} " + "in ${seconds.toStringAsFixed(1)} seconds"); + print(''); + _stopwatch.reset(); if (errors.isNotEmpty) { errors.forEach(print); diff --git a/lib/src/html/html_generator_instance.dart b/lib/src/html/html_generator_instance.dart index 3de8f9b8a7..ab0e3eddc3 100644 --- a/lib/src/html/html_generator_instance.dart +++ b/lib/src/html/html_generator_instance.dart @@ -4,7 +4,7 @@ import 'dart:async' show Future, StreamController; import 'dart:convert' show JsonEncoder; -import 'dart:io' show Directory, File, stdout; +import 'dart:io' show Directory, File; import 'dart:typed_data' show Uint8List; import 'package:collection/collection.dart' show compareNatural; @@ -178,16 +178,13 @@ class HtmlGeneratorInstance implements HtmlOptions { } void generatePackage() { - stdout.write('\ndocumenting ${package.name}'); - TemplateData data = new PackageTemplateData(this, package, useCategories); _build('index.html', _templates.indexTemplate, data); } void generateLibrary(Package package, Library lib) { - stdout - .write('\ngenerating docs for library ${lib.name} from ${lib.path}...'); + print('generating docs for library ${lib.name} from ${lib.path}...'); if (!lib.isAnonymous && !lib.hasDocumentation) { package.warnOnElement(lib, PackageWarning.noLibraryLevelDocs); } diff --git a/lib/src/model.dart b/lib/src/model.dart index 8153456575..65ad735fda 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -2849,7 +2849,7 @@ class PackageWarningCounter { } else { if (options.asErrors.contains(kind)) toWrite = "error: ${fullMessage}"; } - if (toWrite != null) stderr.write("\n ${toWrite}"); + if (toWrite != null) print(" ${toWrite}"); } /// Returns true if we've already warned for this. @@ -3057,7 +3057,7 @@ class Package implements Nameable, Documentable { break; case PackageWarning.unknownFile: warningMessage = - 'dartdoc detected an unknown file in the doc tree: ${message}'; + 'dartdoc detected an unknown file in the doc tree: ${message}'; break; case PackageWarning.typeAsHtml: // The message for this warning can contain many punctuation and other symbols, diff --git a/lib/src/utils.dart b/lib/src/utils.dart index df4cc85356..6e2192d2bd 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -49,3 +49,5 @@ String truncateString(String str, int length) { return str; } } + +String pluralize(String word, int count) => count == 1 ? word : '${word}s';