Skip to content

Commit 97770cf

Browse files
authored
Merge pull request #271 from rintaro/jextract-known-types
[JExtract] Introduce SwiftKnownTypes
2 parents 8de85be + 673689e commit 97770cf

9 files changed

+124
-64
lines changed

Sources/JExtractSwiftLib/FFM/CDeclLowering/CRepresentation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ enum CDeclToCLoweringError: Error {
9999
case invalidFunctionConvention(SwiftFunctionType)
100100
}
101101

102-
extension KnownStandardLibraryType {
102+
extension SwiftStandardLibraryTypeKind {
103103
/// Determine the primitive C type that corresponds to this C standard
104104
/// library type, if there is one.
105105
var primitiveCType: CType? {

Sources/JExtractSwiftLib/FFM/CDeclLowering/FFMSwift2JavaGenerator+FunctionLowering.swift

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ extension FFMSwift2JavaGenerator {
7575

7676
/// Responsible for lowering Swift API to C API.
7777
struct CdeclLowering {
78-
var swiftStdlibTypes: SwiftStandardLibraryTypes
78+
var knownTypes: SwiftKnownTypes
79+
80+
init(swiftStdlibTypes: SwiftStandardLibraryTypeDecls) {
81+
self.knownTypes = SwiftKnownTypes(decls: swiftStdlibTypes)
82+
}
7983

8084
/// Lower the given Swift function signature to a Swift @_cdecl function signature,
8185
/// which is C compatible, and the corresponding Java method signature.
@@ -149,11 +153,7 @@ struct CdeclLowering {
149153
SwiftParameter(
150154
convention: .byValue,
151155
parameterName: parameterName,
152-
type: .nominal(
153-
SwiftNominalType(
154-
nominalTypeDecl: swiftStdlibTypes[.unsafeRawPointer]
155-
)
156-
)
156+
type: knownTypes.unsafeRawPointer
157157
)
158158
],
159159
conversion: .unsafeCastPointer(.placeholder, swiftType: instanceType)
@@ -173,10 +173,14 @@ struct CdeclLowering {
173173
// Typed pointers are mapped down to their raw forms in cdecl entry
174174
// points. These can be passed through directly.
175175
let isMutable = knownType == .unsafeMutablePointer
176-
let rawPointerNominal = swiftStdlibTypes[isMutable ? .unsafeMutableRawPointer : .unsafeRawPointer]
177-
let paramType: SwiftType = .nominal(SwiftNominalType(nominalTypeDecl: rawPointerNominal))
178176
return LoweredParameter(
179-
cdeclParameters: [SwiftParameter(convention: .byValue, parameterName: parameterName, type: paramType)],
177+
cdeclParameters: [
178+
SwiftParameter(
179+
convention: .byValue,
180+
parameterName: parameterName,
181+
type: isMutable ? knownTypes.unsafeMutableRawPointer : knownTypes.unsafeRawPointer
182+
)
183+
],
180184
conversion: .typedPointer(.placeholder, swiftType: genericArgs[0])
181185
)
182186

@@ -186,17 +190,15 @@ struct CdeclLowering {
186190
}
187191
// Typed pointers are lowered to (raw-pointer, count) pair.
188192
let isMutable = knownType == .unsafeMutableBufferPointer
189-
let rawPointerNominal = swiftStdlibTypes[isMutable ? .unsafeMutableRawPointer : .unsafeRawPointer]
190-
191193
return LoweredParameter(
192194
cdeclParameters: [
193195
SwiftParameter(
194196
convention: .byValue, parameterName: "\(parameterName)_pointer",
195-
type: .nominal(SwiftNominalType(nominalTypeDecl: rawPointerNominal))
197+
type: isMutable ? knownTypes.unsafeMutableRawPointer : knownTypes.unsafeRawPointer
196198
),
197199
SwiftParameter(
198200
convention: .byValue, parameterName: "\(parameterName)_count",
199-
type: .nominal(SwiftNominalType(nominalTypeDecl: swiftStdlibTypes[.int]))
201+
type: knownTypes.int
200202
),
201203
], conversion: .initialize(
202204
type,
@@ -221,12 +223,7 @@ struct CdeclLowering {
221223
SwiftParameter(
222224
convention: .byValue,
223225
parameterName: parameterName,
224-
type: .nominal(SwiftNominalType(
225-
nominalTypeDecl: swiftStdlibTypes.unsafePointerDecl,
226-
genericArguments: [
227-
.nominal(SwiftNominalType(nominalTypeDecl: swiftStdlibTypes[.int8]))
228-
]
229-
))
226+
type: knownTypes.unsafePointer(knownTypes.int8)
230227
)
231228
],
232229
conversion: .initialize(type, arguments: [
@@ -243,15 +240,12 @@ struct CdeclLowering {
243240

244241
// Arbitrary nominal types are passed-in as an pointer.
245242
let isMutable = (convention == .inout)
246-
let rawPointerNominal = swiftStdlibTypes[isMutable ? .unsafeMutableRawPointer : .unsafeRawPointer]
247-
let parameterType: SwiftType = .nominal(SwiftNominalType(nominalTypeDecl: rawPointerNominal))
248-
249243
return LoweredParameter(
250244
cdeclParameters: [
251245
SwiftParameter(
252246
convention: .byValue,
253247
parameterName: parameterName,
254-
type: parameterType
248+
type: isMutable ? knownTypes.unsafeMutableRawPointer : knownTypes.unsafeRawPointer
255249
),
256250
],
257251
conversion: .pointee(.typedPointer(.placeholder, swiftType: type))
@@ -352,12 +346,10 @@ struct CdeclLowering {
352346
switch type {
353347
case .metatype:
354348
// 'unsafeBitcast(<result>, to: UnsafeRawPointer.self)' as 'UnsafeRawPointer'
355-
356-
let resultType: SwiftType = .nominal(SwiftNominalType(nominalTypeDecl: swiftStdlibTypes[.unsafeRawPointer]))
357349
return LoweredResult(
358-
cdeclResultType: resultType,
350+
cdeclResultType: knownTypes.unsafeRawPointer,
359351
cdeclOutParameters: [],
360-
conversion: .unsafeCastPointer(.placeholder, swiftType: resultType)
352+
conversion: .unsafeCastPointer(.placeholder, swiftType: knownTypes.unsafeRawPointer)
361353
)
362354

363355
case .nominal(let nominal):
@@ -367,8 +359,7 @@ struct CdeclLowering {
367359
case .unsafePointer, .unsafeMutablePointer:
368360
// Typed pointers are lowered to corresponding raw forms.
369361
let isMutable = knownType == .unsafeMutablePointer
370-
let rawPointerNominal = swiftStdlibTypes[isMutable ? .unsafeMutableRawPointer : .unsafeRawPointer]
371-
let resultType: SwiftType = .nominal(SwiftNominalType(nominalTypeDecl: rawPointerNominal))
362+
let resultType: SwiftType = isMutable ? knownTypes.unsafeMutableRawPointer : knownTypes.unsafeRawPointer
372363
return LoweredResult(
373364
cdeclResultType: resultType,
374365
cdeclOutParameters: [],
@@ -378,11 +369,10 @@ struct CdeclLowering {
378369
case .unsafeBufferPointer, .unsafeMutableBufferPointer:
379370
// Typed pointers are lowered to (raw-pointer, count) pair.
380371
let isMutable = knownType == .unsafeMutableBufferPointer
381-
let rawPointerType = swiftStdlibTypes[isMutable ? .unsafeMutableRawPointer : .unsafeRawPointer]
382372
return try lowerResult(
383373
.tuple([
384-
.nominal(SwiftNominalType(nominalTypeDecl: rawPointerType)),
385-
.nominal(SwiftNominalType(nominalTypeDecl: swiftStdlibTypes[.int]))
374+
isMutable ? knownTypes.unsafeMutableRawPointer : knownTypes.unsafeRawPointer,
375+
knownTypes.int
386376
]),
387377
outParameterName: outParameterName
388378
)
@@ -407,7 +397,7 @@ struct CdeclLowering {
407397
SwiftParameter(
408398
convention: .byValue,
409399
parameterName: outParameterName,
410-
type: .nominal(SwiftNominalType(nominalTypeDecl: swiftStdlibTypes[.unsafeMutableRawPointer]))
400+
type: knownTypes.unsafeMutableRawPointer
411401
)
412402
],
413403
conversion: .populatePointer(name: outParameterName, assumingType: type, to: .placeholder)
@@ -431,10 +421,7 @@ struct CdeclLowering {
431421
let parameter = SwiftParameter(
432422
convention: .byValue,
433423
parameterName: parameterName,
434-
type: .nominal(SwiftNominalType(
435-
nominalTypeDecl: swiftStdlibTypes.unsafeMutablePointerDecl,
436-
genericArguments: [lowered.cdeclResultType]
437-
))
424+
type: knownTypes.unsafeMutablePointer(lowered.cdeclResultType)
438425
)
439426
parameters.append(parameter)
440427
conversions.append(.populatePointer(
@@ -551,7 +538,7 @@ extension LoweredFunctionSignature {
551538
cName: String,
552539
swiftAPIName: String,
553540
as apiKind: SwiftAPIKind,
554-
stdlibTypes: SwiftStandardLibraryTypes
541+
stdlibTypes: SwiftStandardLibraryTypeDecls
555542
) -> FunctionDeclSyntax {
556543

557544
let cdeclParams = allLoweredParameters.map(\.description).joined(separator: ", ")

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator+JavaTranslation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ extension TranslatedFunctionSignature {
144144
}
145145

146146
struct JavaTranslation {
147-
var swiftStdlibTypes: SwiftStandardLibraryTypes
147+
var swiftStdlibTypes: SwiftStandardLibraryTypeDecls
148148

149149
func translate(
150150
_ decl: ImportedFunc

Sources/JExtractSwiftLib/FFM/FFMSwift2JavaGenerator.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ package class FFMSwift2JavaGenerator: Swift2JavaGenerator {
2323
let javaPackage: String
2424
let swiftOutputDirectory: String
2525
let javaOutputDirectory: String
26-
let swiftStdlibTypes: SwiftStandardLibraryTypes
26+
let swiftStdlibTypes: SwiftStandardLibraryTypeDecls
2727
let symbolTable: SwiftSymbolTable
2828

2929
var javaPackagePath: String {
@@ -49,7 +49,7 @@ package class FFMSwift2JavaGenerator: Swift2JavaGenerator {
4949
self.swiftOutputDirectory = swiftOutputDirectory
5050
self.javaOutputDirectory = javaOutputDirectory
5151
self.symbolTable = translator.symbolTable
52-
self.swiftStdlibTypes = translator.swiftStdlibTypes
52+
self.swiftStdlibTypes = translator.swiftStdlibTypeDecls
5353
}
5454

5555
func generate() throws {

Sources/JExtractSwiftLib/Swift2JavaTranslator.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public final class Swift2JavaTranslator {
4343
/// type representation.
4444
package var importedTypes: [String: ImportedNominalType] = [:]
4545

46-
package var swiftStdlibTypes: SwiftStandardLibraryTypes
46+
package var swiftStdlibTypeDecls: SwiftStandardLibraryTypeDecls
4747

4848
package let symbolTable: SwiftSymbolTable
4949

@@ -59,7 +59,7 @@ public final class Swift2JavaTranslator {
5959

6060
// Create a mock of the Swift standard library.
6161
var parsedSwiftModule = SwiftParsedModuleSymbolTable(moduleName: "Swift")
62-
self.swiftStdlibTypes = SwiftStandardLibraryTypes(into: &parsedSwiftModule)
62+
self.swiftStdlibTypeDecls = SwiftStandardLibraryTypeDecls(into: &parsedSwiftModule)
6363
self.symbolTable.importedModules.append(parsedSwiftModule.symbolTable)
6464
}
6565
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2025 Apple Inc. and the Swift.org project authors
6+
// Licensed under Apache License v2.0
7+
//
8+
// See LICENSE.txt for license information
9+
// See CONTRIBUTORS.txt for the list of Swift.org project authors
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
struct SwiftKnownTypes {
16+
private let decls: SwiftStandardLibraryTypeDecls
17+
18+
init(decls: SwiftStandardLibraryTypeDecls) {
19+
self.decls = decls
20+
}
21+
22+
var bool: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.bool])) }
23+
var int: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.int])) }
24+
var uint: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.uint])) }
25+
var int8: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.int8])) }
26+
var uint8: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.uint8])) }
27+
var int16: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.int16])) }
28+
var uint16: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.uint16])) }
29+
var int32: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.int32])) }
30+
var uint32: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.uint32])) }
31+
var int64: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.int64])) }
32+
var uint64: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.uint64])) }
33+
var float: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.float])) }
34+
var double: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.double])) }
35+
var unsafeRawPointer: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.unsafeRawPointer])) }
36+
var unsafeMutableRawPointer: SwiftType { .nominal(SwiftNominalType(nominalTypeDecl: decls[.unsafeMutableRawPointer])) }
37+
38+
func unsafePointer(_ pointeeType: SwiftType) -> SwiftType {
39+
.nominal(
40+
SwiftNominalType(
41+
nominalTypeDecl: decls.unsafePointerDecl,
42+
genericArguments: [pointeeType]
43+
)
44+
)
45+
}
46+
47+
func unsafeMutablePointer(_ pointeeType: SwiftType) -> SwiftType {
48+
.nominal(
49+
SwiftNominalType(
50+
nominalTypeDecl: decls.unsafeMutablePointerDecl,
51+
genericArguments: [pointeeType]
52+
)
53+
)
54+
}
55+
56+
func unsafeBufferPointer(_ elementType: SwiftType) -> SwiftType {
57+
.nominal(
58+
SwiftNominalType(
59+
nominalTypeDecl: decls.unsafeBufferPointerDecl,
60+
genericArguments: [elementType]
61+
)
62+
)
63+
}
64+
65+
func unsafeMutableBufferPointer(_ elementType: SwiftType) -> SwiftType {
66+
.nominal(
67+
SwiftNominalType(
68+
nominalTypeDecl: decls.unsafeMutableBufferPointerDecl,
69+
genericArguments: [elementType]
70+
)
71+
)
72+
}
73+
}

