[Xaml] decorate TypeConverter for additional check (#909)
authorStephane Delcroix <stephane@delcroix.org>
Thu, 16 Nov 2017 19:15:43 +0000 (20:15 +0100)
committerGitHub <noreply@github.com>
Thu, 16 Nov 2017 19:15:43 +0000 (20:15 +0100)
52 files changed:
Xamarin.Forms.Build.Tasks/CompiledConverters/BoundsTypeConverter.cs
Xamarin.Forms.Build.Tasks/NodeILExtensions.cs
Xamarin.Forms.Build.Tasks/SetPropertiesVisitor.cs
Xamarin.Forms.Core/BindablePropertyConverter.cs
Xamarin.Forms.Core/BindingTypeConverter.cs
Xamarin.Forms.Core/BoundsTypeConverter.cs
Xamarin.Forms.Core/Button.cs
Xamarin.Forms.Core/ColorTypeConverter.cs
Xamarin.Forms.Core/ConstraintTypeConverter.cs
Xamarin.Forms.Core/FileImageSourceConverter.cs
Xamarin.Forms.Core/FontSizeConverter.cs
Xamarin.Forms.Core/FontTypeConverter.cs
Xamarin.Forms.Core/GridLengthTypeConverter.cs
Xamarin.Forms.Core/ImageSourceConverter.cs
Xamarin.Forms.Core/KeyboardTypeConverter.cs
Xamarin.Forms.Core/LayoutOptionsConverter.cs
Xamarin.Forms.Core/ListStringTypeConverter.cs
Xamarin.Forms.Core/PointTypeConverter.cs
Xamarin.Forms.Core/RectangleTypeConverter.cs
Xamarin.Forms.Core/ThicknessTypeConverter.cs
Xamarin.Forms.Core/TypeConversionAttribute.cs [new file with mode: 0644]
Xamarin.Forms.Core/TypeTypeConverter.cs
Xamarin.Forms.Core/UriTypeConverter.cs
Xamarin.Forms.Core/WebViewSourceTypeConverter.cs
Xamarin.Forms.Core/Xamarin.Forms.Core.csproj
Xamarin.Forms.Pages/JsonSourceConverter.cs
Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml [new file with mode: 0644]
Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml.cs [new file with mode: 0644]
Xamarin.Forms.Xaml.UnitTests/Xamarin.Forms.Xaml.UnitTests.csproj
docs/Xamarin.Forms.Core/Xamarin.Forms.Xaml/TypeConversionAttribute.xml [new file with mode: 0644]
docs/Xamarin.Forms.Core/Xamarin.Forms/BindablePropertyConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/BindingTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/BoundsTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/Button+ButtonContentTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/ColorTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/ConstraintTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/FileImageSourceConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/FontSizeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/FontTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/GridLengthTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/ImageSourceConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/KeyboardTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/LayoutOptionsConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/ListStringTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/PointTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/RectangleTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/ThicknessTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/TypeTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/UriTypeConverter.xml
docs/Xamarin.Forms.Core/Xamarin.Forms/WebViewSourceTypeConverter.xml
docs/Xamarin.Forms.Core/index.xml
docs/Xamarin.Forms.Pages/Xamarin.Forms.Pages/JsonSourceConverter.xml

index 440303e..44ec4f2 100644 (file)
@@ -13,7 +13,7 @@ namespace Xamarin.Forms.Core.XamlC
 {
        class BoundsTypeConverter : ICompiledTypeConverter
        {
-               IEnumerable<Instruction> ICompiledTypeConverter.ConvertFromString(string value, ILContext context, BaseNode node)
+               public IEnumerable<Instruction> ConvertFromString(string value, ILContext context, BaseNode node)
                {
                        var module = context.Body.Method.Module;
 
@@ -73,4 +73,4 @@ namespace Xamarin.Forms.Core.XamlC
                        yield return Instruction.Create(OpCodes.Newobj, rectangleCtorRef);
                }
        }
-}
\ No newline at end of file
+}
index 34e93e4..025a211 100644 (file)
@@ -12,6 +12,49 @@ namespace Xamarin.Forms.Build.Tasks
 {
        static class NodeILExtensions
        {
+               public static bool CanConvertValue(this ValueNode node, ILContext context, TypeReference targetTypeRef, IEnumerable<ICustomAttributeProvider> attributeProviders)
+               {
+                       TypeReference typeConverter = null;
+                       foreach (var attributeProvider in attributeProviders) {
+                               CustomAttribute typeConverterAttribute;
+                               if (
+                                       (typeConverterAttribute =
+                                               attributeProvider.CustomAttributes.FirstOrDefault(
+                                                       cad => TypeConverterAttribute.TypeConvertersType.Contains(cad.AttributeType.FullName))) != null) {
+                                       typeConverter = typeConverterAttribute.ConstructorArguments[0].Value as TypeReference;
+                                       break;
+                               }
+                       }
+
+                       return node.CanConvertValue(context, targetTypeRef, typeConverter);
+               }
+
+               public static bool CanConvertValue(this ValueNode node, ILContext context, FieldReference bpRef)
+               {
+                       var module = context.Body.Method.Module;
+                       var targetTypeRef = bpRef.GetBindablePropertyType(node, module);
+                       var typeConverter = bpRef.GetBindablePropertyTypeConverter(module);
+                       return node.CanConvertValue(context, targetTypeRef, typeConverter);
+               }
+
+               public static bool CanConvertValue(this ValueNode node, ILContext context, TypeReference targetTypeRef, TypeReference typeConverter)
+               {
+                       var str = (string)node.Value;
+                       var module = context.Body.Method.Module;
+
+                       //If there's a [TypeConverter], use it
+                       if (typeConverter != null && str != null) {
+                               var typeConvAttribute = typeConverter.GetCustomAttribute(module.ImportReference(typeof(TypeConversionAttribute)));
+                               if (typeConvAttribute == null) //trust the unattributed TypeConverter
+                                       return true;
+                               var toType = typeConvAttribute.ConstructorArguments.First().Value as TypeReference;
+                               return toType.InheritsFromOrImplements(targetTypeRef);
+                       }
+
+                       ///No reason to return false
+                       return true;
+               }
+
                public static IEnumerable<Instruction> PushConvertedValue(this ValueNode node, ILContext context,
                        TypeReference targetTypeRef, IEnumerable<ICustomAttributeProvider> attributeProviders,
                        IEnumerable<Instruction> pushServiceProvider, bool boxValueTypes, bool unboxValueTypes)
index f2e2119..52484fb 100644 (file)
@@ -931,7 +931,8 @@ namespace Xamarin.Forms.Build.Tasks
                        if (bpRef == null)
                                return false;
 
-                       if (node is ValueNode)
+                       var valueNode = node as ValueNode;
+                       if (valueNode != null && valueNode.CanConvertValue(context, bpRef))
                                return true;
 
                        var elementNode = node as IElementNode;
@@ -1026,11 +1027,13 @@ namespace Xamarin.Forms.Build.Tasks
                        var property = parent.VariableType.GetProperty(pd => pd.Name == localName, out declaringTypeReference);
                        if (property == null)
                                return false;
+                       var propertyType = property.ResolveGenericPropertyType(declaringTypeReference, module);
                        var propertySetter = property.SetMethod;
                        if (propertySetter == null || !propertySetter.IsPublic || propertySetter.IsStatic)
                                return false;
 
-                       if (node is ValueNode)
+                       var valueNode = node as ValueNode;
+                       if (valueNode != null && valueNode.CanConvertValue(context, propertyType, new ICustomAttributeProvider[] { property, propertyType.Resolve()}))
                                return true;
 
                        var elementNode = node as IElementNode;
@@ -1038,7 +1041,6 @@ namespace Xamarin.Forms.Build.Tasks
                                return false;
 
                        var vardef = context.Variables [elementNode];
-                       var propertyType = property.ResolveGenericPropertyType(declaringTypeReference, module);
                        var implicitOperator = vardef.VariableType.GetImplicitOperatorTo(propertyType, module);
 
                        if (implicitOperator != null)
index ee69ef2..9f96647 100644 (file)
@@ -9,6 +9,7 @@ using Xamarin.Forms.Xaml;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.BindablePropertyConverter")]
+       [Xaml.TypeConversion(typeof(BindableProperty))]
        public sealed class BindablePropertyConverter : TypeConverter, IExtendedTypeConverter
        {
                object IExtendedTypeConverter.ConvertFrom(CultureInfo culture, object value, IServiceProvider serviceProvider)
index 2e57ac8..08e84c5 100644 (file)
@@ -1,6 +1,7 @@
 ï»¿namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.BindingTypeConverter")]
+       [Xaml.TypeConversion(typeof(Binding))]
        public sealed class BindingTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 68464f8..f77dcfc 100644 (file)
@@ -4,6 +4,7 @@ using System.Globalization;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled ("Xamarin.Forms.Core.XamlC.BoundsTypeConverter")]
+       [Xaml.TypeConversion(typeof(Rectangle))]
        public sealed class BoundsTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index f2c4fa6..805ae48 100644 (file)
@@ -273,6 +273,7 @@ namespace Xamarin.Forms
                        }
                }
 
