You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			437 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			437 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // 
 | |
| // NodeInspector.cs
 | |
| // 
 | |
| // Authors:
 | |
| // 	Alexander Chebaturkin (chebaturkin@gmail.com)
 | |
| // 
 | |
| // Copyright (C) 2011 Alexander Chebaturkin
 | |
| // 
 | |
| // Permission is hereby granted, free of charge, to any person obtaining
 | |
| // a copy of this software and associated documentation files (the
 | |
| // "Software"), to deal in the Software without restriction, including
 | |
| // without limitation the rights to use, copy, modify, merge, publish,
 | |
| // distribute, sublicense, and/or sell copies of the Software, and to
 | |
| // permit persons to whom the Software is furnished to do so, subject to
 | |
| // the following conditions:
 | |
| // 
 | |
| // The above copyright notice and this permission notice shall be
 | |
| // included in all copies or substantial portions of the Software.
 | |
| //  
 | |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
| // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
 | |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
| // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | |
| // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | |
| // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | |
| // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| // 
 | |
| 
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| namespace Mono.CodeContracts.Static.AST.Visitors {
 | |
| 	class NodeInspector {
 | |
| 		public virtual void Visit (Node node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 			switch (node.NodeType) {
 | |
| 			case NodeType.Nop:
 | |
| 				break;
 | |
| 
 | |
| 				#region Binary
 | |
| 			case NodeType.Add:
 | |
| 			case NodeType.Sub:
 | |
| 			case NodeType.Rem:
 | |
| 			case NodeType.Clt:
 | |
| 			case NodeType.Cgt:
 | |
| 			case NodeType.Ceq:
 | |
| 			case NodeType.Box:
 | |
| 			case NodeType.Le:
 | |
| 			case NodeType.Mul:
 | |
| 			case NodeType.Div:
 | |
| 			case NodeType.Div_Un:
 | |
| 			case NodeType.Rem_Un:
 | |
| 			case NodeType.And:
 | |
| 			case NodeType.Or:
 | |
| 			case NodeType.Shr:
 | |
| 			case NodeType.Xor:
 | |
| 			case NodeType.Shl:
 | |
| 			case NodeType.Shr_Un:
 | |
| 			case NodeType.Ne:
 | |
| 			case NodeType.Ge:
 | |
| 			case NodeType.Gt:
 | |
| 			case NodeType.Lt:
 | |
| 			case NodeType.Eq:
 | |
| 				VisitBinaryExpression ((BinaryExpression) node);
 | |
| 				break;
 | |
| 				#endregion
 | |
| 
 | |
| 			case NodeType.Call:
 | |
| 			case NodeType.Jmp:
 | |
| 			case NodeType.MethodCall:
 | |
| 				VisitMethodCall ((MethodCall) node);
 | |
| 				break;
 | |
| 			case NodeType.Conv:
 | |
| 			case NodeType.Conv_I1:
 | |
| 			case NodeType.Conv_I2:
 | |
| 			case NodeType.Conv_I8:
 | |
| 			case NodeType.Conv_I4:
 | |
| 			case NodeType.Conv_R4:
 | |
| 			case NodeType.Conv_R8:
 | |
| 			case NodeType.Neg:
 | |
| 			case NodeType.Not:
 | |
| 			case NodeType.LogicalNot:
 | |
| 				VisitUnaryExpression ((UnaryExpression) node);
 | |
| 				break;
 | |
| 			case NodeType.Literal:
 | |
| 				VisitLiteral ((Literal) node);
 | |
| 				break;
 | |
| 			case NodeType.This:
 | |
| 				VisitThis ((This) node);
 | |
| 				break;
 | |
| 			case NodeType.Block:
 | |
| 				VisitBlock ((Block) node);
 | |
| 				break;
 | |
| 			case NodeType.Branch:
 | |
| 				VisitBranch ((Branch) node);
 | |
| 				break;
 | |
| 			case NodeType.Return:
 | |
| 				VisitReturn ((Return) node);
 | |
| 				break;
 | |
| 			case NodeType.AssignmentStatement:
 | |
| 				VisitAssignmentStatement ((AssignmentStatement) node);
 | |
| 				break;
 | |
| 			case NodeType.Local:
 | |
| 				VisitLocal ((Local) node);
 | |
| 				break;
 | |
| 			case NodeType.Parameter:
 | |
| 				VisitParameter ((Parameter) node);
 | |
| 				break;
 | |
| 			case NodeType.ExpressionStatement:
 | |
| 				VisitExpressionStatement ((ExpressionStatement) node);
 | |
| 				break;
 | |
| 			case NodeType.Method:
 | |
| 				VisitMethod ((Method) node);
 | |
| 				break;
 | |
| 			case NodeType.MethodContract:
 | |
| 				VisitMethodContract ((MethodContract) node);
 | |
| 				break;
 | |
| 			case NodeType.Requires:
 | |
| 				VisitRequires ((Requires) node);
 | |
| 				break;
 | |
| 			case NodeType.Ensures:
 | |
| 				VisitEnsures ((Ensures) node);
 | |
| 				break;
 | |
| 			case NodeType.TypeNode:
 | |
| 				VisitTypeNode ((TypeNode) node);
 | |
| 				break;
 | |
| 			case NodeType.Assembly:
 | |
| 				VisitAssembly ((AssemblyNode) node);
 | |
| 				break;
 | |
| 			case NodeType.Module:
 | |
| 				VisitModule ((Module) node);
 | |
| 				break;
 | |
| 			case NodeType.MemberBinding:
 | |
| 				VisitMemberBinding ((MemberBinding) node);
 | |
| 				break;
 | |
| 			case NodeType.Construct:
 | |
| 				VisitConstruct ((Construct) node);
 | |
| 				break;
 | |
| 			default:
 | |
| 				VisitUnknownNodeType (node);
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitAssembly (AssemblyNode node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitModuleList (node.Modules);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitModuleList (IEnumerable<Module> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			foreach (Module module in node)
 | |
| 				VisitModule (module);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitModule (Module node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitTypeNodeList (node.Types);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitAssignmentStatement (AssignmentStatement node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 			VisitTargetExpression (node.Target);
 | |
| 			VisitExpression (node.Source);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitBinaryExpression (BinaryExpression node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Left);
 | |
| 			VisitExpression (node.Right);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitBlock (Block node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitStatementList (node.Statements);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitStatementList (List<Statement> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++)
 | |
| 				Visit (node [i]);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitBranch (Branch node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Condition);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitConstruct (Construct node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Constructor);
 | |
| 			VisitExpressionList (node.Arguments);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitExpressionList (List<Expression> list)
 | |
| 		{
 | |
| 			if (list == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < list.Count; ++i)
 | |
| 				Visit (list [i]);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitEnsures (Ensures node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Assertion);
 | |
| 			VisitExpression (node.UserMessage);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitExpression (Expression node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			//todo: maybe there will be something
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitExpressionStatement (ExpressionStatement node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Expression);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitLiteral (Literal node)
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitLocal (Local node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitTypeNode (node.Type);
 | |
| 
 | |
| 			//todo: maybe there should be something else
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitMemberBinding (MemberBinding node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.TargetObject);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitMethod (Method node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitTypeNode (node.ReturnType);
 | |
| 			VisitParameterList (node.Parameters);
 | |
| 			VisitMethodContract (node.MethodContract);
 | |
| 			VisitBlock (node.Body);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitParameterList (List<Parameter> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++)
 | |
| 				VisitParameter (node [i]);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitMethodCall (MethodCall node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Callee);
 | |
| 			VisitExpressionList (node.Arguments);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitMethodContract (MethodContract node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitRequiresList (node.Requires);
 | |
| 			VisitEnsuresList (node.Ensures);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitEnsuresList (List<Ensures> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++)
 | |
| 				Visit (node [i]);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitRequiresList (List<Requires> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++)
 | |
| 				Visit (node [i]);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitParameter (Parameter node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitTypeNode (node.Type);
 | |
| 
 | |
| 			//todo: there may be something else
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitRequires (Requires node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Assertion);
 | |
| 			VisitExpression (node.UserMessage);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitReturn (Return node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Expression);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitTargetExpression (Expression node)
 | |
| 		{
 | |
| 			VisitExpression (node);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitThis (This node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitTypeNode (node.Type);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitTypeNode (TypeNode node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			var clazz = node as Class;
 | |
| 			if (clazz != null)
 | |
| 				VisitTypeNode (clazz.BaseType);
 | |
| 
 | |
| 			VisitPropertiesList (node.Properties);
 | |
| 			VisitMethodsList (node.Methods);
 | |
| 			VisitTypeNodeList (node.NestedTypes);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitPropertiesList (List<Property> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++) {
 | |
| 				Property property = node [i];
 | |
| 				if (property != null)
 | |
| 					Visit (node [i]);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitMethodsList (List<Method> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++) {
 | |
| 				Method method = node [i];
 | |
| 				if (method != null)
 | |
| 					Visit (node [i]);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitTypeNodeList (List<TypeNode> node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			for (int i = 0; i < node.Count; i++) {
 | |
| 				TypeNode typeNode = node [i];
 | |
| 				if (typeNode != null)
 | |
| 					Visit (typeNode);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitUnaryExpression (UnaryExpression node)
 | |
| 		{
 | |
| 			if (node == null)
 | |
| 				return;
 | |
| 
 | |
| 			VisitExpression (node.Operand);
 | |
| 		}
 | |
| 
 | |
| 		public virtual void VisitUnknownNodeType (Node node)
 | |
| 		{
 | |
| 		}
 | |
| 	}
 | |
| }
 |