1
0
Fork 0
gobject-generator/Sources/GObjectGeneratorCore/CodeGen.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
}
}