Browse Source

Fixed two bugs in the C# to VB converter.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@726 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
ae264e9aff
  1. 4
      src/Libraries/NRefactory/NRefactory.sln
  2. 1
      src/Libraries/NRefactory/Project/NRefactory.csproj
  3. 110
      src/Libraries/NRefactory/Project/Src/Main.cs
  4. 25
      src/Libraries/NRefactory/Project/Src/Parser/AST/CSharp/Statements/FixedStatement.cs
  5. 14
      src/Libraries/NRefactory/Project/Src/Parser/AST/CSharp/Statements/UsingStatement.cs
  6. 27
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Expressions/Expression.cs
  7. 12
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/DoLoopStatement.cs
  8. 14
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/ForStatement.cs
  9. 18
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/ForeachStatement.cs
  10. 14
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/IfElseStatement.cs
  11. 13
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/LockStatement.cs
  12. 31
      src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/Statement.cs
  13. 14
      src/Libraries/NRefactory/Project/Src/Parser/AST/VBNet/Statements/ForNextStatement.cs
  14. 13
      src/Libraries/NRefactory/Project/Src/Parser/AST/VBNet/Statements/OnErrorStatement.cs
  15. 2
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  16. 2
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  17. 3
      src/Libraries/NRefactory/Project/Src/Parser/Visitors/CSharpToVBNetConvertVisitor.cs
  18. 46
      src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs
  19. 16
      src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs
  20. 8
      src/Libraries/NRefactory/Test/Parser/ParseUtilVBNet.cs

4
src/Libraries/NRefactory/NRefactory.sln

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.0.0.382
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.0.0.724
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryTests", "Test\NRefactoryTests.csproj", "{870115DD-960A-4406-A6B9-600BCDC36A03}"

1
src/Libraries/NRefactory/Project/NRefactory.csproj

@ -68,7 +68,6 @@ @@ -68,7 +68,6 @@
<Compile Include="Src\Lexer\VBNet\Keywords.cs" />
<Compile Include="Src\Lexer\VBNet\Lexer.cs" />
<Compile Include="Src\Lexer\VBNet\Tokens.cs" />
<Compile Include="Src\Main.cs" />
<Compile Include="Src\Output\AbstractOutputFormatter.cs" />
<Compile Include="Src\Output\AbstractPrettyPrintOptions.cs" />
<Compile Include="Src\Output\CodeDOM\CodeDOMOutputVisitor.cs" />

110
src/Libraries/NRefactory/Project/Src/Main.cs

@ -1,110 +0,0 @@ @@ -1,110 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.IO;
using System.Collections;
using System.Collections.Specialized;
using ICSharpCode.NRefactory.Parser;
namespace ICSharpCode.NRefactory
{
/// <summary>
/// Description of Main.
/// </summary>
public class MainClass
{
public static ArrayList SearchDirectory(string directory, string filemask)
{
return SearchDirectory(directory, filemask, true);
}
public static ArrayList SearchDirectory(string directory, string filemask, bool searchSubdirectories)
{
ArrayList collection = new ArrayList();
SearchDirectory(directory, filemask, collection, searchSubdirectories);
return collection;
}
/// <summary>
/// Finds all files which are valid to the mask <code>filemask</code> in the path
/// <code>directory</code> and all subdirectories (if searchSubdirectories
/// is true. The found files are added to the ArrayList
/// <code>collection</code>.
/// </summary>
static void SearchDirectory(string directory, string filemask, ArrayList collection, bool searchSubdirectories)
{
try {
string[] file = Directory.GetFiles(directory, filemask);
foreach (string f in file) {
collection.Add(f);
}
if (searchSubdirectories) {
string[] dir = Directory.GetDirectories(directory);
foreach (string d in dir) {
try {
SearchDirectory(d, filemask, collection, searchSubdirectories);
} catch (Exception) {}
}
}
} catch (Exception) {
}
}
public static void Main(string[] args)
{
// string program = @"
//public class SimpleHandler {
//
// public void ProcessRequest(HttpContext context) {
// labelDate.Text = 123456789.ToString();
// }
//
//}
//";
IParser parser = ParserFactory.CreateParser(@"c:\Dokumente und Einstellungen\Markus\Desktop\CustomEvents.vb");
parser.Parse();
if (parser.Errors.ErrorOutput.Length > 0) {
Console.WriteLine(parser.Errors.ErrorOutput);
Console.ReadLine();
}
/*
string searchPath = @"C:\Programme\Microsoft.NET\SDK\v1.1"; //Path.GetFullPath(Application.StartupPath + @"\..\..\..\..");
ArrayList files = SearchDirectory(searchPath, "*.cs", true);
ArrayList defs = new ArrayList();
long oldSet = Environment.WorkingSet;
DateTime start = DateTime.Now;
foreach (string str in files) {
IParser parser = ParserFactory.CreateParser(str);
parser.Parse();
}
*/
}
}
}
/* Supported .NET 2.0 features
CONTINUE statement
USING statement
UInteger, ULong, UShort, SByte data type
IsNot operator
Partial classes
TODO:
Explicit Zero Lower Bound on an Array (Don't know if this requires grammar change, I've no documentation about it.)
Properties with Mixed Access Levels
Operator Overloading
Generic Types
*/