+               [Xaml.TypeConversion(typeof(ButtonContentLayout))]
                public sealed class ButtonContentTypeConverter : TypeConverter
                {
                        public override object ConvertFromInvariantString(string value)
index 3e22bdd..21432db 100644 (file)
@@ -6,6 +6,7 @@ using Xamarin.Forms.Internals;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.ColorTypeConverter")]
+       [Xaml.TypeConversion(typeof(Color))]
        public class ColorTypeConverter : TypeConverter
        {
                // Supported inputs
index 04f3519..ed39c86 100644 (file)
@@ -4,6 +4,7 @@ using System.Globalization;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.ConstraintTypeConverter")]
+       [Xaml.TypeConversion(typeof(Constraint))]
        public class ConstraintTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 25a0e22..9fb46d3 100644 (file)
@@ -2,6 +2,7 @@ using System;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(FileImageSource))]
        public sealed class FileImageSourceConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index be4d961..e02b6a9 100644 (file)
@@ -4,6 +4,7 @@ using Xamarin.Forms.Xaml;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(double))]
        public class FontSizeConverter : TypeConverter, IExtendedTypeConverter
        {
                [Obsolete("IExtendedTypeConverter.ConvertFrom is obsolete as of version 2.2.0. Please use ConvertFromInvariantString (string, IServiceProvider) instead.")]
index 464cf4a..3bd86eb 100644 (file)
@@ -5,6 +5,7 @@ using System.Linq;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(Font))]
        public sealed class FontTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 7c58b41..08b99a9 100644 (file)
