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;")); elsmatch type ("int32") do weave w: w_FunctionCall (call_stmt => defer ("return \e;")); else weave w: w_FunctionCall ( pre_call_decl => defer ("\e res = new \e ();"), pre_call_stmt => defer ("res.handle = \e;"), 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") ); else weave w: w_ParamCall ( actual_value => defer ("\e.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;