diff options
author | Stephane Delcroix <stephane@delcroix.org> | 2016-12-14 13:50:15 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-14 13:50:15 +0100 |
commit | 859b05887415ffdb1453065ee37cf225ca869523 (patch) | |
tree | 81eedba6697457fe124b72004aaf36ae463b18d0 /Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs | |
parent | d4792dc98dfca29849bedc21519d9cf9ae6f2cb6 (diff) | |
download | xamarin-forms-859b05887415ffdb1453065ee37cf225ca869523.tar.gz xamarin-forms-859b05887415ffdb1453065ee37cf225ca869523.tar.bz2 xamarin-forms-859b05887415ffdb1453065ee37cf225ca869523.zip |
Xamlc compiled trigger (#629)
* [XamlC] compiled Trigger
* remove file header
* name bool parameters
Diffstat (limited to 'Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs')
-rw-r--r-- | Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs new file mode 100644 index 00000000..c2875c7c --- /dev/null +++ b/Xamarin.Forms.Build.Tasks/CompiledValueProviders/TriggerValueProvider.cs @@ -0,0 +1,40 @@ +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 TriggerValueProvider : ICompiledValueProvider + { + public IEnumerable<Instruction> ProvideValue(VariableDefinitionReference vardefref, ModuleDefinition module, BaseNode node, ILContext context) + { + var valueNode = ((IElementNode)node).Properties[new XmlName("", "Value")]; + + //if it's an elementNode, there's probably no need to convert it + if (valueNode is IElementNode) + yield break; + + var value = ((string)((ValueNode)valueNode).Value); + var bpNode = ((ValueNode)((IElementNode)node).Properties[new XmlName("", "Property")]); + var bpRef = (new BindablePropertyConverter()).GetBindablePropertyFieldReference((string)bpNode.Value, module, bpNode); + + TypeReference _; + var setValueRef = module.Import(module.Import(typeof(Trigger)).GetProperty(p => p.Name == "Value", out _).SetMethod); + + //push the setter + yield return Instruction.Create(OpCodes.Ldloc, vardefref.VariableDefinition); + + //push the value + foreach (var instruction in ((ValueNode)valueNode).PushConvertedValue(context, bpRef, valueNode.PushServiceProvider(context, bpRef: bpRef), boxValueTypes: true, unboxValueTypes: false)) + yield return instruction; + + //set the value + yield return Instruction.Create(OpCodes.Callvirt, setValueRef); + } + } +}
\ No newline at end of file |