@@ -3,6 +3,7 @@ using System.Globalization;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(GridLength))]
        public class GridLengthTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 8ca829f..676c187 100644 (file)
@@ -2,6 +2,7 @@ using System;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(ImageSource))]
        public sealed class ImageSourceConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 50074bd..a9e47b9 100644 (file)
@@ -5,6 +5,7 @@ using Xamarin.Forms.Internals;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(Keyboard))]
        public class KeyboardTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 46ef256..66198db 100644 (file)
@@ -6,6 +6,7 @@ using Xamarin.Forms.Internals;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.LayoutOptionsConverter")]
+       [Xaml.TypeConversion(typeof(LayoutOptions))]
        public sealed class LayoutOptionsConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 69aa53f..12aa718 100644 (file)
@@ -1,9 +1,11 @@
 using System;
+using System.Collections.Generic;
 using System.Linq;
 
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.ListStringTypeConverter")]
+       [Xaml.TypeConversion(typeof(List<string>))]
        public class ListStringTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 9b94998..b41263d 100644 (file)
@@ -3,6 +3,7 @@ using System.Globalization;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(Point))]
        public class PointTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index 421c806..36fa2b9 100644 (file)
@@ -4,6 +4,7 @@ using System.Globalization;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.RectangleTypeConverter")]
+       [Xaml.TypeConversion(typeof(Rectangle))]
        public class RectangleTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
index fa60267..8568cb0 100644 (file)
@@ -4,6 +4,7 @@ using System.Globalization;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.ThicknessTypeConverter")]
+       [Xaml.TypeConversion(typeof(Thickness))]
        public class ThicknessTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
