import Foundation /// Minimal shim keeping the scaffolding extensions (`CodeGen+Scaffolding.swift`) /// compilable. The old code-generation engine was deleted in B7; only the /// Package.swift / module-map / umbrella-header generation survives here. public struct CodeGenerator { public init() {} // MARK: - Re-export umbrella files /// Generates `@_exported import` umbrella files so every dependency is /// available through a single import of this module. static func generateReexportUmbrellas(analysis: MultiPackageAnalysis) -> [String: String] { var files: [String: String] = [:] let header = "// Generated by gobject-generator. DO NOT EDIT.\n\n" for (moduleName, transitive) in analysis.transitiveDependencies { guard !transitive.isEmpty else { continue } var content = header for dep in transitive.sorted() { content += "@_spi(SGTKInternal) @_exported import \(dep)\n" } content += "\n" files["Sources/\(moduleName)/\(moduleName).swift"] = content } return files } // MARK: - User target preservation /// Preserves user-defined targets between `// BEGIN_USER_TARGETS` and /// `// END_USER_TARGETS` markers when regenerating Package.swift. /// /// If the existing file has content between the markers, it is spliced /// into the freshly generated output. If either file lacks the markers, /// the generated output is returned unchanged. /// /// - Parameters: /// - generated: The freshly generated Package.swift content. /// - existing: The existing Package.swift on disk (if any). /// - Returns: The generated content with user targets spliced in. public static func preserveUserTargets(generated: String, existing: String) -> String { let beginMarker = "// BEGIN_USER_TARGETS" let endMarker = "// END_USER_TARGETS" guard let genStart = generated.range(of: beginMarker), let genEnd = generated.range(of: endMarker, range: genStart.upperBound..