wip nullable tag
authorMatt Corallo <git@bluematt.me>
Thu, 5 Aug 2021 13:52:52 +0000 (13:52 +0000)
committerMatt Corallo <git@bluematt.me>
Thu, 5 Aug 2021 13:52:52 +0000 (13:52 +0000)
bindingstypes.py
genbindings.py
java_strings.py

index 2ca6c0de11712ed570eca663a8e9b111e22720ee..edb19565140c0c435892615810e59986414b6778 100644 (file)
@@ -65,6 +65,8 @@ class ConvInfo:
         self.to_hu_conv = to_hu_conv
         self.to_hu_conv_name = to_hu_conv_name
         self.from_hu_conv = from_hu_conv
+        # This is set based on docstrings in various contexts:
+        self.nullable = False
 
 class TraitMethInfo:
     def __init__(self, fn_name, self_is_const, ret_ty_info, args_ty, docs):
index 5e8071ec00b31e1c93a9d6a05ef69d9dbc043e37..f90c5d456266f3e94009c9035b9a943bc77c5936 100755 (executable)
@@ -70,6 +70,21 @@ def camel_to_snake(s):
             lastund = True
     return (ret + lastchar.lower()).strip("_")
 
+def doc_to_params_ret_nullable(doc):
+    if doc is None:
+        return (set(), False)
+    params = set()
+    ret_null = False
+    for line in doc.splitlines():
+        if "may be NULL or all-0s to represent None" not in line:
+            continue
+        if "Note that the return value" in line:
+            ret_null = True
+        elif "Note that " in line:
+            param = doc.split("Note that ")[1].split(" ")[0]
+            params.add(param)
+    return (params, ret_null)
+
 unitary_enums = set()
 complex_enums = set()
 opaque_structs = set()
@@ -418,6 +433,10 @@ with open(sys.argv[1]) as in_h, open(sys.argv[2], "w") as out_java:
 
         return_type_info = type_mapping_generator.map_type(method_return_type.strip() + " ret", True, ret_arr_len, False, False)
 
+        (params_nullable, ret_nullable) = doc_to_params_ret_nullable(doc_comment)
+        if ret_nullable:
+            return_type_info.nullable = True
+
         argument_types = []
         default_constructor_args = {}
         takes_self = False
@@ -430,7 +449,10 @@ with open(sys.argv[1]) as in_h, open(sys.argv[2], "w") as out_java:
                 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
             if argument_conversion_info.arg_conv is not None and "Warning" in argument_conversion_info.arg_conv:
+                assert not argument_conversion_info.arg_name in params_nullable
                 if argument_conversion_info.rust_obj in constructor_fns:
                     assert not is_free
                     for explode_arg in constructor_fns[argument_conversion_info.rust_obj].split(','):
index d4931cd912038295c89ab63ce11f0ffdbe9e35e7..f4c80d3eb526573204f873ae7ee2a1d68f88f75a 100644 (file)
@@ -1137,6 +1137,8 @@ import java.util.Arrays;
             meth_n = method_name[len(struct_meth) + 1 if len(struct_meth) != 0 else 0:].strip("_")
             if doc_comment is not None:
                 out_java_struct += "\t/**\n\t * " + doc_comment.replace("\n", "\n\t * ") + "\n\t */\n"
+            if return_type_info.nullable:
+                out_java_struct += "\t@Nullable\n"
             if not takes_self:
                 if meth_n == "new":
                     out_java_struct += "\tpublic static " + return_type_info.java_hu_ty + " of("
@@ -1154,12 +1156,15 @@ import java.util.Arrays;
                     continue
                 if arg.java_ty != "void":
                     if arg.arg_name in default_constructor_args:
+                        assert not arg.nullable
                         for explode_idx, explode_arg in enumerate(default_constructor_args[arg.arg_name]):
                             if explode_idx != 0:
                                 out_java_struct += (", ")
                             out_java_struct += (
                                 explode_arg.java_hu_ty + " " + arg.arg_name + "_" + explode_arg.arg_name)
                     else:
+                        if arg.nullable:
+                            out_java_struct += "@Nullable "
                         out_java_struct += (arg.java_hu_ty + " " + arg.arg_name)
         out_java += (");\n")
         out_c += (") {\n")