public CodeExpression FromNative(CodeExpression arg) { switch (GetKind(type)) { // ArraySymbol: // return String.Format ("({0}[]) JNIEnv.GetArray ({1}, {2}, typeof ({3}))", ElementType, var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer", opt.GetOutputName (sym.FullName)); case SymbolKind.Array: return(new CodeMethodCall(jnienv_getarray.MakeGenericMethod(type.GetElementType()), arg, do_not_transfer_literal, new CodeLiteral(type)).CastTo(type.GetElementType().MakeArrayType())); // CharSequence: // return String.Format ("Java.Lang.Object.GetObject<Java.Lang.ICharSequence> ({0}, {1})", var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.CharSequence: return(new CodeMethodCall(object_getobject.MakeGenericMethod(type), arg, do_not_transfer_literal)); // ClassGen: // return String.Format ("Java.Lang.Object.GetObject<{0}> ({1}, {2})", opt.GetOutputName (FullName), varname, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.Class: return(new CodeMethodCall(object_getobject.MakeGenericMethod(type), arg, do_not_transfer_literal)); // EnumSymbol: // return String.Format ("({0}) {1}", type, varname); case SymbolKind.Enum: return(arg.CastTo(type)); // SimpleSymbol/FormatSymbol: // return as is case SymbolKind.SimpleFormat: return(arg); /* * // GenericSymbol: * // return gen.FromNative (opt, varname, owned); * case SymbolKind.Generic: * throw new NotImplementedException (); */ // GenericTypeParameter: // return String.Format ("({0}) Java.Lang.Object.GetObject<{3}> ({1}, {2})", type, varname, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer", FullName); case SymbolKind.GenericTypeParameter: return(new CodeMethodCall(object_getobject.MakeGenericMethod(type), arg, do_not_transfer_literal).CastTo(type)); // InterfaceGen: // return String.Format ("Java.Lang.Object.GetObject<{0}> ({1}, {2})", opt.GetOutputName (FullName), varname, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.Interface: return(new CodeMethodCall(object_getobject.MakeGenericMethod(type), arg, do_not_transfer_literal)); // StreamSymbol: // return String.Format (opt.GetOutputName ("Android.Runtime.{0}Invoker") + ".FromJniHandle ({1}, {2})", base_name, var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.Stream: switch (parameter_kind) { case ExportParameterKind.InputStream: return(new CodeMethodCall(inputstreaminvoker_fromjnihandle, arg, do_not_transfer_literal)); case ExportParameterKind.OutputStream: return(new CodeMethodCall(outputstreaminvoker_fromjnihandle, arg, do_not_transfer_literal)); default: throw new NotSupportedException("To use Stream type in callback, ExportParameterAttribute is required on the parameter to indicate its Java appropriate parameter kind"); } // StringSymbol: // return String.Format ("JNIEnv.GetString ({0}, {1})", var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.String: return(new CodeMethodCall(jnienv_getstring, arg, do_not_transfer_literal)); // XmlPullParserSymbol: // return String.Format (opt.GetOutputName ("Android.Runtime.XmlPullParserReader") + ".FromJniHandle ({0}, {1})", var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); // XmlResourceParserSymbol: // return String.Format (opt.GetOutputName ("Android.Runtime.XmlResourceParserReader") + ".FromJniHandle ({0}, {1})", var_name, owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"); case SymbolKind.XmlReader: switch (parameter_kind) { case ExportParameterKind.XmlPullParser: return(new CodeMethodCall(xmlpullparserreader_fromjnihandle, arg, do_not_transfer_literal)); case ExportParameterKind.XmlResourceParser: return(new CodeMethodCall(xmlresourceparserreader_fromjnihandle, arg, do_not_transfer_literal)); default: throw new NotSupportedException("To use XmlReader type in callback, ExportParameterAttribute is required on the parameter to indicate its Java appropriate parameter kind"); } } throw new InvalidOperationException(); }
// Ignore ToNative() overload that takes generic instancing mapping. The reflected method should have nothing to do with it. public CodeExpression ToNative(CodeExpression arg) { switch (GetKind(type)) { // ArraySymbol: // return String.Format ("JNIEnv.NewArray ({0})", var_name); case SymbolKind.Array: return(new CodeMethodCall(jnienv_newarray.MakeGenericMethod(type.GetElementType()), arg)); // CharSequenceSymbol: // return String.Format ("CharSequence.ToLocalJniHandle ({0})", var_name); case SymbolKind.CharSequence: return(new CodeMethodCall(charsequence_tojnihandle, arg)); // ClassGen: // return String.Format ("JNIEnv.ToLocalJniHandle ({0})", varname); case SymbolKind.Class: return(new CodeMethodCall(jnienv_tojnihandle, arg)); // CollectionSymbol: // return String.Format ("{0}.ToLocalJniHandle ({1})", opt.GetOutputName (marshaler + (parms != null && parms.IsConcrete ? parms.ToString () : String.Empty)), varname); case SymbolKind.Collection: return(new CodeMethodCall(type.GetMethod("ToLocalJniHandle"), arg)); // EnumSymbol: // return "(int) " + varname; case SymbolKind.Enum: return(arg.CastTo(typeof(int))); // SimpleSymbol/FormatSymbol: // return as is case SymbolKind.SimpleFormat: return(arg); /* * // GenericSymbol: * case SymbolKind.Generic: * throw new NotImplementedException (); */ // GenericTypeParameter: // return String.Format ("JNIEnv.ToLocalJniHandle ({0})", varname); case SymbolKind.GenericTypeParameter: return(new CodeMethodCall(jnienv_tojnihandle, arg)); // InterfaceGen: // return String.Format ("JNIEnv.ToLocalJniHandle ({0})", varname); case SymbolKind.Interface: return(new CodeMethodCall(jnienv_tojnihandle, arg)); // StreamSymbol: case SymbolKind.Stream: // return String.Format (opt.GetOutputName ("Android.Runtime.{0}Adapter") + ".ToLocalJniHandle ({1})", base_name, var_name); switch (parameter_kind) { case ExportParameterKind.InputStream: return(new CodeMethodCall(inputstreamadapter_tojnihandle, arg)); case ExportParameterKind.OutputStream: return(new CodeMethodCall(outputstreamadapter_tojnihandle, arg)); default: throw new NotSupportedException("To use Stream type in callback, ExportParameterAttribute is required on the parameter to indicate its Java appropriate parameter kind"); } // StringSymbol: // return String.Format ("JNIEnv.NewString ({0})", var_name); case SymbolKind.String: return(new CodeMethodCall(jnienv_newstring, arg)); // XmlPullParserSymbol: // return String.Format ("global::Android.Runtime.XmlReaderPullParser.ToLocalJniHandle ({0})", var_name); // XmlResourceParserSymbol: // return String.Format ("global::Android.Runtime.XmlReaderResourceParser.ToLocalJniHandle ({0})", var_name); case SymbolKind.XmlReader: switch (parameter_kind) { case ExportParameterKind.XmlPullParser: return(new CodeMethodCall(xmlreaderpullparser_tojnihandle, arg)); case ExportParameterKind.XmlResourceParser: return(new CodeMethodCall(xmlreaderresourceparser_tojnihandle, arg)); default: throw new NotSupportedException("To use XmlReader type in callback, ExportParameterAttribute is required on the parameter to indicate its Java appropriate parameter kind"); } } throw new InvalidOperationException(); }
public static CodeCastExpression CastTo(this CodeExpression expr, Type type) { return(expr.CastTo(Easy.TypeRef(type))); }