Files
uwrap/include/cs/wrappers.wrp
2020-09-14 21:58:50 -04:00

157 lines
3.7 KiB
Plaintext

template w_CS do
var contents : text;
end;
template w_NamedEntity extends w_CS do
var name : text;
end;
template w_Unit extends w_NamedEntity do
end;
template w_Using extends w_CS do
var ref : text;
end;
template w_Namespace extends w_NamedEntity do
end;
template w_Function extends w_NamedEntity do
var returned_type : text;
var static : text;
end;
template w_FunctionCall extends w_Function do
var pre_call_decl : text;
var pre_call_stmt : text;
var call_decl_exp : text;
var call_decl : text;
var call_stmt : text;
var post_call_decl : text;
var post_call_stmt : text;
var return_stmt : text;
var call_assoc_list : text;
var call : text;
var call_name : text;
end;
template w_FunctionCallback extends w_Function do
end;
template w_DllImportFunction extends w_Function do
var dll : text;
end;
template w_Param extends w_NamedEntity do
var generate_formal: text;
var formal_text: text => defer (type_expr & " " & name);
var actual_text: text;
var type_expr: text;
var pre_call_decl: text;
var pre_call_stmt: text;
var call_decl: text;
var call_stmt: text;
var actual_value: text;
var post_call_decl: text;
var post_call_stmt: text;
var return_stmt: text;
var result_type_expr: text => "_";
var mode: text;
end;
template w_ParamCall extends w_Param do
end;
template w_ParamCallback extends w_Param do
end;
template w_ParamDll extends w_Param do
end;
template w_TypeExpr extends w_CS do
var txt : text;
end;
template w_Class extends w_NamedEntity do
end;
template wrappers2cs pick origin do
match w_DllImportFunction () do
weave (contents => defer (i"""
[DllImport("libproxy")]
private \e<static> extern \e<returned_type> \e<name> (\e<child (w_ParamDll ()).fold ("", @ & formal_text, @ & ", ")>);"""));
end;
match w_FunctionCall () do
weave (contents => defer (i"""
public \e<static> \e<returned_type> \e<name> (\e<child (w_ParamCall ()).fold ("", @ & formal_text, @ & ", ")>) {
\e<pre_call_decl>
\e<pre_call_stmt>
\e<call_decl_exp>
\e<call_decl>
\e<call_stmt>
\e<post_call_decl>
\e<post_call_stmt>
}"""));
end;
match p: w_ParamCall () and s: parent (w_FunctionCall) do
pick s weave (
pre_call_decl => defer (@ & p.pre_call_decl),
pre_call_stmt => defer (@ & p.pre_call_stmt),
call_decl => defer (@ & p.call_decl),
post_call_decl => defer (@ & p.post_call_decl),
post_call_stmt => defer (@ & p.post_call_stmt)
);
end;
match w_Class () do
weave (contents => defer (i"""
public class \e<name> {
public System.IntPtr handle;
\e<child (\ w_NamedEntity ()).fold ("", @ & contents, @ & "\n\n")>
}"""));
end;
match w_Namespace () do
weave (contents => defer (i"""
namespace \e<name> {
public static class \e<name>Module {
\e<child (\ w_Function ()).fold ("", @ & contents & "\n")>
}
\e<child (\ w_Class ()).fold ("", @ & contents & "\n")>
}"""));
end;
match w_Unit () do
wrap standard.file (defer (name & ".cs"), defer (contents));
weave (contents => defer (i"""
using System.Runtime.InteropServices;
\e<child (w_Using ()).fold ("", @ & "using " & ref & ";\n")>
namespace \e<name> {
public static class \e<name>Unit {
\e<child (w_Function ()).filter (\ true).fold ("", @ & contents & "\n")>
}
\e<child (w_Class ()).fold ("", @ & contents & "\n")>
}"""));
end;
end;