#!/usr/bin/env dart

/// Converts block-style Doc comments in Dart code to line style.
library line_doc_comments;
import 'dart:io';

import '../pkg/pathos/lib/path.dart' as path;

final oneLineBlock = new RegExp(r'^(\s*)/\*\*\s?(.*)\*/\s*$');
final startBlock = new RegExp(r'^(\s*)/\*\*(.*)$');
final blockLine = new RegExp(r'^\s*\*\s?(.*)$');
final endBlock = new RegExp(r'^\s*\*/\s*$');

main() {
  var args = new Options().arguments;
  if (args.length != 1) {
    print('Converts "/**"-style block doc comments in a directory ');
    print('containing Dart code to "///"-style line doc comments.');
    print('');
    print('Usage: line_doc_coments.dart <dir>');
    return;
  }

  var dir = new Directory(args[0]);
  dir.list(recursive: true).listen(
      (entity) {
        if (entity is File) {
          var file = entity.name;
          if (path.extension(file) != '.dart') return;
          fixFile(file);
        }
      });
}

void fixFile(String path) {
  var file = new File(path);
  file.readAsLines().transform(fixContents).chain((fixed) {
    return new File(path).writeAsString(fixed);
  }).then((file) {
    print(file.name);
  });
}

String fixContents(List<String> lines) {
  var buffer = new StringBuffer();
  var inBlock = false;
  var indent;
  for (var line in lines) {
    if (inBlock) {
      // See if it's the end of the comment.
      if (endBlock.hasMatch(line)) {
        inBlock = false;

        // Just a pointless line, delete it!
        line = null;
      } else {
        var match = blockLine.firstMatch(line);
        line = '$indent/// ${match[1]}';
      }
    } else {
      // See if it's a one-line block comment like: /** Blah. */
      var match = oneLineBlock.firstMatch(line);
      if (match != null) {
        if (match[2] != '') {
          line = '${match[1]}/// ${match[2]}';
        } else {
          line = '${match[1]}///';
        }
      } else {
        // See if it's the start of a block doc comment.
        match = startBlock.firstMatch(line);
        if (match != null) {
          inBlock = true;
          indent = match[1];
          if (match[2] != '') {
            // Got comment on /** line.
            line = match[2];
          } else {
            // Just a pointless line, delete it!
            line = null;
          }
        }
      }
    }

    if (line != null) buffer.write('$line\n');
  }

  return buffer.toString();
}