diff --git a/Xamarin.Forms.Core/TypeConversionAttribute.cs b/Xamarin.Forms.Core/TypeConversionAttribute.cs
new file mode 100644 (file)
index 0000000..7d29637
--- /dev/null
@@ -0,0 +1,15 @@
+using System;
+
+namespace Xamarin.Forms.Xaml
+{
+       [System.AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
+       public sealed class TypeConversionAttribute : Attribute
+       {
+               public Type TargetType { get; private set; }
+
+               public TypeConversionAttribute(Type targetType)
+               {
+                       TargetType = targetType;
+               }
+       }
+}
\ No newline at end of file
index 01b596b..4f5d156 100644 (file)
@@ -5,6 +5,7 @@ using Xamarin.Forms.Xaml;
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.TypeTypeConverter")]
+       [Xaml.TypeConversion(typeof(Type))]
        public sealed class TypeTypeConverter : TypeConverter, IExtendedTypeConverter
        {
                [Obsolete("IExtendedTypeConverter.ConvertFrom is obsolete as of version 2.2.0. Please use ConvertFromInvariantString (string, IServiceProvider) instead.")]
index fca3570..b47a576 100644 (file)
@@ -3,6 +3,7 @@
 namespace Xamarin.Forms
 {
        [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.UriTypeConverter")]
+       [Xaml.TypeConversion(typeof(Uri))]
        public class UriTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
@@ -22,4 +23,4 @@ namespace Xamarin.Forms
                        return false;
                }
        }
-}
\ No newline at end of file
+}
index 5955eb1..b070f9c 100644 (file)
@@ -2,6 +2,7 @@ using System;
 
 namespace Xamarin.Forms
 {
+       [Xaml.TypeConversion(typeof(UrlWebViewSource))]
        public class WebViewSourceTypeConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
@@ -9,7 +10,7 @@ namespace Xamarin.Forms
                        if (value != null)
                                return new UrlWebViewSource { Url = value };
 
-                       throw new InvalidOperationException(string.Format("Cannot convert \"{0}\" into {1}", value, typeof(Color)));
+                       throw new InvalidOperationException(string.Format("Cannot convert \"{0}\" into {1}", value, typeof(UrlWebViewSource)));
                }
        }
 }
\ No newline at end of file
index 1c9b65c..8fd79a2 100644 (file)
     <Compile Include="TextAlignmentElement.cs" />
     <Compile Include="PaddingElement.cs" />
     <Compile Include="IPaddingElement.cs" />
+    <Compile Include="TypeConversionAttribute.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
   <ItemGroup>
