public void Generate(StreamWriter sw, string indent, CodeGenerationOptions opt, bool use_base, ClassGen type) { string jni_sig = JniSignature; bool gen_string_overload = Parameters.HasCharSequence && !type.ContainsCtor(jni_sig.Replace("java/lang/CharSequence", "java/lang/String")); System.Collections.Specialized.StringCollection call_cleanup = Parameters.GetCallCleanup(opt); opt.CodeGenerator.WriteConstructorIdField(this, sw, indent, opt); sw.WriteLine("{0}// Metadata.xml XPath constructor reference: path=\"{1}/constructor[@name='{2}'{3}]\"", indent, type.MetadataXPathReference, type.JavaSimpleName, Parameters.GetMethodXPathPredicate()); sw.WriteLine("{0}[Register (\"{1}\", \"{2}\", \"{3}\"{4})]", indent, ".ctor", jni_sig, String.Empty, this.AdditionalAttributeString()); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} unsafe {2} ({3})\n{0}\t: {4} (IntPtr.Zero, JniHandleOwnership.DoNotTransfer)", indent, Visibility, Name, GenBase.GetSignature(this, opt), use_base ? "base" : "this"); sw.WriteLine("{0}{{", indent); opt.CodeGenerator.WriteConstructorBody(this, sw, indent + "\t", opt, call_cleanup); sw.WriteLine("{0}}}", indent); sw.WriteLine(); if (gen_string_overload) { sw.WriteLine("{0}[Register (\"{1}\", \"{2}\", \"{3}\"{4})]", indent, ".ctor", jni_sig, String.Empty, this.AdditionalAttributeString()); sw.WriteLine("{0}{1} unsafe {2} ({3})\n{0}\t: {4} (IntPtr.Zero, JniHandleOwnership.DoNotTransfer)", indent, Visibility, Name, GenBase.GetSignature(this, opt).Replace("Java.Lang.ICharSequence", "string").Replace("global::string", "string"), use_base ? "base" : "this"); sw.WriteLine("{0}{{", indent); opt.CodeGenerator.WriteConstructorBody(this, sw, indent + "\t", opt, call_cleanup); sw.WriteLine("{0}}}", indent); sw.WriteLine(); } }
public void GenerateExtensionOverload(StreamWriter sw, string indent, CodeGenerationOptions opt, string selfType) { if (!CanHaveStringOverload) { return; } string ret = opt.GetOutputName(RetVal.FullName.Replace("Java.Lang.ICharSequence", "string")); sw.WriteLine(); sw.WriteLine("{0}public static {1} {2} (this {3} self, {4})", indent, ret, Name, selfType, GenBase.GetSignature(this, opt).Replace("Java.Lang.ICharSequence", "string").Replace("global::string", "string")); sw.WriteLine("{0}{{", indent); GenerateStringOverloadBody(sw, indent + "\t", opt, true); sw.WriteLine("{0}}}", indent); }
public void Generate(StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase type, bool generate_callbacks) { if (!IsValid) { return; } bool gen_as_formatted = IsReturnCharSequence; if (generate_callbacks && IsVirtual) { GenerateCallback(sw, indent, opt, type, null, gen_as_formatted); } string name_and_jnisig = JavaName + JniSignature.Replace("java/lang/CharSequence", "java/lang/String"); bool gen_string_overload = !IsOverride && Parameters.HasCharSequence && !type.ContainsMethod(name_and_jnisig); string static_arg = IsStatic ? " static" : String.Empty; string virt_ov = IsOverride ? " override" : IsVirtual ? " virtual" : String.Empty; string seal = IsOverride && IsFinal ? " sealed" : null; string ret = opt.GetOutputName(RetVal.FullName); GenerateIdField(sw, indent, opt); sw.WriteLine("{0}// Metadata.xml XPath method reference: path=\"{1}\"", indent, GetMetadataXPathReference(this.DeclaringType)); if (Deprecated != null) { sw.WriteLine("{0}[Obsolete (@\"{1}\")]", indent, Deprecated.Replace("\"", "\"\"")); } if (IsReturnEnumified) { sw.WriteLine("{0}[return:global::Android.Runtime.GeneratedEnum]", indent); } sw.WriteLine("{0}[Register (\"{1}\", \"{2}\", \"{3}\"{4})]", indent, JavaName, JniSignature, IsVirtual ? ConnectorName : String.Empty, this.AdditionalAttributeString()); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1}{2}{3}{4} unsafe {5} {6} ({7})", indent, Visibility, static_arg, virt_ov, seal, ret, AdjustedName, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); GenerateBody(sw, indent + "\t", opt); sw.WriteLine("{0}}}", indent); sw.WriteLine(); if (gen_string_overload || gen_as_formatted) { GenerateStringOverload(sw, indent, opt); } GenerateAsyncWrapper(sw, indent, opt); }
public void GenerateExtensionAsyncWrapper(StreamWriter sw, string indent, CodeGenerationOptions opt, string selfType) { if (!Asyncify) { return; } string ret; if (IsVoid) { ret = "global::System.Threading.Tasks.Task"; } else { ret = "global::System.Threading.Tasks.Task<" + opt.GetOutputName(RetVal.FullName) + ">"; } sw.WriteLine("{0}public static {1} {2}Async (this {3} self{4}{5})", indent, ret, AdjustedName, selfType, Parameters.Count > 0 ? ", " : string.Empty, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); sw.WriteLine("{0}\treturn global::System.Threading.Tasks.Task.Run (() => self.{1} ({2}));", indent, AdjustedName, Parameters.GetCall(opt)); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
public void GenerateAsyncWrapper(StreamWriter sw, string indent, CodeGenerationOptions opt) { if (!Asyncify) { return; } string static_arg = IsStatic ? " static" : String.Empty; string ret; if (IsVoid) { ret = "global::System.Threading.Tasks.Task"; } else { ret = "global::System.Threading.Tasks.Task<" + opt.GetOutputName(RetVal.FullName) + ">"; } sw.WriteLine("{0}{1}{2} {3} {4}Async ({5})", indent, Visibility, static_arg, ret, AdjustedName, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); sw.WriteLine("{0}\treturn global::System.Threading.Tasks.Task.Run (() => {1} ({2}));", indent, AdjustedName, Parameters.GetCall(opt)); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
void GenerateStringOverload(StreamWriter sw, string indent, CodeGenerationOptions opt) { string static_arg = IsStatic ? " static" : String.Empty; string ret = opt.GetOutputName(RetVal.FullName.Replace("Java.Lang.ICharSequence", "string")); if (Deprecated != null) { sw.WriteLine("{0}[Obsolete (@\"{1}\")]", indent, Deprecated.Replace("\"", "\"\"").Trim()); } sw.WriteLine("{0}{1}{2} {3} {4} ({5})", indent, Visibility, static_arg, ret, Name, GenBase.GetSignature(this, opt).Replace("Java.Lang.ICharSequence", "string").Replace("global::string", "string")); sw.WriteLine("{0}{{", indent); GenerateStringOverloadBody(sw, indent + "\t", opt, false); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
// This is supposed to generate instantiated generic method output, but I don't think it is done yet. public void GenerateExplicitIface(StreamWriter sw, string indent, CodeGenerationOptions opt, GenericSymbol gen) { sw.WriteLine("{0}// This method is explicitly implemented as a member of an instantiated {1}", indent, gen.FullName); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} {2}.{3} ({4})", indent, opt.GetOutputName(RetVal.FullName), opt.GetOutputName(gen.Gen.FullName), Name, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); Dictionary <string, string> mappings = new Dictionary <string, string> (); for (int i = 0; i < gen.TypeParams.Length; i++) { mappings [gen.Gen.TypeParameters[i].Name] = gen.TypeParams [i].FullName; } GenerateGenericBody(sw, indent + "\t", opt, null, String.Empty, mappings); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
public void GenerateInvoker(StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase type) { GenerateCallback(sw, indent, opt, type, null, IsReturnCharSequence); GenerateIdField(sw, indent, opt, invoker: true); sw.WriteLine("{0}public unsafe {1}{2} {3} ({4})", indent, IsStatic ? "static " : string.Empty, opt.GetOutputName(RetVal.FullName), AdjustedName, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); GenerateInvokerBody(sw, indent + "\t", opt); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
public void GenerateDeclaration(StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase type, string adapter) { sw.WriteLine("{0}// Metadata.xml XPath method reference: path=\"{1}\"", indent, GetMetadataXPathReference(this.DeclaringType)); if (Deprecated != null) { sw.WriteLine("[Obsolete (@\"{0}\")]", Deprecated.Replace("\"", "\"\"")); } if (IsReturnEnumified) { sw.WriteLine("{0}[return:global::Android.Runtime.GeneratedEnum]", indent); } if (IsInterfaceDefaultMethod) { sw.WriteLine("{0}[global::Java.Interop.JavaInterfaceDefaultMethod]", indent); } sw.WriteLine("{0}[Register (\"{1}\", \"{2}\", \"{3}:{4}\"{5})]", indent, JavaName, JniSignature, ConnectorName, GetAdapterName(opt, adapter), this.AdditionalAttributeString()); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} {2} ({3});", indent, opt.GetOutputName(RetVal.FullName), AdjustedName, GenBase.GetSignature(this, opt)); sw.WriteLine(); }
public void GenerateEventDelegate(StreamWriter sw, string indent, CodeGenerationOptions opt) { sw.WriteLine("{0}public delegate {1} {2}EventHandler ({3});", indent, opt.GetOutputName(RetVal.FullName), Name, GenBase.GetSignature(this, opt)); sw.WriteLine(); }
public void GenerateAbstractDeclaration(StreamWriter sw, string indent, CodeGenerationOptions opt, InterfaceGen gen, GenBase impl) { if (RetVal.IsGeneric && gen != null) { GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} {2}.{3} ({4})", indent, opt.GetOutputName(RetVal.FullName), opt.GetOutputName(gen.FullName), Name, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); sw.WriteLine("{0}\tthrow new NotImplementedException ();", indent); sw.WriteLine("{0}}}", indent); sw.WriteLine(); } else { bool gen_as_formatted = IsReturnCharSequence; string name = AdjustedName; GenerateCallback(sw, indent, opt, impl, null, gen_as_formatted); sw.WriteLine("{0}// Metadata.xml XPath method reference: path=\"{1}\"", indent, GetMetadataXPathReference(this.DeclaringType)); sw.WriteLine("{0}[Register (\"{1}\", \"{2}\", \"{3}\"{4})]", indent, JavaName, JniSignature, ConnectorName, this.AdditionalAttributeString()); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} abstract {2} {3} ({4});", indent, Visibility, opt.GetOutputName(RetVal.FullName), name, GenBase.GetSignature(this, opt)); sw.WriteLine(); if (gen_as_formatted || Parameters.HasCharSequence) { GenerateStringOverload(sw, indent, opt); } } GenerateAsyncWrapper(sw, indent, opt); }
public void GenerateExplicitInterfaceInvoker(StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase iface) { //sw.WriteLine ("\t\t// explicitly implemented invoker method from " + iface.FullName); GenerateIdField(sw, indent, opt); sw.WriteLine("{0}unsafe {1} {2}.{3} ({4})", indent, opt.GetOutputName(RetVal.FullName), opt.GetOutputName(iface.FullName), Name, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); GenerateBody(sw, indent + "\t", opt); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
public void GenerateExplicitInterfaceImplementation(StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase iface) { // sw.WriteLine ("// explicitly implemented method from " + iface.FullName); GenerateCustomAttributes(sw, indent); sw.WriteLine("{0}{1} {2}.{3} ({4})", indent, opt.GetOutputName(RetVal.FullName), opt.GetOutputName(iface.FullName), Name, GenBase.GetSignature(this, opt)); sw.WriteLine("{0}{{", indent); sw.WriteLine("{0}\treturn {1} ({2});", indent, Name, Parameters.GetCall(opt)); sw.WriteLine("{0}}}", indent); sw.WriteLine(); }
void GenerateEventHandlerImplContent(Method m, StreamWriter sw, string indent, CodeGenerationOptions opt, bool needs_sender, string jniClass, List <string> handlers) { string methodSpec = Methods.Count > 1 ? m.AdjustedName : String.Empty; handlers.Add(methodSpec); string args_name = GetArgsName(m); if (m.EventName != string.Empty) { sw.WriteLine("#pragma warning disable 0649"); sw.WriteLine("{0}\tpublic {1} {2}Handler;", indent, GetEventDelegateName(m), methodSpec); sw.WriteLine("#pragma warning restore 0649"); } sw.WriteLine(); sw.WriteLine("{0}\tpublic {1} {2} ({3})", indent, m.RetVal.FullName, m.Name, GenBase.GetSignature(m, opt)); sw.WriteLine("{0}\t{{", indent); if (m.EventName == string.Empty) { // generate nothing } else if (m.IsVoid) { sw.WriteLine("{0}\t\tvar __h = {1}Handler;", indent, methodSpec); sw.WriteLine("{0}\t\tif (__h != null)", indent); sw.WriteLine("{0}\t\t\t__h ({1}, new {2} ({3}));", indent, needs_sender ? "sender" : m.Parameters.SenderName, args_name, m.Parameters.CallDropSender); } else if (m.IsEventHandlerWithHandledProperty) { sw.WriteLine("{0}\t\tvar __h = {1}Handler;", indent, methodSpec); sw.WriteLine("{0}\t\tif (__h == null)", indent); sw.WriteLine("{0}\t\t\treturn {1};", indent, m.RetVal.DefaultValue); var call = m.Parameters.CallDropSender; sw.WriteLine("{0}\t\tvar __e = new {1} (true{2}{3});", indent, args_name, call.Length != 0 ? ", " : "", call); sw.WriteLine("{0}\t\t__h ({1}, __e);", indent, needs_sender ? "sender" : m.Parameters.SenderName); sw.WriteLine("{0}\t\treturn __e.Handled;", indent); } else { sw.WriteLine("{0}\t\tvar __h = {1}Handler;", indent, methodSpec); sw.WriteLine("{0}\t\treturn __h != null ? __h ({1}) : default ({2});", indent, m.Parameters.GetCall(opt), opt.GetOutputName(m.RetVal.FullName)); } sw.WriteLine("{0}\t}}", indent); }
void GenerateEventArgs(Method m, StreamWriter sw, string indent, CodeGenerationOptions opt) { string args_name = GetArgsName(m); if (m.RetVal.IsVoid || m.IsEventHandlerWithHandledProperty) { if (!m.IsSimpleEventHandler || m.IsEventHandlerWithHandledProperty) { sw.WriteLine("{0}// event args for {1}.{2}", indent, this.JavaName, m.JavaName); sw.WriteLine("{0}public partial class {1} : global::System.EventArgs {{", indent, args_name); sw.WriteLine(); var signature = m.Parameters.GetSignatureDropSender(opt); sw.WriteLine("{0}\tpublic {1} ({2}{3}{4})", indent, args_name, m.IsEventHandlerWithHandledProperty ? "bool handled" : "", (m.IsEventHandlerWithHandledProperty && signature.Length != 0) ? ", " : "", signature); sw.WriteLine("{0}\t{{", indent); if (m.IsEventHandlerWithHandledProperty) { sw.WriteLine("{0}\t\tthis.handled = handled;", indent); } foreach (Parameter p in m.Parameters) { if (!p.IsSender) { sw.WriteLine("{0}\t\tthis.{1} = {1};", indent, opt.GetSafeIdentifier(p.Name)); } } sw.WriteLine("{0}\t}}", indent); if (m.IsEventHandlerWithHandledProperty) { sw.WriteLine(); sw.WriteLine("{0}\tbool handled;", indent); sw.WriteLine("{0}\tpublic bool Handled {{", indent); sw.WriteLine("{0}\t\tget {{ return handled; }}", indent); sw.WriteLine("{0}\t\tset {{ handled = value; }}", indent); sw.WriteLine("{0}\t}}", indent); } foreach (Parameter p in m.Parameters) { if (p.IsSender) { continue; } sw.WriteLine(); var safeTypeName = p.Type.StartsWith("params ", StringComparison.Ordinal) ? p.Type.Substring("params ".Length) : p.Type; sw.WriteLine("{0}\t{1} {2};", indent, opt.GetOutputName(safeTypeName), opt.GetSafeIdentifier(p.Name)); // AbsListView.IMultiChoiceModeListener.onItemCheckedStateChanged() hit this strict name check, at parameter "@checked". sw.WriteLine("{0}\tpublic {1} {2} {{", indent, opt.GetOutputName(safeTypeName), p.PropertyName); sw.WriteLine("{0}\t\tget {{ return {1}; }}", indent, opt.GetSafeIdentifier(p.Name)); sw.WriteLine("{0}\t}}", indent); } sw.WriteLine("{0}}}", indent); sw.WriteLine(); } } else { sw.WriteLine("{0}public delegate {1} {2} ({3});", indent, opt.GetOutputName(m.RetVal.FullName), GetEventDelegateName(m), GenBase.GetSignature(m, opt)); sw.WriteLine(); } }