renameDartFiles function

Future renameDartFiles(
  1. Directory dir,
  2. String oldName,
  3. String newName
)

Implementation

Future renameDartFiles(Directory dir, String oldName, String newName) async {
  if (!await dir.exists()) return;

  // Try to replace MongoDB URL
  // Replace name in config directory
  try {
    var configGlob = Glob('config/**/*.yaml');
    await for (var yamlFile in configGlob.list(root: dir.absolute.path)) {
      if (yamlFile is File) {
        print(
            'Replacing occurrences of "$oldName" with "$newName" in file "${yamlFile.absolute.path}"...');
        if (yamlFile is File) {
          var contents = (yamlFile as File).readAsStringSync();
          contents = contents.replaceAll(oldName, newName);
          (yamlFile as File).writeAsStringSync(contents);
        }
      }
    }
  } catch (_) {}

  var entry = File.fromUri(dir.uri.resolve('lib/$oldName.dart'));

  if (await entry.exists()) {
    await entry.rename(dir.uri.resolve('lib/$newName.dart').toFilePath());
    print('Renaming library file `${entry.absolute.path}`...');
  }

  // Replace package:oldName/oldName.dart with package:newName/newName.dart
  // Replace package:oldName/ with package:newName/
  String updateImport(String content, String oldName, String newName) {
    if (!content.startsWith('import')) {
      return content;
    }

    if (content.contains('package:$oldName/$oldName.dart')) {
      return content.replaceFirst(
          'package:$oldName/$oldName.dart', 'package:$newName/$newName.dart');
    }

    if (content.contains('package:$oldName/')) {
      return content.replaceFirst('package:$oldName/', 'package:$newName/');
    }

    return content;
  }

  // Replace mustache {{oldName}} with newName
  String updateMustacheBinding(String content, String oldName, String newName) {
    if (content.contains('{{$oldName}}')) {
      return content.replaceAll('{{$oldName}}', newName);
    }

    return content;
  }

  var fmt = DartFormatter();
  await for (FileSystemEntity file in dir.list(recursive: true)) {
    if (file is File && file.path.endsWith('.dart')) {
      var lineList = await file.readAsLines();

      if (oldName.isNotEmpty && newName.isNotEmpty) {
        var contents = lineList.fold<String>('', (prev, cur) {
          var updatedCur = updateImport(cur, oldName, newName);
          updatedCur = updateMustacheBinding(updatedCur, oldName, newName);
          return '$prev\n$updatedCur';
        });
        await file.writeAsString(fmt.format(contents));

        print('Updated file `${file.absolute.path}`.');
      }
    }
  }

  /* Deprecated, Not working
  var fmt = DartFormatter();
  await for (FileSystemEntity file in dir.list(recursive: true)) {
    if (file is File && file.path.endsWith('.dart')) {
      var contents = await file.readAsString();

      // front_end package. Temporarily commeted out
      //var ast = parseCompilationUnit(contents);
      var visitor = RenamingVisitor(oldName, newName);
      //  ..visitCompilationUnit(ast);

      if (visitor.replace.isNotEmpty) {
        visitor.replace.forEach((range, replacement) {
          if (range.first is int) {
            contents = contents.replaceRange(
                range.first as int, range.last as int?, replacement);
          } else if (range.first is String) {
            contents = contents.replaceAll(range.first as String, replacement);
          }
        });

        await file.writeAsString(fmt.format(contents));
        print('Updated file `${file.absolute.path}`.');
      }
    }
  }
  */
}