index 461c96d..c8afe00 100644 (file)
@@ -2,6 +2,7 @@ using System;
 
 namespace Xamarin.Forms.Pages
 {
+       [Xaml.TypeConversion(typeof(JsonSource))]
        public class JsonSourceConverter : TypeConverter
        {
                public override object ConvertFromInvariantString(string value)
@@ -12,7 +13,7 @@ namespace Xamarin.Forms.Pages
                                Uri uri;
                                if (Uri.TryCreate(value, UriKind.Absolute, out uri) && uri.Scheme != "file")
                                        return new UriJsonSource { Uri = uri };
-                               if (value.StartsWith("[") || value.StartsWith("{"))
+                               if (value.StartsWith("[", StringComparison.OrdinalIgnoreCase) || value.StartsWith("{", StringComparison.OrdinalIgnoreCase))
                                        return new StringJsonSource { Json = value };
                        }
 
diff --git a/Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml b/Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml
new file mode 100644 (file)
index 0000000..24efe97
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+    x:Class="Xamarin.Forms.Xaml.UnitTests.Bz55862"
+    Foo="2"/>
\ No newline at end of file
diff --git a/Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml.cs b/Xamarin.Forms.Xaml.UnitTests/Issues/Bz55862.xaml.cs
new file mode 100644 (file)
index 0000000..9cd3074
--- /dev/null
@@ -0,0 +1,52 @@
+using System;
+using NUnit.Framework;
+using Xamarin.Forms.Core.UnitTests;
+
+namespace Xamarin.Forms.Xaml.UnitTests
+{
+       [TypeConverter(typeof(ThicknessTypeConverter))]
+       public struct Bz55862Bar
+       {
+       }
+
+       [XamlCompilation(XamlCompilationOptions.Skip)]
+       public partial class Bz55862 : ContentPage
+       {
+               public Bz55862Bar Foo { get; set; }
+               public Bz55862()
+               {
+                       InitializeComponent();
+               }
+
+               public Bz55862(bool useCompiledXaml)
+               {
+                       //this stub will be replaced at compile time
+               }
+
+               [TestFixture]
+               class Tests
+               {
+                       [SetUp]
+                       public void Setup()
+                       {
+                               Device.PlatformServices = new MockPlatformServices();
+                       }
+
+                       [TearDown]
+                       public void TearDown()
+                       {
+                               Device.PlatformServices = null;
+                       }
+
+                       [TestCase(true)]
+                       [TestCase(false)]
+                       public void BindingContextWithConverter(bool useCompiledXaml)
+                       {
+                               if (useCompiledXaml)
+                                       Assert.That(() => MockCompiler.Compile(typeof(Bz55862)), Throws.Exception.TypeOf<XamlParseException>());
+                               else
+                                       Assert.That(() => new Bz55862(useCompiledXaml), Throws.Exception.TypeOf<XamlParseException>()); 
+                       }
+               }
+       }
+}
index 1a3e534..62d094d 100644 (file)
     <Compile Include="Issues\Bz60203.xaml.cs">
       <DependentUpon>Bz60203.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Issues\Bz55862.xaml.cs">
+      <DependentUpon>Bz55862.xaml</DependentUpon>
+    </Compile>
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="..\.nuspec\Xamarin.Forms.Debug.targets" />
     <EmbeddedResource Include="Issues\Bz60203.xaml">
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
+    <EmbeddedResource Include="Issues\Bz55862.xaml">
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
     <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
diff --git a/docs/Xamarin.Forms.Core/Xamarin.Forms.Xaml/TypeConversionAttribute.xml b/docs/Xamarin.Forms.Core/Xamarin.Forms.Xaml/TypeConversionAttribute.xml
new file mode 100644 (file)
index 0000000..e2f6f00
--- /dev/null
@@ -0,0 +1,55 @@
+<Type Name="TypeConversionAttribute" FullName="Xamarin.Forms.Xaml.TypeConversionAttribute">
+  <TypeSignature Language="C#" Value="public sealed class TypeConversionAttribute : Attribute" />
+  <TypeSignature Language="ILAsm" Value=".class public auto ansi sealed beforefieldinit TypeConversionAttribute extends System.Attribute" />
+  <AssemblyInfo>
+    <AssemblyName>Xamarin.Forms.Core</AssemblyName>
+    <AssemblyVersion>2.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <Base>
+    <BaseTypeName>System.Attribute</BaseTypeName>
+  </Base>
+  <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>System.AttributeUsage(System.AttributeTargets.Class, AllowMultiple=false, Inherited=true)</AttributeName>
+    </Attribute>
+  </Attributes>
+  <Docs>
+    <summary>To be added.</summary>
+    <remarks>To be added.</remarks>
+  </Docs>
+  <Members>
+    <Member MemberName=".ctor">
+      <MemberSignature Language="C#" Value="public TypeConversionAttribute (Type targetType);" />
+      <MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor(class System.Type targetType) cil managed" />
+      <MemberType>Constructor</MemberType>
+      <AssemblyInfo>
+        <AssemblyVersion>2.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <Parameters>
+        <Parameter Name="targetType" Type="System.Type" />
+      </Parameters>
+      <Docs>
+        <param name="targetType">To be added.</param>
+        <summary>To be added.</summary>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+    <Member MemberName="TargetType">
+      <MemberSignature Language="C#" Value="public Type TargetType { get; }" />
+      <MemberSignature Language="ILAsm" Value=".property instance class System.Type TargetType" />
+      <MemberType>Property</MemberType>
+      <AssemblyInfo>
+        <AssemblyVersion>2.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <ReturnValue>
+        <ReturnType>System.Type</ReturnType>
+      </ReturnValue>
+      <Docs>
+        <summary>To be added.</summary>
+        <value>To be added.</value>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+  </Members>
+</Type>
index 0c4a3a5..f7b7b65 100644 (file)
       <InterfaceName>Xamarin.Forms.IExtendedTypeConverter</InterfaceName>
     </Interface>
   </Interfaces>
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.BindableProperty))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> for bindable properties.</summary>
     <remarks>To be added.</remarks>
index 59e907d..2340527 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Binding))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Type converter that converts from strings to <see cref="T:Xamarin.Forms.Binding" /> objects.</summary>
     <remarks>To be added.</remarks>
index 5e86c71..96b189e 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Rectangle))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts strings into <see cref="T:Xamarin.Forms.Rectangle" />s for use with <see cref="T:Xamarin.Forms.AbsoluteLayout" />s.</summary>
     <remarks>To be added.</remarks>
index 21d8e5c..1dcfe47 100644 (file)
@@ -9,6 +9,11 @@
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Button/ButtonContentLayout))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Class that the XAML parser uses to convert strings to <see cref="T:Xamarin.Forms.Button+ButtonContentLayout" /> objects.</summary>
     <remarks>To be added.</remarks>
index 2794aa0..75bcd74 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Color))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from strings to a <see cref="T:Xamarin.Forms.Color" />.</summary>
     <remarks>
index 03aa77f..3b5a98a 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Constraint))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from strings to a <see cref="T:Xamarin.Forms.Constraint" />.</summary>
     <remarks>To be added.</remarks>
