예제 #1
0
        public InterfaceListenerProperty(InterfaceGen iface, string name, string nameSpec, string methodName, string fullDelegateName, CodeGenerationOptions opt)
        {
            Name         = name;
            PropertyType = new TypeReferenceWriter(opt.GetOutputName(fullDelegateName))
            {
                Nullable = opt.SupportNullableReferenceTypes
            };

            IsPublic = true;

            HasGet = true;

            var handlerPrefix = iface.Methods.Count > 1 ? methodName : string.Empty;

            GetBody.Add($"{opt.GetOutputName (iface.FullName)}Implementor{opt.NullableOperator} impl = Impl{name};");
            GetBody.Add($"return impl == null ? null : impl.{handlerPrefix}Handler;");

            HasSet = true;

            SetBody.Add($"{opt.GetOutputName (iface.FullName)}Implementor{opt.NullableOperator} impl = Impl{name};");
            SetBody.Add($"if (impl == null) {{");
            SetBody.Add($"\timpl = new {opt.GetOutputName (iface.FullName)}Implementor ({(iface.NeedsSender ? "this" : string.Empty)});");
            SetBody.Add($"\tImpl{name} = impl;");
            SetBody.Add($"}} else");
            SetBody.Add($"impl.{nameSpec}Handler = value;");
        }
예제 #2
0
        public void CreatesCorrectPolicy(string content)
        {
            var basePolicy = new SetBody(content);
            var xml        = basePolicy.GetXml().ToString();

            xml.Should().Be($"<set-body>{content}</set-body>");
        }
        public GenericExplicitInterfaceImplementationProperty(Property property, GenericSymbol gen, string adapter, Dictionary <string, string> mappings, CodeGenerationOptions opt)
        {
            Name = property.AdjustedName;

            PropertyType = new TypeReferenceWriter(opt.GetTypeReferenceName(property));
            ExplicitInterfaceImplementation = opt.GetOutputName(gen.Gen.FullName);

            Comments.Add($"// This method is explicitly implemented as a member of an instantiated {gen.FullName}");

            if (property.Getter != null)
            {
                HasGet = true;

                if (gen.Gen.IsGeneratable)
                {
                    GetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.Gen.MetadataXPathReference}/method[@name='{property.Getter.JavaName}'{property.Getter.Parameters.GetMethodXPathPredicate ()}]\"");
                }
                if (property.Getter.GenericArguments != null && property.Getter.GenericArguments.Any())
                {
                    GetterAttributes.Add(new CustomAttr(property.Getter.GenericArguments.ToGeneratedAttributeString()));
                }

                SourceWriterExtensions.AddSupportedOSPlatform(GetterAttributes, property.Getter, opt);

                GetterAttributes.Add(new RegisterAttr(property.Getter.JavaName, property.Getter.JniSignature, property.Getter.ConnectorName + ":" + property.Getter.GetAdapterName(opt, adapter), additionalProperties: property.Getter.AdditionalAttributeString()));

                GetBody.Add($"return {property.Name};");
            }

            if (property.Setter != null)
            {
                HasSet = true;

                if (gen.Gen.IsGeneratable)
                {
                    SetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.Gen.MetadataXPathReference}/method[@name='{property.Setter.JavaName}'{property.Setter.Parameters.GetMethodXPathPredicate ()}]\"");
                }
                if (property.Setter.GenericArguments != null && property.Setter.GenericArguments.Any())
                {
                    SetterAttributes.Add(new CustomAttr(property.Setter.GenericArguments.ToGeneratedAttributeString()));
                }

                SourceWriterExtensions.AddSupportedOSPlatform(SetterAttributes, property.Setter, opt);

                SetterAttributes.Add(new RegisterAttr(property.Setter.JavaName, property.Setter.JniSignature, property.Setter.ConnectorName + ":" + property.Setter.GetAdapterName(opt, adapter), additionalProperties: property.Setter.AdditionalAttributeString()));

                // Temporarily rename the parameter to "value"
                var pname = property.Setter.Parameters [0].Name;
                property.Setter.Parameters [0].Name = "value";
                SetBody.Add($"{property.Name} = {property.Setter.Parameters.GetGenericCall (opt, mappings)};");
                property.Setter.Parameters [0].Name = pname;
            }
        }
