Skip to content

Commit d7a3f88

Browse files
authored
Merge branch 'main' into wip-arenas
2 parents 0ed1621 + c57088c commit d7a3f88

Some content is hidden

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

48 files changed

+1901
-566
lines changed

.github/workflows/pull_request.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: pull_request
22

33
on:
44
pull_request:
5-
types: [ opened, reopened, synchronize ]
5+
types: [opened, reopened, synchronize]
66

77
jobs:
88
soundness:
@@ -12,19 +12,16 @@ jobs:
1212
# FIXME: Something is off with the format task and it gets "stuck", need to investigate
1313
format_check_enabled: false
1414
license_header_check_project_name: Swift.org
15-
# FIXME: we're about to remove _Subprocess immediately anyway, so rather than fixing it one by one remove this adjusted list and use the default again ASAP
16-
# swift-subprocess includes the word "kill" because SIGKILL signal handling so we allow it
17-
unacceptable_language_check_word_list: "blacklist whitelist slave master sane sanity insane insanity killed killing hang hung hanged hanging" #ignore-unacceptable-language
1815

1916
test-java:
2017
name: Java tests (swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}} os:${{ matrix.os_version }})
2118
runs-on: ubuntu-latest
2219
strategy:
2320
fail-fast: true
2421
matrix:
25-
swift_version: [ 'nightly-main' ]
26-
os_version: [ 'jammy' ]
27-
jdk_vendor: [ 'Corretto' ]
22+
swift_version: ['nightly-main']
23+
os_version: ['jammy']
24+
jdk_vendor: ['Corretto']
2825
container:
2926
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
3027
env:
@@ -68,9 +65,9 @@ jobs:
6865
strategy:
6966
fail-fast: false
7067
matrix:
71-
swift_version: [ 'nightly-main' ]
72-
os_version: [ 'jammy' ]
73-
jdk_vendor: [ 'Corretto' ]
68+
swift_version: ['nightly-main']
69+
os_version: ['jammy']
70+
jdk_vendor: ['Corretto']
7471
container:
7572
image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }}
7673
env:
@@ -106,6 +103,9 @@ jobs:
106103
# run the actual build
107104
- name: Generate sources (make) (Temporary)
108105
# TODO: this should be triggered by the respective builds
109-
run: "make jextract-run"
106+
run: "make jextract-generate"
110107
- name: Test Swift
111108
run: "swift test"
109+
- name: Build (Swift) Sample Apps
110+
run: |
111+
find Samples/ -name Package.swift -maxdepth 2 -exec swift build --package-path $(dirname {}) \;;

.licenseignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
.swift-format
66
.github/*
77
*.md
8+
**/*.config
89
CONTRIBUTORS.txt
910
LICENSE.txt
1011
NOTICE.txt

Makefile

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,34 +53,39 @@ endif
5353

5454
SAMPLES_DIR := "Samples"
5555

56-
all: generate-all
56+
all:
57+
@echo "Welcome to swift-java! There are several makefile targets to choose from:"
58+
@echo " javakit-run: Run the JavaKit example program that uses Java libraries from Swift."
59+
@echo " javakit-generate: Regenerate the Swift wrapper code for the various JavaKit libraries from Java. This only has to be done when changing the Java2Swift tool."
60+
@echo " jextract-run: Run the Java example code that uses the wrapped Swift library. NOTE: this requires development toolchain described in the README."
61+
@echo " jextract-generate: Generate Java wrapper code for the example Swift library allowing Swift to be called from Java. NOTE: this requires development toolchain described in the README."
5762

5863
$(BUILD_DIR)/debug/libJavaKit.$(LIB_SUFFIX) $(BUILD_DIR)/debug/Java2Swift:
5964
swift build
6065

61-
run: $(BUILD_DIR)/debug/libJavaKit.$(LIB_SUFFIX) $(BUILD_DIR)/debug/libExampleSwiftLibrary.$(LIB_SUFFIX)
62-
./gradlew Samples:JavaKitSampleApp:run
66+
javakit-run:
67+
cd Samples/JavaKitSampleApp && swift build && java -cp .build/plugins/outputs/javakitsampleapp/JavaKitExample/destination/JavaCompilerPlugin/Java -Djava.library.path=.build/debug com.example.swift.JavaKitSampleMain
6368

6469
Java2Swift: $(BUILD_DIR)/debug/Java2Swift
6570

6671
generate-JavaKit: Java2Swift
6772
mkdir -p Sources/JavaKit/generated
68-
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKit -o Sources/JavaKit/generated java.lang.Object=JavaObject java.util.Enumeration java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.Error=JavaError
73+
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKit -o Sources/JavaKit/generated Sources/JavaKit/Java2Swift.config
6974

