diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-12-23 10:21:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-23 10:21:30 +0100 |
commit | c34016dc84a30a351d9323285b68ce6cb02af969 (patch) | |
tree | 1c223684896b460d13a0fe84f4d91926f540f922 | |
parent | b96df000db76ba3490589c37e93224271249bc88 (diff) | |
download | xamarin-forms-c34016dc84a30a351d9323285b68ce6cb02af969.tar.gz xamarin-forms-c34016dc84a30a351d9323285b68ce6cb02af969.tar.bz2 xamarin-forms-c34016dc84a30a351d9323285b68ce6cb02af969.zip |
Xamlc compile data triggers (#648)
* [Xaml] DataTrigger and PropertyCondition no longer use a ServiceProvider
* [XamlC] avoid generating ServiceProvider for unused ProvideValue
* fix tests
9 files changed, 74 insertions, 17 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CompiledValueProviders/PassthroughValueProvider.cs b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/PassthroughValueProvider.cs new file mode 100644 index 00000000..b3d59f98 --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/PassthroughValueProvider.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using Xamarin.Forms.Xaml; +using Xamarin.Forms.Build.Tasks; + +namespace Xamarin.Forms.Core.XamlC +{ + class PassthroughValueProvider : ICompiledValueProvider + { + public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefref, ModuleDefinition module, BaseNode node, ILContext context) + { + yield break; + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs index c2875c7c..6a0ca822 100644 --- a/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs +++ b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs @@ -8,7 +8,6 @@ using Xamarin.Forms.Build.Tasks; namespace Xamarin.Forms.Core.XamlC { - class TriggerValueProvider : ICompiledValueProvider { public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefref, ModuleDefinition module, BaseNode node, ILContext context) diff --git a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj index ac7d6f13..21c51688 100644 --- a/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj +++ b/Xamarin.Forms.Build.Tasks/Xamarin.Forms.Build.Tasks.csproj @@ -108,6 +108,7 @@ <Compile Include="CompiledValueProviders\SetterValueProvider.cs" /> <Compile Include="CompiledValueProviders\ICompiledValueProvider.cs" /> <Compile Include="CompiledValueProviders\TriggerValueProvider.cs" /> + <Compile Include="CompiledValueProviders\PassthroughValueProvider.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Target Name="AfterBuild"> diff --git a/Xamarin.Forms.Core.UnitTests/DataTriggerTests.cs b/Xamarin.Forms.Core.UnitTests/DataTriggerTests.cs index 585bebcf..22384298 100644 --- a/Xamarin.Forms.Core.UnitTests/DataTriggerTests.cs +++ b/Xamarin.Forms.Core.UnitTests/DataTriggerTests.cs @@ -6,6 +6,20 @@ namespace Xamarin.Forms.Core.UnitTests [TestFixture] public class DataTriggerTests : BaseTestFixture { + [SetUp] + public override void Setup() + { + Device.PlatformServices = new MockPlatformServices(); + base.Setup(); + } + + [TearDown] + public override void TearDown() + { + base.TearDown(); + Device.PlatformServices = null; + } + class MockElement : VisualElement { } diff --git a/Xamarin.Forms.Core.UnitTests/MultiTriggerTests.cs b/Xamarin.Forms.Core.UnitTests/MultiTriggerTests.cs index df253e76..df515346 100644 --- a/Xamarin.Forms.Core.UnitTests/MultiTriggerTests.cs +++ b/Xamarin.Forms.Core.UnitTests/MultiTriggerTests.cs @@ -5,6 +5,20 @@ namespace Xamarin.Forms.Core.UnitTests [TestFixture] public class MultiTriggerTests : BaseTestFixture { + [SetUp] + public override void Setup() + { + Device.PlatformServices = new MockPlatformServices(); + base.Setup(); + } + + [TearDown] + public override void TearDown() + { + base.TearDown(); + Device.PlatformServices = null; + } + class MockElement : VisualElement { } diff --git a/Xamarin.Forms.Core/Interactivity/BindingCondition.cs b/Xamarin.Forms.Core/Interactivity/BindingCondition.cs index 1d111850..ccf55e58 100644 --- a/Xamarin.Forms.Core/Interactivity/BindingCondition.cs +++ b/Xamarin.Forms.Core/Interactivity/BindingCondition.cs @@ -3,6 +3,7 @@ using Xamarin.Forms.Xaml; namespace Xamarin.Forms { + [ProvideCompiled("Xamarin.Forms.Core.XamlC.PassthroughValueProvider")] public sealed class BindingCondition : Condition, IValueProvider { readonly BindableProperty _boundProperty; @@ -41,15 +42,9 @@ namespace Xamarin.Forms } } - internal IServiceProvider ServiceProvider { get; set; } - - internal IValueConverterProvider ValueConverter { get; set; } - object IValueProvider.ProvideValue(IServiceProvider serviceProvider) { - ValueConverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider; - ServiceProvider = serviceProvider; - + //This is no longer required return this; } @@ -71,14 +66,16 @@ namespace Xamarin.Forms bindable.ClearValue(_boundProperty); } + static IValueConverterProvider s_valueConverter = DependencyService.Get<IValueConverterProvider>(); + bool EqualsToValue(object other) { if ((other == Value) || (other != null && other.Equals(Value))) return true; object converted = null; - if (ValueConverter != null) - converted = ValueConverter.Convert(Value, other != null ? other.GetType() : typeof(object), null, ServiceProvider); + if (s_valueConverter != null) + converted = s_valueConverter.Convert(Value, other != null ? other.GetType() : typeof(object), null, null); else return false; diff --git a/Xamarin.Forms.Core/Interactivity/DataTrigger.cs b/Xamarin.Forms.Core/Interactivity/DataTrigger.cs index e27ec134..d90cf44e 100644 --- a/Xamarin.Forms.Core/Interactivity/DataTrigger.cs +++ b/Xamarin.Forms.Core/Interactivity/DataTrigger.cs @@ -5,6 +5,7 @@ using Xamarin.Forms.Xaml; namespace Xamarin.Forms { [ContentProperty("Setters")] + [ProvideCompiled("Xamarin.Forms.Core.XamlC.PassthroughValueProvider")] public sealed class DataTrigger : TriggerBase, IValueProvider { public DataTrigger([TypeConverter(typeof(TypeTypeConverter))] [Parameter("TargetType")] Type targetType) : base(new BindingCondition(), targetType) @@ -48,9 +49,7 @@ namespace Xamarin.Forms object IValueProvider.ProvideValue(IServiceProvider serviceProvider) { - var valueconverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider; - (Condition as BindingCondition).ValueConverter = valueconverter; - + //This is no longer required return this; } } diff --git a/Xamarin.Forms.Xaml.UnitTests/Issues/Bz28719.xaml.cs b/Xamarin.Forms.Xaml.UnitTests/Issues/Bz28719.xaml.cs index 5cd1f9cb..bd0fe48e 100644 --- a/Xamarin.Forms.Xaml.UnitTests/Issues/Bz28719.xaml.cs +++ b/Xamarin.Forms.Xaml.UnitTests/Issues/Bz28719.xaml.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; +using NUnit.Framework; -using Xamarin.Forms; -using NUnit.Framework; +using Xamarin.Forms.Core.UnitTests; namespace Xamarin.Forms.Xaml.UnitTests { @@ -21,6 +19,18 @@ namespace Xamarin.Forms.Xaml.UnitTests [TestFixture] class Tests { + [SetUp] + public void Setup() + { + Device.PlatformServices = new MockPlatformServices(); + } + + [TearDown] + public void TearDown() + { + Device.PlatformServices = null; + } + [TestCase(true)] [TestCase(false)] public void DataTriggerInTemplates (bool useCompiledXaml) diff --git a/Xamarin.Forms.Xaml/ValueConverterProvider.cs b/Xamarin.Forms.Xaml/ValueConverterProvider.cs index 6758f9af..0f3871b5 100644 --- a/Xamarin.Forms.Xaml/ValueConverterProvider.cs +++ b/Xamarin.Forms.Xaml/ValueConverterProvider.cs @@ -1,6 +1,11 @@ using System; using System.Reflection; +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +[assembly:Dependency(typeof(ValueConverterProvider))] + namespace Xamarin.Forms.Xaml { class ValueConverterProvider : IValueConverterProvider |