예제 #4
0
        public HandledProperty()
        {
            Name         = "Handled";
            PropertyType = TypeReferenceWriter.Bool;

            IsPublic = true;

            HasGet = true;
            GetBody.Add("return handled;");

            HasSet = true;
            SetBody.Add("handled = value;");
        }
예제 #5
0
        public BoundPropertyStringVariant(Property property, CodeGenerationOptions opt)
        {
            var is_array = property.Getter.RetVal.IsArray;

            Name = property.Name;

            PropertyType = new TypeReferenceWriter("string" + (is_array ? "[]" : string.Empty))
            {
                Nullable = opt.SupportNullableReferenceTypes
            };

            SetVisibility((property.Setter ?? property.Getter).Visibility);

            SourceWriterExtensions.AddSupportedOSPlatform(Attributes, property.Getter, opt);

            HasGet = true;

            if (is_array)
            {
                GetBody.Add($"return CharSequence.ArrayToStringArray ({property.AdjustedName});");
            }
            else
            {
                GetBody.Add($"return {property.AdjustedName} == null ? null : {property.AdjustedName}.ToString ();");
            }

            if (property.Setter is null)
            {
                return;
            }

            HasSet = true;

            if (is_array)
            {
                SetBody.Add($"global::Java.Lang.ICharSequence[] jlsa = CharSequence.ArrayFromStringArray (value);");
                SetBody.Add($"{property.AdjustedName} = jlsa;");
                SetBody.Add($"foreach (var jls in jlsa) if (jls != null) jls.Dispose ();");
            }
            else
            {
                SetBody.Add($"var jls = value == null ? null : new global::Java.Lang.String (value);");
                SetBody.Add($"{property.AdjustedName} = jls;");
                SetBody.Add($"if (jls != null) jls.Dispose ();");
            }
        }
        public InterfaceListenerPropertyImplementor(InterfaceGen iface, string name, CodeGenerationOptions opt)
        {
            this.name = name;
            this.opt  = opt;

            Name         = "Impl" + name;
            PropertyType = new TypeReferenceWriter(opt.GetOutputName(iface.FullName) + "Implementor")
            {
                Nullable = opt.SupportNullableReferenceTypes
            };

            HasGet = true;

            GetBody.Add($"if (weak_implementor_{name} == null || !weak_implementor_{name}.IsAlive)");
            GetBody.Add($"\treturn null;");
            GetBody.Add($"return weak_implementor_{name}.Target as {opt.GetOutputName (iface.FullName)}Implementor;");

            HasSet = true;

            SetBody.Add($"weak_implementor_{name} = new WeakReference (value, true);");
        }
예제 #7
0
        public Property InitBody(IEnumerable <string> getBody = null,
                                 IEnumerable <string> setBody = null)
        {
            IsAuto = getBody == null && setBody == null;

            if (getBody != null)
            {
                GetBody.AddRange(getBody);
            }
            if (setBody != null)
            {
                SetBody.AddRange(setBody);
            }

            if (!IsAuto)
            {
                HasGetter = getBody != null;
                HasSetter = setBody != null;
            }

            return(this);
        }
