Browse Source

Fixed NRefactory bugs regarding "else if"-statements.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1014 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
9833db1c49
  1. 14
      src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorStatements.cs
  2. 7
      src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/StatementTests.cs
  3. 40
      src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs
  4. 812
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  5. 67
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  6. 16
      src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs
  7. 12
      src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs
  8. 52
      src/Libraries/NRefactory/Test/Parser/Statements/IfElseStatementTests.cs

14
src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitorStatements.cs

@ -400,17 +400,25 @@ namespace NRefactoryToBooConverter
public object Visit(IfElseStatement ifElseStatement, object data) public object Visit(IfElseStatement ifElseStatement, object data)
{ {
B.IfStatement ifs = new B.IfStatement(GetLexicalInfo(ifElseStatement)); B.IfStatement ifs = new B.IfStatement(GetLexicalInfo(ifElseStatement));
B.IfStatement outerIf = ifs;
ifs.EndSourceLocation = GetLocation(ifElseStatement.EndLocation); ifs.EndSourceLocation = GetLocation(ifElseStatement.EndLocation);
ifs.Condition = ConvertExpression(ifElseStatement.Condition); ifs.Condition = ConvertExpression(ifElseStatement.Condition);
ifs.TrueBlock = ConvertBlock(ifElseStatement.TrueStatement); ifs.TrueBlock = ConvertBlock(ifElseStatement.TrueStatement);
if (ifElseStatement.HasElseIfSections) { if (ifElseStatement.HasElseIfSections) {
// TODO: implement elseif foreach (ElseIfSection sec in ifElseStatement.ElseIfSections) {
AddError(ifElseStatement, "ElseIfSections are not supported (because Daniel was lazy)"); B.IfStatement elif = new B.IfStatement(GetLexicalInfo(sec));
elif.EndSourceLocation = GetLocation(sec.EndLocation);
elif.Condition = ConvertExpression(sec.Condition);
elif.TrueBlock = ConvertBlock(sec.EmbeddedStatement);
ifs.FalseBlock = new B.Block();
ifs.FalseBlock.Add(elif);
ifs = elif;
}
} }
if (ifElseStatement.HasElseStatements) { if (ifElseStatement.HasElseStatements) {
ifs.FalseBlock = ConvertBlock(ifElseStatement.FalseStatement); ifs.FalseBlock = ConvertBlock(ifElseStatement.FalseStatement);
} }
return ifs; return outerIf;
} }
public object Visit(ElseIfSection elseIfSection, object data) public object Visit(ElseIfSection elseIfSection, object data)

7
src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Test/StatementTests.cs

