string GenJavaDelegateCode(DelegateType d, ForeignMacroExpr dEntity, string entrypointName) { using (var tw = new StringWriter()) { using (var ftw = new TextFormatter(tw)) { var voidReturn = d.ReturnType.IsVoid; var name = Convert.Name.JavaDelegateName(d); var fullName = Convert.Name.JavaDelegateName(d, true); var package = fullName.Substring(0, fullName.LastIndexOf('.')); var implements = (voidReturn && d.Parameters.Length == 0) ? " implements java.lang.Runnable" : ""; ftw.WriteLine("package " + package + ";"); ftw.WriteLine("import com.foreign.*;"); ftw.WriteLine("import com.uno.BoolArray;"); ftw.WriteLine("import com.uno.ByteArray;"); ftw.WriteLine("import com.uno.CharArray;"); ftw.WriteLine("import com.uno.DoubleArray;"); ftw.WriteLine("import com.uno.FloatArray;"); ftw.WriteLine("import com.uno.IntArray;"); ftw.WriteLine("import com.uno.LongArray;"); ftw.WriteLine("import com.uno.ObjectArray;"); ftw.WriteLine("import com.uno.ShortArray;"); ftw.WriteLine("import com.uno.StringArray;"); ftw.WriteLine("import com.uno.UnoObject;"); ftw.WriteLine(""); ftw.WriteLine("public class " + name + " extends com.uno.UnoObject" + implements); ftw.Indent("{"); ftw.WriteLine("public " + name + "(long ptr) { super(ptr); }"); ftw.Indent("public " + Convert.Type.UnoToJavaType(d.ReturnType, true) + " run(" + string.Join(", ", d.Parameters.Select(Convert.Param.UnoToJavaParameter)) + ") {"); var args = d.Parameters.Select(x => x.Name).ToList(); args.Insert(0, "this"); ftw.WriteLine((voidReturn ? "" : "return ") + dEntity.GenCallToNativeMethod(entrypointName, args) + ";"); ftw.Unindent("}"); ftw.Unindent("}"); var finalStr = tw.ToString(); return(finalStr); } } }
string InterceptCallToUno(Function func, object callArgs) { var ufunc = new ForeignMacroExpr(func, Convert, Helpers); var entrypointName = Convert.Name.GenNativeMethodName(func); // Add requirements BlockHost.RequireMember(func); BlockHost.Include(ufunc.EntrypointIncludes); // Generate c++ entrypoint BlockHost.AddCppEntrypoint(ufunc, entrypointName); // Generate java native method BlockHost.NativeJavaMethods.Add(ufunc.GenJavaNativeMethod(entrypointName)); // Generate java call to java native method var args = (List <string>)callArgs; var castedArgs = ufunc.Params.Zip(args, (x, y) => x.JavaArgCast + y); return(ufunc.GenCallToNativeMethod(entrypointName, new List <string>(castedArgs))); }
string InterceptProperty(string macroText, string expansionResult, Property property, object callArgs) { var isGetter = !macroText.Contains(":Set("); var ufunc = new ForeignMacroExpr(property, isGetter, Convert, Helpers); var entrypointName = Convert.Name.GenNativePropertyName(property, isGetter); // Add requirements BlockHost.RequireMember(property); BlockHost.Include(property.DeclaringType); BlockHost.Include(ufunc.EntrypointIncludes); // Generate c++ entrypoint BlockHost.AddCppEntrypoint(ufunc, entrypointName); // Generate java native method BlockHost.NativeJavaMethods.Add(ufunc.GenJavaNativeMethod(entrypointName)); // Generate java call to java native method var args = callArgs == null ? new List <string>() : new List <string>((List <string>)callArgs); return(ufunc.GenCallToNativeMethod(entrypointName, args)); }