예제 #1
0
        public BoundInterfaceMethodDeclaration(Method method, string adapter, CodeGenerationOptions opt)
        {
            this.method = method;
            this.opt    = opt;

            Name          = method.AdjustedName;
            ReturnType    = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal));
            IsDeclaration = true;

            if (method.DeclaringType.IsGeneratable)
            {
                Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\"");
            }
            if (method.Deprecated != null)
            {
                Attributes.Add(new ObsoleteAttr(method.Deprecated.Replace("\"", "\"\"")));
            }
            if (method.IsReturnEnumified)
            {
                Attributes.Add(new GeneratedEnumAttr(true));
            }
            if (method.IsInterfaceDefaultMethod)
            {
                Attributes.Add(new CustomAttr("[global::Java.Interop.JavaInterfaceDefaultMethod]"));
            }

            Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.ConnectorName + ":" + method.GetAdapterName(opt, adapter), additionalProperties: method.AdditionalAttributeString()));

            SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method);
            this.AddMethodParameters(method.Parameters, opt);
        }
예제 #2
0
        public BoundMethodAbstractDeclaration(GenBase gen, Method method, CodeGenerationOptions opt, GenBase impl)
        {
            this.method = method;
            this.opt    = opt;

            if (method.RetVal.IsGeneric && gen != null)
            {
                Name = method.Name;
                ExplicitInterfaceImplementation = opt.GetOutputName(gen.FullName);

                SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method);

                Body.Add("throw new NotImplementedException ();");

                return;
            }

            Name = method.AdjustedName;

            IsAbstract = true;
            IsShadow   = impl.RequiresNew(method.Name, method);
            SetVisibility(method.Visibility);
            ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal));

            NewFirst = true;

            method_callback = new MethodCallback(impl, method, opt, null, method.IsReturnCharSequence);

            if (method.DeclaringType.IsGeneratable)
            {
                Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\"");
            }

            Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.ConnectorName, additionalProperties: method.AdditionalAttributeString()));

            SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method);
            this.AddMethodParameters(method.Parameters, opt);
        }
예제 #3
0
        public BoundMethod(GenBase type, Method method, CodeGenerationOptions opt, bool generateCallbacks)
        {
            JavaMethod = method;

            if (generateCallbacks && method.IsVirtual)
            {
                callback = new MethodCallback(type, method, opt, null, method.IsReturnCharSequence);
            }

            Name = method.AdjustedName;

            IsStatic = method.IsStatic;
            IsSealed = method.IsOverride && method.IsFinal;
            IsUnsafe = true;

            SetVisibility(type is InterfaceGen && !IsStatic ? string.Empty : method.Visibility);

            // TODO: Clean up this logic
            var is_explicit = opt.SupportDefaultInterfaceMethods && type is InterfaceGen && method.OverriddenInterfaceMethod != null;
            var virt_ov     = is_explicit ? string.Empty : method.IsOverride ? (opt.SupportDefaultInterfaceMethods && method.OverriddenInterfaceMethod != null ? " virtual" : " override") : method.IsVirtual ? " virtual" : string.Empty;

            IsVirtual  = virt_ov.Trim() == "virtual";
            IsOverride = virt_ov.Trim() == "override";

            // When using DIM, don't generate "virtual sealed" methods, remove both modifiers instead
            if (opt.SupportDefaultInterfaceMethods && method.OverriddenInterfaceMethod != null && IsVirtual && IsSealed)
            {
                IsVirtual = false;
                IsSealed  = false;
            }

            if (is_explicit)
            {
                ExplicitInterfaceImplementation = GetDeclaringTypeOfExplicitInterfaceMethod(method.OverriddenInterfaceMethod);
            }

            if ((IsVirtual || !IsOverride) && type.RequiresNew(method.AdjustedName, method))
            {
                IsShadow = true;
            }

            // Allow user to override our virtual/override logic
            if (method.ManagedOverride?.ToLowerInvariant() == "virtual")
            {
                IsVirtual  = true;
                IsOverride = false;
            }
            else if (method.ManagedOverride?.ToLowerInvariant() == "override")
            {
                IsVirtual  = false;
                IsOverride = true;
            }

            ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal));

            method.JavadocInfo?.AddJavadocs(Comments);

            if (method.DeclaringType.IsGeneratable)
            {
                Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\"");
            }

            if (method.Deprecated.HasValue())
            {
                Attributes.Add(new ObsoleteAttr(method.Deprecated.Replace("\"", "\"\"")));
            }

            if (method.IsReturnEnumified)
            {
                Attributes.Add(new GeneratedEnumAttr(true));
            }

            SourceWriterExtensions.AddSupportedOSPlatform(Attributes, method, opt);

            Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.IsVirtual ? method.GetConnectorNameFull(opt) : string.Empty, additionalProperties: method.AdditionalAttributeString()));

            SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method);
            this.AddMethodParameters(method.Parameters, opt);

            SourceWriterExtensions.AddMethodBody(Body, method, opt);
        }