@ -25,6 +25,13 @@ namespace NRefactoryToBooConverter.Tests
TestStatement("if (a) B(); else C();", "if a:\n\tB()\nelse:\n\tC()"); TestStatement("if (a) B(); else C();", "if a:\n\tB()\nelse:\n\tC()");
} }
[Test]
public void IfElseIfElseStatement()
{
TestStatement("if (a) C(); else if (b) D(); else E();",
"if a:\n\tC()\nelse:\n\tif b:\n\t\tD()\n\telse:\n\t\tE()");
}
[Test] [Test]
public void ForLoop() public void ForLoop()
{ {

40
src/Libraries/NRefactory/Project/Src/Output/CSharp/CSharpOutputVisitor.cs

@ -1017,15 +1017,8 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
outputFormatter.PrintToken(Tokens.OpenParenthesis); outputFormatter.PrintToken(Tokens.OpenParenthesis);
nodeTracker.TrackedVisit(ifElseStatement.Condition, data); nodeTracker.TrackedVisit(ifElseStatement.Condition, data);
outputFormatter.PrintToken(Tokens.CloseParenthesis); outputFormatter.PrintToken(Tokens.CloseParenthesis);
if (ifElseStatement.TrueStatement.Count > 1) {
outputFormatter.PrintToken(Tokens.OpenCurlyBrace); PrintIfSection(ifElseStatement.TrueStatement);
}
foreach (Statement stmt in ifElseStatement.TrueStatement) {
nodeTracker.TrackedVisit(stmt, data);
}
if (ifElseStatement.TrueStatement.Count > 1) {
outputFormatter.PrintToken(Tokens.CloseCurlyBrace);
}
foreach (ElseIfSection elseIfSection in ifElseStatement.ElseIfSections) { foreach (ElseIfSection elseIfSection in ifElseStatement.ElseIfSections) {
nodeTracker.TrackedVisit(elseIfSection, data); nodeTracker.TrackedVisit(elseIfSection, data);
@ -1034,20 +1027,31 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
if (ifElseStatement.HasElseStatements) { if (ifElseStatement.HasElseStatements) {
outputFormatter.Indent(); outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.Else); outputFormatter.PrintToken(Tokens.Else);
if (ifElseStatement.FalseStatement.Count > 1) { PrintIfSection(ifElseStatement.FalseStatement);
outputFormatter.PrintToken(Tokens.OpenCurlyBrace);
}
foreach (Statement stmt in ifElseStatement.FalseStatement) {
nodeTracker.TrackedVisit(stmt, data);
}
if (ifElseStatement.FalseStatement.Count > 1) {
outputFormatter.PrintToken(Tokens.CloseCurlyBrace);
}
} }
return null; return null;
} }
void PrintIfSection(List<Statement> statements)
{
if (statements.Count != 1 || !(statements[0] is BlockStatement)) {
outputFormatter.Space();
}
if (statements.Count != 1) {
outputFormatter.PrintToken(Tokens.OpenCurlyBrace);
}
foreach (Statement stmt in statements) {
nodeTracker.TrackedVisit(stmt, null);
}
if (statements.Count != 1) {
outputFormatter.PrintToken(Tokens.CloseCurlyBrace);
}
if (statements.Count != 1 || !(statements[0] is BlockStatement)) {
outputFormatter.Space();
}
}
public object Visit(ElseIfSection elseIfSection, object data) public object Visit(ElseIfSection elseIfSection, object data)
{ {
outputFormatter.PrintToken(Tokens.Else); outputFormatter.PrintToken(Tokens.Else);

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

File diff suppressed because it is too large Load Diff

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

@ -1860,63 +1860,72 @@ EmbeddedStatement<out Statement statement>
statement = null; statement = null;
.) .)
= =
Block<out statement> Block<out statement>
/*--- empty statement: */ /*--- empty statement: */
| ";" (. statement = new EmptyStatement(); .) | ";" (. statement = new EmptyStatement(); .)
/*--- checked / unchecked statement: */ /*--- checked / unchecked statement: */
| IF (UnCheckedAndLBrace()) (. Statement block; bool isChecked = true; .) | IF (UnCheckedAndLBrace()) (. Statement block; bool isChecked = true; .)
("checked" | "unchecked" (. isChecked = false;.) ) ("checked" | "unchecked" (. isChecked = false;.) )
Block<out block> (. statement = isChecked ? (Statement)new CheckedStatement(block) : (Statement)new UncheckedStatement(block); .) Block<out block> (. statement = isChecked ? (Statement)new CheckedStatement(block) : (Statement)new UncheckedStatement(block); .)
/*--- selection statements (if, switch): */ /*--- selection statements (if, switch): */
| "if" (. Statement elseStatement = null; .) | "if" (. Statement elseStatement = null; .)
"(" Expr<out expr> ")" "(" Expr<out expr> ")"
EmbeddedStatement<out embeddedStatement> EmbeddedStatement<out embeddedStatement>
[ "else" EmbeddedStatement<out elseStatement> ] [ "else" EmbeddedStatement<out elseStatement> ]
(. statement = elseStatement != null ? (Statement)new IfElseStatement(expr, embeddedStatement, elseStatement) : (Statement)new IfElseStatement(expr, embeddedStatement); .) (. statement = elseStatement != null ? new IfElseStatement(expr, embeddedStatement, elseStatement) : new IfElseStatement(expr, embeddedStatement); .)
| "switch" (. List<SwitchSection> switchSections = new List<SwitchSection>(); SwitchSection switchSection; .) (. if (elseStatement is IfElseStatement && (elseStatement as IfElseStatement).TrueStatement.Count == 1) {
/* else if-section (otherwise we would have a BlockStatment) */
(statement as IfElseStatement).ElseIfSections.Add(
new ElseIfSection((elseStatement as IfElseStatement).Condition,
(elseStatement as IfElseStatement).TrueStatement[0]));
(statement as IfElseStatement).ElseIfSections.AddRange((elseStatement as IfElseStatement).ElseIfSections);
(statement as IfElseStatement).FalseStatement = (elseStatement as IfElseStatement).FalseStatement;
} .)
| "switch" (. List<SwitchSection> switchSections = new List<SwitchSection>(); SwitchSection switchSection; .)
"(" Expr<out expr> ")" "(" Expr<out expr> ")"
"{" { SwitchSection<out switchSection> (. switchSections.Add(switchSection); .) } "{" { SwitchSection<out switchSection> (. switchSections.Add(switchSection); .) }
"}" (. statement = new SwitchStatement(expr, switchSections); .) "}" (. statement = new SwitchStatement(expr, switchSections); .)
/*--- iteration statements (while, do, for, foreach): */ /*--- iteration statements (while, do, for, foreach): */
| "while" "(" Expr<out expr> ")" | "while" "(" Expr<out expr> ")"
EmbeddedStatement<out embeddedStatement> (. statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start);.) EmbeddedStatement<out embeddedStatement> (. statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.Start);.)
| "do" EmbeddedStatement<out embeddedStatement> "while" | "do" EmbeddedStatement<out embeddedStatement> "while"
"(" Expr<out expr> ")" ";" (. statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.End); .) "(" Expr<out expr> ")" ";" (. statement = new DoLoopStatement(expr, embeddedStatement, ConditionType.While, ConditionPosition.End); .)
| "for" (. List<Statement> initializer = null; List<Statement> iterator = null; .) | "for" (. List<Statement> initializer = null; List<Statement> iterator = null; .)
"(" [ ForInitializer<out initializer> ] ";" "(" [ ForInitializer<out initializer> ] ";"
[ Expr<out expr> ] ";" [ Expr<out expr> ] ";"
[ ForIterator<out iterator> ] ")" [ ForIterator<out iterator> ] ")"
EmbeddedStatement<out embeddedStatement> (. statement = new ForStatement(initializer, expr, iterator, embeddedStatement); .) EmbeddedStatement<out embeddedStatement> (. statement = new ForStatement(initializer, expr, iterator, embeddedStatement); .)
| "foreach" "(" Type<out type> ident (. string varName = t.val; Point start = t.Location;.) | "foreach" "(" Type<out type> ident (. string varName = t.val; Point start = t.Location;.)
"in" Expr<out expr> ")" "in" Expr<out expr> ")"
EmbeddedStatement<out embeddedStatement> (. statement = new ForeachStatement(type, varName , expr, embeddedStatement); EmbeddedStatement<out embeddedStatement> (. statement = new ForeachStatement(type, varName , expr, embeddedStatement);
statement.EndLocation = t.EndLocation; statement.EndLocation = t.EndLocation;
.) .)
/*--- jump statements (break, contine, goto, return, throw): */ /*--- jump statements (break, contine, goto, return, throw): */
| "break" ";" (. statement = new BreakStatement(); .) | "break" ";" (. statement = new BreakStatement(); .)
| "continue" ";" (. statement = new ContinueStatement(); .) | "continue" ";" (. statement = new ContinueStatement(); .)
| GotoStatement<out statement> | GotoStatement<out statement>
| IF (IsYieldStatement()) ident ( "return" Expr<out expr> (. statement = new YieldStatement(new ReturnStatement(expr)); .) | IF (IsYieldStatement()) ident ( "return" Expr<out expr> (. statement = new YieldStatement(new ReturnStatement(expr)); .)
| "break" (. statement = new YieldStatement(new BreakStatement()); .) ) ";" | "break" (. statement = new YieldStatement(new BreakStatement()); .) ) ";"
| "return" [ Expr<out expr> ] ";" (. statement = new ReturnStatement(expr); .) | "return" [ Expr<out expr> ] ";" (. statement = new ReturnStatement(expr); .)
| "throw" [ Expr<out expr> ] ";" (. statement = new ThrowStatement(expr); .) | "throw" [ Expr<out expr> ] ";" (. statement = new ThrowStatement(expr); .)
/*--- expression statement: */
| StatementExpr<out statement> ";" /*--- expression statement: */
/*--- try statement: */ | StatementExpr<out statement> ";"
| TryStatement<out statement> /*--- try statement: */
/*--- lock satement: */ | TryStatement<out statement>
| "lock" "(" Expr<out expr> ")" /*--- lock satement: */
EmbeddedStatement<out embeddedStatement> (. statement = new LockStatement(expr, embeddedStatement); .) | "lock" "(" Expr<out expr> ")"
/*--- using statement: */ EmbeddedStatement<out embeddedStatement> (. statement = new LockStatement(expr, embeddedStatement); .)
| (.Statement resourceAcquisitionStmt = null; .) /*--- using statement: */
| (.Statement resourceAcquisitionStmt = null; .)
"using" "(" "using" "("
ResourceAcquisition<out resourceAcquisitionStmt> ")" ResourceAcquisition<out resourceAcquisitionStmt> ")"
EmbeddedStatement<out embeddedStatement> (. statement = new UsingStatement(resourceAcquisitionStmt, embeddedStatement); .) EmbeddedStatement<out embeddedStatement> (. statement = new UsingStatement(resourceAcquisitionStmt, embeddedStatement); .)
/*--- unsafe statement: */ /*--- unsafe statement: */
| "unsafe" Block<out embeddedStatement> (. statement = new UnsafeStatement(embeddedStatement); .) | "unsafe" Block<out embeddedStatement> (. statement = new UnsafeStatement(embeddedStatement); .)
/*--- fixed statement: */ /*--- fixed statement: */
| "fixed" | "fixed"
"(" Type<out type> (. if (type.PointerNestingLevel == 0) Error("can only fix pointer types"); "(" Type<out type> (. if (type.PointerNestingLevel == 0) Error("can only fix pointer types");
List<VariableDeclaration> pointerDeclarators = new List<VariableDeclaration>(1); List<VariableDeclaration> pointerDeclarators = new List<VariableDeclaration>(1);
.) .)

