Always produce nullable type for result out parameter in Obj-C header

Otherwise it would be unusable when passing reference to local variable
from Swift as it would require a non-null initializer then.
This commit is contained in:
Svyatoslav Scherbina
2019-06-21 17:42:49 +03:00
committed by SvyatoslavScherbina
parent fba4a35d60
commit 87396c6caf
3 changed files with 17 additions and 4 deletions
@@ -639,8 +639,14 @@ internal class ObjCExportTranslatorImpl(
MethodBridgeValueParameter.ErrorOutParameter -> MethodBridgeValueParameter.ErrorOutParameter ->
ObjCPointerType(ObjCNullableReferenceType(ObjCClassType("NSError")), nullable = true) ObjCPointerType(ObjCNullableReferenceType(ObjCClassType("NSError")), nullable = true)
is MethodBridgeValueParameter.KotlinResultOutParameter -> is MethodBridgeValueParameter.KotlinResultOutParameter -> {
ObjCPointerType(mapType(method.returnType!!, bridge.bridge, objCExportScope), nullable = true) val resultType = mapType(method.returnType!!, bridge.bridge, objCExportScope)
// Note: non-nullable reference or pointer type is unusable here
// when passing reference to local variable from Swift because it
// would require a non-null initializer then.
val pointeeType = resultType.makeNullableIfReferenceOrPointer()
ObjCPointerType(pointeeType, nullable = true)
}
} }
parameters += ObjCParameter(uniqueName, p, type) parameters += ObjCParameter(uniqueName, p, type)
@@ -981,7 +987,6 @@ abstract class ObjCExportHeaderGenerator internal constructor(
listOf( listOf(
"-Wunknown-warning-option", "-Wunknown-warning-option",
"-Wnullability", "-Wnullability",
"-Wnullability-completeness",
"-Wswift-name-attribute" "-Wswift-name-attribute"
).forEach { ).forEach {
add("#pragma clang diagnostic ignored \"$it\"") add("#pragma clang diagnostic ignored \"$it\"")
@@ -130,3 +130,11 @@ internal enum class ObjCValueType(val encoding: String) {
DOUBLE("d"), DOUBLE("d"),
POINTER("^v") POINTER("^v")
} }
internal fun ObjCType.makeNullableIfReferenceOrPointer(): ObjCType = when (this) {
is ObjCPointerType -> ObjCPointerType(this.pointee, nullable = true)
is ObjCNonNullReferenceType -> ObjCNullableReferenceType(this)
is ObjCNullableReferenceType, is ObjCRawType, is ObjCPrimitiveType, ObjCVoidType -> this
}
@@ -297,7 +297,7 @@ __attribute__((swift_name("Bridge")))
- (ValuesKotlinNothing * _Nullable)foo1AndReturnError:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo1()"))); - (ValuesKotlinNothing * _Nullable)foo1AndReturnError:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo1()")));
- (BOOL)foo2AndReturnResult:(int32_t * _Nullable)result error:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo2(result:)"))); - (BOOL)foo2AndReturnResult:(int32_t * _Nullable)result error:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo2(result:)")));
- (BOOL)foo3AndReturnError:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo3()"))); - (BOOL)foo3AndReturnError:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo3()")));
- (BOOL)foo4AndReturnResult:(ValuesKotlinNothing ** _Nullable)result error:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo4(result:)"))); - (BOOL)foo4AndReturnResult:(ValuesKotlinNothing * _Nullable * _Nullable)result error:(NSError * _Nullable * _Nullable)error __attribute__((swift_name("foo4(result:)")));
@end; @end;
__attribute__((objc_subclassing_restricted)) __attribute__((objc_subclassing_restricted))