예제 #8
0
        public BoundProperty(GenBase gen, Property property, CodeGenerationOptions opt, bool withCallbacks = true, bool forceOverride = false)
        {
            Name         = property.AdjustedName;
            PropertyType = new TypeReferenceWriter(opt.GetTypeReferenceName(property.Getter.RetVal));

            SetVisibility(gen is InterfaceGen ? string.Empty : property.Getter.IsAbstract && property.Getter.RetVal.IsGeneric ? "protected" : (property.Setter ?? property.Getter).Visibility);

            IsUnsafe = true;
            HasGet   = true;

            var is_virtual = property.Getter.IsVirtual && (property.Setter == null || property.Setter.IsVirtual);

            if (is_virtual && withCallbacks)
            {
                IsVirtual = true;
                IsShadow  = gen.RequiresNew(property);

                if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1)
                {
                    getter_callback = new MethodCallback(gen, property.Getter, opt, property.AdjustedName, false);
                }

                if (property.Setter != null && opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1)
                {
                    setter_callback = new MethodCallback(gen, property.Setter, opt, property.AdjustedName, false);
                }
            }

            if (forceOverride || ShouldForceOverride(property))
            {
                IsVirtual  = false;
                IsOverride = true;
            }

            if ((property.Getter ?? property.Setter).IsStatic)
            {
                IsStatic   = true;
                IsVirtual  = false;
                IsOverride = false;
            }
            else if (gen.BaseSymbol != null)
            {
                // It should be using AdjustedName instead of Name, but ICharSequence ("Formatted") properties are not caught by this...
                var base_prop = gen.BaseSymbol.GetPropertyByName(property.Name, true);

                // If the matching base getter we found is a DIM, we do not override it, it should stay virtual
                if (base_prop != null && !base_prop.Getter.IsInterfaceDefaultMethod)
                {
                    IsVirtual  = false;
                    IsOverride = true;
                }
            }

            // Allow user to override our virtual/override logic
            if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant() == "virtual")
            {
                IsVirtual  = true;
                IsOverride = false;
            }
            else if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant() == "override")
            {
                IsVirtual  = false;
                IsOverride = true;
            }

            // Unlike [Register], [Obsolete] cannot be put on property accessors, so we can apply them only under limited condition...
            if (property.Getter.Deprecated != null && (property.Setter == null || property.Setter.Deprecated != null))
            {
                Attributes.Add(new ObsoleteAttr(property.Getter.Deprecated.Replace("\"", "\"\"").Trim() + (property.Setter != null && property.Setter.Deprecated != property.Getter.Deprecated ? " " + property.Setter.Deprecated.Replace("\"", "\"\"").Trim() : null)));
            }

            SourceWriterExtensions.AddSupportedOSPlatform(Attributes, property.Getter, opt);

            SourceWriterExtensions.AddMethodCustomAttributes(GetterAttributes, property.Getter);

            if (gen.IsGeneratable)
            {
                GetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Getter.JavaName}'{property.Getter.Parameters.GetMethodXPathPredicate ()}]\"");
            }

            if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1)
            {
                GetterAttributes.Add(new RegisterAttr(property.Getter.JavaName, property.Getter.JniSignature, property.Getter.IsVirtual ? property.Getter.GetConnectorNameFull(opt) : string.Empty, additionalProperties: property.Getter.AdditionalAttributeString()));
            }

            SourceWriterExtensions.AddMethodBody(GetBody, property.Getter, opt);

            if (property.Setter != null)
            {
                HasSet = true;

                if (gen.IsGeneratable)
                {
                    SetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Setter.JavaName}'{property.Setter.Parameters.GetMethodXPathPredicate ()}]\"");
                }

                SourceWriterExtensions.AddSupportedOSPlatform(SetterAttributes, property.Setter, opt);

                SourceWriterExtensions.AddMethodCustomAttributes(SetterAttributes, property.Setter);
                if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1)
                {
                    SetterAttributes.Add(new RegisterAttr(property.Setter.JavaName, property.Setter.JniSignature, property.Setter.IsVirtual ? property.Setter.GetConnectorNameFull(opt) : string.Empty, additionalProperties: property.Setter.AdditionalAttributeString()));
                }

                var pname = property.Setter.Parameters [0].Name;
                property.Setter.Parameters [0].Name = "value";
                SourceWriterExtensions.AddMethodBody(SetBody, property.Setter, opt);
                property.Setter.Parameters [0].Name = pname;
            }
            else if (property.GenerateDispatchingSetter)
            {
                HasSet = true;
                SetterComments.Add("// This is a dispatching setter");
                SetBody.Add($"Set{property.Name} (value);");
            }

            AddJavadocs(property);
        }