diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-12-12 10:35:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-12 10:35:42 +0100 |
commit | f0ea0fa4bf86c7b641d0ddc3c734a5b7971c90f7 (patch) | |
tree | 57536ced5b4810c2f415a03d0fb91387cd9556c4 /Xamarin.Forms.Build.Tasks | |
parent | 1c796c3a9edfa6a5f16689e5e7ea775c8ef21339 (diff) | |
download | xamarin-forms-f0ea0fa4bf86c7b641d0ddc3c734a5b7971c90f7.tar.gz xamarin-forms-f0ea0fa4bf86c7b641d0ddc3c734a5b7971c90f7.tar.bz2 xamarin-forms-f0ea0fa4bf86c7b641d0ddc3c734a5b7971c90f7.zip |
[XamlC] compile ThicknessTypeConverter (#603)
Diffstat (limited to 'Xamarin.Forms.Build.Tasks')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/CompiledConverters/ThicknessTypeConverter.cs | 51 | ||||
-rw-r--r-- | Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj | 1 |
2 files changed, 52 insertions, 0 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CompiledConverters/ThicknessTypeConverter.cs b/Xamarin.Forms.Build.Tasks/CompiledConverters/ThicknessTypeConverter.cs new file mode 100644 index 00000000..e16a8b01 --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/CompiledConverters/ThicknessTypeConverter.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using Xamarin.Forms.Xaml; + +namespace Xamarin.Forms.Core.XamlC +{ + class ThicknessTypeConverter : ICompiledTypeConverter + { + public IEnumerable<Instruction> ConvertFromString(string value, ModuleDefinition module, BaseNode node) + { + if (!string.IsNullOrEmpty(value)) { + double l, t, r, b; + var thickness = value.Split(','); + switch (thickness.Length) { + case 1: + if (double.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out l)) + return GenerateIL(module, l); + break; + case 2: + if (double.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out l) && + double.TryParse(thickness[1], NumberStyles.Number, CultureInfo.InvariantCulture, out t)) + return GenerateIL(module, l, t); + break; + case 4: + if (double.TryParse(thickness[0], NumberStyles.Number, CultureInfo.InvariantCulture, out l) && + double.TryParse(thickness[1], NumberStyles.Number, CultureInfo.InvariantCulture, out t) && + double.TryParse(thickness[2], NumberStyles.Number, CultureInfo.InvariantCulture, out r) && + double.TryParse(thickness[3], NumberStyles.Number, CultureInfo.InvariantCulture, out b)) + return GenerateIL(module, l, t, r, b); + break; + } + } + throw new XamlParseException($"Cannot convert \"{value}\" into {typeof(Thickness)}", node); + } + + IEnumerable<Instruction> GenerateIL(ModuleDefinition module, params double[] args) + { + foreach (var d in args) + yield return Instruction.Create(OpCodes.Ldc_R8, d); + var thicknessCtor = module.Import(typeof(Thickness)).Resolve().Methods.FirstOrDefault(md => md.IsConstructor && md.Parameters.Count == args.Length); + var thicknessCtorRef = module.Import(thicknessCtor); + yield return Instruction.Create(OpCodes.Newobj, thicknessCtorRef); + } + } + +}
\ 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 9507ea3c..1ccace2b 100644 --- a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj +++ b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj @@ -102,6 +102,7 @@ <Compile Include="XamlTask.cs" /> <Compile Include="CompiledMarkupExtensions\ArrayExtension.cs" /> <Compile Include="CompiledConverters\ConstraintTypeConverter.cs" /> + <Compile Include="CompiledConverters\ThicknessTypeConverter.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Target Name="AfterBuild"> |