From: Stephane Delcroix Date: Wed, 18 Jan 2017 12:04:13 +0000 (+0100) Subject: [XamlC] compile ListStringTypeConverter (#660) X-Git-Tag: accepted/tizen/common/20170324.122620~142 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a003d578219a9c8832bdc6589dda4051ddfa9c3b;p=platform%2Fupstream%2Fxamarin-forms.git [XamlC] compile ListStringTypeConverter (#660) * [XamlC] compile ListStringTypeConverter * remove debug statements --- diff --git a/Xamarin.Forms.Build.Tasks/CompiledConverters/ListStringTypeConverter.cs b/Xamarin.Forms.Build.Tasks/CompiledConverters/ListStringTypeConverter.cs new file mode 100644 index 0000000..62d7d69 --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/CompiledConverters/ListStringTypeConverter.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using Xamarin.Forms.Xaml; +using Xamarin.Forms.Build.Tasks; + +namespace Xamarin.Forms.Core.XamlC +{ + class ListStringTypeConverter : ICompiledTypeConverter + { + public IEnumerable ConvertFromString(string value, ModuleDefinition module, BaseNode node) + { + if (value == null) { + yield return Instruction.Create(OpCodes.Ldnull); + yield break; + } + var parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList(); + + var listCtor = module.Import(typeof(List<>)).Resolve().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == 1 && md.Parameters[0].ParameterType.FullName == "System.Int32"); + var listCtorRef = module.Import(listCtor); + listCtorRef = module.Import(listCtorRef.ResolveGenericParameters(module.Import(typeof(List)), module)); + + var adder = module.Import(typeof(ICollection<>)).Resolve().Methods.FirstOrDefault(md => md.Name == "Add" && md.Parameters.Count == 1); + var adderRef = module.Import(adder); + adderRef = module.Import(adderRef.ResolveGenericParameters(module.Import(typeof(ICollection)), module)); + + yield return Instruction.Create(OpCodes.Ldc_I4, parts.Count); + yield return Instruction.Create(OpCodes.Newobj, listCtorRef); + + foreach (var part in parts) { + yield return Instruction.Create(OpCodes.Dup); + yield return Instruction.Create(OpCodes.Ldstr, part); + yield return Instruction.Create(OpCodes.Callvirt, adderRef); + } + } + } +} \ No newline at end of file diff --git a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj index 6424c93..3a2929e 100644 --- a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj +++ b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj @@ -109,6 +109,7 @@ + diff --git a/Xamarin.Forms.Core/ListStringTypeConverter.cs b/Xamarin.Forms.Core/ListStringTypeConverter.cs index 647f014..69aa53f 100644 --- a/Xamarin.Forms.Core/ListStringTypeConverter.cs +++ b/Xamarin.Forms.Core/ListStringTypeConverter.cs @@ -3,6 +3,7 @@ using System.Linq; namespace Xamarin.Forms { + [Xaml.ProvideCompiled("Xamarin.Forms.Core.XamlC.ListStringTypeConverter")] public class ListStringTypeConverter : TypeConverter { public override object ConvertFromInvariantString(string value) diff --git a/Xamarin.Forms.Xaml.UnitTests/CompiledTypeConverter.xaml b/Xamarin.Forms.Xaml.UnitTests/CompiledTypeConverter.xaml index 296f9ee..7118c5d 100644 --- a/Xamarin.Forms.Xaml.UnitTests/CompiledTypeConverter.xaml +++ b/Xamarin.Forms.Xaml.UnitTests/CompiledTypeConverter.xaml @@ -4,7 +4,8 @@ x:Class="Xamarin.Forms.Xaml.UnitTests.CompiledTypeConverter" RectangleP="0,1,2,4" RectangleBP="4,8,16,32" - BackgroundColor="Pink"> + BackgroundColor="Pink" + List="Foo, Bar">