| File: CodeDomFixup\CodeDomVisitors\CodeDomVisitor.cs | Web Access |
| Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using Microsoft.CodeDom; using System.Collections; namespace Microsoft.Tools.ServiceModel.Svcutil { internal abstract class CodeDomVisitor { public static void Visit(CodeDomVisitor[] visitors, CodeCompileUnit code) { new Enumerator(visitors).Enumerate(code); } private class Enumerator : CodeDomVisitor { private CodeDomVisitor[] _visitors; public Enumerator(CodeDomVisitor[] visitors) { _visitors = visitors; } public void Enumerate(CodeCompileUnit code) { Visit((object)code); CallFinishVisit(code); } private void Enumerate(object o) { Visit(o); } private void Enumerate(IEnumerable coll) { foreach (object o in coll) { Visit(o); } } private void CallVisitors(object obj) { for (int i = 0; i < _visitors.Length; i++) { _visitors[i].Visit(obj); } } private void CallFinishVisit(CodeCompileUnit cu) { for (int i = 0; i < _visitors.Length; i++) { _visitors[i].FinishVisit(cu); } } protected override void Visit(object obj) { CallVisitors(obj); base.Visit(obj); } #region enumerating visitor overrides protected override void Visit(CodeArgumentReferenceExpression expr) { base.Visit(expr); } protected override void Visit(CodeArrayCreateExpression expr) { Enumerate(expr.CreateType); Enumerate(expr.Initializers); Enumerate(expr.SizeExpression); base.Visit(expr); } protected override void Visit(CodeArrayIndexerExpression expr) { Enumerate(expr.Indices); Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeAssignStatement statement) { Enumerate(statement.Right); Enumerate(statement.Left); base.Visit(statement); } protected override void Visit(CodeAttachEventStatement statement) { Enumerate(statement.Listener); Enumerate(statement.Event); base.Visit(statement); } protected override void Visit(CodeAttributeArgument attrarg) { Enumerate(attrarg.Value); base.Visit(attrarg); } protected override void Visit(CodeAttributeDeclaration attr) { Enumerate(attr.Arguments); Enumerate(attr.AttributeType); base.Visit(attr); } protected override void Visit(CodeBaseReferenceExpression expr) { base.Visit(expr); } protected override void Visit(CodeBinaryOperatorExpression expr) { Enumerate(expr.Right); Enumerate(expr.Left); base.Visit(expr); } protected override void Visit(CodeCastExpression expr) { Enumerate(expr.Expression); Enumerate(expr.TargetType); base.Visit(expr); } protected override void Visit(CodeCatchClause clause) { Enumerate(clause.CatchExceptionType); Enumerate(clause.Statements); base.Visit(clause); } protected override void Visit(CodeChecksumPragma directive) { base.Visit(directive); } protected override void Visit(CodeComment comment) { base.Visit(comment); } protected override void Visit(CodeCommentStatement statement) { Enumerate(statement.Comment); base.Visit(statement); } protected override void Visit(CodeCompileUnit cu) { Enumerate(cu.StartDirectives); Enumerate(cu.AssemblyCustomAttributes); Enumerate(cu.Namespaces); Enumerate(cu.EndDirectives); base.Visit(cu); } protected override void Visit(CodeConditionStatement statement) { Enumerate(statement.Condition); Enumerate(statement.TrueStatements); Enumerate(statement.FalseStatements); base.Visit(statement); } protected override void Visit(CodeConstructor ctor) { Enumerate(ctor.BaseConstructorArgs); Enumerate(ctor.ChainedConstructorArgs); base.Visit(ctor); } protected override void Visit(CodeDefaultValueExpression expr) { Enumerate(expr.Type); base.Visit(expr); } protected override void Visit(CodeDelegateCreateExpression expr) { Enumerate(expr.DelegateType); Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeDelegateInvokeExpression expr) { Enumerate(expr.Parameters); Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeDirectionExpression expr) { Enumerate(expr.Expression); base.Visit(expr); } protected override void Visit(CodeDirective directive) { base.Visit(directive); } protected override void Visit(CodeEntryPointMethod method) { base.Visit(method); } protected override void Visit(CodeEventReferenceExpression expr) { Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeExpression expr) { base.Visit(expr); } protected override void Visit(CodeExpressionStatement statement) { Enumerate(statement.Expression); base.Visit(statement); } protected override void Visit(CodeFieldReferenceExpression expr) { Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeGotoStatement statement) { base.Visit(statement); } protected override void Visit(CodeIndexerExpression expr) { Enumerate(expr.Indices); Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeIterationStatement statement) { Enumerate(statement.InitStatement); Enumerate(statement.TestExpression); Enumerate(statement.Statements); Enumerate(statement.TestExpression); base.Visit(statement); } protected override void Visit(CodeLabeledStatement statement) { Enumerate(statement.Statement); base.Visit(statement); } protected override void Visit(CodeLinePragma pragma) { base.Visit(pragma); } protected override void Visit(CodeMemberEvent evt) { Enumerate(evt.Type); Enumerate(evt.ImplementationTypes); Enumerate(evt.PrivateImplementationType); base.Visit(evt); } protected override void Visit(CodeMemberField field) { Enumerate(field.InitExpression); Enumerate(field.Type); base.Visit(field); } protected override void Visit(CodeMemberMethod method) { Enumerate(method.TypeParameters); Enumerate(method.Parameters); Enumerate(method.ReturnType); Enumerate(method.ReturnTypeCustomAttributes); Enumerate(method.Statements); Enumerate(method.ImplementationTypes); Enumerate(method.PrivateImplementationType); base.Visit(method); } protected override void Visit(CodeMemberProperty prop) { Enumerate(prop.Parameters); Enumerate(prop.Type); Enumerate(prop.GetStatements); Enumerate(prop.SetStatements); Enumerate(prop.ImplementationTypes); Enumerate(prop.PrivateImplementationType); base.Visit(prop); } protected override void Visit(CodeMethodInvokeExpression expr) { Enumerate(expr.Parameters); Enumerate(expr.Method); base.Visit(expr); } protected override void Visit(CodeMethodReferenceExpression expr) { Enumerate(expr.TypeArguments); Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodeMethodReturnStatement statement) { Enumerate(statement.Expression); base.Visit(statement); } protected override void Visit(CodeNamespace ns) { Enumerate(ns.Comments); Enumerate(ns.Imports); EnumerateTypes(ns); base.Visit(ns); } private void EnumerateTypes(CodeNamespace ns) { foreach (CodeObject codeObj in ns.Types) { codeObj.UserData["Namespace"] = ns; } Enumerate(ns.Types); } protected override void Visit(CodeNamespaceImport ns) { Enumerate(ns.LinePragma); base.Visit(ns); } protected override void Visit(CodeObject obj) { // CONSIDER: UserData base.Visit(obj); } protected override void Visit(CodeObjectCreateExpression expr) { Enumerate(expr.Parameters); Enumerate(expr.CreateType); base.Visit(expr); } protected override void Visit(CodeParameterDeclarationExpression expr) { Enumerate(expr.Type); Enumerate(expr.CustomAttributes); base.Visit(expr); } protected override void Visit(CodePrimitiveExpression expr) { base.Visit(expr); } protected override void Visit(CodePropertyReferenceExpression expr) { Enumerate(expr.TargetObject); base.Visit(expr); } protected override void Visit(CodePropertySetValueReferenceExpression expr) { base.Visit(expr); } protected override void Visit(CodeRegionDirective directive) { base.Visit(directive); } protected override void Visit(CodeRemoveEventStatement statement) { Enumerate(statement.Listener); Enumerate(statement.Event); base.Visit(statement); } protected override void Visit(CodeSnippetCompileUnit cu) { Enumerate(cu.LinePragma); base.Visit(cu); } protected override void Visit(CodeSnippetExpression expr) { base.Visit(expr); } protected override void Visit(CodeSnippetStatement statement) { base.Visit(statement); } protected override void Visit(CodeSnippetTypeMember snippet) { base.Visit(snippet); } protected override void Visit(CodeStatement statement) { Enumerate(statement.StartDirectives); Enumerate(statement.LinePragma); Enumerate(statement.EndDirectives); base.Visit(statement); } protected override void Visit(CodeThisReferenceExpression expr) { base.Visit(expr); } protected override void Visit(CodeThrowExceptionStatement statement) { Enumerate(statement.ToThrow); base.Visit(statement); } protected override void Visit(CodeTryCatchFinallyStatement statement) { Enumerate(statement.TryStatements); Enumerate(statement.CatchClauses); Enumerate(statement.FinallyStatements); base.Visit(statement); } protected override void Visit(CodeTypeConstructor cctor) { base.Visit(cctor); } protected override void Visit(CodeTypeDeclaration type) { Enumerate(type.BaseTypes); Enumerate(type.TypeParameters); Enumerate(type.Members); base.Visit(type); } protected override void Visit(CodeTypeDelegate del) { Enumerate(del.Parameters); Enumerate(del.ReturnType); base.Visit(del); } protected override void Visit(CodeTypeMember member) { Enumerate(member.StartDirectives); Enumerate(member.Comments); Enumerate(member.CustomAttributes); Enumerate(member.LinePragma); Enumerate(member.EndDirectives); base.Visit(member); } protected override void Visit(CodeTypeOfExpression expr) { Enumerate(expr.Type); base.Visit(expr); } protected override void Visit(CodeTypeParameter typeparam) { Enumerate(typeparam.Constraints); Enumerate(typeparam.CustomAttributes); base.Visit(typeparam); } protected override void Visit(CodeTypeReference typeref) { Enumerate(typeref.ArrayElementType); Enumerate(typeref.TypeArguments); base.Visit(typeref); } protected override void Visit(CodeTypeReferenceExpression expr) { Enumerate(expr.Type); base.Visit(expr); } protected override void Visit(CodeVariableDeclarationStatement statement) { Enumerate(statement.Type); Enumerate(statement.InitExpression); base.Visit(statement); } protected override void Visit(CodeVariableReferenceExpression expr) { base.Visit(expr); } #endregion // enumerating visitor overrides } protected virtual void Visit(object obj) { if (obj is CodeAttributeArgument) Visit((CodeAttributeArgument)obj); else if (obj is CodeAttributeDeclaration) Visit((CodeAttributeDeclaration)obj); else if (obj is CodeCatchClause) Visit((CodeCatchClause)obj); else if (obj is CodeLinePragma) Visit((CodeLinePragma)obj); else if (obj is CodeObject) Visit((CodeObject)obj); } #region descendants of object protected virtual void Visit(CodeAttributeArgument attrarg) { } protected virtual void Visit(CodeAttributeDeclaration attr) { } protected virtual void Visit(CodeCatchClause clause) { } protected virtual void Visit(CodeLinePragma pragma) { } protected virtual void Visit(CodeObject obj) { if (obj is CodeComment) Visit((CodeComment)obj); else if (obj is CodeCompileUnit) Visit((CodeCompileUnit)obj); else if (obj is CodeDirective) Visit((CodeDirective)obj); else if (obj is CodeExpression) Visit((CodeExpression)obj); else if (obj is CodeNamespace) Visit((CodeNamespace)obj); else if (obj is CodeNamespaceImport) Visit((CodeNamespaceImport)obj); else if (obj is CodeStatement) Visit((CodeStatement)obj); else if (obj is CodeTypeMember) Visit((CodeTypeMember)obj); else if (obj is CodeTypeParameter) Visit((CodeTypeParameter)obj); else if (obj is CodeTypeReference) Visit((CodeTypeReference)obj); } #region descendants of CodeObject protected virtual void Visit(CodeComment comment) { } protected virtual void Visit(CodeCompileUnit cu) { if (cu is CodeSnippetCompileUnit) Visit((CodeSnippetCompileUnit)cu); } #region descendants of CodeCompileUnit protected virtual void Visit(CodeSnippetCompileUnit cu) { } #endregion // descendants of CodeCompileUnit protected virtual void Visit(CodeDirective directive) { if (directive is CodeChecksumPragma) Visit((CodeChecksumPragma)directive); else if (directive is CodeRegionDirective) Visit((CodeRegionDirective)directive); } #region descendants of CodeDirective protected virtual void Visit(CodeChecksumPragma directive) { } protected virtual void Visit(CodeRegionDirective directive) { } #endregion // descendants of CodeDirective protected virtual void Visit(CodeExpression expr) { if (expr is CodeArgumentReferenceExpression) Visit((CodeArgumentReferenceExpression)expr); else if (expr is CodeArrayCreateExpression) Visit((CodeArrayCreateExpression)expr); else if (expr is CodeArrayIndexerExpression) Visit((CodeArrayIndexerExpression)expr); else if (expr is CodeBaseReferenceExpression) Visit((CodeBaseReferenceExpression)expr); else if (expr is CodeBinaryOperatorExpression) Visit((CodeBinaryOperatorExpression)expr); else if (expr is CodeCastExpression) Visit((CodeCastExpression)expr); else if (expr is CodeDefaultValueExpression) Visit((CodeDefaultValueExpression)expr); else if (expr is CodeDelegateCreateExpression) Visit((CodeDelegateCreateExpression)expr); else if (expr is CodeDelegateInvokeExpression) Visit((CodeDelegateInvokeExpression)expr); else if (expr is CodeDirectionExpression) Visit((CodeDirectionExpression)expr); else if (expr is CodeEventReferenceExpression) Visit((CodeEventReferenceExpression)expr); else if (expr is CodeFieldReferenceExpression) Visit((CodeFieldReferenceExpression)expr); else if (expr is CodeIndexerExpression) Visit((CodeIndexerExpression)expr); else if (expr is CodeMethodInvokeExpression) Visit((CodeMethodInvokeExpression)expr); else if (expr is CodeMethodReferenceExpression) Visit((CodeMethodReferenceExpression)expr); else if (expr is CodeObjectCreateExpression) Visit((CodeObjectCreateExpression)expr); else if (expr is CodeParameterDeclarationExpression) Visit((CodeParameterDeclarationExpression)expr); else if (expr is CodePrimitiveExpression) Visit((CodePrimitiveExpression)expr); else if (expr is CodePropertyReferenceExpression) Visit((CodePropertyReferenceExpression)expr); else if (expr is CodePropertySetValueReferenceExpression) Visit((CodePropertySetValueReferenceExpression)expr); else if (expr is CodeSnippetExpression) Visit((CodeSnippetExpression)expr); else if (expr is CodeThisReferenceExpression) Visit((CodeThisReferenceExpression)expr); else if (expr is CodeTypeOfExpression) Visit((CodeTypeOfExpression)expr); else if (expr is CodeTypeReferenceExpression) Visit((CodeTypeReferenceExpression)expr); else if (expr is CodeVariableReferenceExpression) Visit((CodeVariableReferenceExpression)expr); } #region descendants of CodeExpression protected virtual void Visit(CodeArgumentReferenceExpression expr) { } protected virtual void Visit(CodeArrayCreateExpression expr) { } protected virtual void Visit(CodeArrayIndexerExpression expr) { } protected virtual void Visit(CodeBaseReferenceExpression expr) { } protected virtual void Visit(CodeBinaryOperatorExpression expr) { } protected virtual void Visit(CodeCastExpression expr) { } protected virtual void Visit(CodeDefaultValueExpression expr) { } protected virtual void Visit(CodeDelegateCreateExpression expr) { } protected virtual void Visit(CodeDelegateInvokeExpression expr) { } protected virtual void Visit(CodeDirectionExpression expr) { } protected virtual void Visit(CodeEventReferenceExpression expr) { } protected virtual void Visit(CodeFieldReferenceExpression expr) { } protected virtual void Visit(CodeIndexerExpression expr) { } protected virtual void Visit(CodeMethodInvokeExpression expr) { } protected virtual void Visit(CodeMethodReferenceExpression expr) { } protected virtual void Visit(CodeObjectCreateExpression expr) { } protected virtual void Visit(CodeParameterDeclarationExpression expr) { } protected virtual void Visit(CodePrimitiveExpression expr) { } protected virtual void Visit(CodePropertyReferenceExpression expr) { } protected virtual void Visit(CodePropertySetValueReferenceExpression expr) { } protected virtual void Visit(CodeSnippetExpression expr) { } protected virtual void Visit(CodeThisReferenceExpression expr) { } protected virtual void Visit(CodeTypeOfExpression expr) { } protected virtual void Visit(CodeTypeReferenceExpression expr) { } protected virtual void Visit(CodeVariableReferenceExpression expr) { } #endregion // descendants of CodeExpression protected virtual void Visit(CodeNamespace ns) { } protected virtual void Visit(CodeNamespaceImport ns) { } protected virtual void Visit(CodeStatement statement) { if (statement is CodeAssignStatement) Visit((CodeAssignStatement)statement); else if (statement is CodeAttachEventStatement) Visit((CodeAttachEventStatement)statement); else if (statement is CodeCommentStatement) Visit((CodeCommentStatement)statement); else if (statement is CodeConditionStatement) Visit((CodeConditionStatement)statement); else if (statement is CodeExpressionStatement) Visit((CodeExpressionStatement)statement); else if (statement is CodeGotoStatement) Visit((CodeGotoStatement)statement); else if (statement is CodeIterationStatement) Visit((CodeIterationStatement)statement); else if (statement is CodeLabeledStatement) Visit((CodeLabeledStatement)statement); else if (statement is CodeMethodReturnStatement) Visit((CodeMethodReturnStatement)statement); else if (statement is CodeRemoveEventStatement) Visit((CodeRemoveEventStatement)statement); else if (statement is CodeSnippetStatement) Visit((CodeSnippetStatement)statement); else if (statement is CodeThrowExceptionStatement) Visit((CodeThrowExceptionStatement)statement); else if (statement is CodeTryCatchFinallyStatement) Visit((CodeTryCatchFinallyStatement)statement); else if (statement is CodeVariableDeclarationStatement) Visit((CodeVariableDeclarationStatement)statement); } #region descendants of CodeStatement protected virtual void Visit(CodeAssignStatement statement) { } protected virtual void Visit(CodeAttachEventStatement statement) { } protected virtual void Visit(CodeCommentStatement statement) { } protected virtual void Visit(CodeConditionStatement statement) { } protected virtual void Visit(CodeExpressionStatement statement) { } protected virtual void Visit(CodeGotoStatement statement) { } protected virtual void Visit(CodeIterationStatement statement) { } protected virtual void Visit(CodeLabeledStatement statement) { } protected virtual void Visit(CodeMethodReturnStatement statement) { } protected virtual void Visit(CodeRemoveEventStatement statement) { } protected virtual void Visit(CodeSnippetStatement statement) { } protected virtual void Visit(CodeThrowExceptionStatement statement) { } protected virtual void Visit(CodeTryCatchFinallyStatement statement) { } protected virtual void Visit(CodeVariableDeclarationStatement statement) { } #endregion // descendants of CodeStatement protected virtual void Visit(CodeTypeMember member) { if (member is CodeMemberEvent) Visit((CodeMemberEvent)member); else if (member is CodeMemberField) Visit((CodeMemberField)member); else if (member is CodeMemberMethod) Visit((CodeMemberMethod)member); else if (member is CodeMemberProperty) Visit((CodeMemberProperty)member); else if (member is CodeSnippetTypeMember) Visit((CodeSnippetTypeMember)member); else if (member is CodeTypeDeclaration) Visit((CodeTypeDeclaration)member); } #region descendants of CodeTypeMember protected virtual void Visit(CodeMemberEvent evt) { } protected virtual void Visit(CodeMemberField field) { } protected virtual void Visit(CodeMemberMethod method) { if (method is CodeConstructor) Visit((CodeConstructor)method); else if (method is CodeEntryPointMethod) Visit((CodeEntryPointMethod)method); else if (method is CodeTypeConstructor) Visit((CodeTypeConstructor)method); } #region descendants of CodeMemberMethod protected virtual void Visit(CodeConstructor ctor) { } protected virtual void Visit(CodeEntryPointMethod method) { } protected virtual void Visit(CodeTypeConstructor cctor) { } #endregion // descendants of CodeMemberMethod protected virtual void Visit(CodeMemberProperty prop) { } protected virtual void Visit(CodeSnippetTypeMember snippet) { } protected virtual void Visit(CodeTypeDeclaration type) { if (type is CodeTypeDelegate) Visit((CodeTypeDelegate)type); } #region descendants of CodeTypeDeclaration protected virtual void Visit(CodeTypeDelegate del) { } #endregion // descendants of CodeTypeDeclaration #endregion // descendants of CodeTypeMember protected virtual void Visit(CodeTypeParameter typeparam) { } protected virtual void Visit(CodeTypeReference typeref) { } #endregion // descendants of CodeObject #endregion // descendants of object protected virtual void FinishVisit(CodeCompileUnit cu) { } } }