提交 ae7bb993 编写于 作者: A Artur Spychaj

Add Annotations and LINQ to IsCompleteSubmission

IsCompleteSubmission now returns false for a standalone annotation.
IsCompleteSubmission now returns false for a LINQ query that is not
followed by an empty new line.
上级 dde23f1c
......@@ -532,6 +532,28 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return SyntaxEquivalence.AreEquivalent(oldList.Node, newList.Node, ignoreChildNode, topLevel:=False)
End Function
''' <summary>
''' Determines if a syntax node is a part of a LINQ query.
''' If so then a query is not terminated the syntax tree ends with an empty line.
''' </summary>
''' <returns>True if the token is part of a LINQ query and syntax tree ends with an empty line.</returns>
Private Shared Function IsPartOfUnterminatedLinqQuery(token As SyntaxToken, statementNode As SyntaxNode, endOfFileToken As SyntaxToken) As Boolean
Dim node = token.Parent
Do
If node.IsKind(SyntaxKind.QueryExpression) Then
Return Not endOfFileToken.LeadingTrivia.Contains(Function(trivia) trivia.IsKind(SyntaxKind.EndOfLineTrivia))
End If
If node Is statementNode Then
Exit Do
End If
node = node.Parent
Loop
Return False
End Function
''' <summary>
''' Determines if a submission is complete.
''' Returns false if the syntax is valid but incomplete.
......@@ -572,14 +594,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Dim lastToken = lastNode.GetLastToken(includeZeroWidth:=True, includeSkipped:=True)
If lastToken.HasTrailingTrivia AndAlso lastToken.TrailingTrivia.Last().IsKind(SyntaxKind.LineContinuationTrivia) Then
If IsPartOfUnterminatedLinqQuery(lastToken, lastNode, compilation.EndOfFileToken) OrElse
(lastToken.HasTrailingTrivia AndAlso lastToken.TrailingTrivia.Last().IsKind(SyntaxKind.LineContinuationTrivia)) Then
' Even if the compilation is correct but has a line continuation trivia return statement as incomplete.
' For example `Dim x = 12 _` has no compilation errors but should be treated as an incomplete statement.
Return False
ElseIf Not compilation.HasErrors Then
' No errors returned. This is a valid and complete submission.
Return True
ElseIf lastToken.IsMissing Then
ElseIf lastNode.IsKind(SyntaxKind.IncompleteMember) OrElse lastToken.IsMissing Then
Return False
End If
......
......@@ -37,6 +37,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
AssertInvalidCompleteSubmission("Dim x = 1 Dim y = 2")
AssertValidCompleteSubmission("Dim x = 1: Dim y = 2")
AssertIncompleteSubmission("Dim x =")
AssertIncompleteSubmission("Dim x = ""str"" & ")
AssertIncompleteSubmission("Dim x = 12 _")
AssertValidCompleteSubmission(
"Dim x =
......@@ -48,6 +49,20 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests
"Dim x = _
& ""hello""")
' Annotations
AssertIncompleteSubmission("<AttributeUsage(AttributeTargets.All)>")
AssertIncompleteSubmission(
"<AttributeUsage(AttributeTargets.All)>
<AttributeUsage(AttributeTargets.All)>")
AssertIncompleteSubmission(
"<AttributeUsage(
AttributeTargets.All)>")
AssertValidCompleteSubmission(
"<AttributeUsage(
AttributeTargets.All)>
Class C
End Class")
' Xml literals
AssertValidCompleteSubmission("Dim xml = <xml></xml>")
AssertIncompleteSubmission(
......@@ -150,6 +165,27 @@ Next")
"If holidays
TakeABreak()
End If")
' LINQ queries
AssertIncompleteSubmission("Dim x = FROM x In {1, 2, 3}")
AssertIncompleteSubmission(
"Dim x = FROM x In {1, 2, 3}
WHERE x > 1")
AssertIncompleteSubmission(
"Dim x = FROM x In {1, 2, 3}
WHERE x > 1
SELECT x + 1")
AssertValidCompleteSubmission(
"Dim x = FROM x In {1, 2, 3}
WHERE x > 1
")
AssertValidCompleteSubmission(
"Dim x = FROM x In {1, 2, 3}
WHERE x > 1
SELECT x + 1
")
End Sub
End Class
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册