Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Activities / Rules / Statements.cs / 1305376 / Statements.cs
using System; using System.Collections.Generic; using System.Text; using System.CodeDom; using System.Reflection; using System.Globalization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Compiler; using System.Workflow.Activities.Common; namespace System.Workflow.Activities.Rules { internal abstract class RuleCodeDomStatement { internal abstract bool Validate(RuleValidation validation); internal abstract void Execute(RuleExecution execution); internal abstract void AnalyzeUsage(RuleAnalysis analysis); internal abstract void Decompile(StringBuilder decompilation); internal abstract bool Match(CodeStatement expression); internal abstract CodeStatement Clone(); } internal class ExpressionStatement : RuleCodeDomStatement { private CodeExpressionStatement exprStatement; private ExpressionStatement(CodeExpressionStatement exprStatement) { this.exprStatement = exprStatement; } internal static RuleCodeDomStatement Create(CodeStatement statement) { return new ExpressionStatement((CodeExpressionStatement)statement); } internal override bool Validate(RuleValidation validation) { bool success = false; if (exprStatement.Expression == null) { ValidationError error = new ValidationError(Messages.NullInvokeStatementExpression, ErrorNumbers.Error_ParameterNotSet); error.UserData[RuleUserDataKeys.ErrorObject] = exprStatement; validation.Errors.Add(error); } else if (exprStatement.Expression is CodeMethodInvokeExpression) { RuleExpressionInfo exprInfo = RuleExpressionWalker.Validate(validation, exprStatement.Expression, false); success = (exprInfo != null); } else { ValidationError error = new ValidationError(Messages.InvokeNotHandled, ErrorNumbers.Error_CodeExpressionNotHandled); error.UserData[RuleUserDataKeys.ErrorObject] = exprStatement; validation.Errors.Add(error); } return success; } internal override void AnalyzeUsage(RuleAnalysis analysis) { RuleExpressionWalker.AnalyzeUsage(analysis, exprStatement.Expression, false, false, null); } internal override void Execute(RuleExecution execution) { RuleExpressionWalker.Evaluate(execution, exprStatement.Expression); } internal override void Decompile(StringBuilder decompilation) { if (exprStatement.Expression == null) { RuleEvaluationException exception = new RuleEvaluationException(Messages.InvokeStatementNull); exception.Data[RuleUserDataKeys.ErrorObject] = exprStatement; throw exception; } RuleExpressionWalker.Decompile(decompilation, exprStatement.Expression, null); } internal override bool Match(CodeStatement comperand) { CodeExpressionStatement comperandStatement = comperand as CodeExpressionStatement; return ((comperandStatement != null) && RuleExpressionWalker.Match(exprStatement.Expression, comperandStatement.Expression)); } internal override CodeStatement Clone() { CodeExpressionStatement newStatement = new CodeExpressionStatement(); newStatement.Expression = RuleExpressionWalker.Clone(exprStatement.Expression); return newStatement; } } internal class AssignmentStatement : RuleCodeDomStatement { private CodeAssignStatement assignStatement; private AssignmentStatement(CodeAssignStatement assignStatement) { this.assignStatement = assignStatement; } internal static RuleCodeDomStatement Create(CodeStatement statement) { return new AssignmentStatement((CodeAssignStatement)statement); } internal override bool Validate(RuleValidation validation) { bool success = false; string message; RuleExpressionInfo lhsExprInfo = null; if (assignStatement.Left == null) { ValidationError error = new ValidationError(Messages.NullAssignLeft, ErrorNumbers.Error_LeftOperandMissing); error.UserData[RuleUserDataKeys.ErrorObject] = assignStatement; validation.Errors.Add(error); } else { lhsExprInfo = validation.ExpressionInfo(assignStatement.Left); if (lhsExprInfo == null) lhsExprInfo = RuleExpressionWalker.Validate(validation, assignStatement.Left, true); } RuleExpressionInfo rhsExprInfo = null; if (assignStatement.Right == null) { ValidationError error = new ValidationError(Messages.NullAssignRight, ErrorNumbers.Error_RightOperandMissing); error.UserData[RuleUserDataKeys.ErrorObject] = assignStatement; validation.Errors.Add(error); } else { rhsExprInfo = RuleExpressionWalker.Validate(validation, assignStatement.Right, false); } if (lhsExprInfo != null && rhsExprInfo != null) { Type expressionType = rhsExprInfo.ExpressionType; Type assignmentType = lhsExprInfo.ExpressionType; if (assignmentType == typeof(NullLiteral)) { // Can't assign to a null literal. ValidationError error = new ValidationError(Messages.NullAssignLeft, ErrorNumbers.Error_LeftOperandInvalidType); error.UserData[RuleUserDataKeys.ErrorObject] = assignStatement; validation.Errors.Add(error); success = false; } else if (assignmentType == expressionType) { // Easy case, they're both the same type. success = true; } else { // The types aren't the same, but it still might be a legal assignment. ValidationError error = null; if (!RuleValidation.TypesAreAssignable(expressionType, assignmentType, assignStatement.Right, out error)) { if (error == null) { message = string.Format(CultureInfo.CurrentCulture, Messages.AssignNotAllowed, RuleDecompiler.DecompileType(expressionType), RuleDecompiler.DecompileType(assignmentType)); error = new ValidationError(message, ErrorNumbers.Error_OperandTypesIncompatible); } error.UserData[RuleUserDataKeys.ErrorObject] = assignStatement; validation.Errors.Add(error); } else { success = true; } } } return success; } internal override void AnalyzeUsage(RuleAnalysis analysis) { // The left side of the assignment is modified. RuleExpressionWalker.AnalyzeUsage(analysis, assignStatement.Left, false, true, null); // The right side of the assignment is read. RuleExpressionWalker.AnalyzeUsage(analysis, assignStatement.Right, true, false, null); } internal override void Execute(RuleExecution execution) { Type leftType = execution.Validation.ExpressionInfo(assignStatement.Left).ExpressionType; Type rightType = execution.Validation.ExpressionInfo(assignStatement.Right).ExpressionType; RuleExpressionResult leftResult = RuleExpressionWalker.Evaluate(execution, assignStatement.Left); RuleExpressionResult rightResult = RuleExpressionWalker.Evaluate(execution, assignStatement.Right); leftResult.Value = Executor.AdjustType(rightType, rightResult.Value, leftType); } internal override void Decompile(StringBuilder decompilation) { if (assignStatement.Right == null) { RuleEvaluationException exception = new RuleEvaluationException(Messages.AssignRightNull); exception.Data[RuleUserDataKeys.ErrorObject] = assignStatement; throw exception; } if (assignStatement.Left == null) { RuleEvaluationException exception = new RuleEvaluationException(Messages.AssignLeftNull); exception.Data[RuleUserDataKeys.ErrorObject] = assignStatement; throw exception; } RuleExpressionWalker.Decompile(decompilation, assignStatement.Left, null); decompilation.Append(" = "); RuleExpressionWalker.Decompile(decompilation, assignStatement.Right, null); } internal override bool Match(CodeStatement comperand) { CodeAssignStatement comperandStatement = comperand as CodeAssignStatement; return ((comperandStatement != null) && RuleExpressionWalker.Match(assignStatement.Left, comperandStatement.Left) && RuleExpressionWalker.Match(assignStatement.Right, comperandStatement.Right)); } internal override CodeStatement Clone() { CodeAssignStatement newStatement = new CodeAssignStatement(); newStatement.Left = RuleExpressionWalker.Clone(assignStatement.Left); newStatement.Right = RuleExpressionWalker.Clone(assignStatement.Right); return newStatement; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IUnknownConstantAttribute.cs
- QueryMath.cs
- GridViewRowCollection.cs
- Column.cs
- RC2CryptoServiceProvider.cs
- Property.cs
- EDesignUtil.cs
- TypeListConverter.cs
- ContextMenuStrip.cs
- TriggerAction.cs
- DaylightTime.cs
- AdRotator.cs
- ExpressionBuilder.cs
- SqlCacheDependencyDatabaseCollection.cs
- SiteMapSection.cs
- oledbconnectionstring.cs
- MediaPlayerState.cs
- TextParaClient.cs
- OAVariantLib.cs
- StructuralType.cs
- QilStrConcatenator.cs
- BindingNavigator.cs
- MonitorWrapper.cs
- MergePropertyDescriptor.cs
- MenuItem.cs
- RequestBringIntoViewEventArgs.cs
- DoubleAnimation.cs
- ClientSponsor.cs
- _HelperAsyncResults.cs
- DBCSCodePageEncoding.cs
- ConfigXmlElement.cs
- StringToken.cs
- ValidationErrorEventArgs.cs
- HitTestParameters3D.cs
- SmiGettersStream.cs
- ValidatedControlConverter.cs
- HatchBrush.cs
- SystemFonts.cs
- NavigationPropertyEmitter.cs
- NetworkCredential.cs
- DllNotFoundException.cs
- StringAnimationBase.cs
- BoundColumn.cs
- StorageInfo.cs
- CheckBox.cs
- ReferentialConstraint.cs
- Figure.cs
- Metadata.cs
- CheckBoxField.cs
- FontCacheLogic.cs
- Expression.cs
- DrawingVisual.cs
- Button.cs
- GetRecipientRequest.cs
- WindowsButton.cs
- ContentType.cs
- WmlValidationSummaryAdapter.cs
- COM2PropertyDescriptor.cs
- VersionPair.cs
- ClrPerspective.cs
- complextypematerializer.cs
- WebReferencesBuildProvider.cs
- MatrixCamera.cs
- RichTextBox.cs
- CompleteWizardStep.cs
- MimeWriter.cs
- ThreadExceptionEvent.cs
- WindowCollection.cs
- XmlSerializationReader.cs
- glyphs.cs
- IndentedTextWriter.cs
- SystemIPGlobalStatistics.cs
- SafeArrayTypeMismatchException.cs
- LoadMessageLogger.cs
- RegisteredArrayDeclaration.cs
- ConfigurationSectionCollection.cs
- Timer.cs
- TableCell.cs
- PropertyToken.cs
- Timer.cs
- RoutedEventHandlerInfo.cs
- _BufferOffsetSize.cs
- CombinedTcpChannel.cs
- DbConnectionPoolGroupProviderInfo.cs
- RadioButton.cs
- ISCIIEncoding.cs
- RenderOptions.cs
- ClipboardProcessor.cs
- WS2007FederationHttpBindingCollectionElement.cs
- DirectoryObjectSecurity.cs
- ActivityCodeDomSerializer.cs
- DataSourceHelper.cs
- CalendarDataBindingHandler.cs
- WebBrowserNavigatedEventHandler.cs
- CharEntityEncoderFallback.cs
- WpfKnownMember.cs
- AdRotator.cs
- PageWrapper.cs
- ISSmlParser.cs
- ControlParameter.cs