linkDesktopPubspecFfiOnly function

void linkDesktopPubspecFfiOnly(
  1. List<ModuleInfo> moduleInfos, {
  2. String baseDir = '.',
})

Implementation

void linkDesktopPubspecFfiOnly(
  List<ModuleInfo> moduleInfos, {
  String baseDir = '.',
}) {
  final pubspecFile = File(p.join(baseDir, 'pubspec.yaml'));
  if (!pubspecFile.existsSync()) return;
  final fixWindows = moduleInfos.any((m) => m.windowsIsCpp);
  final fixLinux = moduleInfos.any((m) => m.linuxIsCpp);
  if (!fixWindows && !fixLinux) return;

  final targets = <String>{if (fixWindows) 'windows', if (fixLinux) 'linux'};
  final lines = pubspecFile.readAsStringSync().split('\n');
  final out = <String>[];
  var inPlatforms = false;
  var platformsIndent = -1;
  var changed = false;

  int indentOf(String l) => l.length - l.trimLeft().length;

  for (var i = 0; i < lines.length; i++) {
    final line = lines[i];
    final trimmed = line.trim();

    if (trimmed == 'platforms:') {
      inPlatforms = true;
      platformsIndent = indentOf(line);
      out.add(line);
      continue;
    }
    if (inPlatforms && trimmed.isNotEmpty && indentOf(line) <= platformsIndent) {
      inPlatforms = false; // left the platforms block
    }

    final stripped = _ffiStrippedFlowMapLine(line, targets, baseDir, inPlatforms);
    if (stripped != null) {
      out.add(stripped);
      changed = true;
      continue;
    }

    final block = _ffiEmitBlockFormEntry(
      lines,
      i,
      line,
      targets,
      baseDir,
      inPlatforms,
      out,
    );
    if (block.handled) {
      if (block.changed) changed = true;
      i = block.lastIndex;
      continue;
    }

    out.add(line);
  }

  if (changed) {
    pubspecFile.writeAsStringSync(out.join('\n'));
    stdout.writeln('  pubspec.yaml: removed pluginClass from FFI-only desktop platform entries (fixes "No target <plugin>_plugin")');
  }
}