index c8ceaf3..618e984 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.FileImageSource))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts to <see cref="P:Xamarin.Forms.FileImageSource" />.</summary>
     <remarks>To be added.</remarks>
index 7a4f4c9..aa9bf58 100644 (file)
       <InterfaceName>Xamarin.Forms.IExtendedTypeConverter</InterfaceName>
     </Interface>
   </Interfaces>
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(System.Double))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Converts a string into a font size.</summary>
     <remarks>To be added.</remarks>
index e263d5c..c203403 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Font))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from strings to <see cref="T:Xamarin.Forms.Core.Font" />.</summary>
     <remarks>String should be formatted as "[name],[attributes],[size]" there may be multiple attributes, e.g. "Georgia, Bold, Italic, 42"</remarks>
index 3de1991..ae3b0f1 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.GridLength))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from strings to <see cref="T:Xamarin.Forms.GridLength" />s.</summary>
     <remarks>
index d449be9..19366cd 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.ImageSource))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Class that takes a string representation of an image file location and returns a <see cref="T:Xamarin.Forms.ImageSource" /> from the specified resource.</summary>
     <remarks>To be added.</remarks>
index 3349d71..0f5514f 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Keyboard))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts a string into a <see cref="T:Xamarin.Forms.Keyboard" />.</summary>
     <remarks>
index 0051b1f..0dc9a85 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.LayoutOptions))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Class that takes a string representation of a <see cref="T:Xamarin.Forms.LayoutOptions" /> and returns a corresponding <see cref="T:Xamarin.Forms.LayoutOptions" />.</summary>
     <remarks>To be added.</remarks>
index 3ef4a11..6cf02fa 100644 (file)
@@ -9,6 +9,11 @@
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(System.Collections.Generic.List`1&lt;System.String&gt;))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Type converter for converting properly formatted string lists to lists.</summary>
     <remarks>To be added.</remarks>
index d291c32..216132f 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Point))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from a string to a <see cref="T:Xamarin.Forms.Point" />.</summary>
     <remarks>To be added.</remarks>
index d008550..85be9e0 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Rectangle))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts a string to a <see cref="T:Xamarin.Forms.Rectangle" />.</summary>
     <remarks>To be added.</remarks>
index ecd1219..da20fe9 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Thickness))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from a string to a <see cref="T:Xamarin.Forms.Thickness" />.</summary>
     <remarks>To be added.</remarks>
index aba9c54..102e321 100644 (file)
       <InterfaceName>Xamarin.Forms.IExtendedTypeConverter</InterfaceName>
     </Interface>
   </Interfaces>
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(System.Type))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Class that takes a string representation of a <see cref="T:System.Type" /> and returns a corresponding <see cref="T:System.Type" />.</summary>
     <remarks>To be added.</remarks>
index 8ff0bae..8ec49c1 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(System.Uri))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts from a string or <see cref="T:System.Uri" /> to a <see cref="T:System.Uri" />.</summary>
     <remarks>To be added.</remarks>
index 355659f..0caa27a 100644 (file)
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.UrlWebViewSource))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>A <see cref="T:Xamarin.Forms.TypeConverter" /> that converts a string to a <see cref="T:Xamarin.Forms.UrlWebViewSource" />.</summary>
     <remarks>To be added.</remarks>
index a262a57..be386d9 100644 (file)
       <Type Name="IValueProvider" Kind="Interface" />
       <Type Name="IXamlTypeResolver" Kind="Interface" />
       <Type Name="IXmlLineInfoProvider" Kind="Interface" />
+      <Type Name="TypeConversionAttribute" Kind="Class" />
       <Type Name="XamlParseException" Kind="Class" />
       <Type Name="XamlResourceIdAttribute" Kind="Class" />
       <Type Name="XmlLineInfo" Kind="Class" />
index 0d5ecdb..8189047 100644 (file)
@@ -9,6 +9,11 @@
     <BaseTypeName>Xamarin.Forms.TypeConverter</BaseTypeName>
   </Base>
   <Interfaces />
+  <Attributes>
+    <Attribute>
+      <AttributeName>Xamarin.Forms.Xaml.TypeConversion(typeof(Xamarin.Forms.Pages.JsonSource))</AttributeName>
+    </Attribute>
+  </Attributes>
   <Docs>
     <summary>Converter that returns a <see cref="T:Xamarin.Forms.Pages.JsonSource" /> for a JSON string or a URI string.</summary>
     <remarks>To be added.</remarks>