linkDesktopPubspecFfiOnly function
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")');
}
}