7075
generate-JavaKitReflection: Java2Swift generate-JavaKit
7176
mkdir -p Sources/JavaKitReflection/generated
72-
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --manifests Sources/JavaKit/generated/JavaKit.swift2java -o Sources/JavaKitReflection/generated java.lang.reflect.Method java.lang.reflect.Type java.lang.reflect.Constructor java.lang.reflect.Parameter java.lang.reflect.ParameterizedType java.lang.reflect.Executable java.lang.reflect.AnnotatedType java.lang.reflect.TypeVariable java.lang.reflect.WildcardType java.lang.reflect.GenericArrayType java.lang.reflect.AccessibleObject java.lang.annotation.Annotation java.lang.reflect.GenericDeclaration java.lang.reflect.Field
77+
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitReflection --depends-on JavaKit=Sources/JavaKit/Java2Swift.config -o Sources/JavaKitReflection/generated Sources/JavaKitReflection/Java2Swift.config
7378

7479
generate-JavaKitJar: Java2Swift generate-JavaKit
7580
mkdir -p Sources/JavaKitJar/generated
76-
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitJar --manifests Sources/JavaKit/generated/JavaKit.swift2java -o Sources/JavaKitJar/generated java.util.jar.Attributes java.util.jar.JarEntry java.util.jar.JarFile java.util.jar.JarInputStream java.util.jar.JarOutputStream java.util.jar.Manifest
81+
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitJar --depends-on JavaKit=Sources/JavaKit/Java2Swift.config -o Sources/JavaKitJar/generated Sources/JavaKitJar/Java2Swift.config
7782

7883
generate-JavaKitNetwork: Java2Swift generate-JavaKit
7984
mkdir -p Sources/JavaKitNetwork/generated
80-
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitNetwork --manifests Sources/JavaKit/generated/JavaKit.swift2java -o Sources/JavaKitNetwork/generated java.net.URI java.net.URL java.net.URLClassLoader
85+
$(BUILD_DIR)/debug/Java2Swift --module-name JavaKitNetwork --depends-on JavaKit=Sources/JavaKit/Java2Swift.config -o Sources/JavaKitNetwork/generated Sources/JavaKitNetwork/Java2Swift.config
86+
87+
javakit-generate: generate-JavaKit generate-JavaKitReflection generate-JavaKitJar generate-JavaKitNetwork
8188