Sources/JExtractSwiftLib/SwiftTypes/SwiftNominalTypeDeclaration.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ package class SwiftNominalTypeDeclaration {
5252

5353
/// Identify this nominal declaration as one of the known standard library
5454
/// types, like 'Swift.Int[.
55-
lazy var knownStandardLibraryType: KnownStandardLibraryType? = {
55+
lazy var knownStandardLibraryType: SwiftStandardLibraryTypeKind? = {
5656
self.computeKnownStandardLibraryType()
5757
}()
5858

@@ -80,12 +80,12 @@ package class SwiftNominalTypeDeclaration {
8080

8181
/// Determine the known standard library type for this nominal type
8282
/// declaration.
83-
private func computeKnownStandardLibraryType() -> KnownStandardLibraryType? {
83+
private func computeKnownStandardLibraryType() -> SwiftStandardLibraryTypeKind? {
8484
if parent != nil || moduleName != "Swift" {
8585
return nil
8686
}
8787

88-
return KnownStandardLibraryType(typeNameInSwiftModule: name)
88+
return SwiftStandardLibraryTypeKind(typeNameInSwiftModule: name)
8989
}
9090

9191
package var qualifiedName: String {

Sources/JExtractSwiftLib/SwiftTypes/SwiftStandardLibraryTypes.swift renamed to Sources/JExtractSwiftLib/SwiftTypes/SwiftStandardLibraryTypeDecls.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import SwiftSyntax
1616

17-
enum KnownStandardLibraryType: String, Hashable, CaseIterable {
17+
enum SwiftStandardLibraryTypeKind: String, Hashable, CaseIterable {
1818
case bool = "Bool"
1919
case int = "Int"
2020
case uint = "UInt"
@@ -60,7 +60,7 @@ enum KnownStandardLibraryType: String, Hashable, CaseIterable {
6060

6161
/// Captures many types from the Swift standard library in their most basic
6262
/// forms, so that the translator can reason about them in source code.
63-
public struct SwiftStandardLibraryTypes {
63+
public struct SwiftStandardLibraryTypeDecls {
6464
// Swift.UnsafePointer<Element>
6565
let unsafePointerDecl: SwiftNominalTypeDeclaration
6666

@@ -74,16 +74,16 @@ public struct SwiftStandardLibraryTypes {
7474
let unsafeMutableBufferPointerDecl: SwiftNominalTypeDeclaration
7575

7676
/// Mapping from known standard library types to their nominal type declaration.
77-
let knownTypeToNominal: [KnownStandardLibraryType: SwiftNominalTypeDeclaration]
77+
let knownTypeToNominal: [SwiftStandardLibraryTypeKind: SwiftNominalTypeDeclaration]
7878

7979
/// Mapping from nominal type declarations to known types.
80-
let nominalTypeDeclToKnownType: [SwiftNominalTypeDeclaration: KnownStandardLibraryType]
80+
let nominalTypeDeclToKnownType: [SwiftNominalTypeDeclaration: SwiftStandardLibraryTypeKind]
8181

8282
private static func recordKnownType(
83-
_ type: KnownStandardLibraryType,
83+
_ type: SwiftStandardLibraryTypeKind,
8484
_ syntax: NominalTypeDeclSyntaxNode,
85-
knownTypeToNominal: inout [KnownStandardLibraryType: SwiftNominalTypeDeclaration],
86-
nominalTypeDeclToKnownType: inout [SwiftNominalTypeDeclaration: KnownStandardLibraryType],
85+
knownTypeToNominal: inout [SwiftStandardLibraryTypeKind: SwiftNominalTypeDeclaration],
86+
nominalTypeDeclToKnownType: inout [SwiftNominalTypeDeclaration: SwiftStandardLibraryTypeKind],
8787
parsedModule: inout SwiftParsedModuleSymbolTable
8888
) {
8989
let nominalDecl = parsedModule.addNominalTypeDeclaration(syntax, parent: nil)
@@ -92,9 +92,9 @@ public struct SwiftStandardLibraryTypes {
9292
}
9393

9494
private static func recordKnownNonGenericStruct(
95-
_ type: KnownStandardLibraryType,
96-
knownTypeToNominal: inout [KnownStandardLibraryType: SwiftNominalTypeDeclaration],
97-
nominalTypeDeclToKnownType: inout [SwiftNominalTypeDeclaration: KnownStandardLibraryType],
95+
_ type: SwiftStandardLibraryTypeKind,
96+
knownTypeToNominal: inout [SwiftStandardLibraryTypeKind: SwiftNominalTypeDeclaration],
97+
nominalTypeDeclToKnownType: inout [SwiftNominalTypeDeclaration: SwiftStandardLibraryTypeKind],
9898
parsedModule: inout SwiftParsedModuleSymbolTable
9999
) {
100100
recordKnownType(
@@ -155,11 +155,11 @@ public struct SwiftStandardLibraryTypes {
155155
parent: nil
156156
)
157157

158-
var knownTypeToNominal: [KnownStandardLibraryType: SwiftNominalTypeDeclaration] = [:]
159-
var nominalTypeDeclToKnownType: [SwiftNominalTypeDeclaration: KnownStandardLibraryType] = [:]
158+
var knownTypeToNominal: [SwiftStandardLibraryTypeKind: SwiftNominalTypeDeclaration] = [:]
159+
var nominalTypeDeclToKnownType: [SwiftNominalTypeDeclaration: SwiftStandardLibraryTypeKind] = [:]
160160

161161
// Handle all of the non-generic types at once.
162-
for knownType in KnownStandardLibraryType.allCases {
162+
for knownType in SwiftStandardLibraryTypeKind.allCases {
163163
guard !knownType.isGeneric else {
164164
continue
165165
}
@@ -176,11 +176,11 @@ public struct SwiftStandardLibraryTypes {
176176
self.nominalTypeDeclToKnownType = nominalTypeDeclToKnownType
177177
}
178178

179-
subscript(knownType: KnownStandardLibraryType) -> SwiftNominalTypeDeclaration {
179+
subscript(knownType: SwiftStandardLibraryTypeKind) -> SwiftNominalTypeDeclaration {
180180
knownTypeToNominal[knownType]!
181181
}
182182

183-
subscript(nominalType: SwiftNominalTypeDeclaration) -> KnownStandardLibraryType? {
183+
subscript(nominalType: SwiftNominalTypeDeclaration) -> SwiftStandardLibraryTypeKind? {
184184
nominalTypeDeclToKnownType[nominalType]
185185
}
186186
}

0 commit comments

Comments
 (0)