mirror of
https://github.com/AdaCore/uwrap.git
synced 2026-02-12 13:06:34 -08:00
88 lines
2.3 KiB
Plaintext
88 lines
2.3 KiB
Plaintext
import proxy.proxy;
|
|
import cs.wrappers;
|
|
|
|
function native_type (type) do
|
|
pick "System.IntPtr";
|
|
|
|
match type("int32") pick "int";
|
|
|
|
match type("void") pick "void";
|
|
end;
|
|
|
|
function cs_type (type) do
|
|
pick type;
|
|
|
|
match type("int32") pick "int";
|
|
|
|
match type("void") pick "void";
|
|
end;
|
|
|
|
template generate_proxy2cs pick origin do
|
|
match not parent ()
|
|
wrap w: w_Unit (name => child (name ("name")).value);
|
|
|
|
match parent (\ name ("functions"))
|
|
do
|
|
var type: text => child (\ name ("type")).value;
|
|
var ret_type_native: text => native_type (type);
|
|
var ret_type_cs: text => cs_type (type);
|
|
|
|
wrap n: w_FunctionCall (
|
|
name => child (\ name ("name")).value,
|
|
returned_type => ret_type_cs,
|
|
call => defer (child (\ name ("symbol")).value & "("
|
|
& n.child (w_ParamCall ()).fold ("", @ & actual_value, @ & ", ") & ")"),
|
|
static => "static");
|
|
|
|
match type ("void") do
|
|
weave w: w_FunctionCall (call_stmt => defer ("\e<w.call>;"));
|
|
elsmatch type ("int32") do
|
|
weave w: w_FunctionCall (call_stmt => defer ("return \e<w.call>;"));
|
|
else
|
|
weave w: w_FunctionCall (
|
|
pre_call_decl => defer ("\e<ret_type_cs> res = new \e<ret_type_cs> ();"),
|
|
pre_call_stmt => defer ("res.handle = \e<w.call>;"),
|
|
call_stmt => "return res;"
|
|
);
|
|
end;
|
|
|
|
wrap w_DllImportFunction (
|
|
name => child (\ name ("symbol")).value,
|
|
returned_type => defer (ret_type_native),
|
|
static => "static");
|
|
end;
|
|
|
|
match parent (\ name ("parameters")) do
|
|
var type: text => child (\ name ("type")).value;
|
|
var ret_type_native: text => native_type (type);
|
|
var ret_type_cs: text => cs_type (type);
|
|
|
|
wrap w_ParamCall (
|
|
name => child (\ name ("name")).value,
|
|
type_expr => defer (ret_type_cs)
|
|
);
|
|
|
|
match type ("int32") do
|
|
weave w: w_ParamCall (
|
|
actual_value => defer ("\e<w.name>")
|
|
);
|
|
else
|
|
weave w: w_ParamCall (
|
|
actual_value => defer ("\e<w.name>.handle")
|
|
);
|
|
end;
|
|
|
|
wrap w_ParamDll (
|
|
name => child (\ name ("name")).value,
|
|
type_expr => ret_type_native
|
|
);
|
|
|
|
end;
|
|
|
|
match parent (\ name ("classes")) do
|
|
wrap w_Class (
|
|
name => child (\ name ("name")).value
|
|
);
|
|
end;
|
|
end;
|