62 lines
2.7 KiB
Swift
62 lines
2.7 KiB
Swift
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..<generated.endIndex) else {
|
|
return generated
|
|
}
|
|
|
|
// Default to keeping the generated gap (blank line and indent)
|
|
var userContent = String(generated[genStart.upperBound..<genEnd.lowerBound])
|
|
|
|
if let exStart = existing.range(of: beginMarker),
|
|
let exEnd = existing.range(of: endMarker, range: exStart.upperBound..<existing.endIndex) {
|
|
userContent = String(existing[exStart.upperBound..<exEnd.lowerBound])
|
|
}
|
|
|
|
var result = generated
|
|
result.replaceSubrange(genStart.upperBound..<genEnd.lowerBound, with: userContent)
|
|
return result
|
|
}
|
|
}
|