Browse Source

- added ThrowStatement and TryStatement

- added more unit tests
- fixed bugs in XML mode detection in Case clauses

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@5976 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
037707520e
  1. 26
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg
  2. 1719
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs
  3. 2
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs
  4. 167
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs

26
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/ExpressionFinder.atg

@ -521,6 +521,8 @@ Statement = @@ -521,6 +521,8 @@ Statement =
| DoLoopStatement
| ForStatement
| ErrorHandlingStatement
| ThrowStatement
| TryStatement
| InvocationStatement
.
@ -564,10 +566,10 @@ MultilineIfRemainder = @@ -564,10 +566,10 @@ MultilineIfRemainder =
SelectStatement =
"Select" [ "Case" ] Expression StatementTerminator
{
"Case" (
"Case" (. nextTokenIsPotentialStartOfXmlMode = true; .) (
"Else" |
( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression )
{ "," ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) }
{ "," (. nextTokenIsPotentialStartOfXmlMode = true; .) ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) }
)
StatementTerminatorAndBlock
}
@ -622,6 +624,26 @@ ErrorHandlingStatement = @@ -622,6 +624,26 @@ ErrorHandlingStatement =
| "Resume" ( "Next" | LiteralInteger | Identifier )
.
ThrowStatement =
"Throw" (. nextTokenIsPotentialStartOfXmlMode = true; .) [ Expression ]
.
TryStatement =
"Try"
StatementTerminatorAndBlock
{
"Catch"
[ Identifier [ "As" TypeName ] ]
[ "When" Expression ]
StatementTerminatorAndBlock
}
[
"Finally"
StatementTerminatorAndBlock
]
"End" "Try"
.
InvocationStatement =
[ "Call" ] Expression
.

1719
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Parser.cs

File diff suppressed because it is too large Load Diff

2
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/ParserTests.cs

@ -14,7 +14,7 @@ using VB = ICSharpCode.NRefactory.Parser.VB; @@ -14,7 +14,7 @@ using VB = ICSharpCode.NRefactory.Parser.VB;
using ICSharpCode.NRefactory.Parser.VBNet.Experimental;
using NUnit.Framework;
namespace VBParserExperiment.Tests
namespace VBParserExperiment
{
[TestFixture]
public class ParserTests

167
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Experimental/Test/XmlModeLexerTests.cs

@ -496,6 +496,173 @@ Next <Test />"; @@ -496,6 +496,173 @@ Next <Test />";
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement()
{
string statement = @"While <Test />
End While";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.End, Tokens.While
);
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement2()
{
string statement = @"Do While <Test />
Loop";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Loop
);
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement3()
{
string statement = @"Do
Loop While <Test />";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.EOL,
Tokens.Loop, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void UntilLoopStatement()
{
string statement = @"Do Until <Test />
Loop";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.Until, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Loop
);
CheckFoot(lexer);
}
[Test]
public void UntilLoopStatement2()
{
string statement = @"Do
Loop Until <Test />";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.EOL,
Tokens.Loop, Tokens.Until, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void IfStatementLarge()
{
string statement = @"If <Test /> Then
Else If <Test /> Then
ElseIf <Test></Test> Then
Else
End If";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.If, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Then, Tokens.EOL,
Tokens.Else, Tokens.If, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Then, Tokens.EOL,
Tokens.ElseIf, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.Then, Tokens.EOL,
Tokens.Else, Tokens.EOL,
Tokens.End, Tokens.If
);
CheckFoot(lexer);
}
[Test]
public void SelectStatement()
{
string statement = @"Select Case <Test />
Case <Test />, <Test />
Case Else
End Select";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Select, Tokens.Case, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Case, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Case, Tokens.Else, Tokens.EOL,
Tokens.End, Tokens.Select
);
CheckFoot(lexer);
}
[Test]
public void TryStatement()
{
string statement = @"Try
Catch x
Catch y As Exception
Catch When <Test />
Finally
End Try";
ILexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Try, Tokens.EOL,
Tokens.Catch, Tokens.Identifier, Tokens.EOL,
Tokens.Catch, Tokens.Identifier, Tokens.As, Tokens.Identifier, Tokens.EOL,
Tokens.Catch, Tokens.When, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Finally, Tokens.EOL,
Tokens.End, Tokens.Try
);
CheckFoot(lexer);
}
[Test]
public void ThrowStatement()
{
ILexer lexer = GenerateLexer(new StringReader(TestStatement("Throw <Test />")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Throw, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement);
CheckFoot(lexer);
}
#endregion
#region Helpers

Loading…
Cancel
Save