25
src/Libraries/NRefactory/Project/Src/Parser/AST/CSharp/Statements/FixedStatement.cs

@ -7,16 +7,14 @@ @@ -7,16 +7,14 @@
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class FixedStatement : Statement
public class FixedStatement : StatementWithEmbeddedStatement
{
TypeReference typeReference;
// List<VariableDeclaration> pointerDeclarators;
ArrayList pointerDeclarators;
Statement embeddedStatement;
List<VariableDeclaration> pointerDeclarators;
public TypeReference TypeReference {
get {
@ -27,25 +25,16 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -27,25 +25,16 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public ArrayList PointerDeclarators {
public List<VariableDeclaration> PointerDeclarators {
get {
return pointerDeclarators;
}
set {
pointerDeclarators = value == null ? new ArrayList(1) : value;
pointerDeclarators = value ?? new List<VariableDeclaration>(1);
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public FixedStatement(TypeReference typeReference, ArrayList pointerDeclarators, Statement embeddedStatement)
public FixedStatement(TypeReference typeReference, List<VariableDeclaration> pointerDeclarators, Statement embeddedStatement)
{
this.TypeReference = typeReference;
this.PointerDeclarators = pointerDeclarators;
@ -62,7 +51,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -62,7 +51,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
return String.Format("[FixedStatement: TypeReference={0}, PointerDeclarators={1}, EmbeddedStatement={2}]",
typeReference,
GetCollectionString(pointerDeclarators),
embeddedStatement);
EmbeddedStatement);
}
}
}

14
src/Libraries/NRefactory/Project/Src/Parser/AST/CSharp/Statements/UsingStatement.cs

@ -11,10 +11,9 @@ using System.Collections; @@ -11,10 +11,9 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class UsingStatement : Statement
public class UsingStatement : StatementWithEmbeddedStatement
{
Statement resourceAcquisition;
Statement embeddedStatement;
public Statement ResourceAcquisition {
get {
@ -25,15 +24,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -25,15 +24,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public UsingStatement(Statement resourceAcquisition, Statement embeddedStatement)
{
this.ResourceAcquisition = resourceAcquisition;
@ -49,7 +39,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -49,7 +39,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
{
return String.Format("[UsingStatement: ResourceAcquisition={0}, EmbeddedStatement={1}]",
resourceAcquisition,
embeddedStatement);
EmbeddedStatement);
}
}
}

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

@ -45,13 +45,36 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -45,13 +45,36 @@ namespace ICSharpCode.NRefactory.Parser.AST
if (boe != null && boe.Op == BinaryOperatorType.Add) {
boe.Right = AddInteger(boe.Right, value);
if (boe.Right is PrimitiveExpression && ((PrimitiveExpression)boe.Right).Value is int) {
if ((int)((PrimitiveExpression)boe.Right).Value == 0) {
int newVal = (int)((PrimitiveExpression)boe.Right).Value;
if (newVal == 0) {
return boe.Left;
} else if (newVal < 0) {
((PrimitiveExpression)boe.Right).Value = -newVal;
boe.Op = BinaryOperatorType.Subtract;
}
}
return boe;
}
return new BinaryOperatorExpression(expr, BinaryOperatorType.Add, new PrimitiveExpression(value, value.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)));
if (boe != null && boe.Op == BinaryOperatorType.Subtract) {
pe = boe.Right as PrimitiveExpression;
if (pe != null && pe.Value is int) {
int newVal = (int)pe.Value - value;
if (newVal == 0)
return boe.Left;
if (newVal < 0) {
newVal = -newVal;
boe.Op = BinaryOperatorType.Add;
}
boe.Right = new PrimitiveExpression(newVal, newVal.ToString(System.Globalization.NumberFormatInfo.InvariantInfo));
return boe;
}
}
BinaryOperatorType opType = BinaryOperatorType.Add;
if (value < 0) {
value = -value;
opType = BinaryOperatorType.Subtract;
}
return new BinaryOperatorExpression(expr, opType, new PrimitiveExpression(value, value.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)));
}
}

12
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/DoLoopStatement.cs

@ -26,10 +26,9 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -26,10 +26,9 @@ namespace ICSharpCode.NRefactory.Parser.AST
End
}
public class DoLoopStatement : Statement
public class DoLoopStatement : StatementWithEmbeddedStatement
{
Expression condition;
Statement embeddedStatement;
ConditionType conditionType;
ConditionPosition conditionPosition;
@ -60,15 +59,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -60,15 +59,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public DoLoopStatement(Expression condition, Statement embeddedStatement, ConditionType conditionType, ConditionPosition conditionPosition)
{
this.Condition = condition;

14
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/ForStatement.cs

@ -11,12 +11,11 @@ using System.Collections; @@ -11,12 +11,11 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class ForStatement : Statement
public class ForStatement : StatementWithEmbeddedStatement
{
ArrayList initializers; // EmbeddedStatement OR list of StatmentExpressions
Expression condition;
ArrayList iterator; // [Statement]
Statement embeddedStatement;
public ArrayList Initializers {
get {
@ -39,15 +38,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -39,15 +38,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public ForStatement(ArrayList initializers, Expression condition, ArrayList iterator, Statement embeddedStatement)
{
this.initializers = initializers == null ? new ArrayList(1) : initializers;
@ -68,7 +58,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -68,7 +58,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
GetCollectionString(initializers),
condition,
GetCollectionString(iterator),
embeddedStatement);
EmbeddedStatement);
}
}
}

18
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/ForeachStatement.cs

@ -11,13 +11,12 @@ using System.Collections; @@ -11,13 +11,12 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class ForeachStatement : Statement
public class ForeachStatement : StatementWithEmbeddedStatement
{
TypeReference typeReference;
string variableName;
Expression expression;
Expression nextExpression;
Statement embeddedStatement;
public TypeReference TypeReference {
get {
@ -55,17 +54,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -55,17 +54,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public ForeachStatement(TypeReference typeReference, string variableName, Expression expression, Statement embeddedStatement)
{
this.TypeReference = typeReference;
@ -81,7 +69,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -81,7 +69,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
this.variableName = variableName;
this.expression = expression;
this.nextExpression = nextExpression;
this.embeddedStatement = embeddedStatement;
this.EmbeddedStatement = embeddedStatement;
}
public override object AcceptVisitor(IASTVisitor visitor, object data)
@ -91,7 +79,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -91,7 +79,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
public override string ToString() {
return String.Format("[ForeachStatement: embeddedStatement = {0}, expression = {1}, nextExpression = {2}, typeReference = {3}, variableName = {4}]",
embeddedStatement,
EmbeddedStatement,
expression,
nextExpression,
typeReference,

14
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/IfElseStatement.cs

@ -99,10 +99,9 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -99,10 +99,9 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public class ElseIfSection : Statement
public class ElseIfSection : StatementWithEmbeddedStatement
{
Expression condition;
Statement embeddedStatement;
public Expression Condition {
get {
@ -113,15 +112,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -113,15 +112,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public ElseIfSection(Expression condition, Statement embeddedStatement)
{
this.Condition = condition;
@ -136,7 +126,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -136,7 +126,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
{
return String.Format("[ElseIfStatement: Condition={0}, EmbeddedStatement={1}]",
condition,
embeddedStatement
EmbeddedStatement
);
}
}

13
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/LockStatement.cs

@ -11,10 +11,9 @@ using System.Collections; @@ -11,10 +11,9 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class LockStatement : Statement
public class LockStatement : StatementWithEmbeddedStatement
{
Expression lockExpression;
Statement embeddedStatement;
public Expression LockExpression {
get {
@ -24,14 +23,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -24,14 +23,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
lockExpression = Expression.CheckNull(value);
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public LockStatement(Expression lockExpression, Statement embeddedStatement)
{
@ -48,7 +39,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -48,7 +39,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
{
return String.Format("[LockStatement: LockExpression={0}, EmbeddedStatement={1}]",
lockExpression,
embeddedStatement);
EmbeddedStatement);
}
}
}

31
src/Libraries/NRefactory/Project/Src/Parser/AST/General/Statements/Statement.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 Statement : AbstractNode, INullable
{
@ -28,6 +28,35 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -28,6 +28,35 @@ namespace ICSharpCode.NRefactory.Parser.AST
{
return statement == null ? NullStatement.Instance : statement;
}
public static void Replace(Statement oldStatement, Statement newStatement)
{
INode parent = oldStatement.Parent;
StatementWithEmbeddedStatement parentStmt = parent as StatementWithEmbeddedStatement;
if (parentStmt != null && parentStmt.EmbeddedStatement == oldStatement)
parentStmt.EmbeddedStatement = newStatement;
int index = parent.Children.IndexOf(oldStatement);
if (index >= 0) {
parent.Children[index] = newStatement;
newStatement.Parent = parent;
}
}
}
public abstract class StatementWithEmbeddedStatement : Statement
{
Statement embeddedStatement;
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
if (value != null)
value.Parent = this;
}
}
}
public class NullStatement : Statement

14
src/Libraries/NRefactory/Project/Src/Parser/AST/VBNet/Statements/ForNextStatement.cs

@ -10,12 +10,11 @@ using System.Collections; @@ -10,12 +10,11 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class ForNextStatement : Statement
public class ForNextStatement : StatementWithEmbeddedStatement
{
Expression start;
Expression end;
Expression step;
Statement embeddedStatement;
// List<Expression> nextExpressions;
ArrayList nextExpressions;
@ -76,15 +75,6 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -76,15 +75,6 @@ namespace ICSharpCode.NRefactory.Parser.AST
}
}
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public ForNextStatement(TypeReference typeReference, string variableName, Expression start, Expression end, Expression step, Statement embeddedStatement, ArrayList nextExpressions)
{
this.TypeReference = typeReference;
@ -107,7 +97,7 @@ namespace ICSharpCode.NRefactory.Parser.AST @@ -107,7 +97,7 @@ namespace ICSharpCode.NRefactory.Parser.AST
start,
end,
step,
embeddedStatement,
EmbeddedStatement,
GetCollectionString(nextExpressions),
VariableName,
TypeReference

13
src/Libraries/NRefactory/Project/Src/Parser/AST/VBNet/Statements/OnErrorStatement.cs

@ -11,19 +11,8 @@ using System.Collections; @@ -11,19 +11,8 @@ using System.Collections;
namespace ICSharpCode.NRefactory.Parser.AST
{
public class OnErrorStatement : Statement
public class OnErrorStatement : StatementWithEmbeddedStatement
{
Statement embeddedStatement;
public Statement EmbeddedStatement {
get {
return embeddedStatement;
}
set {
embeddedStatement = Statement.CheckNull(value);
}
}
public OnErrorStatement(Statement embeddedStatement)
{
this.EmbeddedStatement = embeddedStatement;

2
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

@ -4119,7 +4119,7 @@ out type); @@ -4119,7 +4119,7 @@ out type);
#line 1911 "cs.ATG"
if (type.PointerNestingLevel == 0) Error("can only fix pointer types");
ArrayList pointerDeclarators = new ArrayList(1);
List<VariableDeclaration> pointerDeclarators = new List<VariableDeclaration>(1);
Expect(1);

2
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -1909,7 +1909,7 @@ EmbeddedStatement<out Statement statement> @@ -1909,7 +1909,7 @@ EmbeddedStatement<out Statement statement>
/*--- fixed statement: */
| "fixed"
"(" Type<out type> (. if (type.PointerNestingLevel == 0) Error("can only fix pointer types");
ArrayList pointerDeclarators = new ArrayList(1);
List<VariableDeclaration> pointerDeclarators = new List<VariableDeclaration>(1);
.)
ident (. string identifier = t.val; .)
"=" Expr<out expr> (. pointerDeclarators.Add(new VariableDeclaration(identifier, expr)); .)

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

@ -230,7 +230,8 @@ namespace ICSharpCode.NRefactory.Parser @@ -230,7 +230,8 @@ namespace ICSharpCode.NRefactory.Parser
start, end,
(step == 1) ? null : new PrimitiveExpression(step, step.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)),
forStatement.EmbeddedStatement, null);
forStatement.Parent.Children[forStatement.Parent.Children.IndexOf(forStatement)] = forNextStatement;
Statement.Replace(forStatement, forNextStatement);
}
}
}

46
src/Libraries/NRefactory/Test/Parser/Expressions/BinaryOperatorExpressionTests.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// <file>
// <file>
// <copyright see="prj:///doc/copyright.txt">2002-2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
@ -10,6 +10,7 @@ using System.IO; @@ -10,6 +10,7 @@ using System.IO;
using NUnit.Framework;
using ICSharpCode.NRefactory.Parser;
using ICSharpCode.NRefactory.Parser.AST;
using ICSharpCode.NRefactory.PrettyPrinter;
namespace ICSharpCode.NRefactory.Tests.AST
{
@ -317,5 +318,48 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -317,5 +318,48 @@ namespace ICSharpCode.NRefactory.Tests.AST
VBNetTestBinaryOperatorExpressionTest("a Like b", BinaryOperatorType.Like);
}
#endregion
#region AddIntegerTests
string AddIntegerToBoe(string input, int number)
{
return AddInteger<BinaryOperatorExpression>(input, number);
}
string AddInteger<T>(string input, int number) where T : Expression
{
Expression e = ParseUtilCSharp.ParseExpression<T>(input);
e = Expression.AddInteger(e, number);
CSharpOutputVisitor v = new CSharpOutputVisitor();
e.AcceptVisitor(v, null);
return v.Text;
}
[Test]
public void AddInteger()
{
Assert.AreEqual("a + 2", AddIntegerToBoe("a + 1", 1));
Assert.AreEqual("a + 2", AddIntegerToBoe("a + 3", -1));
Assert.AreEqual("a + b + c + 2", AddIntegerToBoe("a + b + c + 1", 1));
Assert.AreEqual("a", AddIntegerToBoe("a + 1", -1));
Assert.AreEqual("2", AddInteger<PrimitiveExpression>("1", 1));
Assert.AreEqual("-1", AddInteger<PrimitiveExpression>("1", -2));
Assert.AreEqual("0", AddInteger<PrimitiveExpression>("1", -1));
Assert.AreEqual("a + 1", AddInteger<IdentifierExpression>("a", 1));
}
[Test]
public void AddIntegerWithNegativeResult()
{
Assert.AreEqual("a - 1", AddIntegerToBoe("a + 1", -2));
Assert.AreEqual("a - 2", AddIntegerToBoe("a - 1", -1));
Assert.AreEqual("a + b + c - 2", AddIntegerToBoe("a + b + c + 2", -4));
Assert.AreEqual("a + b + c - 6", AddIntegerToBoe("a + b + c - 2", -4));
Assert.AreEqual("a + b + c", AddIntegerToBoe("a + b + c + 2", -2));
Assert.AreEqual("a", AddIntegerToBoe("a - 1", 1));
Assert.AreEqual("a + 1", AddIntegerToBoe("a - 2", 3));
Assert.AreEqual("a - 1", AddInteger<IdentifierExpression>("a", -1));
}
#endregion
}
}

16
src/Libraries/NRefactory/Test/Parser/ParseUtilCSharp.cs

@ -18,17 +18,17 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -18,17 +18,17 @@ namespace ICSharpCode.NRefactory.Tests.AST
{
public class ParseUtilCSharp
{
public static T ParseGlobal<T>(string program)
public static T ParseGlobal<T>(string program) where T : INode
{
return ParseGlobal<T>(program, false);
}
public static T ParseGlobal<T>(string program, bool expectError)
public static T ParseGlobal<T>(string program, bool expectError) where T : INode
{
return ParseGlobal<T>(program, expectError, false);
}
public static T ParseGlobal<T>(string program, bool expectError, bool skipMethodBodies)
public static T ParseGlobal<T>(string program, bool expectError, bool skipMethodBodies) where T : INode
{
IParser parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, new StringReader(program));
parser.ParseMethodBodies = !skipMethodBodies;
@ -47,12 +47,12 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -47,12 +47,12 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)parser.CompilationUnit.Children[0];
}
public static T ParseTypeMember<T>(string typeMember)
public static T ParseTypeMember<T>(string typeMember) where T : INode
{
return ParseTypeMember<T>(typeMember, false);
}
public static T ParseTypeMember<T>(string typeMember, bool expectError)
public static T ParseTypeMember<T>(string typeMember, bool expectError) where T : INode
{
TypeDeclaration td = ParseGlobal<TypeDeclaration>("class MyClass {" + typeMember + "}", expectError);
Assert.IsTrue(td.Children.Count > 0);
@ -61,7 +61,7 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -61,7 +61,7 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)td.Children[0];
}
public static T ParseStatement<T>(string statement)
public static T ParseStatement<T>(string statement) where T : INode
{
MethodDeclaration md = ParseTypeMember<MethodDeclaration>("void A() { " + statement + " }");
Assert.IsTrue(md.Body.Children.Count > 0);
@ -70,12 +70,12 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -70,12 +70,12 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)md.Body.Children[0];
}
public static T ParseExpression<T>(string expr)
public static T ParseExpression<T>(string expr) where T : INode
{
return ParseExpression<T>(expr, false);
}
public static T ParseExpression<T>(string expr, bool expectErrors)
public static T ParseExpression<T>(string expr, bool expectErrors) where T : INode
{
IParser parser = ParserFactory.CreateParser(SupportedLanguage.CSharp, new StringReader(expr + ";"));
object parsedExpression = parser.ParseExpression();

8
src/Libraries/NRefactory/Test/Parser/ParseUtilVBNet.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -37,7 +37,7 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)parser.CompilationUnit.Children[0];
}
public static T ParseTypeMember<T>(string typeMember)
public static T ParseTypeMember<T>(string typeMember) where T : INode
{
System.Console.WriteLine("Class TestClass\n " + typeMember + "\n End Class\n");
TypeDeclaration td = ParseGlobal<TypeDeclaration>("Class TestClass\n " + typeMember + "\n End Class\n");
@ -47,7 +47,7 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -47,7 +47,7 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)td.Children[0];
}
public static T ParseStatement<T>(string statement)
public static T ParseStatement<T>(string statement) where T : INode
{
MethodDeclaration md = ParseTypeMember<MethodDeclaration>("Sub A()\n " + statement + "\nEnd Sub\n");
Assert.IsTrue(md.Body.Children.Count > 0);
@ -56,12 +56,12 @@ namespace ICSharpCode.NRefactory.Tests.AST @@ -56,12 +56,12 @@ namespace ICSharpCode.NRefactory.Tests.AST
return (T)md.Body.Children[0];
}
public static T ParseExpression<T>(string expr)
public static T ParseExpression<T>(string expr) where T : INode
{
return ParseExpression<T>(expr, false);
}
public static T ParseExpression<T>(string expr, bool expectErrors)
public static T ParseExpression<T>(string expr, bool expectErrors) where T : INode
{
IParser parser = ParserFactory.CreateParser(SupportedLanguage.VBNet, new StringReader(expr));
object parsedExpression = parser.ParseExpression();

Loading…
Cancel
Save