linkWindowsCppImplStubs function

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

Creates Windows-specific C++ impl stub files for modules that target windows: WindowsNativeImpl.cpp. These stubs live in windows/src/ so windows/CMakeLists.txt can reference them via a relative path.

Implementation

void linkWindowsCppImplStubs(List<ModuleInfo> moduleInfos, {String baseDir = '.'}) {
  final libDir = Directory(p.join(baseDir, 'lib'));
  final specFiles = libDir.existsSync() ? libDir.listSync(recursive: true).whereType<File>().where((f) => f.path.endsWith('.native.dart')).toList() : <File>[];
  final windowsCppLibs = specFiles.where(isWindowsCppModule).map((f) {
    final stem = p.basename(f.path).replaceAll(RegExp(r'\.native\.dart$'), '');
    return extractLibNameFromSpec(f) ?? stem;
  }).toSet();

  for (final m in moduleInfos.where((m) => m.isCpp && windowsCppLibs.contains(m.lib))) {
    final className = _toPascalCase(m.lib);
    final winSrcDir = Directory(p.join(baseDir, 'windows', 'src'))..createSync(recursive: true);
    final stubFile = File(p.join(winSrcDir.path, 'Hybrid$className.cpp'));
    if (stubFile.existsSync()) continue;
    stubFile.writeAsStringSync(
      '// Hybrid$className — WindowsNativeImpl.cpp implementation.\n'
      '// Generated by nitrogen link. Fill in the method bodies.\n'
      '#include "../../lib/src/generated/cpp/${m.lib}.native.g.h"\n'
      '\n'
      '#include <string>\n'
      '\n'
      'class Hybrid${className}Impl final : public Hybrid$className {\n'
      'public:\n'
      '    // TODO: implement all pure-virtual methods declared in Hybrid$className\n'
      '};\n'
      '\n'
      '// MSVC static-initializer auto-registration (no __attribute__((constructor)) on Windows).\n'
      'namespace {\n'
      '  struct _AutoRegister {\n'
      '    _AutoRegister() { ${m.lib}_register_impl(new Hybrid${className}Impl()); }\n'
      '  };\n'
      '  static _AutoRegister _auto_register_instance;\n'
      '}\n',
    );
  }
}