82-
generate-all: generate-JavaKit generate-JavaKitReflection generate-JavaKitJar generate-JavaKitNetwork \
83-
jextract-swift
8489
clean:
8590
rm -rf .build; \
8691
rm -rf Samples/SwiftKitExampleApp/src/generated/java/*
@@ -112,11 +117,11 @@ jextract-swift: generate-JExtract-interface-files
112117
swift build
113118

114119
generate-JExtract-interface-files: $(BUILD_DIR)/debug/libJavaKit.$(LIB_SUFFIX)
115-
echo "Generate .swiftinterface files..."
120+
@echo "Generate .swiftinterface files..."
116121
@$(call make_swiftinterface, "ExampleSwiftLibrary", "MySwiftLibrary")
117122
@$(call make_swiftinterface, "SwiftKitSwift", "SwiftKit")
118123

119-
jextract-run: jextract-swift generate-JExtract-interface-files
124+
jextract-generate: jextract-swift generate-JExtract-interface-files
120125
swift run jextract-swift \
121126
--package-name com.example.swift.generated \
122127
--swift-module ExampleSwiftLibrary \
@@ -129,5 +134,5 @@ jextract-run: jextract-swift generate-JExtract-interface-files
129134
$(BUILD_DIR)/jextract/SwiftKitSwift/SwiftKit.swiftinterface
130135

131136

132-
jextract-run-java: jextract-swift generate-JExtract-interface-files
137+
jextract-run: jextract-generate
133138
./gradlew Samples:SwiftKitSampleApp:run

Package.swift

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,7 @@ let javaIncludePath = "\(javaHome)/include"
4343
let package = Package(
4444
name: "JavaKit",
4545
platforms: [
46-
.macOS(.v13),
47-
.iOS(.v13),
48-
.tvOS(.v13),
49-
.watchOS(.v6),
50-
.macCatalyst(.v13),
46+
.macOS(.v10_15)
5147
],
5248
products: [
5349
// ==== JavaKit (i.e. calling Java directly Swift utilities)
@@ -56,6 +52,11 @@ let package = Package(
5652
targets: ["JavaKit"]
5753
),
5854

55+
.library(
56+
name: "JavaRuntime",
57+
targets: ["JavaRuntime"]
58+
),
59+
5960
.library(
6061
name: "JavaKitJar",
6162
targets: ["JavaKitReflection"]
@@ -86,6 +87,22 @@ let package = Package(
8687
targets: ["Java2Swift"]
8788
),
8889

90+
// ==== Plugin for building Java code
91+
.plugin(
92+
name: "JavaCompilerPlugin",
93+
targets: [
94+
"JavaCompilerPlugin"
95+
]
96+
),
97+
98+
// ==== Plugin for wrapping Java classes in Swift
99+
.plugin(
100+
name: "Java2SwiftPlugin",
101+
targets: [
102+
"Java2SwiftPlugin"
103+
]
104+
),
105+
89106
// ==== jextract-swift (extract Java accessors from Swift interface files)
90107

91108
.executable(
@@ -107,11 +124,6 @@ let package = Package(
107124

108125
// ==== Examples
109126

110-
.library(
111-
name: "JavaKitExample",
112-
type: .dynamic,
113-
targets: ["JavaKitExample"]
114-
),
115127
.library(
116128
name: "ExampleSwiftLibrary",
117129
type: .dynamic,
@@ -144,7 +156,7 @@ let package = Package(
144156
.target(
145157
name: "JavaKit",
146158
dependencies: ["JavaRuntime", "JavaKitMacros", "JavaTypes"],
147-
exclude: ["generated/JavaKit.swift2java"],
159+
exclude: ["Java2Swift.config"],
148160
swiftSettings: [
149161
.swiftLanguageMode(.v5),
150162
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -153,7 +165,7 @@ let package = Package(
153165
.target(
154166
name: "JavaKitJar",
155167
dependencies: ["JavaKit"],
156-
exclude: ["generated/JavaKitJar.swift2java"],
168+
exclude: ["Java2Swift.config"],
157169
swiftSettings: [
158170
.swiftLanguageMode(.v5),
159171
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -162,7 +174,7 @@ let package = Package(
162174
.target(
163175
name: "JavaKitNetwork",
164176
dependencies: ["JavaKit"],
165-
exclude: ["generated/JavaKitNetwork.swift2java"],
177+
exclude: ["Java2Swift.config"],
166178
swiftSettings: [
167179
.swiftLanguageMode(.v5),
168180
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -171,7 +183,7 @@ let package = Package(
171183
.target(
172184
name: "JavaKitReflection",
173185
dependencies: ["JavaKit"],
174-
exclude: ["generated/JavaKitReflection.swift2java"],
186+
exclude: ["Java2Swift.config"],
175187
swiftSettings: [
176188
.swiftLanguageMode(.v5),
177189
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
@@ -197,14 +209,20 @@ let package = Package(
197209
.linkedLibrary("jvm"),
198210
]
199211
),
200-
.target(
201-
name: "JavaKitExample",
202-
dependencies: ["JavaKit"],
203-
swiftSettings: [
204-
.swiftLanguageMode(.v5),
205-
.unsafeFlags(["-I\(javaIncludePath)", "-I\(javaPlatformIncludePath)"])
206-
]
212+
213+
.plugin(
214+
name: "JavaCompilerPlugin",
215+
capability: .buildTool()
216+
),
217+
218+
.plugin(
219+
name: "Java2SwiftPlugin",
220+
capability: .buildTool(),
221+
dependencies: [
222+
"Java2Swift"
223+
]
207224
),
225+
208226
.target(
209227
name: "ExampleSwiftLibrary",
210228
dependencies: [],
@@ -230,6 +248,25 @@ let package = Package(
230248
]
231249
),
232250

251+
.target(
252+
name: "Java2SwiftLib",
253+
dependencies: [
254+
.product(name: "SwiftBasicFormat", package: "swift-syntax"),
255+
.product(name: "SwiftSyntax", package: "swift-syntax"),
256+
.product(name: "SwiftSyntaxBuilder", package: "swift-syntax"),
257+
"JavaKit",
258+
"JavaKitJar",
259+
"JavaKitReflection",
260+
"JavaKitNetwork",
261+
"JavaKitVM",
262+
"JavaTypes",
263+
],
264+
swiftSettings: [
265+
.swiftLanguageMode(.v5),
266+
.enableUpcomingFeature("BareSlashRegexLiterals")
267+
]
268+
),
269+
233270
.executableTarget(
234271
name: "Java2Swift",
235272
dependencies: [
@@ -239,11 +276,11 @@ let package = Package(
239276
.product(name: "ArgumentParser", package: "swift-argument-parser"),
240277
"JavaKit",
241278
"JavaKitJar",
242-
"JavaKitReflection",
243279
"JavaKitNetwork",
244280
"JavaKitVM",
245-
"JavaTypes",
281+
"Java2SwiftLib",
246282
],
283+
247284
swiftSettings: [
248285
.swiftLanguageMode(.v5),
249286
.enableUpcomingFeature("BareSlashRegexLiterals")
@@ -301,7 +338,15 @@ let package = Package(
301338
.swiftLanguageMode(.v5)
302339
]
303340
),
304-
341+
342+
.testTarget(
343+
name: "Java2SwiftTests",
344+
dependencies: ["Java2SwiftLib"],
345+
swiftSettings: [
346+
.swiftLanguageMode(.v5)
347+
]
348+
),
349+
305350
.testTarget(
306351
name: "JExtractSwiftTests",
307352
dependencies: [
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
/// Configuration for the Java2Swift translation tool, provided on a per-target
16+
/// basis.
17+
///
18+
/// Note: there is a copy of this struct in the Java2Swift library. They
19+
/// must be kept in sync.
20+
struct Configuration: Codable {
21+
/// The Java class path that should be passed along to the Java2Swift tool.
22+
var classPath: String? = nil
23+
24+
/// The Java classes that should be translated to Swift. The keys are
25+
/// canonical Java class names (e.g., java.util.Vector) and the values are
26+
/// the corresponding Swift names (e.g., JavaVector).
27+
var classes: [String: String] = [:]
28+
}

0 commit comments

Comments
 (0)