Skip to content

Commit d43959d

Browse files
authored
Refactor to use more strongly-typed interfaces (#721)
1 parent 35e21a1 commit d43959d

3 files changed

Lines changed: 33 additions & 55 deletions

File tree

Sources/JExtractSwiftLib/JNI/JNISwift2JavaGenerator+JavaTranslation.swift

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ extension JNISwift2JavaGenerator {
856856
return TranslatedParameter(
857857
parameter: JavaParameter(
858858
name: parameterName,
859-
type: .class(package: nil, name: "Optional<\(javaType)>"),
859+
type: .optional(javaType),
860860
annotations: parameterAnnotations,
861861
),
862862
conversion: .method(
@@ -876,7 +876,7 @@ extension JNISwift2JavaGenerator {
876876
return TranslatedParameter(
877877
parameter: JavaParameter(
878878
name: parameterName,
879-
type: .class(package: nil, name: "Optional", typeParameters: [javaType]),
879+
type: .optional(javaType),
880880
annotations: parameterAnnotations,
881881
),
882882
conversion: .method(
@@ -904,46 +904,35 @@ extension JNISwift2JavaGenerator {
904904

905905
switch swiftType {
906906
case .nominal(let nominalType):
907-
if let knownType = nominalType.nominalTypeDecl.knownTypeKind {
907+
if let knownType = nominalType.asKnownType {
908908
switch knownType {
909-
case .optional:
910-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 1 else {
911-
throw JavaTranslationError.unsupportedSwiftType(swiftType)
912-
}
909+
case .optional(let wrapped):
913910
return try translateOptionalResult(
914-
wrappedType: genericArgs[0],
911+
wrappedType: wrapped,
912+
methodName: methodName,
915913
resultName: resultName,
916914
genericParameters: genericParameters,
917915
genericRequirements: genericRequirements,
918916
)
919917

920-
case .array:
921-
guard let elementType = nominalType.genericArguments?.first else {
922-
throw JavaTranslationError.unsupportedSwiftType(swiftType)
923-
}
918+
case .array(let element):
924919
return try translateArrayResult(
925-
elementType: elementType,
920+
elementType: element,
926921
genericParameters: genericParameters,
927922
genericRequirements: genericRequirements,
928923
)
929924

930-
case .dictionary:
931-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 2 else {
932-
throw JavaTranslationError.dictionaryRequiresKeyAndValueTypes(swiftType)
933-
}
925+
case .dictionary(let key, let value):
934926
return try translateDictionaryResult(
935-
keyType: genericArgs[0],
936-
valueType: genericArgs[1],
927+
keyType: key,
928+
valueType: value,
937929
genericParameters: genericParameters,
938930
genericRequirements: genericRequirements,
939931
)
940932

941-
case .set:
942-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 1 else {
943-
throw JavaTranslationError.setRequiresElementType(swiftType)
944-
}
933+
case .set(let element):
945934
return try translateSetResult(
946-
elementType: genericArgs[0],
935+
elementType: element,
947936
genericParameters: genericParameters,
948937
genericRequirements: genericRequirements,
949938
)
@@ -968,7 +957,7 @@ extension JNISwift2JavaGenerator {
968957
)
969958

970959
default:
971-
guard let javaType = JNIJavaTypeTranslator.translate(knownType: knownType, config: self.config) else {
960+
guard let javaType = JNIJavaTypeTranslator.translate(knownType: knownType.kind, config: self.config) else {
972961
throw JavaTranslationError.unsupportedSwiftType(swiftType)
973962
}
974963

@@ -1046,52 +1035,40 @@ extension JNISwift2JavaGenerator {
10461035
case .nominal(let nominalType):
10471036
let nominalTypeName = nominalType.nominalTypeDecl.qualifiedName
10481037

1049-
if let knownType = nominalType.nominalTypeDecl.knownTypeKind {
1038+
if let knownType = nominalType.asKnownType {
10501039
switch knownType {
1051-
case .optional:
1052-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 1 else {
1053-
throw JavaTranslationError.unsupportedSwiftType(swiftType)
1054-
}
1040+
case .optional(let wrapped):
10551041
let wrappedType = try translateGenericTypeParameter(
1056-
genericArgs[0],
1042+
wrapped,
10571043
genericParameters: genericParameters,
10581044
genericRequirements: genericRequirements,
10591045
)
1060-
return .class(package: "java.util", name: "Optional", typeParameters: [wrappedType])
1046+
return .optional(wrappedType)
10611047

1062-
case .array:
1063-
guard let elementType = nominalType.genericArguments?.first else {
1064-
throw JavaTranslationError.unsupportedSwiftType(swiftType)
1065-
}
1048+
case .array(let element):
10661049
let elementJavaType = try translateGenericTypeParameter(
1067-
elementType,
1050+
element,
10681051
genericParameters: genericParameters,
10691052
genericRequirements: genericRequirements,
10701053
)
10711054
return .array(elementJavaType)
10721055

1073-
case .dictionary:
1074-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 2 else {
1075-
throw JavaTranslationError.dictionaryRequiresKeyAndValueTypes(swiftType)
1076-
}
1056+
case .dictionary(let key, let value):
10771057
let keyJavaType = try translateGenericTypeParameter(
1078-
genericArgs[0],
1058+
key,
10791059
genericParameters: genericParameters,
10801060
genericRequirements: genericRequirements,
10811061
)
10821062
let valueJavaType = try translateGenericTypeParameter(
1083-
genericArgs[1],
1063+
value,
10841064
genericParameters: genericParameters,
10851065
genericRequirements: genericRequirements,
10861066
)
10871067
return .swiftDictionaryMap(keyJavaType, valueJavaType)
10881068

1089-
case .set:
1090-
guard let genericArgs = nominalType.genericArguments, genericArgs.count == 1 else {
1091-
throw JavaTranslationError.setRequiresElementType(swiftType)
1092-
}
1069+
case .set(let element):
10931070
let elementJavaType = try translateGenericTypeParameter(
1094-
genericArgs[0],
1071+
element,
10951072
genericParameters: genericParameters,
10961073
genericRequirements: genericRequirements,
10971074
)
@@ -1110,7 +1087,7 @@ extension JNISwift2JavaGenerator {
11101087
return .javaUtilUUID
11111088

11121089
default:
1113-
guard let javaType = JNIJavaTypeTranslator.translate(knownType: knownType, config: self.config) else {
1090+
guard let javaType = JNIJavaTypeTranslator.translate(knownType: knownType.kind, config: self.config) else {
11141091
throw JavaTranslationError.unsupportedSwiftType(swiftType)
11151092
}
11161093
return javaType.boxedType
@@ -1259,6 +1236,7 @@ extension JNISwift2JavaGenerator {
12591236

12601237
func translateOptionalResult(
12611238
wrappedType swiftType: SwiftType,
1239+
methodName: String,
12621240
resultName: String,
12631241
genericParameters: [SwiftGenericParameterDeclaration],
12641242
genericRequirements: [SwiftGenericRequirement],
@@ -1338,7 +1316,7 @@ extension JNISwift2JavaGenerator {
13381316

13391317
let wrappedValueResult = try translate(
13401318
swiftResult: SwiftResult(convention: .direct, type: swiftType),
1341-
methodName: "",
1319+
methodName: methodName,
13421320
resultName: resultName + "Wrapped$",
13431321
genericParameters: genericParameters,
13441322
genericRequirements: genericRequirements,
@@ -1352,7 +1330,7 @@ extension JNISwift2JavaGenerator {
13521330
.void
13531331
}
13541332

1355-
let returnType = JavaType.class(package: nil, name: "Optional", typeParameters: [javaType])
1333+
let returnType = JavaType.optional(javaType)
13561334
return TranslatedResult(
13571335
javaType: returnType,
13581336
annotations: parameterAnnotations,

Tests/JExtractSwiftTests/JNI/JNIGenericCombinationTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct JNIGenericCombinationTests {
5555
detectChunkByInitialLines: 2,
5656
expectedChunks: [
5757
"""
58-
public static Optional<MyID<java.lang.String>> makeStringIDOptional(java.lang.String value, SwiftArena swiftArena) {
58+
public static java.util.Optional<MyID<java.lang.String>> makeStringIDOptional(java.lang.String value, SwiftArena swiftArena) {
5959
byte[] result$_discriminator$ = new byte[1];
6060
org.swift.swiftkit.core._OutSwiftGenericInstance resultWrapped$ = new org.swift.swiftkit.core._OutSwiftGenericInstance();
6161
SwiftModule.$makeStringIDOptional(value, result$_discriminator$, resultWrapped$);
@@ -113,7 +113,7 @@ struct JNIGenericCombinationTests {
113113
detectChunkByInitialLines: 2,
114114
expectedChunks: [
115115
"""
116-
public static void takeStringIDOptional(Optional<MyID<java.lang.String>> value) {
116+
public static void takeStringIDOptional(java.util.Optional<MyID<java.lang.String>> value) {
117117
SwiftModule.$takeStringIDOptional(value.map(MyID<java.lang.String>::$memoryAddress).orElse(0L));
118118
}
119119
""",

Tests/JExtractSwiftTests/JNI/JNIOptionalTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ struct JNIOptionalTests {
155155
* public func optionalClass(_ arg: MyClass?) -> MyClass?
156156
* }
157157
*/
158-
public static Optional<MyClass> optionalClass(Optional<MyClass> arg, SwiftArena swiftArena) {
158+
public static java.util.Optional<MyClass> optionalClass(java.util.Optional<MyClass> arg, SwiftArena swiftArena) {
159159
byte[] result$_discriminator$ = new byte[1];
160160
long result$ = SwiftModule.$optionalClass(arg.map(MyClass::$memoryAddress).orElse(0L), result$_discriminator$);
161161
return (result$_discriminator$[0] == 1) ? Optional.of(MyClass.wrapMemoryAddressUnsafe(result$, swiftArena)) : Optional.empty();
@@ -218,7 +218,7 @@ struct JNIOptionalTests {
218218
* public func optionalJavaKitClass(_ arg: JavaLong?)
219219
* }
220220
*/
221-
public static void optionalJavaKitClass(Optional<java.lang.Long> arg) {
221+
public static void optionalJavaKitClass(java.util.Optional<java.lang.Long> arg) {
222222
SwiftModule.$optionalJavaKitClass(arg.orElse(null));
223223
}
224224
""",

0 commit comments

Comments
 (0)