internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeObjectCreateExpression newParent = (CodeObjectCreateExpression)expression; if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } if (newParent.CreateType == null) { error = new ValidationError(Messages.NullTypeType, 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } Type type = validation.ResolveType(newParent.CreateType); if (type == null) { return(null); } List <CodeExpression> argumentExprs = new List <CodeExpression>(); try { if (!validation.PushParentExpression(newParent)) { return(null); } bool flag = false; for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(type) }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); flag = true; } else { if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } if (flag) { return(null); } } finally { validation.PopParentExpression(); } BindingFlags constructorBindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(type)) { constructorBindingFlags |= BindingFlags.NonPublic; } if (type.IsValueType && (argumentExprs.Count == 0)) { return(new RuleExpressionInfo(type)); } if (type.IsAbstract) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } RuleConstructorExpressionInfo info2 = validation.ResolveConstructor(type, constructorBindingFlags, argumentExprs, out error); if (info2 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } return(info2); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodePropertyReferenceExpression newParent = (CodePropertyReferenceExpression)expression; if (newParent.TargetObject == null) { ValidationError error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, new object[] { newParent.PropertyName }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return(null); } if (!validation.PushParentExpression(newParent)) { return(null); } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); validation.PopParentExpression(); if (info == null) { return(null); } Type expressionType = info.ExpressionType; if (expressionType == null) { return(null); } if (expressionType == typeof(NullLiteral)) { ValidationError error2 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, new object[] { newParent.PropertyName }), 0x546); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return(null); } bool nonPublic = false; BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; if (validation.AllowInternalMembers(expressionType)) { bindingFlags |= BindingFlags.NonPublic; nonPublic = true; } PropertyInfo item = validation.ResolveProperty(expressionType, newParent.PropertyName, bindingFlags); if (item == null) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownProperty, new object[] { newParent.PropertyName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return(null); } if (item.PropertyType == null) { ValidationError error4 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.PropertyName }), 0x194); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return(null); } MethodInfo accessorMethod = isWritten ? item.GetSetMethod(nonPublic) : item.GetGetMethod(nonPublic); if (accessorMethod == null) { string format = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, format, new object[] { newParent.PropertyName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return(null); } if (!validation.ValidateMemberAccess(newParent.TargetObject, expressionType, accessorMethod, newParent.PropertyName, newParent)) { return(null); } object[] customAttributes = item.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack <MemberInfo> stack = new Stack <MemberInfo>(); stack.Push(item); bool flag2 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, item, expressionType, null)) { flag2 = false; } } stack.Pop(); if (!flag2) { return(null); } } return(new RulePropertyExpressionInfo(item, item.PropertyType, false)); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { Type expressionType = null; RuleMethodInvokeExpressionInfo info = null; ValidationError item = null; BindingFlags @public = BindingFlags.Public; CodeMethodInvokeExpression newParent = (CodeMethodInvokeExpression)expression; if (isWritten) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeMethodInvokeExpression).ToString() }), 0x17a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if ((newParent.Method == null) || (newParent.Method.TargetObject == null)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, new object[] { newParent.Method.MethodName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if ((newParent.Method.TypeArguments != null) && (newParent.Method.TypeArguments.Count > 0)) { item = new ValidationError(Messages.GenericMethodsNotSupported, 0x548); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } try { if (!validation.PushParentExpression(newParent)) { return(null); } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, newParent.Method.TargetObject, false); if (info2 == null) { return(null); } expressionType = info2.ExpressionType; if (expressionType == null) { return(null); } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, new object[] { newParent.Method.MethodName }), 0x546); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } List <CodeExpression> argumentExprs = new List <CodeExpression>(); bool flag = false; if (newParent.Parameters != null) { for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), newParent.Method.MethodName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } else { if (expression3 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression3.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression3; validation.AddError(item); flag = true; } if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } } if (expressionType == null) { return(null); } if (flag) { return(null); } if (newParent.Method.TargetObject is CodeTypeReferenceExpression) { @public |= BindingFlags.FlattenHierarchy | BindingFlags.Static; } else { @public |= BindingFlags.Instance; } if (validation.AllowInternalMembers(expressionType)) { @public |= BindingFlags.NonPublic; } info = validation.ResolveMethod(expressionType, newParent.Method.MethodName, @public, argumentExprs, out item); if ((info == null) && newParent.UserData.Contains("QualifiedName")) { string qualifiedName = newParent.UserData["QualifiedName"] as string; Type type2 = validation.ResolveType(qualifiedName); if (type2 != null) { validation.DetermineExtensionMethods(type2.Assembly); info = validation.ResolveMethod(expressionType, newParent.Method.MethodName, @public, argumentExprs, out item); } } if (info == null) { item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } } finally { validation.PopParentExpression(); } MethodInfo methodInfo = info.MethodInfo; if (methodInfo.ReturnType == null) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.Method.MethodName }), 0x194); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (!validation.ValidateMemberAccess(newParent.Method.TargetObject, expressionType, methodInfo, newParent.Method.MethodName, newParent)) { return(null); } object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack <MemberInfo> stack = new Stack <MemberInfo>(); stack.Push(methodInfo); bool flag2 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, methodInfo, expressionType, methodInfo.GetParameters())) { flag2 = false; } } stack.Pop(); if (!flag2) { return(null); } } if (methodInfo is ExtensionMethodInfo) { newParent.UserData["QualifiedName"] = methodInfo.DeclaringType.AssemblyQualifiedName; } return(info); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeBinaryOperatorExpression newParent = (CodeBinaryOperatorExpression)expression; if (!validation.PushParentExpression(newParent)) { return(null); } if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeBinaryOperatorExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } RuleExpressionInfo info = null; RuleExpressionInfo info2 = null; if (newParent.Left == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpLHS, new object[] { newParent.Operator.ToString() }), 0x541); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { if (newParent.Left is CodeTypeReferenceExpression) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { newParent.Left.GetType().FullName }), 0x548); error.UserData["ErrorObject"] = newParent.Left; validation.AddError(error); return(null); } info = RuleExpressionWalker.Validate(validation, newParent.Left, false); } if (newParent.Right == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpRHS, new object[] { newParent.Operator.ToString() }), 0x543); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { if (newParent.Right is CodeTypeReferenceExpression) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { newParent.Right.GetType().FullName }), 0x548); error.UserData["ErrorObject"] = newParent.Right; validation.AddError(error); return(null); } info2 = RuleExpressionWalker.Validate(validation, newParent.Right, false); } validation.PopParentExpression(); RuleBinaryExpressionInfo info3 = null; if ((info != null) && (info2 != null)) { Type expressionType = info.ExpressionType; Type rhs = info2.ExpressionType; switch (newParent.Operator) { case CodeBinaryOperatorType.Add: case CodeBinaryOperatorType.Subtract: case CodeBinaryOperatorType.Multiply: case CodeBinaryOperatorType.Divide: case CodeBinaryOperatorType.Modulus: case CodeBinaryOperatorType.BitwiseOr: case CodeBinaryOperatorType.BitwiseAnd: info3 = ArithmeticLiteral.ResultType(newParent.Operator, expressionType, newParent.Left, rhs, newParent.Right, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(ulong)); } } goto Label_063E; case CodeBinaryOperatorType.IdentityInequality: case CodeBinaryOperatorType.IdentityEquality: info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); goto Label_063E; case CodeBinaryOperatorType.ValueEquality: info3 = Literal.AllowedComparison(expressionType, newParent.Left, rhs, newParent.Right, newParent.Operator, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); } } goto Label_063E; case CodeBinaryOperatorType.BooleanOr: case CodeBinaryOperatorType.BooleanAnd: info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); if (expressionType != typeof(bool)) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeLHS, new object[] { newParent.Operator.ToString(), (expressionType == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(expressionType) }), 0x542); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); info3 = null; } if (rhs != typeof(bool)) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeRHS, new object[] { newParent.Operator.ToString(), (rhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(rhs) }), 0x544); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); info3 = null; } goto Label_063E; case CodeBinaryOperatorType.LessThan: case CodeBinaryOperatorType.LessThanOrEqual: case CodeBinaryOperatorType.GreaterThan: case CodeBinaryOperatorType.GreaterThanOrEqual: info3 = Literal.AllowedComparison(expressionType, newParent.Left, rhs, newParent.Right, newParent.Operator, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); } } goto Label_063E; } error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.BinaryOpNotSupported, new object[] { newParent.Operator.ToString() }), 0x548); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } Label_063E: if (info3 != null) { MethodInfo methodInfo = info3.MethodInfo; if (methodInfo == null) { return(info3); } object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes == null) || (customAttributes.Length <= 0)) { return(info3); } Stack <MemberInfo> stack = new Stack <MemberInfo>(); stack.Push(methodInfo); bool flag = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, methodInfo, methodInfo.DeclaringType, methodInfo.GetParameters())) { flag = false; } } stack.Pop(); if (!flag) { return(null); } } return(info3); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError item = null; RulePropertyExpressionInfo info = null; bool nonPublic = false; Type expressionType = null; CodeIndexerExpression newParent = (CodeIndexerExpression)expression; CodeExpression targetObject = newParent.TargetObject; if (targetObject == null) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (targetObject is CodeTypeReferenceExpression) { item = new ValidationError(Messages.IndexersCannotBeStatic, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if ((newParent.Indices == null) || (newParent.Indices.Count == 0)) { item = new ValidationError(Messages.MissingIndexExpressions, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } try { if (!validation.PushParentExpression(newParent)) { return(null); } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); if (info2 == null) { return(null); } expressionType = info2.ExpressionType; if (expressionType == null) { return(null); } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullIndexerTarget, new object[0]), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } List <CodeExpression> argumentExprs = new List <CodeExpression>(); bool flag2 = false; for (int i = 0; i < newParent.Indices.Count; i++) { CodeExpression expression4 = newParent.Indices[i]; if (expression4 == null) { item = new ValidationError(Messages.NullIndexExpression, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag2 = true; } else { CodeDirectionExpression expression5 = expression4 as CodeDirectionExpression; if ((expression5 != null) && (expression5.Direction != FieldDirection.In)) { item = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, 0x19d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag2 = true; } if (expression4 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression4.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression4; validation.AddError(item); flag2 = true; } if (RuleExpressionWalker.Validate(validation, expression4, false) == null) { flag2 = true; } else { argumentExprs.Add(expression4); } } } if (expressionType == null) { return(null); } if (flag2) { return(null); } BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(expressionType)) { bindingFlags |= BindingFlags.NonPublic; nonPublic = true; } info = validation.ResolveIndexerProperty(expressionType, bindingFlags, argumentExprs, out item); if (info == null) { item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } } finally { validation.PopParentExpression(); } PropertyInfo propertyInfo = info.PropertyInfo; MethodInfo accessorMethod = isWritten ? propertyInfo.GetSetMethod(nonPublic) : propertyInfo.GetGetMethod(nonPublic); if (accessorMethod == null) { string format = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; item = new ValidationError(string.Format(CultureInfo.CurrentCulture, format, new object[] { propertyInfo.Name, RuleDecompiler.DecompileType(expressionType) }), 0x54a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (!validation.ValidateMemberAccess(targetObject, expressionType, accessorMethod, propertyInfo.Name, newParent)) { return(null); } object[] customAttributes = propertyInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack <MemberInfo> stack = new Stack <MemberInfo>(); stack.Push(propertyInfo); bool flag3 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, propertyInfo, expressionType, propertyInfo.GetIndexParameters())) { flag3 = false; } } stack.Pop(); if (!flag3) { return(null); } } return(info); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodeFieldReferenceExpression newParent = (CodeFieldReferenceExpression)expression; if (newParent.TargetObject == null) { ValidationError item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, new object[] { newParent.FieldName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (!validation.PushParentExpression(newParent)) { return(null); } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); validation.PopParentExpression(); if (info == null) { return(null); } Type expressionType = info.ExpressionType; if (expressionType == null) { return(null); } if (expressionType == typeof(NullLiteral)) { ValidationError error2 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, new object[] { newParent.FieldName }), 0x546); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return(null); } BindingFlags @public = BindingFlags.Public; if (newParent.TargetObject is CodeTypeReferenceExpression) { @public |= BindingFlags.FlattenHierarchy | BindingFlags.Static; } else { @public |= BindingFlags.Instance; } if (validation.AllowInternalMembers(expressionType)) { @public |= BindingFlags.NonPublic; } FieldInfo field = expressionType.GetField(newParent.FieldName, @public); if (field == null) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownField, new object[] { newParent.FieldName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return(null); } if (field.FieldType == null) { ValidationError error4 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.FieldName }), 0x194); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return(null); } if (isWritten && field.IsLiteral) { ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.FieldSetNotAllowed, new object[] { newParent.FieldName, RuleDecompiler.DecompileType(expressionType) }), 0x17a); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return(null); } if (!validation.ValidateMemberAccess(newParent.TargetObject, expressionType, field, field.Name, newParent)) { return(null); } validation.IsAuthorized(field.FieldType); return(new RuleFieldExpressionInfo(field)); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodePropertyReferenceExpression newParent = (CodePropertyReferenceExpression) expression; if (newParent.TargetObject == null) { ValidationError error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, new object[] { newParent.PropertyName }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } if (!validation.PushParentExpression(newParent)) { return null; } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); validation.PopParentExpression(); if (info == null) { return null; } Type expressionType = info.ExpressionType; if (expressionType == null) { return null; } if (expressionType == typeof(NullLiteral)) { ValidationError error2 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, new object[] { newParent.PropertyName }), 0x546); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return null; } bool nonPublic = false; BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; if (validation.AllowInternalMembers(expressionType)) { bindingFlags |= BindingFlags.NonPublic; nonPublic = true; } PropertyInfo item = validation.ResolveProperty(expressionType, newParent.PropertyName, bindingFlags); if (item == null) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownProperty, new object[] { newParent.PropertyName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return null; } if (item.PropertyType == null) { ValidationError error4 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.PropertyName }), 0x194); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return null; } MethodInfo accessorMethod = isWritten ? item.GetSetMethod(nonPublic) : item.GetGetMethod(nonPublic); if (accessorMethod == null) { string format = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, format, new object[] { newParent.PropertyName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return null; } if (!validation.ValidateMemberAccess(newParent.TargetObject, expressionType, accessorMethod, newParent.PropertyName, newParent)) { return null; } object[] customAttributes = item.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack<MemberInfo> stack = new Stack<MemberInfo>(); stack.Push(item); bool flag2 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, item, expressionType, null)) { flag2 = false; } } stack.Pop(); if (!flag2) { return null; } } return new RulePropertyExpressionInfo(item, item.PropertyType, false); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; ValidationError error; CodeBinaryOperatorExpression binaryExpr = (CodeBinaryOperatorExpression)expression; // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(binaryExpr)) return null; if (isWritten) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, typeof(CodeBinaryOperatorExpression).ToString()); error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } RuleExpressionInfo lhsExprInfo = null; RuleExpressionInfo rhsExprInfo = null; if (binaryExpr.Left == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpLHS, binaryExpr.Operator.ToString()); error = new ValidationError(message, ErrorNumbers.Error_LeftOperandMissing); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } else { if (binaryExpr.Left is CodeTypeReferenceExpression) { message = string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, binaryExpr.Left.GetType().FullName); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr.Left; validation.AddError(error); return null; } lhsExprInfo = RuleExpressionWalker.Validate(validation, binaryExpr.Left, false); } if (binaryExpr.Right == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpRHS, binaryExpr.Operator.ToString()); error = new ValidationError(message, ErrorNumbers.Error_RightOperandMissing); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } else { if (binaryExpr.Right is CodeTypeReferenceExpression) { message = string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, binaryExpr.Right.GetType().FullName); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr.Right; validation.AddError(error); return null; } rhsExprInfo = RuleExpressionWalker.Validate(validation, binaryExpr.Right, false); } validation.PopParentExpression(); RuleBinaryExpressionInfo resultExprInfo = null; if (lhsExprInfo != null && rhsExprInfo != null) { Type lhsType = lhsExprInfo.ExpressionType; Type rhsType = rhsExprInfo.ExpressionType; switch (binaryExpr.Operator) { case CodeBinaryOperatorType.Add: case CodeBinaryOperatorType.Subtract: case CodeBinaryOperatorType.Multiply: case CodeBinaryOperatorType.Divide: case CodeBinaryOperatorType.Modulus: case CodeBinaryOperatorType.BitwiseAnd: case CodeBinaryOperatorType.BitwiseOr: resultExprInfo = ArithmeticLiteral.ResultType(binaryExpr.Operator, lhsType, binaryExpr.Left, rhsType, binaryExpr.Right, validation, out error); if (resultExprInfo == null) { // check if constants are used with ulongs, as we should do some extra "conversions" if (((lhsType == typeof(ulong)) && (PromotionPossible(rhsType, binaryExpr.Right))) || ((rhsType == typeof(ulong)) && (PromotionPossible(lhsType, binaryExpr.Left)))) { resultExprInfo = new RuleBinaryExpressionInfo(lhsType, rhsType, typeof(ulong)); } else { error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } } break; case CodeBinaryOperatorType.IdentityEquality: case CodeBinaryOperatorType.IdentityInequality: resultExprInfo = new RuleBinaryExpressionInfo(lhsType, rhsType, typeof(bool)); break; case CodeBinaryOperatorType.ValueEquality: resultExprInfo = Literal.AllowedComparison(lhsType, binaryExpr.Left, rhsType, binaryExpr.Right, binaryExpr.Operator, validation, out error); if (resultExprInfo == null) { // check if constants are used with ulongs, as we should do some extra "conversions" if (((lhsType == typeof(ulong)) && (PromotionPossible(rhsType, binaryExpr.Right))) || ((rhsType == typeof(ulong)) && (PromotionPossible(lhsType, binaryExpr.Left)))) { resultExprInfo = new RuleBinaryExpressionInfo(lhsType, rhsType, typeof(bool)); } else { error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } } break; case CodeBinaryOperatorType.LessThan: case CodeBinaryOperatorType.LessThanOrEqual: case CodeBinaryOperatorType.GreaterThan: case CodeBinaryOperatorType.GreaterThanOrEqual: resultExprInfo = Literal.AllowedComparison(lhsType, binaryExpr.Left, rhsType, binaryExpr.Right, binaryExpr.Operator, validation, out error); if (resultExprInfo == null) { // check if constants are used with ulongs, as we should do some extra "conversions" if (((lhsType == typeof(ulong)) && (PromotionPossible(rhsType, binaryExpr.Right))) || ((rhsType == typeof(ulong)) && (PromotionPossible(lhsType, binaryExpr.Left)))) { resultExprInfo = new RuleBinaryExpressionInfo(lhsType, rhsType, typeof(bool)); } else { error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } } break; case CodeBinaryOperatorType.BooleanAnd: case CodeBinaryOperatorType.BooleanOr: resultExprInfo = new RuleBinaryExpressionInfo(lhsType, rhsType, typeof(bool)); if (lhsType != typeof(bool)) { message = string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeLHS, binaryExpr.Operator.ToString(), (lhsType == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(lhsType)); error = new ValidationError(message, ErrorNumbers.Error_LeftOperandInvalidType); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); resultExprInfo = null; } if (rhsType != typeof(bool)) { message = string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeRHS, binaryExpr.Operator.ToString(), (rhsType == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(rhsType)); error = new ValidationError(message, ErrorNumbers.Error_RightOperandInvalidType); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); resultExprInfo = null; } break; default: { message = string.Format(CultureInfo.CurrentCulture, Messages.BinaryOpNotSupported, binaryExpr.Operator.ToString()); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = binaryExpr; validation.Errors.Add(error); } break; } } // Validate any RuleAttributes, if present. if (resultExprInfo != null) { MethodInfo method = resultExprInfo.MethodInfo; if (method != null) { object[] attrs = method.GetCustomAttributes(typeof(RuleAttribute), true); if (attrs != null && attrs.Length > 0) { Stack<MemberInfo> methodStack = new Stack<MemberInfo>(); methodStack.Push(method); bool allAttributesValid = true; foreach (RuleAttribute ruleAttr in attrs) { if (!ruleAttr.Validate(validation, method, method.DeclaringType, method.GetParameters())) allAttributesValid = false; } methodStack.Pop(); if (!allAttributesValid) return null; } } } return resultExprInfo; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; ValidationError error = null; RulePropertyExpressionInfo propExprInfo = null; bool includeNonPublic = false; Type targetType = null; CodeIndexerExpression indexerExpr = (CodeIndexerExpression)expression; CodeExpression targetObject = indexerExpr.TargetObject; if (targetObject == null) { error = new ValidationError(Messages.NullIndexerTarget, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); return null; } if (targetObject is CodeTypeReferenceExpression) { error = new ValidationError(Messages.IndexersCannotBeStatic, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); return null; } if (indexerExpr.Indices == null || indexerExpr.Indices.Count == 0) { error = new ValidationError(Messages.MissingIndexExpressions, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); return null; } try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(indexerExpr)) return null; RuleExpressionInfo targetExprInfo = RuleExpressionWalker.Validate(validation, indexerExpr.TargetObject, false); if (targetExprInfo == null) // error occurred, so simply return return null; targetType = targetExprInfo.ExpressionType; if (targetType == null) return null; // if an error occurred (targetType == null), continue on to validate the arguments if (targetType == typeof(NullLiteral)) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullIndexerTarget); error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); targetType = null; // force exit after validating the arguments } List<CodeExpression> argExprs = new List<CodeExpression>(); bool hasInvalidArgument = false; for (int i = 0; i < indexerExpr.Indices.Count; ++i) { CodeExpression argExpr = indexerExpr.Indices[i]; if (argExpr == null) { error = new ValidationError(Messages.NullIndexExpression, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); hasInvalidArgument = true; } else { CodeDirectionExpression argDirection = argExpr as CodeDirectionExpression; if (argDirection != null && argDirection.Direction != FieldDirection.In) { // No "ref" or "out" arguments are allowed on indexer arguments. error = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, ErrorNumbers.Error_IndexerArgCannotBeRefOrOut); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); hasInvalidArgument = true; } if (argExpr is CodeTypeReferenceExpression) { message = string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, argExpr.GetType().FullName); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = argExpr; validation.AddError(error); hasInvalidArgument = true; } // Validate the argument. RuleExpressionInfo argExprInfo = RuleExpressionWalker.Validate(validation, argExpr, false); if (argExprInfo == null) hasInvalidArgument = true; else argExprs.Add(argExpr); } } // Stop further validation if there was a problem with the target expression. if (targetType == null) return null; // Stop further validation if there was a problem with any of the arguments. if (hasInvalidArgument) return null; BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(targetType)) { bindingFlags |= BindingFlags.NonPublic; includeNonPublic = true; } // Everything okay so far, try to resolve the method. propExprInfo = validation.ResolveIndexerProperty(targetType, bindingFlags, argExprs, out error); if (propExprInfo == null) { error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); return null; } } finally { validation.PopParentExpression(); } PropertyInfo pi = propExprInfo.PropertyInfo; MethodInfo accessorMethod = isWritten ? pi.GetSetMethod(includeNonPublic) : pi.GetGetMethod(includeNonPublic); if (accessorMethod == null) { string baseMessage = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; message = string.Format(CultureInfo.CurrentCulture, baseMessage, pi.Name, RuleDecompiler.DecompileType(targetType)); error = new ValidationError(message, ErrorNumbers.Error_CannotResolveMember); error.UserData[RuleUserDataKeys.ErrorObject] = indexerExpr; validation.Errors.Add(error); return null; } if (!validation.ValidateMemberAccess(targetObject, targetType, accessorMethod, pi.Name, indexerExpr)) return null; // Validate any RuleAttributes, if present. object[] attrs = pi.GetCustomAttributes(typeof(RuleAttribute), true); if (attrs != null && attrs.Length > 0) { Stack<MemberInfo> methodStack = new Stack<MemberInfo>(); methodStack.Push(pi); bool allAttributesValid = true; foreach (RuleAttribute ruleAttr in attrs) { if (!ruleAttr.Validate(validation, pi, targetType, pi.GetIndexParameters())) allAttributesValid = false; } methodStack.Pop(); if (!allAttributesValid) return null; } return propExprInfo; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; CodePropertyReferenceExpression propGetExpr = (CodePropertyReferenceExpression)expression; if (propGetExpr.TargetObject == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, propGetExpr.PropertyName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = propGetExpr; validation.Errors.Add(error); return null; } // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(propGetExpr)) return null; RuleExpressionInfo targetExprInfo = RuleExpressionWalker.Validate(validation, propGetExpr.TargetObject, false); validation.PopParentExpression(); if (targetExprInfo == null) // error occurred, so simply return return null; Type targetType = targetExprInfo.ExpressionType; if (targetType == null) // no type, so must have been an error already return null; if (targetType == typeof(NullLiteral)) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullPropertyTarget, propGetExpr.PropertyName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_BindingTypeMissing); error.UserData[RuleUserDataKeys.ErrorObject] = propGetExpr; validation.Errors.Add(error); return null; } bool includeNonPublic = false; BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy; if (validation.AllowInternalMembers(targetType)) { bindingFlags |= BindingFlags.NonPublic; includeNonPublic = true; } PropertyInfo pi = validation.ResolveProperty(targetType, propGetExpr.PropertyName, bindingFlags); if (pi == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownProperty, propGetExpr.PropertyName, RuleDecompiler.DecompileType(targetType)); ValidationError error = new ValidationError(message, ErrorNumbers.Error_CannotResolveMember); error.UserData[RuleUserDataKeys.ErrorObject] = propGetExpr; validation.Errors.Add(error); return null; } if (pi.PropertyType == null) { // This can only happen with a design-time type. message = string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, propGetExpr.PropertyName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_CouldNotDetermineMemberType); error.UserData[RuleUserDataKeys.ErrorObject] = propGetExpr; validation.Errors.Add(error); return null; } MethodInfo accessorMethod = isWritten ? pi.GetSetMethod(includeNonPublic) : pi.GetGetMethod(includeNonPublic); if (accessorMethod == null) { string baseMessage = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; message = string.Format(CultureInfo.CurrentCulture, baseMessage, propGetExpr.PropertyName, RuleDecompiler.DecompileType(targetType)); ValidationError error = new ValidationError(message, ErrorNumbers.Error_CannotResolveMember); error.UserData[RuleUserDataKeys.ErrorObject] = propGetExpr; validation.Errors.Add(error); return null; } if (!validation.ValidateMemberAccess(propGetExpr.TargetObject, targetType, accessorMethod, propGetExpr.PropertyName, propGetExpr)) return null; // Validate any RuleAttributes, if present. object[] attrs = pi.GetCustomAttributes(typeof(RuleAttribute), true); if (attrs != null && attrs.Length > 0) { Stack<MemberInfo> methodStack = new Stack<MemberInfo>(); methodStack.Push(pi); bool allAttributesValid = true; foreach (RuleAttribute ruleAttr in attrs) { if (!ruleAttr.Validate(validation, pi, targetType, null)) allAttributesValid = false; } methodStack.Pop(); if (!allAttributesValid) return null; } return new RulePropertyExpressionInfo(pi, pi.PropertyType, false); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { Type targetType = null; RuleMethodInvokeExpressionInfo methodInvokeInfo = null; string message; ValidationError error = null; BindingFlags bindingFlags = BindingFlags.Public; CodeMethodInvokeExpression invokeExpr = (CodeMethodInvokeExpression)expression; if (isWritten) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, typeof(CodeMethodInvokeExpression).ToString()); error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); return null; } if ((invokeExpr.Method == null) || (invokeExpr.Method.TargetObject == null)) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, invokeExpr.Method.MethodName); error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); return null; // Fatal error; discontinue validation of this object. } if ((invokeExpr.Method.TypeArguments != null) && (invokeExpr.Method.TypeArguments.Count > 0)) { error = new ValidationError(Messages.GenericMethodsNotSupported, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); return null; } try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(invokeExpr)) return null; RuleExpressionInfo targetExprInfo = RuleExpressionWalker.Validate(validation, invokeExpr.Method.TargetObject, false); if (targetExprInfo == null) // error occurred, so simply return return null; targetType = targetExprInfo.ExpressionType; if (targetType == null) return null; // if an error occurred (targetType == null), continue on to validate the arguments if (targetType == typeof(NullLiteral)) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, invokeExpr.Method.MethodName); error = new ValidationError(message, ErrorNumbers.Error_BindingTypeMissing); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); targetType = null; // force exit after validating the arguments } List<CodeExpression> argExprs = new List<CodeExpression>(); bool hasInvalidArgument = false; if (invokeExpr.Parameters != null) { for (int i = 0; i < invokeExpr.Parameters.Count; ++i) { CodeExpression argExpr = invokeExpr.Parameters[i]; if (argExpr == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullMethodParameter, i.ToString(CultureInfo.CurrentCulture), invokeExpr.Method.MethodName); error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); targetType = null; // force exit after validating the rest of the arguments } else { if (argExpr is CodeTypeReferenceExpression) { message = string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, argExpr.GetType().FullName); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = argExpr; validation.AddError(error); hasInvalidArgument = true; } // Validate the argument. RuleExpressionInfo argExprInfo = RuleExpressionWalker.Validate(validation, argExpr, false); if (argExprInfo == null) hasInvalidArgument = true; argExprs.Add(argExpr); } } } // Stop further validation if there was a problem with the target expression. if (targetType == null) return null; // Stop further validation if there was a problem with any of the arguments. if (hasInvalidArgument) return null; if (invokeExpr.Method.TargetObject is CodeTypeReferenceExpression) bindingFlags |= BindingFlags.Static | BindingFlags.FlattenHierarchy; else bindingFlags |= BindingFlags.Instance; if (validation.AllowInternalMembers(targetType)) bindingFlags |= BindingFlags.NonPublic; // Everything okay so far, try to resolve the method. methodInvokeInfo = validation.ResolveMethod(targetType, invokeExpr.Method.MethodName, bindingFlags, argExprs, out error); if ((methodInvokeInfo == null) && (invokeExpr.UserData.Contains(RuleUserDataKeys.QualifiedName))) { // failed to resolve the method, but a fully qualified type name is around // load the type, add it to the assemblies, and try again string qualifiedName = invokeExpr.UserData[RuleUserDataKeys.QualifiedName] as string; Type containingClassType = validation.ResolveType(qualifiedName); if (containingClassType != null) { validation.DetermineExtensionMethods(containingClassType.Assembly); methodInvokeInfo = validation.ResolveMethod(targetType, invokeExpr.Method.MethodName, bindingFlags, argExprs, out error); } } if (methodInvokeInfo == null) { error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); return null; } } finally { validation.PopParentExpression(); } MethodInfo mi = methodInvokeInfo.MethodInfo; if (mi.ReturnType == null) { // This can only happen with a design-time type. message = string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, invokeExpr.Method.MethodName); error = new ValidationError(message, ErrorNumbers.Error_CouldNotDetermineMemberType); error.UserData[RuleUserDataKeys.ErrorObject] = invokeExpr; validation.Errors.Add(error); return null; } if (!validation.ValidateMemberAccess(invokeExpr.Method.TargetObject, targetType, mi, invokeExpr.Method.MethodName, invokeExpr)) return null; // Validate any RuleAttributes, if present. object[] attrs = mi.GetCustomAttributes(typeof(RuleAttribute), true); if (attrs != null && attrs.Length > 0) { Stack<MemberInfo> methodStack = new Stack<MemberInfo>(); methodStack.Push(mi); bool allAttributesValid = true; foreach (RuleAttribute ruleAttr in attrs) { if (!ruleAttr.Validate(validation, mi, targetType, mi.GetParameters())) allAttributesValid = false; } methodStack.Pop(); if (!allAttributesValid) return null; } // if this is an extension method, save the type information if (mi is ExtensionMethodInfo) { invokeExpr.UserData[RuleUserDataKeys.QualifiedName] = mi.DeclaringType.AssemblyQualifiedName; } return methodInvokeInfo; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { Type expressionType = null; RuleMethodInvokeExpressionInfo info = null; ValidationError item = null; BindingFlags @public = BindingFlags.Public; CodeMethodInvokeExpression newParent = (CodeMethodInvokeExpression) expression; if (isWritten) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeMethodInvokeExpression).ToString() }), 0x17a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if ((newParent.Method == null) || (newParent.Method.TargetObject == null)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, new object[] { newParent.Method.MethodName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if ((newParent.Method.TypeArguments != null) && (newParent.Method.TypeArguments.Count > 0)) { item = new ValidationError(Messages.GenericMethodsNotSupported, 0x548); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } try { if (!validation.PushParentExpression(newParent)) { return null; } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, newParent.Method.TargetObject, false); if (info2 == null) { return null; } expressionType = info2.ExpressionType; if (expressionType == null) { return null; } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodTarget, new object[] { newParent.Method.MethodName }), 0x546); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } List<CodeExpression> argumentExprs = new List<CodeExpression>(); bool flag = false; if (newParent.Parameters != null) { for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullMethodParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), newParent.Method.MethodName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } else { if (expression3 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression3.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression3; validation.AddError(item); flag = true; } if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } } if (expressionType == null) { return null; } if (flag) { return null; } if (newParent.Method.TargetObject is CodeTypeReferenceExpression) { @public |= BindingFlags.FlattenHierarchy | BindingFlags.Static; } else { @public |= BindingFlags.Instance; } if (validation.AllowInternalMembers(expressionType)) { @public |= BindingFlags.NonPublic; } info = validation.ResolveMethod(expressionType, newParent.Method.MethodName, @public, argumentExprs, out item); if ((info == null) && newParent.UserData.Contains("QualifiedName")) { string qualifiedName = newParent.UserData["QualifiedName"] as string; Type type2 = validation.ResolveType(qualifiedName); if (type2 != null) { validation.DetermineExtensionMethods(type2.Assembly); info = validation.ResolveMethod(expressionType, newParent.Method.MethodName, @public, argumentExprs, out item); } } if (info == null) { item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } } finally { validation.PopParentExpression(); } MethodInfo methodInfo = info.MethodInfo; if (methodInfo.ReturnType == null) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.Method.MethodName }), 0x194); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (!validation.ValidateMemberAccess(newParent.Method.TargetObject, expressionType, methodInfo, newParent.Method.MethodName, newParent)) { return null; } object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack<MemberInfo> stack = new Stack<MemberInfo>(); stack.Push(methodInfo); bool flag2 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, methodInfo, expressionType, methodInfo.GetParameters())) { flag2 = false; } } stack.Pop(); if (!flag2) { return null; } } if (methodInfo is ExtensionMethodInfo) { newParent.UserData["QualifiedName"] = methodInfo.DeclaringType.AssemblyQualifiedName; } return info; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError item = null; Type expressionType = null; CodeArrayIndexerExpression newParent = (CodeArrayIndexerExpression) expression; CodeExpression targetObject = newParent.TargetObject; if (targetObject == null) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (targetObject is CodeTypeReferenceExpression) { item = new ValidationError(Messages.IndexersCannotBeStatic, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if ((newParent.Indices == null) || (newParent.Indices.Count == 0)) { item = new ValidationError(Messages.MissingIndexExpressions, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } try { if (!validation.PushParentExpression(newParent)) { return null; } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); if (info == null) { return null; } expressionType = info.ExpressionType; if (expressionType == null) { return null; } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (!expressionType.IsArray) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotIndexType, new object[] { RuleDecompiler.DecompileType(expressionType) }), 0x19b); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } int arrayRank = expressionType.GetArrayRank(); if (newParent.Indices.Count != arrayRank) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadRank, new object[] { arrayRank }), 0x19c); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } bool flag = false; for (int i = 0; i < newParent.Indices.Count; i++) { CodeExpression expression4 = newParent.Indices[i]; if (expression4 == null) { item = new ValidationError(Messages.NullIndexExpression, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag = true; continue; } if (expression4 is CodeDirectionExpression) { item = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, 0x19d); item.UserData["ErrorObject"] = expression4; validation.Errors.Add(item); flag = true; } if (expression4 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression4.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression4; validation.AddError(item); flag = true; } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, expression4, false); if (info2 != null) { Type type = info2.ExpressionType; switch (Type.GetTypeCode(type)) { case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.Int64: { continue; } } item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadType, new object[] { RuleDecompiler.DecompileType(type) }), 0x19e); item.UserData["ErrorObject"] = expression4; validation.Errors.Add(item); flag = true; continue; } flag = true; } if (flag) { return null; } } finally { validation.PopParentExpression(); } return new RuleExpressionInfo(expressionType.GetElementType()); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError item = null; Type expressionType = null; CodeArrayIndexerExpression newParent = (CodeArrayIndexerExpression)expression; CodeExpression targetObject = newParent.TargetObject; if (targetObject == null) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (targetObject is CodeTypeReferenceExpression) { item = new ValidationError(Messages.IndexersCannotBeStatic, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if ((newParent.Indices == null) || (newParent.Indices.Count == 0)) { item = new ValidationError(Messages.MissingIndexExpressions, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } try { if (!validation.PushParentExpression(newParent)) { return(null); } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); if (info == null) { return(null); } expressionType = info.ExpressionType; if (expressionType == null) { return(null); } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (!expressionType.IsArray) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotIndexType, new object[] { RuleDecompiler.DecompileType(expressionType) }), 0x19b); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } int arrayRank = expressionType.GetArrayRank(); if (newParent.Indices.Count != arrayRank) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadRank, new object[] { arrayRank }), 0x19c); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } bool flag = false; for (int i = 0; i < newParent.Indices.Count; i++) { CodeExpression expression4 = newParent.Indices[i]; if (expression4 == null) { item = new ValidationError(Messages.NullIndexExpression, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag = true; continue; } if (expression4 is CodeDirectionExpression) { item = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, 0x19d); item.UserData["ErrorObject"] = expression4; validation.Errors.Add(item); flag = true; } if (expression4 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression4.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression4; validation.AddError(item); flag = true; } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, expression4, false); if (info2 != null) { Type type = info2.ExpressionType; switch (Type.GetTypeCode(type)) { case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.Int64: { continue; } } item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadType, new object[] { RuleDecompiler.DecompileType(type) }), 0x19e); item.UserData["ErrorObject"] = expression4; validation.Errors.Add(item); flag = true; continue; } flag = true; } if (flag) { return(null); } } finally { validation.PopParentExpression(); } return(new RuleExpressionInfo(expressionType.GetElementType())); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodeArrayCreateExpression newParent = (CodeArrayCreateExpression) expression; if (isWritten) { ValidationError item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (newParent.CreateType == null) { ValidationError error2 = new ValidationError(Messages.NullTypeType, 0x53d); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return null; } Type lhsType = validation.ResolveType(newParent.CreateType); if (lhsType == null) { return null; } if (lhsType.IsArray) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayTypeInvalid, new object[] { lhsType.Name }), 0x53d); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return null; } try { if (!validation.PushParentExpression(newParent)) { return null; } if (newParent.Size < 0) { ValidationError error4 = new ValidationError(Messages.ArraySizeInvalid, 0x53d); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return null; } if (newParent.SizeExpression != null) { RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.SizeExpression, false); if (info == null) { return null; } if (((info.ExpressionType != typeof(int)) && (info.ExpressionType != typeof(uint))) && ((info.ExpressionType != typeof(long)) && (info.ExpressionType != typeof(ulong)))) { ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArraySizeTypeInvalid, new object[] { info.ExpressionType.Name }), 0x53d); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return null; } } bool flag = false; for (int i = 0; i < newParent.Initializers.Count; i++) { CodeExpression expression3 = newParent.Initializers[i]; if (expression3 == null) { ValidationError error6 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.MissingInitializer, new object[] { lhsType.Name }), 0x53d); error6.UserData["ErrorObject"] = newParent; validation.Errors.Add(error6); return null; } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, expression3, false); if (info2 == null) { flag = true; } else { ValidationError error7; if (!RuleValidation.StandardImplicitConversion(info2.ExpressionType, lhsType, expression3, out error7)) { if (error7 != null) { error7.UserData["ErrorObject"] = newParent; validation.Errors.Add(error7); } error7 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.InitializerMismatch, new object[] { i, lhsType.Name }), 0x545); error7.UserData["ErrorObject"] = newParent; validation.Errors.Add(error7); return null; } } } if (flag) { return null; } double size = -1.0; if (newParent.SizeExpression != null) { CodePrimitiveExpression sizeExpression = newParent.SizeExpression as CodePrimitiveExpression; if ((sizeExpression != null) && (sizeExpression.Value != null)) { size = (double) Executor.AdjustType(sizeExpression.Value.GetType(), sizeExpression.Value, typeof(double)); } if (newParent.Size > 0) { ValidationError error8 = new ValidationError(Messages.ArraySizeBoth, 0x53d); error8.UserData["ErrorObject"] = newParent; validation.Errors.Add(error8); return null; } } else if (newParent.Size > 0) { size = newParent.Size; } if ((size >= 0.0) && (newParent.Initializers.Count > size)) { ValidationError error9 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.InitializerCountMismatch, new object[] { newParent.Initializers.Count, size }), 0x545); error9.UserData["ErrorObject"] = newParent; validation.Errors.Add(error9); return null; } } finally { validation.PopParentExpression(); } return new RuleExpressionInfo(lhsType.MakeArrayType()); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; ValidationError error = null; Type targetType = null; CodeArrayIndexerExpression arrayIndexerExpr = (CodeArrayIndexerExpression)expression; CodeExpression targetObject = arrayIndexerExpr.TargetObject; if (targetObject == null) { error = new ValidationError(Messages.NullIndexerTarget, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } if (targetObject is CodeTypeReferenceExpression) { error = new ValidationError(Messages.IndexersCannotBeStatic, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } if (arrayIndexerExpr.Indices == null || arrayIndexerExpr.Indices.Count == 0) { error = new ValidationError(Messages.MissingIndexExpressions, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(arrayIndexerExpr)) return null; RuleExpressionInfo targetExprInfo = RuleExpressionWalker.Validate(validation, arrayIndexerExpr.TargetObject, false); if (targetExprInfo == null) // error occurred, so simply return return null; targetType = targetExprInfo.ExpressionType; if (targetType == null) return null; // if an error occurred (targetType == null), continue on to validate the arguments if (targetType == typeof(NullLiteral)) { error = new ValidationError(Messages.NullIndexerTarget, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } // The target type better be an array. if (!targetType.IsArray) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotIndexType, RuleDecompiler.DecompileType(targetType)); error = new ValidationError(message, ErrorNumbers.Error_CannotIndexType); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } int rank = targetType.GetArrayRank(); if (arrayIndexerExpr.Indices.Count != rank) { message = string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadRank, rank); error = new ValidationError(message, ErrorNumbers.Error_ArrayIndexBadRank); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); return null; } bool hasInvalidArgument = false; for (int i = 0; i < arrayIndexerExpr.Indices.Count; ++i) { CodeExpression argExpr = arrayIndexerExpr.Indices[i]; if (argExpr == null) { error = new ValidationError(Messages.NullIndexExpression, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = arrayIndexerExpr; validation.Errors.Add(error); hasInvalidArgument = true; } else { CodeDirectionExpression argDirection = argExpr as CodeDirectionExpression; if (argDirection != null) { // No "ref" or "out" arguments are allowed on indexer arguments. error = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, ErrorNumbers.Error_IndexerArgCannotBeRefOrOut); error.UserData[RuleUserDataKeys.ErrorObject] = argExpr; validation.Errors.Add(error); hasInvalidArgument = true; } if (argExpr is CodeTypeReferenceExpression) { message = string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, argExpr.GetType().FullName); error = new ValidationError(message, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = argExpr; validation.AddError(error); hasInvalidArgument = true; } // Validate the argument. RuleExpressionInfo argExprInfo = RuleExpressionWalker.Validate(validation, argExpr, false); if (argExprInfo != null) { Type argType = argExprInfo.ExpressionType; TypeCode argTypeCode = Type.GetTypeCode(argType); // Any type that is, or can be converted to: int or long. switch (argTypeCode) { case TypeCode.Byte: case TypeCode.Char: case TypeCode.Int16: case TypeCode.Int32: case TypeCode.Int64: case TypeCode.SByte: case TypeCode.UInt16: break; default: message = string.Format(CultureInfo.CurrentCulture, Messages.ArrayIndexBadType, RuleDecompiler.DecompileType(argType)); error = new ValidationError(message, ErrorNumbers.Error_ArrayIndexBadType); error.UserData[RuleUserDataKeys.ErrorObject] = argExpr; validation.Errors.Add(error); hasInvalidArgument = true; break; } } else { hasInvalidArgument = true; } } } // Stop further validation if there was a problem with any of the arguments. if (hasInvalidArgument) return null; } finally { validation.PopParentExpression(); } // The result type is this array's element type. return new RuleExpressionInfo(targetType.GetElementType()); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodeArrayCreateExpression newParent = (CodeArrayCreateExpression)expression; if (isWritten) { ValidationError item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return(null); } if (newParent.CreateType == null) { ValidationError error2 = new ValidationError(Messages.NullTypeType, 0x53d); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return(null); } Type lhsType = validation.ResolveType(newParent.CreateType); if (lhsType == null) { return(null); } if (lhsType.IsArray) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArrayTypeInvalid, new object[] { lhsType.Name }), 0x53d); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return(null); } try { if (!validation.PushParentExpression(newParent)) { return(null); } if (newParent.Size < 0) { ValidationError error4 = new ValidationError(Messages.ArraySizeInvalid, 0x53d); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return(null); } if (newParent.SizeExpression != null) { RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.SizeExpression, false); if (info == null) { return(null); } if (((info.ExpressionType != typeof(int)) && (info.ExpressionType != typeof(uint))) && ((info.ExpressionType != typeof(long)) && (info.ExpressionType != typeof(ulong)))) { ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.ArraySizeTypeInvalid, new object[] { info.ExpressionType.Name }), 0x53d); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return(null); } } bool flag = false; for (int i = 0; i < newParent.Initializers.Count; i++) { CodeExpression expression3 = newParent.Initializers[i]; if (expression3 == null) { ValidationError error6 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.MissingInitializer, new object[] { lhsType.Name }), 0x53d); error6.UserData["ErrorObject"] = newParent; validation.Errors.Add(error6); return(null); } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, expression3, false); if (info2 == null) { flag = true; } else { ValidationError error7; if (!RuleValidation.StandardImplicitConversion(info2.ExpressionType, lhsType, expression3, out error7)) { if (error7 != null) { error7.UserData["ErrorObject"] = newParent; validation.Errors.Add(error7); } error7 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.InitializerMismatch, new object[] { i, lhsType.Name }), 0x545); error7.UserData["ErrorObject"] = newParent; validation.Errors.Add(error7); return(null); } } } if (flag) { return(null); } double size = -1.0; if (newParent.SizeExpression != null) { CodePrimitiveExpression sizeExpression = newParent.SizeExpression as CodePrimitiveExpression; if ((sizeExpression != null) && (sizeExpression.Value != null)) { size = (double)Executor.AdjustType(sizeExpression.Value.GetType(), sizeExpression.Value, typeof(double)); } if (newParent.Size > 0) { ValidationError error8 = new ValidationError(Messages.ArraySizeBoth, 0x53d); error8.UserData["ErrorObject"] = newParent; validation.Errors.Add(error8); return(null); } } else if (newParent.Size > 0) { size = newParent.Size; } if ((size >= 0.0) && (newParent.Initializers.Count > size)) { ValidationError error9 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.InitializerCountMismatch, new object[] { newParent.Initializers.Count, size }), 0x545); error9.UserData["ErrorObject"] = newParent; validation.Errors.Add(error9); return(null); } } finally { validation.PopParentExpression(); } return(new RuleExpressionInfo(lhsType.MakeArrayType())); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; ValidationError error; CodeObjectCreateExpression createExpression = (CodeObjectCreateExpression)expression; if (isWritten) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, typeof(CodeObjectCreateExpression).ToString()); error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } if (createExpression.CreateType == null) { error = new ValidationError(Messages.NullTypeType, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } Type resultType = validation.ResolveType(createExpression.CreateType); if (resultType == null) return null; // look up parameters List<CodeExpression> parameters = new List<CodeExpression>(); try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(createExpression)) return null; bool hasInvalidArgument = false; for (int i = 0; i < createExpression.Parameters.Count; ++i) { CodeExpression parameter = createExpression.Parameters[i]; if (parameter == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); hasInvalidArgument = true; } else { RuleExpressionInfo parameterInfo = RuleExpressionWalker.Validate(validation, parameter, false); if (parameterInfo == null) hasInvalidArgument = true; parameters.Add(parameter); } } // quit if parameters not valid if (hasInvalidArgument) return null; } finally { validation.PopParentExpression(); } // see if we can find the matching constructor BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(resultType)) bindingFlags |= BindingFlags.NonPublic; // creating a value-type object with no parameters can always be done if ((resultType.IsValueType) && (parameters.Count == 0)) return new RuleExpressionInfo(resultType); // error if type is an abstract type if (resultType.IsAbstract) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_MethodNotExists); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } RuleConstructorExpressionInfo constructorInvokeInfo = validation.ResolveConstructor(resultType, bindingFlags, parameters, out error); if (constructorInvokeInfo == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, RuleDecompiler.DecompileType(resultType)); error = new ValidationError(message, ErrorNumbers.Error_MethodNotExists); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } return constructorInvokeInfo; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError item = null; RulePropertyExpressionInfo info = null; bool nonPublic = false; Type expressionType = null; CodeIndexerExpression newParent = (CodeIndexerExpression) expression; CodeExpression targetObject = newParent.TargetObject; if (targetObject == null) { item = new ValidationError(Messages.NullIndexerTarget, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (targetObject is CodeTypeReferenceExpression) { item = new ValidationError(Messages.IndexersCannotBeStatic, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if ((newParent.Indices == null) || (newParent.Indices.Count == 0)) { item = new ValidationError(Messages.MissingIndexExpressions, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } try { if (!validation.PushParentExpression(newParent)) { return null; } RuleExpressionInfo info2 = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); if (info2 == null) { return null; } expressionType = info2.ExpressionType; if (expressionType == null) { return null; } if (expressionType == typeof(NullLiteral)) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullIndexerTarget, new object[0]), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); expressionType = null; } List<CodeExpression> argumentExprs = new List<CodeExpression>(); bool flag2 = false; for (int i = 0; i < newParent.Indices.Count; i++) { CodeExpression expression4 = newParent.Indices[i]; if (expression4 == null) { item = new ValidationError(Messages.NullIndexExpression, 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag2 = true; } else { CodeDirectionExpression expression5 = expression4 as CodeDirectionExpression; if ((expression5 != null) && (expression5.Direction != FieldDirection.In)) { item = new ValidationError(Messages.IndexerArgCannotBeRefOrOut, 0x19d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); flag2 = true; } if (expression4 is CodeTypeReferenceExpression) { item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { expression4.GetType().FullName }), 0x548); item.UserData["ErrorObject"] = expression4; validation.AddError(item); flag2 = true; } if (RuleExpressionWalker.Validate(validation, expression4, false) == null) { flag2 = true; } else { argumentExprs.Add(expression4); } } } if (expressionType == null) { return null; } if (flag2) { return null; } BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(expressionType)) { bindingFlags |= BindingFlags.NonPublic; nonPublic = true; } info = validation.ResolveIndexerProperty(expressionType, bindingFlags, argumentExprs, out item); if (info == null) { item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } } finally { validation.PopParentExpression(); } PropertyInfo propertyInfo = info.PropertyInfo; MethodInfo accessorMethod = isWritten ? propertyInfo.GetSetMethod(nonPublic) : propertyInfo.GetGetMethod(nonPublic); if (accessorMethod == null) { string format = isWritten ? Messages.UnknownPropertySet : Messages.UnknownPropertyGet; item = new ValidationError(string.Format(CultureInfo.CurrentCulture, format, new object[] { propertyInfo.Name, RuleDecompiler.DecompileType(expressionType) }), 0x54a); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (!validation.ValidateMemberAccess(targetObject, expressionType, accessorMethod, propertyInfo.Name, newParent)) { return null; } object[] customAttributes = propertyInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes != null) && (customAttributes.Length > 0)) { Stack<MemberInfo> stack = new Stack<MemberInfo>(); stack.Push(propertyInfo); bool flag3 = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, propertyInfo, expressionType, propertyInfo.GetIndexParameters())) { flag3 = false; } } stack.Pop(); if (!flag3) { return null; } } return info; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; CodeArrayCreateExpression createExpression = (CodeArrayCreateExpression)expression; if (isWritten) { message = string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, typeof(CodeObjectCreateExpression).ToString()); ValidationError error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } if (createExpression.CreateType == null) { ValidationError error = new ValidationError(Messages.NullTypeType, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } Type resultType = validation.ResolveType(createExpression.CreateType); if (resultType == null) return null; // size CodeDom has limited support for arrays (only 1 dimensional, not more) // we limit CodeArrayCreateExpression to a single dimension // (i.e. CodeArrayCreateExpression cannot define int[5,3] or int[5][3], // but it is possible to define int[][3] and then use initializers to // fill it in. But we only support int[] or int[3].) if (resultType.IsArray) { message = string.Format(CultureInfo.CurrentCulture, Messages.ArrayTypeInvalid, resultType.Name); ValidationError error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } try { // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(createExpression)) return null; if (createExpression.Size < 0) { ValidationError error = new ValidationError(Messages.ArraySizeInvalid, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } // look up size (if specified) if (createExpression.SizeExpression != null) { RuleExpressionInfo sizeInfo = RuleExpressionWalker.Validate(validation, createExpression.SizeExpression, false); if (sizeInfo == null) return null; if ((sizeInfo.ExpressionType != typeof(int)) && (sizeInfo.ExpressionType != typeof(uint)) && (sizeInfo.ExpressionType != typeof(long)) && (sizeInfo.ExpressionType != typeof(ulong))) { message = string.Format(CultureInfo.CurrentCulture, Messages.ArraySizeTypeInvalid, sizeInfo.ExpressionType.Name); ValidationError error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } } bool parameterInvalid = false; for (int i = 0; i < createExpression.Initializers.Count; ++i) { CodeExpression init = createExpression.Initializers[i]; if (init == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.MissingInitializer, resultType.Name); ValidationError error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } RuleExpressionInfo parameterInfo = RuleExpressionWalker.Validate(validation, init, false); if (parameterInfo == null) { parameterInvalid = true; } else { // can we convert the result type to the array type? ValidationError error; if (!RuleValidation.StandardImplicitConversion(parameterInfo.ExpressionType, resultType, init, out error)) { // types must match if (error != null) { // we got an error from the conversion, so give it back as well as a new error error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); } message = string.Format(CultureInfo.CurrentCulture, Messages.InitializerMismatch, i, resultType.Name); error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } } } // if any errors get out if (parameterInvalid) return null; // now it gets tricky. CodeArrayCreateExpression constructors allow: // 1) size as int // 2) size as CodeExpression // 3) initializers as params array // However, we allow a size and initializers, so try to verify size >= #initializers // size can be an int, uint, long, or ulong double size = -1; if (createExpression.SizeExpression != null) { CodePrimitiveExpression prim = createExpression.SizeExpression as CodePrimitiveExpression; if ((prim != null) && (prim.Value != null)) size = (double)Executor.AdjustType(prim.Value.GetType(), prim.Value, typeof(double)); if (createExpression.Size > 0) { // both size and SizeExpression specified, complain ValidationError error = new ValidationError(Messages.ArraySizeBoth, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } } else if (createExpression.Size > 0) size = createExpression.Size; if ((size >= 0) && (createExpression.Initializers.Count > size)) { message = string.Format(CultureInfo.CurrentCulture, Messages.InitializerCountMismatch, createExpression.Initializers.Count, size); ValidationError error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible); error.UserData[RuleUserDataKeys.ErrorObject] = createExpression; validation.Errors.Add(error); return null; } } finally { validation.PopParentExpression(); } return new RuleExpressionInfo(resultType.MakeArrayType()); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeBinaryOperatorExpression newParent = (CodeBinaryOperatorExpression) expression; if (!validation.PushParentExpression(newParent)) { return null; } if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeBinaryOperatorExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } RuleExpressionInfo info = null; RuleExpressionInfo info2 = null; if (newParent.Left == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpLHS, new object[] { newParent.Operator.ToString() }), 0x541); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { if (newParent.Left is CodeTypeReferenceExpression) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { newParent.Left.GetType().FullName }), 0x548); error.UserData["ErrorObject"] = newParent.Left; validation.AddError(error); return null; } info = RuleExpressionWalker.Validate(validation, newParent.Left, false); } if (newParent.Right == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullBinaryOpRHS, new object[] { newParent.Operator.ToString() }), 0x543); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { if (newParent.Right is CodeTypeReferenceExpression) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CodeExpressionNotHandled, new object[] { newParent.Right.GetType().FullName }), 0x548); error.UserData["ErrorObject"] = newParent.Right; validation.AddError(error); return null; } info2 = RuleExpressionWalker.Validate(validation, newParent.Right, false); } validation.PopParentExpression(); RuleBinaryExpressionInfo info3 = null; if ((info != null) && (info2 != null)) { Type expressionType = info.ExpressionType; Type rhs = info2.ExpressionType; switch (newParent.Operator) { case CodeBinaryOperatorType.Add: case CodeBinaryOperatorType.Subtract: case CodeBinaryOperatorType.Multiply: case CodeBinaryOperatorType.Divide: case CodeBinaryOperatorType.Modulus: case CodeBinaryOperatorType.BitwiseOr: case CodeBinaryOperatorType.BitwiseAnd: info3 = ArithmeticLiteral.ResultType(newParent.Operator, expressionType, newParent.Left, rhs, newParent.Right, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(ulong)); } } goto Label_063E; case CodeBinaryOperatorType.IdentityInequality: case CodeBinaryOperatorType.IdentityEquality: info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); goto Label_063E; case CodeBinaryOperatorType.ValueEquality: info3 = Literal.AllowedComparison(expressionType, newParent.Left, rhs, newParent.Right, newParent.Operator, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); } } goto Label_063E; case CodeBinaryOperatorType.BooleanOr: case CodeBinaryOperatorType.BooleanAnd: info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); if (expressionType != typeof(bool)) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeLHS, new object[] { newParent.Operator.ToString(), (expressionType == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(expressionType) }), 0x542); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); info3 = null; } if (rhs != typeof(bool)) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.LogicalOpBadTypeRHS, new object[] { newParent.Operator.ToString(), (rhs == typeof(NullLiteral)) ? Messages.NullValue : RuleDecompiler.DecompileType(rhs) }), 0x544); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); info3 = null; } goto Label_063E; case CodeBinaryOperatorType.LessThan: case CodeBinaryOperatorType.LessThanOrEqual: case CodeBinaryOperatorType.GreaterThan: case CodeBinaryOperatorType.GreaterThanOrEqual: info3 = Literal.AllowedComparison(expressionType, newParent.Left, rhs, newParent.Right, newParent.Operator, validation, out error); if (info3 == null) { if ((!(expressionType == typeof(ulong)) || !PromotionPossible(rhs, newParent.Right)) && (!(rhs == typeof(ulong)) || !PromotionPossible(expressionType, newParent.Left))) { error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } else { info3 = new RuleBinaryExpressionInfo(expressionType, rhs, typeof(bool)); } } goto Label_063E; } error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.BinaryOpNotSupported, new object[] { newParent.Operator.ToString() }), 0x548); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); } Label_063E: if (info3 != null) { MethodInfo methodInfo = info3.MethodInfo; if (methodInfo == null) { return info3; } object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuleAttribute), true); if ((customAttributes == null) || (customAttributes.Length <= 0)) { return info3; } Stack<MemberInfo> stack = new Stack<MemberInfo>(); stack.Push(methodInfo); bool flag = true; foreach (RuleAttribute attribute in customAttributes) { if (!attribute.Validate(validation, methodInfo, methodInfo.DeclaringType, methodInfo.GetParameters())) { flag = false; } } stack.Pop(); if (!flag) { return null; } } return info3; }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { string message; CodeFieldReferenceExpression fieldRefExpr = (CodeFieldReferenceExpression)expression; if (fieldRefExpr.TargetObject == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, fieldRefExpr.FieldName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = fieldRefExpr; validation.Errors.Add(error); return null; } // Early exit from this if a cycle is detected. if (!validation.PushParentExpression(fieldRefExpr)) return null; RuleExpressionInfo targetExprInfo = RuleExpressionWalker.Validate(validation, fieldRefExpr.TargetObject, false); validation.PopParentExpression(); if (targetExprInfo == null) // error occurred, so simply return return null; Type targetType = targetExprInfo.ExpressionType; if (targetType == null) // no type, so must have been an error already return null; if (targetType == typeof(NullLiteral)) { message = string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, fieldRefExpr.FieldName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_BindingTypeMissing); error.UserData[RuleUserDataKeys.ErrorObject] = fieldRefExpr; validation.Errors.Add(error); return null; } BindingFlags bindingFlags = BindingFlags.Public; if (fieldRefExpr.TargetObject is CodeTypeReferenceExpression) bindingFlags |= BindingFlags.Static | BindingFlags.FlattenHierarchy; else bindingFlags |= BindingFlags.Instance; if (validation.AllowInternalMembers(targetType)) bindingFlags |= BindingFlags.NonPublic; FieldInfo fi = targetType.GetField(fieldRefExpr.FieldName, bindingFlags); if (fi == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.UnknownField, fieldRefExpr.FieldName, RuleDecompiler.DecompileType(targetType)); ValidationError error = new ValidationError(message, ErrorNumbers.Error_CannotResolveMember); error.UserData[RuleUserDataKeys.ErrorObject] = fieldRefExpr; validation.Errors.Add(error); return null; } if (fi.FieldType == null) { // This can only happen with a design-time type. message = string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, fieldRefExpr.FieldName); ValidationError error = new ValidationError(message, ErrorNumbers.Error_CouldNotDetermineMemberType); error.UserData[RuleUserDataKeys.ErrorObject] = fieldRefExpr; validation.Errors.Add(error); return null; } if (isWritten && fi.IsLiteral) { message = string.Format(CultureInfo.CurrentCulture, Messages.FieldSetNotAllowed, fieldRefExpr.FieldName, RuleDecompiler.DecompileType(targetType)); ValidationError error = new ValidationError(message, ErrorNumbers.Error_InvalidAssignTarget); error.UserData[RuleUserDataKeys.ErrorObject] = fieldRefExpr; validation.Errors.Add(error); return null; } if (!validation.ValidateMemberAccess(fieldRefExpr.TargetObject, targetType, fi, fi.Name, fieldRefExpr)) return null; // Is it possible to set fi by validation.ResolveFieldOrProperty(targetType, fieldExpr.FieldName)? validation.IsAuthorized(fi.FieldType); return new RuleFieldExpressionInfo(fi); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { CodeFieldReferenceExpression newParent = (CodeFieldReferenceExpression) expression; if (newParent.TargetObject == null) { ValidationError item = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, new object[] { newParent.FieldName }), 0x53d); item.UserData["ErrorObject"] = newParent; validation.Errors.Add(item); return null; } if (!validation.PushParentExpression(newParent)) { return null; } RuleExpressionInfo info = RuleExpressionWalker.Validate(validation, newParent.TargetObject, false); validation.PopParentExpression(); if (info == null) { return null; } Type expressionType = info.ExpressionType; if (expressionType == null) { return null; } if (expressionType == typeof(NullLiteral)) { ValidationError error2 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullFieldTarget, new object[] { newParent.FieldName }), 0x546); error2.UserData["ErrorObject"] = newParent; validation.Errors.Add(error2); return null; } BindingFlags @public = BindingFlags.Public; if (newParent.TargetObject is CodeTypeReferenceExpression) { @public |= BindingFlags.FlattenHierarchy | BindingFlags.Static; } else { @public |= BindingFlags.Instance; } if (validation.AllowInternalMembers(expressionType)) { @public |= BindingFlags.NonPublic; } FieldInfo field = expressionType.GetField(newParent.FieldName, @public); if (field == null) { ValidationError error3 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownField, new object[] { newParent.FieldName, RuleDecompiler.DecompileType(expressionType) }), 0x54a); error3.UserData["ErrorObject"] = newParent; validation.Errors.Add(error3); return null; } if (field.FieldType == null) { ValidationError error4 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CouldNotDetermineMemberType, new object[] { newParent.FieldName }), 0x194); error4.UserData["ErrorObject"] = newParent; validation.Errors.Add(error4); return null; } if (isWritten && field.IsLiteral) { ValidationError error5 = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.FieldSetNotAllowed, new object[] { newParent.FieldName, RuleDecompiler.DecompileType(expressionType) }), 0x17a); error5.UserData["ErrorObject"] = newParent; validation.Errors.Add(error5); return null; } if (!validation.ValidateMemberAccess(newParent.TargetObject, expressionType, field, field.Name, newParent)) { return null; } validation.IsAuthorized(field.FieldType); return new RuleFieldExpressionInfo(field); }
internal override RuleExpressionInfo Validate(CodeExpression expression, RuleValidation validation, bool isWritten) { ValidationError error; CodeObjectCreateExpression newParent = (CodeObjectCreateExpression) expression; if (isWritten) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.CannotWriteToExpression, new object[] { typeof(CodeObjectCreateExpression).ToString() }), 0x17a); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } if (newParent.CreateType == null) { error = new ValidationError(Messages.NullTypeType, 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } Type type = validation.ResolveType(newParent.CreateType); if (type == null) { return null; } List<CodeExpression> argumentExprs = new List<CodeExpression>(); try { if (!validation.PushParentExpression(newParent)) { return null; } bool flag = false; for (int i = 0; i < newParent.Parameters.Count; i++) { CodeExpression expression3 = newParent.Parameters[i]; if (expression3 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.NullConstructorParameter, new object[] { i.ToString(CultureInfo.CurrentCulture), RuleDecompiler.DecompileType(type) }), 0x53d); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); flag = true; } else { if (RuleExpressionWalker.Validate(validation, expression3, false) == null) { flag = true; } argumentExprs.Add(expression3); } } if (flag) { return null; } } finally { validation.PopParentExpression(); } BindingFlags constructorBindingFlags = BindingFlags.Public | BindingFlags.Instance; if (validation.AllowInternalMembers(type)) { constructorBindingFlags |= BindingFlags.NonPublic; } if (type.IsValueType && (argumentExprs.Count == 0)) { return new RuleExpressionInfo(type); } if (type.IsAbstract) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } RuleConstructorExpressionInfo info2 = validation.ResolveConstructor(type, constructorBindingFlags, argumentExprs, out error); if (info2 == null) { error = new ValidationError(string.Format(CultureInfo.CurrentCulture, Messages.UnknownConstructor, new object[] { RuleDecompiler.DecompileType(type) }), 0x137); error.UserData["ErrorObject"] = newParent; validation.Errors.Add(error); return null; } return info2; }