示例#1
0
 protected virtual Expression GetExpression(ResolvedPropertySetter a, out ResolvedBinding binding)
 {
     binding = null;
     if (a is ResolvedPropertyValue)
     {
         return(Expression.Constant(a.CastTo <ResolvedPropertyValue>().Value));
     }
     else if (a is ResolvedPropertyBinding)
     {
         binding = a.CastTo <ResolvedPropertyBinding>().Binding;
         return(binding.GetExpression());
     }
     else
     {
         return(null);
     }
 }
 public PropertyInsertionInfo(ResolvedPropertySetter value, bool append)
 {
     this.Value  = value;
     this.Append = append;
 }
示例#3
0
 public PropertyInsertionInfo(ResolvedPropertySetter value, StyleOverrideOptions type)
 {
     this.value = value;
     this.Type  = type;
 }
示例#4
0
 public StyleBuilder <T> SetDotvvmProperty(ResolvedPropertySetter setter, StyleOverrideOptions options = StyleOverrideOptions.Overwrite)
 {
     style.SetProperties[setter.Property] = new CompileTimeStyleBase.PropertyInsertionInfo(setter, options);
     return(this);
 }
示例#5
0
        public virtual ResolvedPropertySetter MergeValues(ResolvedPropertySetter a, ResolvedPropertySetter b, out string error)
        {
            var property = a.Property;

            error = null;
            ResolvedBinding bindingA;
            Expression      valA = GetExpression(a, out bindingA);
            ResolvedBinding bindingB;
            Expression      valB = GetExpression(b, out bindingB);

            if (valA == null)
            {
                error = $"Could not merge with property type '{a.GetType().Name}"; return(null);
            }
            if (valB == null)
            {
                error = $"Could not merge with property type '{b.GetType().Name}"; return(null);
            }

            if (bindingA != null && !typeof(IStaticValueBinding).IsAssignableFrom(bindingA.BindingType) ||
                bindingB != null && !typeof(IStaticValueBinding).IsAssignableFrom(bindingB.BindingType))
            {
                error = $"Can not merge values of non-value bindings."; return(null);
            }

            if (bindingA != null && bindingB != null)
            {
                if (bindingA.BindingType != bindingB.BindingType)
                {
                    error = $"Can not merge values of different binding types"; return(null);
                }
            }

            var resultExpression = TryOptimizeMethodCall(TryFindMethod(GetType(), MergeExpressionsMethodName, Expression.Constant(property), Expression.Constant(valA), Expression.Constant(valB))) as Expression;

            // Try to find MegeValues method if MergeExpression does not exists, or try to eval it to constant if expression is not constant
            if (resultExpression == null || valA.NodeType == ExpressionType.Constant && valB.NodeType == ExpressionType.Constant && resultExpression.NodeType != ExpressionType.Constant)
            {
                var methodCall = TryFindMergeMethod(property, valA, valB);
                if (methodCall == null)
                {
                    error = $"Could not find merge method for '{valA}' and '{valB}'."; return(null);
                }

                var optimizedCall = TryOptimizeMethodCall(methodCall);
                if (optimizedCall != null)
                {
                    resultExpression = Expression.Constant(optimizedCall);
                }
                else if (resultExpression == null)
                {
                    resultExpression = methodCall;
                }
            }

            if (resultExpression.NodeType == ExpressionType.Constant)
            {
                return(EmitConstant(resultExpression.CastTo <ConstantExpression>().Value, property, ref error));
            }
            else
            {
                return(EmitBinding(resultExpression, property, bindingA ?? bindingB, ref error));
            }
        }
示例#6
0
 public static Type GetResultType(this ResolvedPropertySetter property) =>
 property is ResolvedPropertyBinding binding?ResolvedTypeDescriptor.ToSystemType(binding.Binding.ResultType) :
示例#7
0
 public StyleBuilder <T> SetDotvvmProperty(ResolvedPropertySetter setter, bool append = true)
 {
     style.SetProperties[setter.Property] = new CompileTimeStyleBase.PropertyInsertionInfo(setter, append);
     return(this);
 }