summaryrefslogtreecommitdiffstats
path: root/generator/generator_java.ml
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-07-13 13:42:40 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-07-14 11:13:49 +0100
commitb48ae2eadf43315159f2174c8fd35b05ede14c0f (patch)
treee32e73caf222502bf54b783e507042d7c4d1f993 /generator/generator_java.ml
parent98757e151ae8ad8d334f028690abcc85b91c73e5 (diff)
downloadlibguestfs-b48ae2eadf43315159f2174c8fd35b05ede14c0f.tar.gz
libguestfs-b48ae2eadf43315159f2174c8fd35b05ede14c0f.tar.xz
libguestfs-b48ae2eadf43315159f2174c8fd35b05ede14c0f.zip
generator: In non-C bindings, generate '*_opts' alias.
In C, a function called 'func' which has once_had_no_optargs=true will (because of the previous commit) generate 'func_opts' and a backwards-compatibility function called 'func'. This commit changes some of the non-C bindings so that they also generate 'func_opts' which is merely a wrapper that calls 'func'. This avoids incompatibility when we rename 'mkfs_opts' etc back to plain 'mkfs', and it also makes it easier to translate between other language bindings and C code. NB: Some bindings do not include aliases: PHP: There's no way to easily alias methods in PHP < 5.3, and we can't assume everyone has this minimum version. GObject: Very complex to add aliases, but we should probably do this at some point. Haskell: No support for optargs in these bindings. Unfortunately this means that we can no longer bind 'Guestfs.add_drive' (since it will be changed to add optional arguments) making the Haskell bindings even less useful than they were already.
Diffstat (limited to 'generator/generator_java.ml')
-rw-r--r--generator/generator_java.ml48
1 files changed, 47 insertions, 1 deletions
diff --git a/generator/generator_java.ml b/generator/generator_java.ml
index 62a17751..d239e1f7 100644
--- a/generator/generator_java.ml
+++ b/generator/generator_java.ml
@@ -95,7 +95,7 @@ public class GuestFS {
List.iter (
fun ({ name = name; style = (ret, args, optargs as style);
in_docs = in_docs; shortdesc = shortdesc;
- longdesc = longdesc } as f) ->
+ longdesc = longdesc; non_c_aliases = non_c_aliases } as f) ->
if in_docs then (
let doc = replace_str longdesc "C<guestfs_" "C<g." in
let doc =
@@ -200,6 +200,52 @@ public class GuestFS {
pr "\n"
);
+ (* Aliases. *)
+ List.iter (
+ fun alias ->
+ pr " ";
+ generate_java_prototype ~public:true ~semicolon:false alias style;
+ pr "\n";
+ pr " {\n";
+ (match ret with
+ | RErr -> pr " "
+ | _ -> pr " return "
+ );
+ pr "%s (" name;
+ let needs_comma = ref false in
+ List.iter (
+ fun arg ->
+ if !needs_comma then pr ", ";
+ needs_comma := true;
+ pr "%s" (name_of_argt arg)
+ ) args;
+ if optargs <> [] then (
+ if !needs_comma then pr ", ";
+ needs_comma := true;
+ pr "optargs"
+ );
+ pr ");\n";
+ pr " }\n";
+ pr "\n";
+
+ if optargs <> [] then (
+ pr " ";
+ generate_java_prototype ~public:true ~semicolon:false
+ alias (ret, args, []);
+ pr "\n";
+ pr " {\n";
+ (match ret with
+ | RErr -> pr " "
+ | _ -> pr " return "
+ );
+ pr "%s (" name;
+ List.iter (fun arg -> pr "%s, " (name_of_argt arg)) args;
+ pr "null);\n";
+ pr " }\n";
+ pr "\n"
+ )
+ ) non_c_aliases;
+
(* Prototype for the native method. *)
pr " ";
generate_java_prototype ~privat:true ~native:true name style;