Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / XmlUtils / System / Xml / Xsl / QIL / QilValidationVisitor.cs / 1 / QilValidationVisitor.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System.Collections; using System.Diagnostics; namespace System.Xml.Xsl.Qil { using Res = System.Xml.Utils.Res; ///A internal class that validates QilExpression graphs. ////// QilValidationVisitor traverses the QilExpression graph once to enforce the following constraints: /// /// internal class QilValidationVisitor : QilScopedVisitor { private SubstitutionList subs = new SubstitutionList(); private QilTypeChecker typeCheck = new QilTypeChecker(); //----------------------------------------------- // Entry //----------------------------------------------- [Conditional("DEBUG")] public static void Validate(QilNode node) { Debug.Assert(node != null); new QilValidationVisitor().VisitAssumeReference(node); } protected QilValidationVisitor() {} #if DEBUG protected Hashtable allNodes = new ObjectHashtable(); protected Hashtable parents = new ObjectHashtable(); protected Hashtable scope = new ObjectHashtable(); //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- protected override QilNode VisitChildren(QilNode parent) { if (this.parents.Contains(parent)) { // We have already visited the node that starts the infinite loop, but don't visit its children SetError(parent, "Infinite loop"); } else if (AddNode(parent)) { if (parent.XmlType == null) { SetError(parent, "Type information missing"); } else { XmlQueryType type = this.typeCheck.Check(parent); // if (!type.IsSubtypeOf(parent.XmlType)) SetError(parent, "Type information was not correctly inferred"); } this.parents.Add(parent, parent); for (int i = 0; i < parent.Count; i++) { if (parent[i] == null) { // Allow parameter name and default value to be null if (parent.NodeType == QilNodeType.Parameter) continue; // Do not allow null anywhere else in the graph else SetError(parent, "Child " + i + " must not be null"); } if (parent.NodeType == QilNodeType.GlobalVariableList || parent.NodeType == QilNodeType.GlobalParameterList || parent.NodeType == QilNodeType.FunctionList) { if (((QilReference) parent[i]).DebugName == null) SetError(parent[i], "DebugName must not be null"); } // If child is a reference, then call VisitReference instead of Visit in order to avoid circular visits. if (IsReference(parent, i)) VisitReference(parent[i]); else Visit(parent[i]); } this.parents.Remove(parent); } return parent; } //////
///- No circular references
///- No duplicate nodes (except for references)
///- No out-of-scope references
///- Type constraints on operands
///- Type constraints on operators
///- No null objects (except where allowed)
///- No Unknown node types
///When an error occurs, it marks the offending node with an annotation and continues checking, /// allowing the detection of multiple errors at once and printing the structure after validation. /// (In the case of circular references, it breaks the loop at the circular reference to allow the graph /// to print correctly.)
////// Ensure that the function or iterator reference is already in scope. /// protected override QilNode VisitReference(QilNode node) { if (!this.scope.Contains(node)) SetError(node, "Out-of-scope reference"); return node; } //----------------------------------------------- // QilScopedVisitor overrides //----------------------------------------------- ////// Add an iterator or function to scope if it hasn't been added already. /// protected override void BeginScope(QilNode node) { if (this.scope.Contains(node)) SetError(node, "Reference already in scope"); else this.scope.Add(node, node); } ////// Pop scope. /// protected override void EndScope(QilNode node) { this.scope.Remove(node); } //----------------------------------------------- // Helper methods //----------------------------------------------- private class ObjectHashtable : Hashtable { protected override bool KeyEquals(object item, object key) { return item == key; } } private bool AddNode(QilNode n) { if (!this.allNodes.Contains(n)) { this.allNodes.Add(n, n); return true; } else { SetError(n, "Duplicate " + n.NodeType + " node"); return false; } } #endif // DEBUG [Conditional("DEBUG")] internal static void SetError(QilNode n, string message) { message = Res.GetString(Res.Qil_Validation, message); #if QIL_TRACE_NODE_CREATION message += " ["+ n.NodeId + " (" + n.NodeType.ToString("G") + ")]"; #endif string s = n.Annotation as string; if (s != null) { message = s + "\n" + message; } n.Annotation = message; Debug.Assert(false, message); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- using System.Collections; using System.Diagnostics; namespace System.Xml.Xsl.Qil { using Res = System.Xml.Utils.Res; ///A internal class that validates QilExpression graphs. ////// QilValidationVisitor traverses the QilExpression graph once to enforce the following constraints: /// /// internal class QilValidationVisitor : QilScopedVisitor { private SubstitutionList subs = new SubstitutionList(); private QilTypeChecker typeCheck = new QilTypeChecker(); //----------------------------------------------- // Entry //----------------------------------------------- [Conditional("DEBUG")] public static void Validate(QilNode node) { Debug.Assert(node != null); new QilValidationVisitor().VisitAssumeReference(node); } protected QilValidationVisitor() {} #if DEBUG protected Hashtable allNodes = new ObjectHashtable(); protected Hashtable parents = new ObjectHashtable(); protected Hashtable scope = new ObjectHashtable(); //----------------------------------------------- // QilVisitor overrides //----------------------------------------------- protected override QilNode VisitChildren(QilNode parent) { if (this.parents.Contains(parent)) { // We have already visited the node that starts the infinite loop, but don't visit its children SetError(parent, "Infinite loop"); } else if (AddNode(parent)) { if (parent.XmlType == null) { SetError(parent, "Type information missing"); } else { XmlQueryType type = this.typeCheck.Check(parent); // if (!type.IsSubtypeOf(parent.XmlType)) SetError(parent, "Type information was not correctly inferred"); } this.parents.Add(parent, parent); for (int i = 0; i < parent.Count; i++) { if (parent[i] == null) { // Allow parameter name and default value to be null if (parent.NodeType == QilNodeType.Parameter) continue; // Do not allow null anywhere else in the graph else SetError(parent, "Child " + i + " must not be null"); } if (parent.NodeType == QilNodeType.GlobalVariableList || parent.NodeType == QilNodeType.GlobalParameterList || parent.NodeType == QilNodeType.FunctionList) { if (((QilReference) parent[i]).DebugName == null) SetError(parent[i], "DebugName must not be null"); } // If child is a reference, then call VisitReference instead of Visit in order to avoid circular visits. if (IsReference(parent, i)) VisitReference(parent[i]); else Visit(parent[i]); } this.parents.Remove(parent); } return parent; } //////
///- No circular references
///- No duplicate nodes (except for references)
///- No out-of-scope references
///- Type constraints on operands
///- Type constraints on operators
///- No null objects (except where allowed)
///- No Unknown node types
///When an error occurs, it marks the offending node with an annotation and continues checking, /// allowing the detection of multiple errors at once and printing the structure after validation. /// (In the case of circular references, it breaks the loop at the circular reference to allow the graph /// to print correctly.)
////// Ensure that the function or iterator reference is already in scope. /// protected override QilNode VisitReference(QilNode node) { if (!this.scope.Contains(node)) SetError(node, "Out-of-scope reference"); return node; } //----------------------------------------------- // QilScopedVisitor overrides //----------------------------------------------- ////// Add an iterator or function to scope if it hasn't been added already. /// protected override void BeginScope(QilNode node) { if (this.scope.Contains(node)) SetError(node, "Reference already in scope"); else this.scope.Add(node, node); } ////// Pop scope. /// protected override void EndScope(QilNode node) { this.scope.Remove(node); } //----------------------------------------------- // Helper methods //----------------------------------------------- private class ObjectHashtable : Hashtable { protected override bool KeyEquals(object item, object key) { return item == key; } } private bool AddNode(QilNode n) { if (!this.allNodes.Contains(n)) { this.allNodes.Add(n, n); return true; } else { SetError(n, "Duplicate " + n.NodeType + " node"); return false; } } #endif // DEBUG [Conditional("DEBUG")] internal static void SetError(QilNode n, string message) { message = Res.GetString(Res.Qil_Validation, message); #if QIL_TRACE_NODE_CREATION message += " ["+ n.NodeId + " (" + n.NodeType.ToString("G") + ")]"; #endif string s = n.Annotation as string; if (s != null) { message = s + "\n" + message; } n.Annotation = message; Debug.Assert(false, message); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MonikerSyntaxException.cs
- MultiTargetingUtil.cs
- RadioButtonAutomationPeer.cs
- Margins.cs
- HttpException.cs
- bindurihelper.cs
- ProcessModelSection.cs
- RunClient.cs
- DefaultEventAttribute.cs
- DesignTimeType.cs
- SettingsPropertyCollection.cs
- AssemblyBuilder.cs
- ParameterModifier.cs
- DataContractSerializer.cs
- SmiContext.cs
- XmlWrappingReader.cs
- WpfPayload.cs
- PrintDialogException.cs
- MailMessage.cs
- DbParameterCollectionHelper.cs
- PropertyEmitter.cs
- WindowInteropHelper.cs
- SystemIPGlobalStatistics.cs
- BooleanExpr.cs
- WizardForm.cs
- HwndSourceKeyboardInputSite.cs
- XamlFxTrace.cs
- DataGridViewHeaderCell.cs
- DescendantQuery.cs
- ObjectDataSourceSelectingEventArgs.cs
- AdornerDecorator.cs
- SqlClientWrapperSmiStreamChars.cs
- COSERVERINFO.cs
- XsdCachingReader.cs
- GuidelineCollection.cs
- WorkflowTransactionService.cs
- ProfilePropertyMetadata.cs
- sqlcontext.cs
- PaperSource.cs
- xmlglyphRunInfo.cs
- DataTableReaderListener.cs
- CodeMethodInvokeExpression.cs
- UnicastIPAddressInformationCollection.cs
- IntegerValidator.cs
- HttpCachePolicy.cs
- IndexingContentUnit.cs
- BufferedOutputAsyncStream.cs
- CodeIdentifier.cs
- RightsManagementEncryptionTransform.cs
- Span.cs
- Calendar.cs
- ScriptManagerProxy.cs
- ConfigurationPropertyCollection.cs
- BaseHashHelper.cs
- OpCodes.cs
- RowTypePropertyElement.cs
- SystemKeyConverter.cs
- DrawingContextDrawingContextWalker.cs
- SortDescription.cs
- SynchronizationContext.cs
- PartBasedPackageProperties.cs
- FrugalList.cs
- ToolStripSeparatorRenderEventArgs.cs
- UndirectedGraph.cs
- AppDomainGrammarProxy.cs
- WsatServiceCertificate.cs
- ConnectionStringSettingsCollection.cs
- SqlBulkCopyColumnMappingCollection.cs
- Filter.cs
- AmbientProperties.cs
- SqlDependencyListener.cs
- SqlConnection.cs
- MapPathBasedVirtualPathProvider.cs
- TdsParserSessionPool.cs
- HttpRuntimeSection.cs
- ResourceDefaultValueAttribute.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- DataBinding.cs
- LocatorPartList.cs
- COMException.cs
- PageWrapper.cs
- ObservableDictionary.cs
- ObjectDataSourceDesigner.cs
- DataColumnPropertyDescriptor.cs
- ToolStripRenderer.cs
- PointAnimationUsingPath.cs
- InvalidFilterCriteriaException.cs
- WebPartVerbsEventArgs.cs
- MarkedHighlightComponent.cs
- FormsAuthentication.cs
- TemplateBamlRecordReader.cs
- DrawingBrush.cs
- StickyNote.cs
- TagPrefixAttribute.cs
- DataGridViewSelectedColumnCollection.cs
- NativeMethods.cs
- IdentityNotMappedException.cs
- SystemInfo.cs
- DriveNotFoundException.cs
- DataGridViewAdvancedBorderStyle.cs