Merge pull request #3 from mahalex/fix-unpaired-brackets-handling

Fix unpaired brackets handling
This commit is contained in:
Alexander Luzgarev 2020-07-08 12:37:16 +02:00 committed by GitHub
commit fe2f09ce6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 13 deletions

View File

@ -15,9 +15,7 @@ namespace Parser.Tests
} }
[Theory] [Theory]
#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type
[MemberData(nameof(SingleTokensData))] [MemberData(nameof(SingleTokensData))]
#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type
public void MLexerGreen_Parses_Token(TokenKind kind, string text) public void MLexerGreen_Parses_Token(TokenKind kind, string text)
{ {
var tokens = ParseText(text); var tokens = ParseText(text);
@ -26,9 +24,7 @@ namespace Parser.Tests
} }
[Theory] [Theory]
#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type
[MemberData(nameof(PairTokensData))] [MemberData(nameof(PairTokensData))]
#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type
public void MLexerGreen_Parses_PairOfTokens(TokenKind kind1, string text1, TokenKind kind2, string text2) public void MLexerGreen_Parses_PairOfTokens(TokenKind kind1, string text1, TokenKind kind2, string text2)
{ {
var text = text1 + text2; var text = text1 + text2;
@ -39,9 +35,7 @@ namespace Parser.Tests
} }
[Theory] [Theory]
#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type
[MemberData(nameof(PairTokensWithSeparatorData))] [MemberData(nameof(PairTokensWithSeparatorData))]
#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type
public void MLexerGreen_Parses_PairOfTokensWithSeparator(TokenKind kind1, string text1, string separatorText, TokenKind kind2, string text2) public void MLexerGreen_Parses_PairOfTokensWithSeparator(TokenKind kind1, string text1, string separatorText, TokenKind kind2, string text2)
{ {
var text = text1 + separatorText + text2; var text = text1 + separatorText + text2;
@ -89,8 +83,6 @@ namespace Parser.Tests
let text = SyntaxFacts.GetText(kind) let text = SyntaxFacts.GetText(kind)
where !(text is null) where !(text is null)
where !(SyntaxFacts.IsUnaryTokenKind(kind) where !(SyntaxFacts.IsUnaryTokenKind(kind)
|| SyntaxFacts.IsOpeningToken(kind)
|| SyntaxFacts.IsClosingToken(kind)
|| kind == TokenKind.ApostropheToken) || kind == TokenKind.ApostropheToken)
select (kind, text); select (kind, text);
@ -254,6 +246,22 @@ namespace Parser.Tests
{ {
return true; return true;
} }
if (kind1 == TokenKind.CloseBraceToken && kind2 == TokenKind.StringLiteralToken)
{
return true;
}
if (kind1 == TokenKind.CloseParenthesisToken && kind2 == TokenKind.StringLiteralToken)
{
return true;
}
if (kind1 == TokenKind.CloseSquareBracketToken && kind2 == TokenKind.StringLiteralToken)
{
return true;
}
return false; return false;
} }

View File

@ -44,9 +44,7 @@ namespace Parser.Tests
} }
[Theory] [Theory]
#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type
[MemberData(nameof(FilesData))] [MemberData(nameof(FilesData))]
#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type
public void TestFile(string fileName) public void TestFile(string fileName)
{ {
var text = File.ReadAllText(fileName); var text = File.ReadAllText(fileName);

View File

@ -57,6 +57,16 @@ namespace Parser.Internal
Report($"Unexpected token '{actual}', expected '{expected}'."); Report($"Unexpected token '{actual}', expected '{expected}'.");
} }
internal void ReportUnmatchedCloseParenthesis(TextSpan span, TokenKind kind)
{
Report(span, $"Unmatched close parenthesis '{kind}'.");
}
internal void ReportUnmatchedOpenParenthesisByEndOfFile(TextSpan span)
{
Report(span, "Unmatched open parenthesis by the end of file.");
}
public IEnumerator<Diagnostic> GetEnumerator() public IEnumerator<Diagnostic> GetEnumerator()
{ {
return _diagnostics.GetEnumerator(); return _diagnostics.GetEnumerator();
@ -66,5 +76,6 @@ namespace Parser.Internal
{ {
return GetEnumerator(); return GetEnumerator();
} }
} }
} }

View File

@ -798,19 +798,22 @@ namespace Parser.Internal
} }
else else
{ {
throw new ParsingException($"Unmatched \"{tokenInfo.Text}\" at {Window.Position}."); Diagnostics.ReportUnmatchedCloseParenthesis(
new TextSpan(Window.Position.Offset, 1), tokenInfo.Kind);
} }
} }
else else
{ {
throw new ParsingException($"Unmatched \"{tokenInfo.Text}\" at {Window.Position}."); Diagnostics.ReportUnmatchedCloseParenthesis(
new TextSpan(Window.Position.Offset, 1), tokenInfo.Kind);
} }
} }
if (tokenInfo.Kind == TokenKind.EndOfFileToken if (tokenInfo.Kind == TokenKind.EndOfFileToken
&& TokenStack.Any()) && TokenStack.Any())
{ {
throw new ParsingException($"Unmatched \"{TokenStack.Pop()}\" by the end of file."); Diagnostics.ReportUnmatchedOpenParenthesisByEndOfFile(
new TextSpan(Window.Position.Offset, 1));
} }
var result = Create( var result = Create(