Browse Source

VB parser: Declarations in the form "Dim a(10) As Integer" were not recognized as array declarations.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@370 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
e0676ea1c7
  1. 22
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Expressions/Expression.cs
  2. 1327
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  3. 11
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  4. 24
      src/Libraries/NRefactory/Project/Src/Parser/Visitors/CSharpToVBNetConvertVisitor.cs
  5. 25
      src/Libraries/NRefactory/Test/Parser/Statements/LocalVariableDeclarationTests.cs

22
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Expressions/Expression.cs

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
using System;
using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
namespace ICSharpCode.NRefactory.Parser.AST
{
public abstract class Expression : AbstractNode, INullable
{
@ -28,6 +28,26 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -28,6 +28,26 @@ namespace ICSharpCode.NRefactory.Parser.AST
{
return expression == null ? NullExpression.Instance : expression;
}
/// <summary>
/// Returns the existing expression plus the specified integer value.
/// WARNING: This method modifies <paramref name="expr"/> and possibly returns <paramref name="expr"/>
/// again, but it might also create a new expression around <paramref name="expr"/>.
/// </summary>
public static Expression AddInteger(Expression expr, int value)
{
PrimitiveExpression pe = expr as PrimitiveExpression;
if (pe != null && pe.Value is int) {
int newVal = (int)pe.Value + value;
return new PrimitiveExpression(newVal, newVal.ToString(System.Globalization.NumberFormatInfo.InvariantInfo));
}
BinaryOperatorExpression boe = expr as BinaryOperatorExpression;
if (boe != null) {
boe.Right = AddInteger(boe.Right, value);
return boe;
}
return new BinaryOperatorExpression(expr, BinaryOperatorType.Add, new PrimitiveExpression(value, value.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)));
}
}
public class NullExpression : Expression

1327
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

11
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -1498,6 +1498,17 @@ VariableDeclarator<List<VariableDeclaration> fieldDeclaration> @@ -1498,6 +1498,17 @@ VariableDeclarator<List<VariableDeclaration> fieldDeclaration>
} else {
type.RankSpecifier = (int[])rank.ToArray(typeof(int));
}
} else if (type != null && dimension != null) {
if(type.RankSpecifier != null) {
Error("array rank only allowed one time");
} else {
type.RankSpecifier = new int[] { dimension.Count - 1 };
for (int i = 0; i < dimension.Count; i++)
dimension[i] = Expression.AddInteger((Expression)dimension[i], 1);
rank = new ArrayList();
rank.Add(new ArrayCreationParameter(dimension));
expr = new ArrayCreateExpression(type, rank);
}
}
.)
[ "=" VariableInitializer<out expr> ]

24
src/Libraries/NRefactory/Project/Src/Parser/Visitors/CSharpToVBNetConvertVisitor.cs

@ -188,7 +188,7 @@ namespace ICSharpCode.NRefactory.Parser @@ -188,7 +188,7 @@ namespace ICSharpCode.NRefactory.Parser
if (condition.Op == BinaryOperatorType.GreaterThanOrEqual) {
end = condition.Right;
} else if (condition.Op == BinaryOperatorType.GreaterThan) {
end = AddInteger(condition.Right, 1);
end = Expression.AddInteger(condition.Right, 1);
} else {
return;
}
@ -196,7 +196,7 @@ namespace ICSharpCode.NRefactory.Parser @@ -196,7 +196,7 @@ namespace ICSharpCode.NRefactory.Parser
if (condition.Op == BinaryOperatorType.LessThanOrEqual) {
end = condition.Right;
} else if (condition.Op == BinaryOperatorType.LessThan) {
end = AddInteger(condition.Right, -1);
end = Expression.AddInteger(condition.Right, -1);
} else {
return;
}
@ -232,25 +232,5 @@ namespace ICSharpCode.NRefactory.Parser @@ -232,25 +232,5 @@ namespace ICSharpCode.NRefactory.Parser
forStatement.EmbeddedStatement, null);
forStatement.Parent.Children[forStatement.Parent.Children.IndexOf(forStatement)] = forNextStatement;
}
/// <summary>
/// Returns the existing expression plus the specified integer value.
/// WARNING: This method modifies <paramref name="expr"/> and possibly returns <paramref name="expr"/>
/// again, but it might also create a new expression around <paramref name="expr"/>.
/// </summary>
public static Expression AddInteger(Expression expr, int value)
{
PrimitiveExpression pe = expr as PrimitiveExpression;
if (pe != null && pe.Value is int) {
int newVal = (int)pe.Value + value;
return new PrimitiveExpression(newVal, newVal.ToString(System.Globalization.NumberFormatInfo.InvariantInfo));
}
BinaryOperatorExpression boe = expr as BinaryOperatorExpression;
if (boe != null) {
boe.Right = AddInteger(boe.Right, value);
return boe;
}
return new BinaryOperatorExpression(expr, BinaryOperatorType.Add, new PrimitiveExpression(value, value.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)));
}
}
}

