Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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();
        }
Exemple #6
0
        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();
        }
Exemple #7
0
        // 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();
        }
Exemple #8
0
 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();
 }
Exemple #9
0
 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();
 }
Exemple #10
0
 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();
 }
Exemple #11
0
        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);
        }
Exemple #12
0
 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();
 }
Exemple #13
0
        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();
        }
Exemple #14
0
        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);
        }
Exemple #15
0
        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();
            }
        }