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 =
| DoLoopStatement | DoLoopStatement
| ForStatement | ForStatement
| ErrorHandlingStatement | ErrorHandlingStatement
| ThrowStatement
| TryStatement
| InvocationStatement | InvocationStatement
. .
@ -564,10 +566,10 @@ MultilineIfRemainder =
SelectStatement = SelectStatement =
"Select" [ "Case" ] Expression StatementTerminator "Select" [ "Case" ] Expression StatementTerminator
{ {
"Case" ( "Case" (. nextTokenIsPotentialStartOfXmlMode = true; .) (
"Else" | "Else" |
( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression )
{ "," ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) } { "," (. nextTokenIsPotentialStartOfXmlMode = true; .) ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) }
) )
StatementTerminatorAndBlock StatementTerminatorAndBlock
} }
@ -622,6 +624,26 @@ ErrorHandlingStatement =
| "Resume" ( "Next" | LiteralInteger | Identifier ) | "Resume" ( "Next" | LiteralInteger | Identifier )
. .
ThrowStatement =
"Throw" (. nextTokenIsPotentialStartOfXmlMode = true; .) [ Expression ]
.
TryStatement =
"Try"
StatementTerminatorAndBlock
{
"Catch"
[ Identifier [ "As" TypeName ] ]
[ "When" Expression ]
StatementTerminatorAndBlock
}
[
"Finally"
StatementTerminatorAndBlock
]
"End" "Try"
.
InvocationStatement = InvocationStatement =
[ "Call" ] Expression [ "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;
using ICSharpCode.NRefactory.Parser.VBNet.Experimental; using ICSharpCode.NRefactory.Parser.VBNet.Experimental;
using NUnit.Framework; using NUnit.Framework;
namespace VBParserExperiment.Tests namespace VBParserExperiment
{ {
[TestFixture] [TestFixture]
public class ParserTests public class ParserTests

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

@ -496,6 +496,173 @@ Next <Test />";
CheckFoot(lexer); 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 #endregion
#region Helpers #region Helpers

Loading…
Cancel
Save