25
src/Libraries/NRefactory/Test/Parser/Statements/LocalVariableDeclarationTests.cs

@ -26,7 +26,7 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -26,7 +26,7 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.AreEqual("a", ((VariableDeclaration)lvd.Variables[0]).Name);
TypeReference type = lvd.GetTypeForVariable(0);
Assert.AreEqual("int", type.Type);
// TODO: Check initializer
Assert.AreEqual(5, ((PrimitiveExpression)lvd.Variables[0].Initializer).Value);
}
[Test]
@ -190,18 +190,35 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -190,18 +190,35 @@ namespace ICSharpCode.NRefactory.Tests.AST
{
LocalVariableDeclaration lvd = (LocalVariableDeclaration)ParseUtilVBNet.ParseStatment("Dim a As Integer = 5", typeof(LocalVariableDeclaration));
Assert.AreEqual(1, lvd.Variables.Count);
Assert.AreEqual("a", ((VariableDeclaration)lvd.Variables[0]).Name);
Assert.AreEqual("a", lvd.Variables[0].Name);
TypeReference type = lvd.GetTypeForVariable(0);
Assert.AreEqual("Integer", type.Type);
// TODO: Check initializer
Assert.AreEqual(5, ((PrimitiveExpression)lvd.Variables[0].Initializer).Value);
}
[Test]
public void VBNetLocalArrayDeclarationTest()
{
LocalVariableDeclaration lvd = (LocalVariableDeclaration)ParseUtilVBNet.ParseStatment("Dim a(10) As Integer", typeof(LocalVariableDeclaration));
Assert.AreEqual(1, lvd.Variables.Count);
Assert.AreEqual("a", lvd.Variables[0].Name);
TypeReference type = lvd.GetTypeForVariable(0);
Assert.AreEqual("Integer", type.Type);
Assert.AreEqual(new int[] { 0 } , type.RankSpecifier);
ArrayCreateExpression ace = (ArrayCreateExpression)lvd.Variables[0].Initializer;
Assert.AreEqual(1, ace.Parameters.Count);
ArrayCreationParameter acp = (ArrayCreationParameter)ace.Parameters[0];
Assert.AreEqual(1, acp.Expressions.Count);
Assert.AreEqual(11, ((PrimitiveExpression)acp.Expressions[0]).Value);
}
[Test]
public void VBNetComplexGenericLocalVariableDeclarationTest()
{
LocalVariableDeclaration lvd = (LocalVariableDeclaration)ParseUtilVBNet.ParseStatment("Dim where As Generic(Of Printable, G(Of Printable()))", typeof(LocalVariableDeclaration));
Assert.AreEqual(1, lvd.Variables.Count);
Assert.AreEqual("where", ((VariableDeclaration)lvd.Variables[0]).Name);
Assert.AreEqual("where", lvd.Variables[0].Name);
TypeReference type = lvd.GetTypeForVariable(0);
Assert.AreEqual("Generic", type.Type);
Assert.AreEqual(2, type.GenericTypes.Count);

Loading…
Cancel
Save