return (params, ret_null)
unitary_enums = set()
-complex_enums = set()
+# Map from enum name to "contains trait object"
+complex_enums = {}
opaque_structs = set()
trait_structs = {}
result_types = set()
var_name=res.var_name, arr_len="datalen", arr_access="data", subty=res, is_native_primitive=False)
is_primitive = False
+ contains_trait = False
arr_len = None
mapped_type = []
java_type_plural = None
fn_ty_arg = "J"
fn_arg = ma.group(2).strip()
rust_obj = ma.group(1).strip()
+ if rust_obj in trait_structs:
+ contains_trait = True
+ elif rust_obj in complex_enums:
+ contains_trait = complex_enums[rust_obj]
take_by_ptr = True
if fn_arg.startswith(" *") or fn_arg.startswith("*"):
if var_is_arr.group(1) == "":
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty, is_const=is_const,
passed_as_ptr=False, is_ptr=False, nonnull_ptr=nonnull_ptr, var_name="arg",
- arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
+ arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False, contains_trait=contains_trait)
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty, is_const=is_const,
passed_as_ptr=False, is_ptr=False, nonnull_ptr=nonnull_ptr, var_name=var_is_arr.group(1),
- arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False)
+ arr_len=var_is_arr.group(2), arr_access=arr_access, is_native_primitive=False, contains_trait=contains_trait)
if java_hu_ty is None:
java_hu_ty = java_ty
return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_hu_ty=java_hu_ty, java_fn_ty_arg=fn_ty_arg, c_ty=c_ty, passed_as_ptr=is_ptr or take_by_ptr,
- is_const=is_const, is_ptr=is_ptr, nonnull_ptr=nonnull_ptr, var_name=fn_arg, arr_len=arr_len, arr_access=arr_access, is_native_primitive=is_primitive)
+ is_const=is_const, is_ptr=is_ptr, nonnull_ptr=nonnull_ptr, var_name=fn_arg, arr_len=arr_len, arr_access=arr_access, is_native_primitive=is_primitive,
+ contains_trait=contains_trait)
fn_ptr_regex = re.compile("^extern const ([A-Za-z_0-9\* ]*) \(\*(.*)\)\((.*)\);$")
fn_ret_arr_regex = re.compile("(.*) \(\*(.*)\((.*)\)\)\[([0-9]*)\];$")
expected_struct = "LDK" + struct_meth
struct_meth_name = method_name[len(struct_meth) + 1 if len(struct_meth) != 0 else 0:].strip("_")
- return_type_info = type_mapping_generator.map_type(method_return_type.strip() + " ret", True, ret_arr_len, False, force_holds_ref)
-
(params_nullable, ret_nullable) = doc_to_params_ret_nullable(doc_comment)
if ret_nullable:
- return_type_info.nullable = True
+ return_type_info = type_mapping_generator.map_nullable_type(method_return_type.strip() + " ret", True, ret_arr_len, False, force_holds_ref)
+ else:
+ return_type_info = type_mapping_generator.map_type(method_return_type.strip() + " ret", True, ret_arr_len, False, force_holds_ref)
argument_types = []
default_constructor_args = {}
args_known = True
for argument_index, argument in enumerate(method_arguments):
- argument_conversion_info = type_mapping_generator.map_type(argument, False, None, is_free, True)
- if argument_index == 0 and argument_conversion_info.java_hu_ty == struct_meth:
+ arg_ty = type_mapping_generator.java_c_types(argument, None)
+ argument_conversion_info = None
+ if argument_index == 0 and arg_ty.java_hu_ty == struct_meth:
+ argument_conversion_info = type_mapping_generator.map_type_with_info(arg_ty, False, None, is_free, True, False)
takes_self = True
if argument_conversion_info.ty_info.is_ptr:
takes_self_ptr = True
- elif argument_conversion_info.arg_name in params_nullable:
- argument_conversion_info.nullable = True
+ elif arg_ty.var_name in params_nullable:
+ argument_conversion_info = type_mapping_generator.map_type_with_info(arg_ty, False, None, is_free, True, True)
if argument_conversion_info.arg_conv is not None and "Warning" in argument_conversion_info.arg_conv:
arg_ty_info = java_c_types(argument, None)
print("WARNING: Remapping argument " + arg_ty_info.var_name + " of function " + method_name + " to a reference")
print(" It may or may not actually be a reference, but its the simplest mapping option")
print(" and also the only use of this code today.")
arg_ty_info.requires_clone = False
- argument_conversion_info = type_mapping_generator.map_type_with_info(arg_ty_info, False, None, is_free, True)
+ argument_conversion_info = type_mapping_generator.map_type_with_info(arg_ty_info, False, None, is_free, True, True)
+ assert argument_conversion_info.nullable
assert argument_conversion_info.arg_conv is not None and "Warning" not in argument_conversion_info.arg_conv
+ else:
+ argument_conversion_info = type_mapping_generator.map_type_with_info(arg_ty, False, None, is_free, True, False)
if argument_conversion_info.arg_conv is not None and "Warning" in argument_conversion_info.arg_conv:
if argument_conversion_info.rust_obj in constructor_fns:
def map_complex_enum(struct_name, union_enum_items, inline_enum_variants, enum_doc_comment):
java_hu_type = struct_name.replace("LDK", "").replace("COption", "Option")
- complex_enums.add(struct_name)
enum_variants = []
tag_field_lines = union_enum_items["field_lines"]
+ contains_trait = False
for idx, (struct_line, _) in enumerate(tag_field_lines):
if idx == 0:
assert(struct_line == "typedef enum %s_Tag {" % struct_name)
enum_var_lines = union_enum_items["LDK" + variant_name]
for idx, (field, field_docs) in enumerate(enum_var_lines):
if idx != 0 and idx < len(enum_var_lines) - 2 and field.strip() != "":
- field_ty = type_mapping_generator.map_type(field.strip(' ;'), False, None, False, True)
+ field_ty = type_mapping_generator.java_c_types(field.strip(' ;'), None)
+ contains_trait |= field_ty.contains_trait
if field_docs is not None and doc_to_field_nullable(field_docs):
- field_ty.nullable = True
- fields.append((field_ty, field_docs))
+ field_conv = type_mapping_generator.map_type_with_info(field_ty, False, None, False, True, True)
+ else:
+ field_conv = type_mapping_generator.map_type_with_info(field_ty, False, None, False, True, False)
+ fields.append((field_conv, field_docs))
enum_variants.append(ComplexEnumVariantInfo(variant_name, fields, False))
elif camel_to_snake(variant_name) in inline_enum_variants:
# TODO: If we ever have a rust enum Variant(Option<Struct>) we need to pipe
# docs through to there, and then potentially mark the field nullable.
- fields.append((type_mapping_generator.map_type(inline_enum_variants[camel_to_snake(variant_name)] + " " + camel_to_snake(variant_name), False, None, False, True), None))
+ mapped = type_mapping_generator.map_type(inline_enum_variants[camel_to_snake(variant_name)] + " " + camel_to_snake(variant_name), False, None, False, True)
+ contains_trait |= mapped.ty_info.contains_trait
+ fields.append((mapped, None))
enum_variants.append(ComplexEnumVariantInfo(variant_name, fields, True))
else:
enum_variants.append(ComplexEnumVariantInfo(variant_name, fields, True))
+ complex_enums[struct_name] = contains_trait
with open(f"{sys.argv[3]}/structs/{java_hu_type}{consts.file_ext}", "w") as out_java_enum:
(out_java_addendum, out_java_enum_addendum, out_c_addendum) = consts.map_complex_enum(struct_name, enum_variants, camel_to_snake, enum_doc_comment)
ret_ty_info = type_mapping_generator.map_type("void", True, None, False, False)
field_fns.append(TraitMethInfo("cloned", False, ret_ty_info, [], fn_docs))
else:
- ret_ty_info = type_mapping_generator.map_type(fn_line.group(2).strip() + " ret", True, None, False, False)
- is_const = fn_line.group(4) is not None
(nullable_params, ret_nullable) = doc_to_params_ret_nullable(fn_docs)
if ret_nullable:
assert False # This isn't yet handled on the Java side
ret_ty_info.nullable = True
+ ret_ty_info = type_mapping_generator.map_nullable_type(fn_line.group(2).strip() + " ret", True, None, False, False)
+ else:
+ ret_ty_info = type_mapping_generator.map_type(fn_line.group(2).strip() + " ret", True, None, False, False)
+ is_const = fn_line.group(4) is not None
arg_tys = []
for idx, arg in enumerate(fn_line.group(5).split(',')):
if arg == "":
continue
- arg_conv_info = type_mapping_generator.map_type(arg, True, None, False, False)
- if arg_conv_info.arg_name in nullable_params:
+ arg_ty_info = type_mapping_generator.java_c_types(arg, None)
+ if arg_ty_info.var_name in nullable_params:
# Types that are actually null instead of all-0s aren't yet handled on the Java side:
- assert arg_conv_info.rust_obj == "LDKPublicKey"
- arg_conv_info.nullable = True
+ arg_conv_info = type_mapping_generator.map_type_with_info(arg_ty_info, True, None, False, False, True)
+ else:
+ arg_conv_info = type_mapping_generator.map_type_with_info(arg_ty_info, True, None, False, False, False)
arg_tys.append(arg_conv_info)
field_fns.append(TraitMethInfo(fn_line.group(3), is_const, ret_ty_info, arg_tys, fn_docs))