16
src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs

@ -108,6 +108,22 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter
TestStatement("object[] a = new object[] {1, 2, 3};"); TestStatement("object[] a = new object[] {1, 2, 3};");
} }
[Test]
public void IfStatement()
{
TestStatement("if (a) { m1(); } else { m2(); }");
TestStatement("if (a) m1(); else m2(); ");
TestStatement("if (a) {\n" +
"\tm1();\n" +
"} else if (b) {\n" +
"\tm2();\n" +
"} else {\n" +
"\tm3();\n" +
"}");
}
[Test] [Test]
public void Assignment() public void Assignment()
{ {

12
src/Libraries/NRefactory/Test/Output/VBNet/VBNetOutputTest.cs

@ -108,6 +108,18 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter
TestStatement("Dim a As Object() = New Object(10) {}"); TestStatement("Dim a As Object() = New Object(10) {}");
} }
[Test]
public void IfStatement()
{
TestStatement("If a Then\n" +
"\tm1()\n" +
"ElseIf b Then\n" +
"\tm2()\n" +
"Else\n" +
"\tm3()\n" +
"End If");
}
[Test] [Test]
public void Assignment() public void Assignment()
{ {

52
src/Libraries/NRefactory/Test/Parser/Statements/IfElseStatementTests.cs

@ -39,6 +39,24 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]); Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]);
Assert.IsTrue(ifElseStatement.FalseStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.FalseStatement[0]); Assert.IsTrue(ifElseStatement.FalseStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.FalseStatement[0]);
} }
[Test]
public void CSharpIfElseIfStatementTest()
{
IfElseStatement ifElseStatement = ParseUtilCSharp.ParseStatement<IfElseStatement>("if (1) { } else if (2) { } else if (3) { } else { }");
Assert.IsFalse(ifElseStatement.Condition.IsNull);
Assert.IsTrue(ifElseStatement.ElseIfSections.Count == 2, "elseif section count != 2:" + ifElseStatement.ElseIfSections.Count);
Assert.IsTrue(ifElseStatement.TrueStatement.Count == 1, "true count != 1:" + ifElseStatement.TrueStatement.Count);
Assert.IsTrue(ifElseStatement.FalseStatement.Count == 1, "false count != 1:" + ifElseStatement.FalseStatement.Count);
Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]);
Assert.IsTrue(ifElseStatement.FalseStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.FalseStatement[0]);
Assert.IsTrue(ifElseStatement.ElseIfSections[0].EmbeddedStatement is BlockStatement, "Statement was: " + ifElseStatement.ElseIfSections[0].EmbeddedStatement);
Assert.IsTrue(ifElseStatement.ElseIfSections[1].EmbeddedStatement is BlockStatement, "Statement was: " + ifElseStatement.ElseIfSections[1].EmbeddedStatement);
Assert.AreEqual(2, (ifElseStatement.ElseIfSections[0].Condition as PrimitiveExpression).Value);
Assert.AreEqual(3, (ifElseStatement.ElseIfSections[1].Condition as PrimitiveExpression).Value);
}
#endregion #endregion
#region VB.NET #region VB.NET
@ -62,6 +80,38 @@ namespace ICSharpCode.NRefactory.Tests.AST
Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]); Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]);
} }
#endregion [Test]
public void VBNetElseIfStatementTest()
{
IfElseStatement ifElseStatement = ParseUtilVBNet.ParseStatement<IfElseStatement>("If True THEN\n" +
"END\n" +
"ElseIf False Then\n" +
"Stop\n" +
"End If");
Assert.IsFalse(ifElseStatement.Condition.IsNull);
Assert.IsTrue(ifElseStatement.TrueStatement.Count == 1, "true count != 1:" + ifElseStatement.TrueStatement.Count);
Assert.IsTrue(ifElseStatement.FalseStatement.Count == 0, "false count != 0:" + ifElseStatement.FalseStatement.Count);
Assert.IsFalse((bool)(ifElseStatement.ElseIfSections[0].Condition as PrimitiveExpression).Value);
Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]);
Assert.IsTrue(ifElseStatement.ElseIfSections[0].EmbeddedStatement.Children[0] is StopStatement, "Statement was: " + ifElseStatement.ElseIfSections[0].EmbeddedStatement.Children[0]);
}
[Test]
public void VBNetElse_IfStatementTest()
{
IfElseStatement ifElseStatement = ParseUtilVBNet.ParseStatement<IfElseStatement>("If True THEN\n" +
"END\n" +
"Else If False Then\n" +
"Stop\n" +
"End If");
Assert.IsFalse(ifElseStatement.Condition.IsNull);
Assert.IsTrue(ifElseStatement.TrueStatement.Count == 1, "true count != 1:" + ifElseStatement.TrueStatement.Count);
Assert.IsTrue(ifElseStatement.FalseStatement.Count == 0, "false count != 0:" + ifElseStatement.FalseStatement.Count);
Assert.IsFalse((bool)(ifElseStatement.ElseIfSections[0].Condition as PrimitiveExpression).Value);
Assert.IsTrue(ifElseStatement.TrueStatement[0] is BlockStatement, "Statement was: " + ifElseStatement.TrueStatement[0]);
Assert.IsTrue(ifElseStatement.ElseIfSections[0].EmbeddedStatement.Children[0] is StopStatement, "Statement was: " + ifElseStatement.ElseIfSections[0].EmbeddedStatement.Children[0]);
}
#endregion
} }
} }

Loading…
Cancel
Save