1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
import Foundation
public struct WITExtractor {
public struct Output {
public var witContents: String
public var interfaceName: String
public var sourceSummary: SwiftSourceSummary
public var typeMapping: (_ witName: String) -> String?
}
let namespace: String
let packageName: String
let digester: SwiftAPIDigester
let extraDigesterArguments: [String]
let diagnosticCollection = DiagnosticCollection()
public var diagnostics: [Diagnostic] {
diagnosticCollection.diagnostics
}
public init(
namespace: String,
packageName: String,
digesterPath: String,
extraDigesterArguments: [String]
) {
self.namespace = namespace
self.packageName = packageName
self.digester = SwiftAPIDigester(executableURL: URL(fileURLWithPath: digesterPath))
self.extraDigesterArguments = extraDigesterArguments
}
public func run(moduleName: String) throws -> Output {
let header = """
// DO NOT EDIT.
//
// Generated by the WITExtractor
"""
var output = try runWithoutHeader(moduleName: moduleName)
output.witContents = header + output.witContents
return output
}
func runWithoutHeader(moduleName: String) throws -> Output {
let output = try digester.dumpSDK(moduleName: moduleName, arguments: extraDigesterArguments)
var typeMapping = TypeMapping()
typeMapping.collect(digest: output)
var summaryBuilder = SourceSummaryBuilder(diagnostics: diagnosticCollection, typeMapping: typeMapping)
summaryBuilder.build(digest: output)
var translation = ModuleTranslation(
diagnostics: diagnosticCollection,
typeMapping: typeMapping,
builder: WITBuilder(
interfaceName: ConvertCase.witIdentifier(identifier: [moduleName])
)
)
translation.translate(sourceSummary: summaryBuilder.sourceSummary)
let printer = SourcePrinter(
header: """
package \(ConvertCase.witIdentifier(identifier: namespace)):\(ConvertCase.witIdentifier(identifier: packageName))
"""
)
translation.builder.print(printer: printer)
return Output(
witContents: printer.contents,
interfaceName: translation.builder.interfaceName,
sourceSummary: summaryBuilder.sourceSummary,
typeMapping: typeMapping.qualifiedName(byWITName:)
)
}
}
|