From 6418a36780f0dee3f21c99b32e5f3c75aa2d385a Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Jul 2011 22:21:09 +0200 Subject: [PATCH] fix InvalidCastException in For-Next detection --- .../Visitors/CSharpToVBConverterVisitor.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs b/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs index 5dde5328e..c1334396b 100644 --- a/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs +++ b/NRefactory/ICSharpCode.NRefactory.VB/Visitors/CSharpToVBConverterVisitor.cs @@ -1088,7 +1088,7 @@ namespace ICSharpCode.NRefactory.VB.Visitors var increment = match.Get("increment").SingleOrDefault(); var factorExpr = (Expression)match.Get("factor").SingleOrDefault().AcceptVisitor(this, data); - if (increment.Operator == CSharp.AssignmentOperatorType.Add && (factorExpr is PrimitiveExpression && (int)((PrimitiveExpression)factorExpr).Value != 1)) + if (increment.Operator == CSharp.AssignmentOperatorType.Add && (factorExpr is PrimitiveExpression && !IsEqual(((PrimitiveExpression)factorExpr).Value, 1))) stepExpr = factorExpr; if (increment.Operator == CSharp.AssignmentOperatorType.Subtract) stepExpr = new UnaryOperatorExpression(UnaryOperatorType.Minus, factorExpr); @@ -1113,6 +1113,28 @@ namespace ICSharpCode.NRefactory.VB.Visitors return EndNode(forStatement, stmt); } + bool IsEqual(object value, int num) + { + if (value is byte) + return (byte)value == num; + if (value is sbyte) + return (sbyte)value == num; + if (value is short) + return (short)value == num; + if (value is ushort) + return (ushort)value == num; + if (value is int) + return (int)value == num; + if (value is uint) + return (uint)value == num; + if (value is long) + return (long)value == num; + if (value is ulong) + return (ulong)value == (ulong)num; + + throw new InvalidCastException(); + } + public AstNode VisitGotoCaseStatement(CSharp.GotoCaseStatement gotoCaseStatement, object data) { throw new NotImplementedException();