Skip to content

Commit 67fd870

Browse files
committed
rename JExtractSwift to JExtractSwiftLib as we'll depend on it in SwiftJava
1 parent 929c6c4 commit 67fd870

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+208
-17
lines changed

Package.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ let package = Package(
127127
),
128128

129129
.library(
130-
name: "JExtractSwift",
131-
targets: ["JExtractSwift"]
130+
name: "JExtractSwiftLib",
131+
targets: ["JExtractSwiftLib"]
132132
),
133133

134134
// ==== Plugin for wrapping Java classes in Swift
@@ -355,7 +355,7 @@ let package = Package(
355355
),
356356

357357
.target(
358-
name: "JExtractSwift",
358+
name: "JExtractSwiftLib",
359359
dependencies: [
360360
.product(name: "SwiftBasicFormat", package: "swift-syntax"),
361361
.product(name: "SwiftSyntax", package: "swift-syntax"),
@@ -373,7 +373,7 @@ let package = Package(
373373
.executableTarget(
374374
name: "JExtractSwiftTool",
375375
dependencies: [
376-
"JExtractSwift",
376+
"JExtractSwiftLib",
377377
],
378378
swiftSettings: [
379379
.swiftLanguageMode(.v5)
@@ -438,7 +438,7 @@ let package = Package(
438438
.testTarget(
439439
name: "JExtractSwiftTests",
440440
dependencies: [
441-
"JExtractSwift"
441+
"JExtractSwiftLib"
442442
],
443443
swiftSettings: [
444444
.swiftLanguageMode(.v5),
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2024 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+
import SwiftSyntax
16+
import SwiftSyntaxBuilder
17+
18+
extension Swift2JavaTranslator {
19+
public func writeSwiftThunkSources(outputDirectory: String) throws {
20+
var printer = CodePrinter()
21+
22+
try writeSwiftThunkSources(outputDirectory: outputDirectory, printer: &printer)
23+
}
24+
25+
public func writeSwiftThunkSources(outputDirectory: String, printer: inout CodePrinter) throws {
26+
let moduleFilenameBase = "\(self.swiftModuleName)Module+SwiftJava"
27+
let moduleFilename = "\(moduleFilenameBase).swift"
28+
do {
29+
log.info("Printing contents: \(moduleFilename)")
30+
31+
try printGlobalSwiftThunkSources(&printer)
32+
33+
if let outputFile = try printer.writeContents(
34+
outputDirectory: outputDirectory,
35+
javaPackagePath: nil,
36+
filename: moduleFilename)
37+
{
38+
print("[swift-java] Generated: \(moduleFilenameBase.bold).swift (at \(outputFile)")
39+
}
40+
} catch {
41+
log.warning("Failed to write to Swift thunks: \(moduleFilename)")
42+
}
43+
44+
// === All types
45+
for (_, ty) in importedTypes.sorted(by: { (lhs, rhs) in lhs.key < rhs.key }) {
46+
let fileNameBase = "\(ty.swiftNominal.qualifiedName)+SwiftJava"
47+
let filename = "\(fileNameBase).swift"
48+
log.info("Printing contents: \(filename)")
49+
50+
do {
51+
try printSwiftThunkSources(&printer, ty: ty)
52+
53+
if let outputFile = try printer.writeContents(
54+
outputDirectory: outputDirectory,
55+
javaPackagePath: nil,
56+
filename: filename)
57+
{
58+
print("[swift-java] Generated: \(fileNameBase.bold).swift (at \(outputFile)")
59+
}
60+
} catch {
61+
log.warning("Failed to write to Swift thunks: \(filename)")
62+
}
63+
}
64+
}
65+
66+
public func printGlobalSwiftThunkSources(_ printer: inout CodePrinter) throws {
67+
let stt = SwiftThunkTranslator(self)
68+
69+
printer.print(
70+
"""
71+
// Generated by swift-java
72+
73+
import SwiftKitSwift
74+
75+
""")
76+
77+
for thunk in stt.renderGlobalThunks() {
78+
printer.print(thunk)
79+
printer.println()
80+
}
81+
}
82+
83+
public func printSwiftThunkSources(_ printer: inout CodePrinter, decl: ImportedFunc) {
84+
let stt = SwiftThunkTranslator(self)
85+
86+
for thunk in stt.render(forFunc: decl) {
87+
printer.print(thunk)
88+
printer.println()
89+
}
90+
}
91+
92+
package func printSwiftThunkSources(_ printer: inout CodePrinter, ty: ImportedNominalType) throws {
93+
let stt = SwiftThunkTranslator(self)
94+
95+
printer.print(
96+
"""
97+
// Generated by swift-java
98+
99+
import SwiftKitSwift
100+
101+
"""
102+
)
103+
104+
for thunk in stt.renderThunks(forType: ty) {
105+
printer.print("\(thunk)")
106+
printer.print("")
107+
}
108+
}
109+
}
110+
111+
struct SwiftThunkTranslator {
112+
113+
let st: Swift2JavaTranslator
114+
115+
init(_ st: Swift2JavaTranslator) {
116+
self.st = st
117+
}
118+
119+
func renderGlobalThunks() -> [DeclSyntax] {
120+
var decls: [DeclSyntax] = []
121+
decls.reserveCapacity(
122+
st.importedGlobalVariables.count + st.importedGlobalFuncs.count
123+
)
124+
125+
for decl in st.importedGlobalVariables {
126+
decls.append(contentsOf: render(forFunc: decl))
127+
}
128+
129+
for decl in st.importedGlobalFuncs {
130+
decls.append(contentsOf: render(forFunc: decl))
131+
}
132+
133+
return decls
134+
}
135+
136+
/// Render all the thunks that make Swift methods accessible to Java.
137+
func renderThunks(forType nominal: ImportedNominalType) -> [DeclSyntax] {
138+
var decls: [DeclSyntax] = []
139+
decls.reserveCapacity(
140+
1 + nominal.initializers.count + nominal.variables.count + nominal.methods.count
141+
)
142+
143+
decls.append(renderSwiftTypeAccessor(nominal))
144+
145+
for decl in nominal.initializers {
146+
decls.append(contentsOf: render(forFunc: decl))
147+
}
148+
149+
for decl in nominal.variables {
150+
decls.append(contentsOf: render(forFunc: decl))
151+
}
152+
153+
for decl in nominal.methods {
154+
decls.append(contentsOf: render(forFunc: decl))
155+
}
156+
157+
return decls
158+
}
159+
160+
/// Accessor to get the `T.self` of the Swift type, without having to rely on mangled name lookups.
161+
func renderSwiftTypeAccessor(_ nominal: ImportedNominalType) -> DeclSyntax {
162+
let funcName = SwiftKitPrinting.Names.getType(
163+
module: st.swiftModuleName,
164+
nominal: nominal)
165+
166+
return
167+
"""
168+
@_cdecl("\(raw: funcName)")
169+
public func \(raw: funcName)() -> UnsafeMutableRawPointer /* Any.Type */ {
170+
return unsafeBitCast(\(raw: nominal.swiftNominal.qualifiedName).self, to: UnsafeMutableRawPointer.self)
171+
}
172+
"""
173+
}
174+
175+
func render(forFunc decl: ImportedFunc) -> [DeclSyntax] {
176+
st.log.trace("Rendering thunks for: \(decl.displayName)")
177+
178+
let thunkName = st.thunkNameRegistry.functionThunkName(decl: decl)
179+
guard let translatedSignatures = st.translatedSignature(for: decl) else {
180+
return []
181+
}
182+
183+
let thunkFunc = translatedSignatures.loweredSignature.cdeclThunk(
184+
cName: thunkName,
185+
swiftAPIName: decl.name,
186+
as: decl.apiKind,
187+
stdlibTypes: st.swiftStdlibTypes
188+
)
189+
return [DeclSyntax(thunkFunc)]
190+
}
191+
}

Tests/JExtractSwiftTests/Asserts/LoweringAssertions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
@_spi(Testing) import JExtractSwift
15+
@_spi(Testing) import JExtractSwiftLib
1616
import SwiftSyntax
1717
import Testing
1818

Tests/JExtractSwiftTests/Asserts/TextAssertions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717
import struct Foundation.CharacterSet
1818

Tests/JExtractSwiftTests/CTypeTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
@Suite("C type system tests")

Tests/JExtractSwiftTests/ClassPrintingTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
struct ClassPrintingTests {

Tests/JExtractSwiftTests/FuncCallbackImportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
final class FuncCallbackImportTests {

Tests/JExtractSwiftTests/FunctionDescriptorImportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
@Suite

Tests/JExtractSwiftTests/FunctionLoweringTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import SwiftSyntax
1717
import Testing
1818

Tests/JExtractSwiftTests/MethodImportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
final class MethodImportTests {

Tests/JExtractSwiftTests/MethodThunkTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
final class MethodThunkTests {

Tests/JExtractSwiftTests/StringPassingTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
final class StringPassingTests {

Tests/JExtractSwiftTests/SwiftSymbolTableTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
@_spi(Testing) import JExtractSwift
15+
@_spi(Testing) import JExtractSwiftLib
1616
import SwiftSyntax
1717
import SwiftParser
1818
import Testing

Tests/JExtractSwiftTests/VariableImportTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
import JExtractSwift
15+
import JExtractSwiftLib
1616
import Testing
1717

1818
final class VariableImportTests {

0 commit comments

Comments
 (0)