public override object VisitOperatorDeclaration (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration, object data)
			{
				DomMethod method = new DomMethod ();
				method.Name = GetOperatorName (operatorDeclaration);
				method.Documentation = RetrieveDocumentation (operatorDeclaration.StartLocation.Line);
				method.Location = ConvertLocation (operatorDeclaration.StartLocation);
				method.BodyRegion = ConvertRegion (operatorDeclaration.EndLocation, operatorDeclaration.Body != null ? operatorDeclaration.Body.EndLocation : new ICSharpCode.NRefactory.Location (-1, -1));
				method.Modifiers = ConvertModifiers (operatorDeclaration.Modifier) | Modifiers.SpecialName;
				if (operatorDeclaration.IsExtensionMethod)
					method.MethodModifier |= MethodModifier.IsExtension;
				method.ReturnType = ConvertReturnType (operatorDeclaration.TypeReference);
				AddAttributes (method, operatorDeclaration.Attributes);
				method.Add (ConvertParameterList (method, operatorDeclaration.Parameters));
				AddExplicitInterfaces (method, operatorDeclaration.InterfaceImplementations);

				if (operatorDeclaration.Templates != null && operatorDeclaration.Templates.Count > 0) {
					foreach (ICSharpCode.NRefactory.Ast.TemplateDefinition td in operatorDeclaration.Templates) {
						method.AddTypeParameter (ConvertTemplateDefinition (td));
					}
				}
				method.DeclaringType = typeStack.Peek ();
				typeStack.Peek ().Add (method);

				return null;
			}
			static string GetOperatorName (ICSharpCode.NRefactory.Ast.OperatorDeclaration operatorDeclaration)
			{
				if (operatorDeclaration == null)
					return null;
				bool isBinary = operatorDeclaration.Parameters.Count == 2;
				switch (operatorDeclaration.OverloadableOperator) {
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.UnaryMinus:
					return "op_UnaryNegation";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.UnaryPlus:
					return "op_UnaryPlus";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Add:
					return isBinary ? "op_Addition" : "op_UnaryPlus";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Subtract:
					return isBinary ? "op_Subtraction" : "op_UnaryNegation";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Multiply:
					return "op_Multiply";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Divide:
					return "op_Division";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Modulus:
					return "op_Modulus";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Not:
					return "op_LogicalNot";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitNot:
					return "op_OnesComplement";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitwiseAnd:
					return "op_BitwiseAnd";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.BitwiseOr:
					return "op_BitwiseOr";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ExclusiveOr:
					return "op_ExclusiveOr";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftLeft:
					return "op_LeftShift";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.ShiftRight:
					return "op_RightShift";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.GreaterThan:
					return "op_GreaterThan";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.GreaterThanOrEqual:
					return "op_GreaterThanOrEqual";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Equality:
					return "op_Equality";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.InEquality:
					return "op_Inequality";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.LessThan:
					return "op_LessThan";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.LessThanOrEqual:
					return "op_LessThanOrEqual";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Increment:
					return "op_Increment";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.Decrement:
					return "op_Decrement";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsTrue:
					return "op_True";
				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.IsFalse:
					return "op_False";

				case ICSharpCode.NRefactory.Ast.OverloadableOperatorType.None:
					switch (operatorDeclaration.ConversionType) {
					case ICSharpCode.NRefactory.Ast.ConversionType.Implicit:
						return "op_Implicit";
					case ICSharpCode.NRefactory.Ast.ConversionType.Explicit:
						return "op_Explicit";
					}
					break;
				}
				return null;
			}