|
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
Imports System.Runtime.CompilerServices
Imports System.Threading.Thread
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Syntax.InternalSyntax
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Test.Utilities
<CLSCompliant(False)>
Public Class ScannerTests
Inherits BasicTestBase
Private Function ScanOnce(str As String, Optional startStatement As Boolean = False) As SyntaxToken
Return SyntaxFactory.ParseToken(str, startStatement:=startStatement)
End Function
Private Function ScanOnce(str As String, languageVersion As VisualBasic.LanguageVersion) As SyntaxToken
Return SyntaxFactory.ParseTokens(str, options:=New VisualBasicParseOptions(languageVersion:=languageVersion)).First()
End Function
Private Function AsString(tokens As IEnumerable(Of SyntaxToken)) As String
Dim str = String.Concat(From t In tokens Select t.ToFullString())
Return str
End Function
Private Function MakeDwString(str As String) As String
Return (From c In str Select If(c < ChrW(&H21S) OrElse c > ChrW(&H7ES), c, ChrW(AscW(c) + &HFF00US - &H20US))).ToArray
End Function
Private Function ScanAllCheckDw(str As String) As IEnumerable(Of SyntaxToken)
Dim tokens = SyntaxFactory.ParseTokens(str)
' test that token have the same text as it was.
Assert.Equal(str, AsString(tokens))
' test that we get same with doublewidth string
Dim doubleWidthStr = MakeDwString(str)
Dim doubleWidthTokens = ScanAllNoDwCheck(doubleWidthStr)
Assert.Equal(tokens.Count, doubleWidthTokens.Count)
For Each t In tokens.Zip(doubleWidthTokens, Function(t1, t2) Tuple.Create(t1, t2))
Assert.Equal(t.Item1.Kind, t.Item2.Kind)
Assert.Equal(t.Item1.Span, t.Item2.Span)
Assert.Equal(t.Item1.FullSpan, t.Item2.FullSpan)
Assert.Equal(MakeDwString(t.Item1.ToFullString()), t.Item2.ToFullString())
Next
Return tokens
End Function
Private Function ScanAllNoDwCheck(str As String) As IEnumerable(Of SyntaxToken)
Dim tokens = SyntaxFactory.ParseTokens(str)
' test that token have the same text as it was.
Assert.Equal(str, AsString(tokens))
Return tokens
End Function
<Fact>
Public Sub TestLessThanConflictMarker1()
' Needs to be followed by a space.
Dim token = SyntaxFactory.ParseTokens("<<<<<<<").First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
' Has to be the start of a line.
token = SyntaxFactory.ParseTokens(" <<<<<<<").First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens("<<<<<< ").First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
' Start of line, seven characters, ends with space.
token = SyntaxFactory.ParseTokens("<<<<<<< ").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestLessThanConflictMarker2()
Dim token = SyntaxFactory.ParseTokens("{" & vbCrLf & "<<<<<<<").Skip(2).First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
token = SyntaxFactory.ParseTokens("{" & vbCrLf & " <<<<<<<").Skip(2).First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "<<<<<< ").Skip(2).First()
Assert.Equal(SyntaxKind.LessThanLessThanToken, token.Kind())
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "<<<<<<< ").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.SpanStart = 3)
Assert.True(trivia.Span.Length = 8)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestGreaterThanConflictMarker1()
' Needs to be followed by a space.
Dim token = SyntaxFactory.ParseTokens(">>>>>>>").First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
' Has to be the start of a line.
token = SyntaxFactory.ParseTokens(" >>>>>>>").First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens(">>>>>> ").First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
' Start of line, seven characters, ends with space.
token = SyntaxFactory.ParseTokens(">>>>>>> ").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestGreaterThanConflictMarker2()
Dim token = SyntaxFactory.ParseTokens("{" & vbCrLf & ">>>>>>>").Skip(2).First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
token = SyntaxFactory.ParseTokens("{" & vbCrLf & " >>>>>>>").Skip(2).First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & ">>>>>> ").Skip(2).First()
Assert.Equal(SyntaxKind.GreaterThanGreaterThanToken, token.Kind())
token = SyntaxFactory.ParseTokens("{" & vbCrLf & ">>>>>>> ").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.SpanStart = 3)
Assert.True(trivia.Span.Length = 8)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestEqualsConflictMarker1()
' Has to be the start of a line.
Dim token = SyntaxFactory.ParseTokens(" =======").First()
Assert.Equal(SyntaxKind.EqualsToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens("====== ").First()
Assert.Equal(SyntaxKind.EqualsToken, token.Kind())
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("=======").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.ConflictMarkerTrivia)
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("======= trailing chars").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
token = SyntaxFactory.ParseTokens("======= Trailing" & vbCrLf & "disabled text").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 16)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 18)
Assert.Equal(trivia.Span.Length, 13)
token = SyntaxFactory.ParseTokens("======= Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>> still disabled").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Length, 34)
token = SyntaxFactory.ParseTokens("======= Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>>>>> Actually the end").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(token.LeadingTrivia.Count, 4)
Dim trivia1 = token.LeadingTrivia(0)
Assert.True(trivia1.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia1.Span.Length, 16)
Assert.True(trivia1.ContainsDiagnostics)
err = trivia1.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
Dim trivia2 = token.LeadingTrivia(1)
Assert.True(trivia2.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia2.Span.Start, 16)
Assert.Equal(trivia2.Span.Length, 2)
Dim trivia3 = token.LeadingTrivia(2)
Assert.True(trivia3.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia3.Span.Start, 18)
Assert.Equal(trivia3.Span.Length, 15)
Dim trivia4 = token.LeadingTrivia(3)
Assert.True(trivia4.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia4.Span.Start, 33)
Assert.Equal(trivia4.Span.Length, 24)
Assert.True(trivia4.ContainsDiagnostics)
err = trivia4.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestEqualsConflictMarker2()
' Has to be the start of a line.
Dim token = SyntaxFactory.ParseTokens("{" & vbCrLf & " =======").Skip(2).First()
Assert.Equal(SyntaxKind.EqualsToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "====== ").Skip(2).First()
Assert.Equal(SyntaxKind.EqualsToken, token.Kind())
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "=======").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "======= trailing chars").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "======= Trailing" & vbCrLf & "disabled text").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 19)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 21)
Assert.Equal(trivia.Span.Length, 13)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "======= Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>> still disabled").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Length, 34)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "======= Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>>>>> Actually the end").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(token.LeadingTrivia.Count, 4)
Dim trivia1 = token.LeadingTrivia(0)
Assert.True(trivia1.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia1.Span.Length, 16)
Assert.True(trivia1.ContainsDiagnostics)
err = trivia1.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
Dim trivia2 = token.LeadingTrivia(1)
Assert.True(trivia2.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia2.Span.Start, 19)
Assert.Equal(trivia2.Span.Length, 2)
Dim trivia3 = token.LeadingTrivia(2)
Assert.True(trivia3.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia3.Span.Start, 21)
Assert.Equal(trivia3.Span.Length, 15)
Dim trivia4 = token.LeadingTrivia(3)
Assert.True(trivia4.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia4.Span.Start, 36)
Assert.Equal(trivia4.Span.Length, 24)
Assert.True(trivia4.ContainsDiagnostics)
err = trivia4.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestEqualsConflictMarker3()
Dim token = SyntaxFactory.ParseTokens("======= trailing chars" & vbCrLf & "======= more trailing chars").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
Dim trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.Equal("======= trailing chars", trivia.ToFullString())
Assert.True(trivia.ContainsDiagnostics)
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, trivia.Errors().First().Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 22)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 24)
Assert.Equal(trivia.Span.Length, 27)
Assert.Equal("======= more trailing chars", trivia.ToFullString())
End Sub
<Fact>
Public Sub TestPipeConflictMarker1()
' Has to be the start of a line.
Dim token = SyntaxFactory.ParseTokens(" |||||||").First()
Assert.Equal(SyntaxKind.BadToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens("|||||| ").First()
Assert.Equal(SyntaxKind.BadToken, token.Kind())
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("|||||||").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.ConflictMarkerTrivia)
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("||||||| trailing chars").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
token = SyntaxFactory.ParseTokens("||||||| Trailing" & vbCrLf & "disabled text").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 16)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 18)
Assert.Equal(trivia.Span.Length, 13)
token = SyntaxFactory.ParseTokens("||||||| Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>> still disabled").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Length, 34)
token = SyntaxFactory.ParseTokens("||||||| Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>>>>> Actually the end").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(token.LeadingTrivia.Count, 4)
Dim trivia1 = token.LeadingTrivia(0)
Assert.True(trivia1.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia1.Span.Length, 16)
Assert.True(trivia1.ContainsDiagnostics)
err = trivia1.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
Dim trivia2 = token.LeadingTrivia(1)
Assert.True(trivia2.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia2.Span.Start, 16)
Assert.Equal(trivia2.Span.Length, 2)
Dim trivia3 = token.LeadingTrivia(2)
Assert.True(trivia3.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia3.Span.Start, 18)
Assert.Equal(trivia3.Span.Length, 15)
Dim trivia4 = token.LeadingTrivia(3)
Assert.True(trivia4.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia4.Span.Start, 33)
Assert.Equal(trivia4.Span.Length, 24)
Assert.True(trivia4.ContainsDiagnostics)
err = trivia4.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestPipeConflictMarker2()
' Has to be the start of a line.
Dim token = SyntaxFactory.ParseTokens("{" & vbCrLf & " |||||||").Skip(2).First()
Assert.Equal(SyntaxKind.BadToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.True(token.LeadingTrivia.Single().Kind() = SyntaxKind.WhitespaceTrivia)
' Has to have at least seven characters.
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "|||||| ").Skip(2).First()
Assert.Equal(SyntaxKind.BadToken, token.Kind())
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "|||||||").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Dim trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.True(trivia.ContainsDiagnostics)
Dim err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
' Start of line, seven characters
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "||||||| trailing chars").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
trivia = token.LeadingTrivia.Single()
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "||||||| Trailing" & vbCrLf & "disabled text").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 19)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 21)
Assert.Equal(trivia.Span.Length, 13)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "||||||| Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>> still disabled").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 16)
Assert.True(trivia.ContainsDiagnostics)
err = trivia.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Length, 34)
token = SyntaxFactory.ParseTokens("{" & vbCrLf & "||||||| Trailing" & vbCrLf & "disabled text" & vbCrLf & ">>>>>>> Actually the end").Skip(2).First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(token.LeadingTrivia.Count, 4)
Dim trivia1 = token.LeadingTrivia(0)
Assert.True(trivia1.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia1.Span.Length, 16)
Assert.True(trivia1.ContainsDiagnostics)
err = trivia1.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
Dim trivia2 = token.LeadingTrivia(1)
Assert.True(trivia2.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia2.Span.Start, 19)
Assert.Equal(trivia2.Span.Length, 2)
Dim trivia3 = token.LeadingTrivia(2)
Assert.True(trivia3.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia3.Span.Start, 21)
Assert.Equal(trivia3.Span.Length, 15)
Dim trivia4 = token.LeadingTrivia(3)
Assert.True(trivia4.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia4.Span.Start, 36)
Assert.Equal(trivia4.Span.Length, 24)
Assert.True(trivia4.ContainsDiagnostics)
err = trivia4.Errors().First
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, err.Code)
End Sub
<Fact>
Public Sub TestPipeConflictMarker3()
Dim token = SyntaxFactory.ParseTokens("||||||| trailing chars" & vbCrLf & "||||||| more trailing chars").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(3, token.LeadingTrivia.Count)
Dim trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(trivia.Span.Length, 22)
Assert.Equal("||||||| trailing chars", trivia.ToFullString())
Assert.True(trivia.ContainsDiagnostics)
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, trivia.Errors().First().Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
Assert.Equal(trivia.Span.Start, 22)
Assert.Equal(trivia.Span.Length, 2)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal(trivia.Span.Start, 24)
Assert.Equal(trivia.Span.Length, 27)
Assert.Equal("||||||| more trailing chars", trivia.ToFullString())
End Sub
<Fact>
Public Sub TestPipeConflictMarker4()
Dim token = SyntaxFactory.ParseTokens("||||||| trailing chars" & vbCrLf & "disabled text" & vbCrLf & "======= more trailing chars" & vbCrLf & "more disabled text" & vbCrLf & ">>>>>>> end trailing chars").First()
Assert.Equal(SyntaxKind.EndOfFileToken, token.Kind())
Assert.True(token.HasLeadingTrivia)
Assert.Equal(7, token.LeadingTrivia.Count)
Dim trivia = token.LeadingTrivia(0)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal("||||||| trailing chars", trivia.ToFullString())
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, trivia.Errors().First().Code)
trivia = token.LeadingTrivia(1)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
trivia = token.LeadingTrivia(2)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal("disabled text" & vbCrLf, trivia.ToFullString())
trivia = token.LeadingTrivia(3)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal("======= more trailing chars", trivia.ToFullString())
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, trivia.Errors().First().Code)
trivia = token.LeadingTrivia(4)
Assert.True(trivia.Kind() = SyntaxKind.EndOfLineTrivia)
trivia = token.LeadingTrivia(5)
Assert.True(trivia.Kind() = SyntaxKind.DisabledTextTrivia)
Assert.Equal("more disabled text" & vbCrLf, trivia.ToFullString())
trivia = token.LeadingTrivia(6)
Assert.True(trivia.Kind() = SyntaxKind.ConflictMarkerTrivia)
Assert.Equal(">>>>>>> end trailing chars", trivia.ToFullString())
Assert.Equal(ERRID.ERR_Merge_conflict_marker_encountered, trivia.Errors().First().Code)
End Sub
<Fact>
Public Sub Scanner_EndOfText()
Dim tk = ScanOnce("")
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal("", tk.ToFullString())
tk = ScanOnce(" ")
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" ", tk.ToFullString())
tk = ScanOnce(" ")
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" ", tk.ToFullString())
tk = ScanOnce("'")
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.TrailingTrivia(0).Kind)
Assert.Equal("'", tk.ToFullString())
tk = ScanOnce("'", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal("'", tk.ToFullString())
tk = ScanOnce(" ' ")
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.TrailingTrivia(0).Kind)
Assert.Equal(" ", tk.LeadingTrivia(0).ToString())
Assert.Equal("' ", tk.TrailingTrivia(0).ToString())
Assert.Equal(" ' ", tk.ToFullString())
tk = ScanOnce(" ' ", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(1).Kind)
Assert.Equal(" ", tk.LeadingTrivia(0).ToString())
Assert.Equal("' ", tk.LeadingTrivia(1).ToString())
Assert.Equal(" ' ", tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_StatementTerminator()
Dim tk = ScanOnce(vbCr)
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal(vbCr, tk.ToFullString())
tk = ScanOnce(vbCr, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(vbCr, tk.ToFullString())
Dim tks = ScanAllCheckDw(vbCr)
Assert.Equal(1, tks.Count)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(0).Kind)
Assert.Equal(vbCr, tks(0).ToFullString())
tks = ScanAllCheckDw(" " & vbLf)
Assert.Equal(1, tks.Count)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(0).Kind)
Assert.Equal(" " & vbLf, tks(0).ToFullString())
tks = ScanAllCheckDw(" A" & vbCrLf & " ")
Assert.Equal(3, tks.Count)
Assert.Equal(SyntaxKind.IdentifierToken, tks(0).Kind)
Assert.Equal(" A" & vbCrLf, tks(0).ToFullString())
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(1).Kind)
Assert.Equal("", tks(1).ToFullString())
Assert.Equal(SyntaxKind.EndOfFileToken, tks(2).Kind)
Assert.Equal(" ", tks(2).ToFullString())
End Sub
<Fact>
Public Sub Scanner_StartStatement()
Dim tk = ScanOnce(vbCr, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(vbCr, tk.ToFullString())
tk = ScanOnce(" " & vbLf, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" " & vbLf, tk.ToFullString())
Dim str = " " & vbCrLf & " " & vbCr & "'2 " & vbLf & " ("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "'("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "'" & vbCrLf & "("
tk = ScanOnce(str, startStatement:=False)
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal("'" & vbCrLf, tk.ToFullString())
str = "'" & vbCrLf & "("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "' " & vbCrLf & " '(" & vbCrLf & "("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_LineContWhenExpectingNewStatement()
Dim tk = ScanOnce("_", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal("_", tk.ToFullString())
tk = ScanOnce(" _", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _", tk.ToFullString())
tk = ScanOnce(" _ ", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _ ", tk.ToFullString())
tk = ScanOnce(" _'", startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _'", tk.ToFullString())
Assert.Equal(3, tk.LeadingTrivia.Count)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.LineContinuationTrivia, tk.LeadingTrivia(1).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(2).Kind)
Assert.Equal(0, tk.Errors.Count)
tk = ScanOnce(" _'", LanguageVersion.VisualBasic16)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _'", tk.ToFullString())
Assert.Equal(3, tk.LeadingTrivia.Count)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.LineContinuationTrivia, tk.LeadingTrivia(1).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(2).Kind)
Assert.Equal(0, tk.Errors.Count)
tk = ScanOnce(" _' Comment", LanguageVersion.VisualBasic15_3)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _' Comment", tk.ToFullString())
Assert.Equal(3, tk.LeadingTrivia.Count)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.False(tk.LeadingTrivia(0).ContainsDiagnostics)
Assert.Equal(SyntaxKind.LineContinuationTrivia, tk.LeadingTrivia(1).Kind)
Assert.False(tk.LeadingTrivia(1).ContainsDiagnostics)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(2).Kind)
Assert.True(tk.LeadingTrivia(2).ContainsDiagnostics)
Assert.Equal(1, tk.Errors.Count)
Assert.Equal(ERRID.ERR_CommentsAfterLineContinuationNotAvailable1, tk.Errors.First().Code)
tk = ScanOnce(" _' Comment", LanguageVersion.VisualBasic16)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _' Comment", tk.ToFullString())
Assert.Equal(3, tk.LeadingTrivia.Count)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.LineContinuationTrivia, tk.LeadingTrivia(1).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(2).Kind)
Assert.Equal(0, tk.Errors.Count)
tk = ScanOnce(" _ ' Comment" & vbCrLf, LanguageVersion.VisualBasic16)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _ ' Comment" & vbCrLf, tk.ToFullString())
Assert.Equal(5, tk.LeadingTrivia.Count)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(0).Kind)
Assert.Equal(SyntaxKind.LineContinuationTrivia, tk.LeadingTrivia(1).Kind)
Assert.Equal(SyntaxKind.WhitespaceTrivia, tk.LeadingTrivia(2).Kind)
Assert.Equal(SyntaxKind.CommentTrivia, tk.LeadingTrivia(3).Kind)
Assert.Equal(SyntaxKind.EndOfLineTrivia, tk.LeadingTrivia(4).Kind)
Assert.Equal(0, tk.Errors.Count)
tk = ScanOnce(" _ rem", startStatement:=True)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(" _ rem", tk.ToFullString())
Assert.Equal(30999, tk.Errors.First().Code)
tk = ScanOnce(" _ abc", startStatement:=True)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(" _ ", tk.ToFullString())
Assert.Equal(30203, tk.Errors.First().Code)
Dim tks = ScanAllCheckDw(" _ rem")
Assert.Equal(SyntaxKind.BadToken, tks(0).Kind)
Assert.Equal(" _ rem", tks(0).ToFullString())
Assert.Equal(30999, tks(0).Errors.First().Code)
tk = ScanOnce("_" & vbLf, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal("_" & vbLf, tk.ToFullString())
tk = ScanOnce(" _" & vbLf, startStatement:=True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(" _" & vbLf, tk.ToFullString())
Dim str = " _" & vbCrLf & " _" & vbCr & "'2 " & vbLf & " ("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = " _" & vbCrLf & " _" & vbCrLf & "("
tk = ScanOnce(str, startStatement:=True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_LineContInsideStatement()
' this would be a case of )_
' valid _ would have been consumed by )
Dim tk = ScanOnce("_" & vbLf, False)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal("_" + vbLf, tk.ToFullString)
Dim Str = "'_" & vbCrLf & "("
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal("'_" & vbCrLf, tk.ToFullString())
Str = " _" & vbCrLf & "("
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
' _ is invalid here, should not be consumed by (
Str = " _" & vbCrLf & "(" & "_" & vbCrLf & "'qq"
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(" _" & vbCrLf & "(", tk.ToFullString())
' _ is valid here, but we should not go past the Eol
Str = " _" & vbCrLf & "(" & " _" & vbCrLf & "'qq"
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(" _" & vbCrLf & "(" & " _" & vbCrLf, tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_RemComment()
Dim str = " " & vbCrLf & " " & vbCr & "REM " & vbLf & " ("
Dim tk = ScanOnce(str, True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "A REM Hello "
tk = ScanOnce(str, True)
Assert.Equal(SyntaxKind.IdentifierToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "A A REM Hello " & vbCrLf & "A Rem Hello "
Dim tks = ScanAllCheckDw(str)
Assert.Equal(SyntaxKind.IdentifierToken, tks(0).Kind)
Assert.Equal("A ", tks(0).ToFullString)
Assert.Equal(SyntaxKind.IdentifierToken, tks(1).Kind)
Assert.NotEqual("A ", tks(1).ToFullString)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(2).Kind)
Assert.Equal(SyntaxKind.IdentifierToken, tks(3).Kind)
Assert.NotEqual("A ", tks(1).ToFullString)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(4).Kind)
Assert.Equal(5, tks.Count)
REM(
str = "REM("
tk = ScanOnce(str, True)
Assert.Equal(SyntaxKind.EndOfFileToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "ReM" & vbCrLf & "("
tk = ScanOnce(str, False)
Assert.Equal(SyntaxKind.EmptyToken, tk.Kind)
Assert.Equal("ReM" & vbCrLf, tk.ToFullString())
str = "rEM" & vbCrLf & "("
tk = ScanOnce(str, True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
str = "rem " & vbCrLf & " REM(" & vbCrLf & "("
tk = ScanOnce(str, True)
Assert.Equal(SyntaxKind.OpenParenToken, tk.Kind)
Assert.Equal(str, tk.ToFullString())
End Sub
''' <summary>
''' EmptyToken is generated by the Scanner in a single-line
''' If or lambda with an empty statement to avoid generating
''' a statement terminator with leading or trailing trivia.
''' </summary>
<Fact>
Public Sub Scanner_EmptyToken()
' No EmptyToken required because no trivia before EOF.
ParseTokensAndVerify("If True Then Else Return :",
SyntaxKind.IfKeyword,
SyntaxKind.TrueKeyword,
SyntaxKind.ThenKeyword,
SyntaxKind.ElseKeyword,
SyntaxKind.ReturnKeyword,
SyntaxKind.ColonToken,
SyntaxKind.EndOfFileToken)
' No EmptyToken required because no trailing trivia before EOF.
' (The space after the colon is leading trivia on EOF.)
ParseTokensAndVerify("If True Then Else : ",
SyntaxKind.IfKeyword,
SyntaxKind.TrueKeyword,
SyntaxKind.ThenKeyword,
SyntaxKind.ElseKeyword,
SyntaxKind.ColonToken,
SyntaxKind.EndOfFileToken)
' EmptyToken required because comment is trailing
' trivia between the colon and EOL.
ParseTokensAndVerify(<![CDATA[If True Then Else :'Comment
Return]]>.Value,
SyntaxKind.IfKeyword,
SyntaxKind.TrueKeyword,
SyntaxKind.ThenKeyword,
SyntaxKind.ElseKeyword,
SyntaxKind.ColonToken,
SyntaxKind.EmptyToken,
SyntaxKind.StatementTerminatorToken,
SyntaxKind.ReturnKeyword,
SyntaxKind.EndOfFileToken)
' EmptyToken required because comment is trailing
' trivia between the colon and EOF.
ParseTokensAndVerify("Sub() If True Then Return : REM",
SyntaxKind.SubKeyword,
SyntaxKind.OpenParenToken,
SyntaxKind.CloseParenToken,
SyntaxKind.IfKeyword,
SyntaxKind.TrueKeyword,
SyntaxKind.ThenKeyword,
SyntaxKind.ReturnKeyword,
SyntaxKind.ColonToken,
SyntaxKind.EmptyToken,
SyntaxKind.EndOfFileToken)
' No EmptyToken required because colon, space, comment
' and EOL are all treated as multi-line leading trivia on EndKeyword.
ParseTokensAndVerify(<![CDATA[If True Then
: 'Comment
End If]]>.Value,
SyntaxKind.IfKeyword,
SyntaxKind.TrueKeyword,
SyntaxKind.ThenKeyword,
SyntaxKind.StatementTerminatorToken,
SyntaxKind.EndKeyword,
SyntaxKind.IfKeyword,
SyntaxKind.EndOfFileToken)
End Sub
Private Sub ParseTokensAndVerify(str As String, ParamArray kinds As SyntaxKind())
Dim tokens = SyntaxFactory.ParseTokens(str).ToArray()
Dim result = String.Join("", tokens.Select(Function(t) t.ToFullString()))
Assert.Equal(str, result)
Assert.Equal(tokens.Length, kinds.Length)
For i = 0 To tokens.Length - 1
Assert.Equal(tokens(i).Kind, kinds(i))
Next
End Sub
<Fact>
Public Sub Scanner_DimKeyword()
Dim Str = " " & vbCrLf & " " & vbCr & "DIM " & vbLf & " ("
Dim tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.DimKeyword, tk.Kind)
Assert.Equal(" " & vbCrLf & " " & vbCr & "DIM " + vbLf, tk.ToFullString)
Str = "Dim("
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.DimKeyword, tk.Kind)
Assert.Equal("Dim", tk.ToFullString())
Str = "DiM" & vbCrLf & "("
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.DimKeyword, tk.Kind)
Assert.Equal("DiM" + vbCrLf, tk.ToFullString)
Str = "dIM" & " _" & vbCrLf & "("
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.DimKeyword, tk.Kind)
Assert.Equal("dIM" & " _" & vbCrLf, tk.ToFullString())
Str = "dim " & vbCrLf & " DIMM" & vbCrLf & "("
Dim tks = ScanAllNoDwCheck(Str)
Assert.Equal(SyntaxKind.DimKeyword, tks(0).Kind)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(1).Kind)
Assert.Equal(SyntaxKind.IdentifierToken, tks(2).Kind)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(3).Kind)
Assert.Equal(SyntaxKind.OpenParenToken, tks(4).Kind)
End Sub
<WorkItem(15925, "DevDiv_Projects/Roslyn")>
<Fact>
Public Sub StaticKeyword()
Dim Str = " " & vbCrLf & " " & vbCr & "STATIC " & vbLf & " ("
Dim tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.StaticKeyword, tk.Kind)
Assert.Equal(" " & vbCrLf & " " & vbCr & "STATIC " & vbLf, tk.ToFullString())
Str = "Static("
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.StaticKeyword, tk.Kind)
Assert.Equal("Static", tk.ToFullString())
Str = "StatiC" & vbCrLf & "("
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.StaticKeyword, tk.Kind)
Assert.Equal("StatiC" & vbCrLf, tk.ToFullString())
Str = "sTATIC" & " _" & vbCrLf & "("
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.StaticKeyword, tk.Kind)
Assert.Equal("sTATIC" & " _" & vbCrLf, tk.ToFullString())
Str = "static " & vbCrLf & " STATICC" & vbCrLf & "("
Dim tks = ScanAllNoDwCheck(Str)
Assert.Equal(SyntaxKind.StaticKeyword, tks(0).Kind)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(1).Kind)
Assert.Equal(SyntaxKind.IdentifierToken, tks(2).Kind)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(3).Kind)
Assert.Equal(SyntaxKind.OpenParenToken, tks(4).Kind)
End Sub
<Fact>
Public Sub Scanner_FrequentKeywords()
Dim Str = "End "
Dim tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.EndKeyword, tk.Kind)
Assert.Equal(3, tk.Span.Length)
Assert.Equal(4, tk.FullSpan.Length)
Assert.Equal("End ", tk.ToFullString())
Str = "As "
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.AsKeyword, tk.Kind)
Assert.Equal(2, tk.Span.Length)
Assert.Equal(3, tk.FullSpan.Length)
Assert.Equal("As ", tk.ToFullString())
Str = "If "
tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.IfKeyword, tk.Kind)
Assert.Equal(2, tk.Span.Length)
Assert.Equal(3, tk.FullSpan.Length)
Assert.Equal("If ", tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_PlusToken()
Dim Str = "+"
Dim tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.PlusToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
Str = "+ ="
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.PlusEqualsToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_PowerToken()
Dim Str = "^"
Dim tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.CaretToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
Str = "^ =^"
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.CaretEqualsToken, tks(0).Kind)
Assert.Equal(SyntaxKind.CaretToken, tks(1).Kind)
End Sub
<Fact>
Public Sub Scanner_GreaterThanToken()
Dim Str = "> "
Dim tk = ScanOnce(Str, False)
Assert.Equal(SyntaxKind.GreaterThanToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
Str = " >= 'qqqq"
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.GreaterThanEqualsToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
Str = " > ="
tk = ScanOnce(Str, True)
Assert.Equal(SyntaxKind.GreaterThanEqualsToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
'Str = " >" & vbCrLf & "="
'tk = ScanOnce(Str, True)
'Assert.Equal(NodeKind.GreaterToken, tk.Kind)
'Assert.Equal(" >" & vbCrLf, tk.ToFullString())
'Str = ">" & " _" & vbCrLf & "="
'tk = ScanOnce(Str, True)
'Assert.Equal(NodeKind.GreaterToken, tk.Kind)
'Assert.Equal(">" & " _" & vbCrLf, tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_LessThanToken()
Dim Str = "> <"
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.GreaterThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.LessThanToken, tks(1).Kind)
Str = "<<<<%"
tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.LessThanLessThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.LessThanToken, tks(1).Kind)
Assert.Equal(SyntaxKind.LessThanToken, tks(2).Kind)
Assert.Equal(SyntaxKind.BadToken, tks(3).Kind)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(4).Kind)
Str = " < << <% "
tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.LessThanLessThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.LessThanToken, tks(1).Kind)
Assert.Equal(SyntaxKind.LessThanToken, tks(2).Kind)
Assert.Equal(SyntaxKind.BadToken, tks(3).Kind)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(4).Kind)
End Sub
<Fact>
Public Sub Scanner_ShiftLeftToken()
Dim Str = "<<<<="
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.LessThanLessThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.LessThanLessThanEqualsToken, tks(1).Kind)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(2).Kind)
'Str = "<" & vbLf & " < < = "
'tks = ScanAllCheckDw(Str)
'Assert.Equal(NodeKind.LessToken, tks(0).Kind)
'Assert.Equal(NodeKind.LeftShiftEqualsToken, tks(1).Kind)
'Assert.Equal(NodeKind.EndOfTextToken, tks(2).Kind)
'' left shift does not allow implicit line continuation
'Str = "<<" & vbLf & "<<="
'tks = ScanAllCheckDw(Str)
'Assert.Equal(NodeKind.LeftShiftToken, tks(0).Kind)
'Assert.Equal(NodeKind.StatementTerminatorToken, tks(1).Kind)
'Assert.Equal(NodeKind.LeftShiftEqualsToken, tks(2).Kind)
'Assert.Equal(NodeKind.EndOfTextToken, tks(3).Kind)
End Sub
<Fact>
Public Sub Scanner_NotEqualsToken()
Dim Str = "<>"
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.LessThanGreaterThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(1).Kind)
Str = "<>="
tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.LessThanGreaterThanToken, tks(0).Kind)
Assert.Equal(SyntaxKind.EqualsToken, tks(1).Kind)
Assert.Equal(SyntaxKind.EndOfFileToken, tks(2).Kind)
'Str = "<" & vbLf & " > "
'tks = ScanAllCheckDw(Str)
'Assert.Equal(NodeKind.LessToken, tks(0).Kind)
'Assert.Equal(NodeKind.GreaterToken, tks(1).Kind)
'Assert.Equal(NodeKind.EndOfTextToken, tks(2).Kind)
'' left shift does not allow implicit line continuation
'Str = "< > <" & " _" & vbLf & ">"
'tks = ScanAllCheckDw(Str)
'Assert.Equal(NodeKind.NotEqualToken, tks(0).Kind)
'Assert.Equal(NodeKind.LessToken, tks(1).Kind)
'Assert.Equal(NodeKind.GreaterToken, tks(2).Kind)
'Assert.Equal(NodeKind.EndOfTextToken, tks(3).Kind)
End Sub
Private Sub CheckCharTkValue(tk As SyntaxToken, expected As Char)
Dim val = DirectCast(tk.Value, Char)
Assert.Equal(expected, val)
End Sub
<Fact>
Public Sub Scanner_CharLiteralToken()
Dim Str = <text>"Q"c</text>.Value
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.CharacterLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckCharTkValue(tk, "Q"c)
Str = <text>""""c</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.CharacterLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckCharTkValue(tk, """"c)
Str = <text>""c</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(30004, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(Str, tk.ToFullString())
Str = <text>"""c</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal(30648, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(Str, tk.ToFullString())
CheckStrTkValue(tk, """c")
Str = <text>"QQ"c</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(30004, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(Str, tk.ToFullString())
Str = <text>"Q"c "Q"c"Q"c "Q"c _
"Q"c
""""c</text>.Value
Dim doubleWidthStr = MakeDwString(Str)
Dim tks = ScanAllNoDwCheck(doubleWidthStr)
Assert.Equal(10, tks.Count)
Assert.Equal(True, tks.Any(Function(t) t.ContainsDiagnostics))
End Sub
Private Sub CheckStrTkValue(tk As SyntaxToken, expected As String)
Dim str = DirectCast(tk.Value, String)
Assert.Equal(expected, str)
End Sub
<Fact>
Public Sub Scanner_StringLiteralToken()
Dim Str = <text>""</text>.Value
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckStrTkValue(tk, "")
Str = <text>"Q"</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckStrTkValue(tk, "Q")
Str = <text>""""</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckStrTkValue(tk, """")
Str = <text>""""""""</text>.Value
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal(Str, tk.ToFullString())
CheckStrTkValue(tk, """""""")
Str = <text>"""" """"</text>.Value
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tks(0).Kind)
Assert.Equal(SyntaxKind.StringLiteralToken, tks(1).Kind)
Str = <text>"AA"
"BB"</text>.Value
tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.StringLiteralToken, tks(0).Kind)
Assert.Equal(SyntaxKind.StatementTerminatorToken, tks(1).Kind)
Assert.Equal(SyntaxKind.StringLiteralToken, tks(2).Kind)
End Sub
<Fact>
Public Sub Scanner_IntegerLiteralToken()
Dim Str = "42"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Decimal, tk.GetBase())
Assert.Equal(42, tk.Value)
Str = " 42 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Decimal, tk.GetBase())
Assert.Equal(42, tk.Value)
Assert.Equal(" 42 ", tk.ToFullString())
Str = " 4_2 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Decimal, tk.GetBase())
Assert.Equal(42, tk.Value)
Assert.Equal(" 4_2 ", tk.ToFullString())
Assert.Equal(0, tk.Errors().Count)
Str = " &H42L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Hexadecimal, tk.GetBase())
Assert.Equal(&H42L, tk.Value)
Assert.Equal(" &H42L ", tk.ToFullString())
Str = " &H4_2L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Hexadecimal, tk.GetBase())
Assert.Equal(&H42L, tk.Value)
Assert.Equal(" &H4_2L ", tk.ToFullString())
Str = " &H_1 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Hexadecimal, tk.GetBase())
Assert.Equal(&H1, tk.Value)
Assert.Equal(" &H_1 ", tk.ToFullString())
Str = " &B_1 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Binary, tk.GetBase())
Assert.Equal(&B1, tk.Value)
Assert.Equal(" &B_1 ", tk.ToFullString())
Str = " &O_1 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Octal, tk.GetBase())
Assert.Equal(&O1, tk.Value)
Assert.Equal(" &O_1 ", tk.ToFullString())
Str = " &H__1_1L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Hexadecimal, tk.GetBase())
Assert.Equal(&H11L, tk.Value)
Assert.Equal(" &H__1_1L ", tk.ToFullString())
Str = " &B__1_1L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Binary, tk.GetBase())
Assert.Equal(&B11L, tk.Value)
Assert.Equal(" &B__1_1L ", tk.ToFullString())
Str = " &O__1_1L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Octal, tk.GetBase())
Assert.Equal(&O11L, tk.Value)
Assert.Equal(" &O__1_1L ", tk.ToFullString())
Str = " &H42L &H42& "
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tks(0).Kind)
Assert.Equal(LiteralBase.Hexadecimal, tks(1).GetBase())
Assert.Equal(&H42L, tks(1).Value)
Assert.Equal(TypeCharacter.Long, tks(1).GetTypeCharacter())
Str = " &B1010L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Binary, tk.GetBase())
Assert.Equal(&HAL, tk.Value)
Assert.Equal(" &B1010L ", tk.ToFullString())
Assert.Equal(0, tk.Errors().Count)
Str = " &B1_0_1_0L "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(LiteralBase.Binary, tk.GetBase())
Assert.Equal(&HAL, tk.Value)
Assert.Equal(" &B1_0_1_0L ", tk.ToFullString())
Assert.Equal(0, tk.Errors().Count)
End Sub
<Fact>
Public Sub Scanner_FloatingLiteralToken()
Dim Str = "4.2"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(4.2, tk.Value)
Str = " 0.42 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42, tk.Value)
Assert.IsType(Of Double)(tk.Value)
Assert.Equal(" 0.42 ", tk.ToFullString())
Str = " 0_0.4_2 "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42, tk.Value)
Assert.IsType(Of Double)(tk.Value)
Assert.Equal(" 0_0.4_2 ", tk.ToFullString())
Str = " 0.42# "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42, tk.Value)
Assert.IsType(Of Double)(tk.Value)
Assert.Equal(" 0.42# ", tk.ToFullString())
Str = " 0.42R "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42, tk.Value)
Assert.IsType(Of Double)(tk.Value)
Assert.Equal(" 0.42R ", tk.ToFullString())
Str = " 0.42! "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42!, tk.Value)
Assert.IsType(Of Single)(tk.Value)
Assert.Equal(" 0.42! ", tk.ToFullString())
Str = " 0.42F "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(0.42F, tk.Value)
Assert.IsType(Of Single)(tk.Value)
Assert.Equal(" 0.42F ", tk.ToFullString())
Str = " .42 42# "
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tks(1).Kind)
Assert.Equal(42.0#, tks(1).Value)
Assert.Equal(0.42, tks(0).Value)
Assert.IsType(Of Double)(tks(1).Value)
Assert.Equal(TypeCharacter.Double, tks(1).GetTypeCharacter())
End Sub
<Fact>
Public Sub Scanner_DecimalLiteralToken()
Dim Str = "4.2D"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tk.Kind)
Assert.Equal(TypeCharacter.DecimalLiteral, tk.GetTypeCharacter())
Assert.Equal(4.2D, tk.Value)
Str = " 0.42@ "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tk.Kind)
Assert.Equal(0.42@, tk.Value)
Assert.Equal(" 0.42@ ", tk.ToFullString())
Str = " .42D 4242424242424242424242424242@ "
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tks(1).Kind)
Assert.Equal(4242424242424242424242424242D, tks(1).Value)
Assert.Equal(0.42D, tks(0).Value)
Assert.Equal(TypeCharacter.Decimal, tks(1).GetTypeCharacter())
End Sub
<WorkItem(538543, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538543")>
<Fact>
Public Sub Scanner_DecimalLiteralExpToken()
Dim Str = "1E1D"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tk.Kind)
Assert.Equal(TypeCharacter.DecimalLiteral, tk.GetTypeCharacter())
Assert.Equal(10D, tk.Value)
End Sub
<Fact>
Public Sub Scanner_Overflow()
Dim Str = "2147483647I"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(2147483647I, CInt(tk.Value))
Str = "2147483648I"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(30036, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&H7FFFFFFFI"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(&H7FFFFFFFI, CInt(tk.Value))
Str = "&HFFFFFFFFI"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(&HFFFFFFFFI, tk.Value)
Str = "&HFFFFFFFFS"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(30036, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&B111111111111111111111111111111111I"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(30036, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&B11111111111111111111111111111111UI"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(&HFFFFFFFFUI, CUInt(tk.Value))
Str = "&B1111111111111111111111111111111I"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(&H7FFFFFFFI, CInt(tk.Value))
Str = "1.7976931348623157E+308d"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tk.Kind)
Assert.Equal(30036, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0D, tk.Value)
Str = "1.797693134862315456489789797987987897897987987E+308F"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(30036, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0.0F, tk.Value)
End Sub
<Fact>
Public Sub Scanner_UnderscoreWrongLocation()
Dim Str = "_1"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IdentifierToken, tk.Kind)
Assert.Equal(0, tk.GetSyntaxErrorsNoTree().Count())
Str = "1_"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(30035, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&H1_"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Assert.Equal(30035, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "1_.1"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(30035, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "1.1_"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(30035, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&H_"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Dim errors = tk.Errors()
Assert.Equal(1, errors.Count)
Assert.Equal(30035, errors.First().Code)
Assert.Equal(0, CInt(tk.Value))
Str = "&H_2_"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
errors = tk.Errors()
Assert.Equal(1, errors.Count)
Assert.Equal(30035, errors.First().Code)
Assert.Equal(0, CInt(tk.Value))
End Sub
<Fact>
Public Sub Scanner_UnderscoreFeatureFlag()
Dim Str = "&H_1"
Dim tk = ScanOnce(Str, LanguageVersion.VisualBasic14)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
Dim errors = tk.Errors()
Assert.Equal(1, errors.Count)
Assert.Equal(36716, errors.First().Code)
Assert.Equal(1, CInt(tk.Value))
Str = "&H_123_456_789_ABC_DEF_123"
tk = ScanOnce(Str, LanguageVersion.VisualBasic14)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
errors = tk.Errors()
Assert.Equal(2, errors.Count)
Assert.Equal(30036, errors.ElementAt(0).Code)
Assert.Equal(36716, errors.ElementAt(1).Code)
Assert.Equal(0, CInt(tk.Value))
End Sub
<Fact>
Public Sub Scanner_DateLiteralToken()
Dim Str = "#10/10/2010#"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DateLiteralToken, tk.Kind)
Assert.Equal(#10/10/2010#, tk.Value)
Str = "#10/10/1#"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DateLiteralToken, tk.Kind)
Assert.Equal(#10/10/0001#, tk.Value)
Str = "#10/10/101#"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DateLiteralToken, tk.Kind)
Assert.Equal(#10/10/0101#, tk.Value)
Str = "#10/10/0#"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(31085, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal("#10/10/0#", tk.ToFullString())
Str = " #10/10/2010 10:10:00 PM# "
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DateLiteralToken, tk.Kind)
Assert.Equal(#10/10/2010 10:10:00 PM#, tk.Value)
Str = "x = #10/10/2010##10/10/2010 10:10:00 PM# "
Dim tks = ScanAllCheckDw(Str)
Assert.Equal(#10/10/2010#, tks(2).Value)
Assert.Equal(#10/10/2010 10:10:00 PM#, tks(3).Value)
End Sub
<Fact>
Public Sub Scanner_DateLiteralTokenWithYearFirst()
Dim text = "#1984-10-12#"
Dim token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#10/12/1984#, token.Value)
' May use slash as separator in dates.
text = "#1984/10/12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#10/12/1984#, token.Value)
' Years must be four digits.
text = "#84-10-12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#84/10/12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
' Months may be one digit.
text = "#2010-4-12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#4/12/2010#, token.Value)
' Days may be one digit.
text = "#1955/11/5#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#11/5/1955#, token.Value)
' Time only.
text = " #09:45:01# "
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#1/1/1 9:45:01 AM#, token.Value)
' Date and time.
text = " # 2010-04-12 9:00 # "
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#4/12/2010 9:00:00 AM#, token.Value)
text = " #2010/04/12 9:00# "
token = ScanOnce(text)
Assert.Equal(SyntaxKind.DateLiteralToken, token.Kind)
Assert.Equal(#4/12/2010 9:00:00 AM#, token.Value)
text = "x = #2010-04-12##2010-04-12 09:00:00 # "
Dim tokens = ScanAllCheckDw(text)
Assert.Equal(#4/12/2010#, tokens(2).Value)
Assert.Equal(#4/12/2010 9:00:00 AM#, tokens(3).Value)
text = "#01984/10/12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#984/10/12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#1984/10/#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#1984//12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#1984/10-12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
text = "#1984-10/12#"
token = ScanOnce(text)
Assert.Equal(SyntaxKind.BadToken, token.Kind)
Assert.Equal(31085, token.GetSyntaxErrorsNoTree()(0).Code)
End Sub
<Fact, WorkItem(529782, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/529782")>
Public Sub DateAndDecimalCultureIndependentTokens()
Dim SavedCultureInfo = CurrentThread.CurrentCulture
Try
CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("de-DE", False)
Dim Str = "4.2"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(4.2, tk.Value)
Str = "4.2F"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(4.2F, tk.Value)
Assert.IsType(Of Single)(tk.Value)
Str = "4.2R"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.FloatingLiteralToken, tk.Kind)
Assert.Equal(4.2R, tk.Value)
Assert.IsType(Of Double)(tk.Value)
Str = "4.2D"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DecimalLiteralToken, tk.Kind)
Assert.Equal(4.2D, tk.Value)
Assert.IsType(Of Decimal)(tk.Value)
Str = "#8/23/1970 3:35:39AM#"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.DateLiteralToken, tk.Kind)
Assert.Equal(#8/23/1970 3:35:39 AM#, tk.Value)
Finally
CurrentThread.CurrentCulture = SavedCultureInfo
End Try
End Sub
<Fact>
Public Sub Scanner_BracketedIdentToken()
Dim Str = "[Goo123]"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IdentifierToken, tk.Kind)
Assert.True(tk.IsBracketed)
Assert.Equal("Goo123", tk.ValueText)
Assert.Equal("Goo123", tk.Value)
Assert.Equal("[Goo123]", tk.ToFullString())
Str = "[__]"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IdentifierToken, tk.Kind)
Assert.True(tk.IsBracketed)
Assert.Equal("__", tk.ValueText)
Assert.Equal("[__]", tk.ToFullString())
Str = "[Goo ]"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(30034, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal("[Goo ", tk.ToFullString())
Str = "[]"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(30203, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal("[]", tk.ToFullString())
Str = "[_]"
tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(30203, tk.GetSyntaxErrorsNoTree()(0).Code)
Assert.Equal("[_]", tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_StringLiteralValueText()
Dim str = """Hello, World!"""
Dim tk = ScanOnce(str)
Assert.Equal(SyntaxKind.StringLiteralToken, tk.Kind)
Assert.Equal("Hello, World!", tk.ValueText)
Assert.Equal("""Hello, World!""", tk.ToFullString())
End Sub
<Fact>
Public Sub Scanner_MultiLineStringLiteral()
Dim text =
<text>"Hello,
World!"</text>.Value
Dim token = ScanOnce(text)
Assert.Equal(SyntaxKind.StringLiteralToken, token.Kind)
Assert.Equal("Hello," & vbLf & "World!", token.ValueText)
Assert.Equal("""Hello," & vbLf & "World!""", token.ToString())
End Sub
Private Function Repeat(str As String, num As Integer) As String
Dim arr(num - 1) As String
For i As Integer = 0 To num - 1
arr(i) = str
Next
Return String.Join("", arr)
End Function
<Fact>
Public Sub Scanner_BufferTest()
For i As Integer = 0 To 12
Dim TokenStr = New String("+"c, i)
Dim tks = ScanAllCheckDw(TokenStr)
Assert.Equal(i + 1, tks.Count)
TokenStr = Repeat(" SomeIdentifier ", i)
tks = ScanAllCheckDw(TokenStr)
Assert.Equal(i + 1, tks.Count)
' trying to place space after "someIdent" on ^2 boundary
Dim identLen = Math.Max(1, CInt(2 ^ i) - 11)
TokenStr = Repeat("X", identLen) & " someIdent " & Repeat("X", identLen + 11)
tks = ScanAllNoDwCheck(TokenStr)
Assert.Equal(4, tks.Count)
Next
For i As Integer = 100 To 5000 Step 250
Dim TokenStr = New String("+"c, i)
Dim tks = ScanAllCheckDw(TokenStr)
Assert.Equal(i + 1, tks.Count)
TokenStr = Repeat(" SomeIdentifier ", i)
tks = ScanAllCheckDw(TokenStr)
Assert.Equal(i + 1, tks.Count)
Next
End Sub
<Fact>
Public Sub Scanner_Bug866445()
Dim x = &HFF00110001020408L
Dim Str = "&HFF00110001020408L"
Dim tk = ScanOnce(Str)
Assert.Equal(SyntaxKind.IntegerLiteralToken, tk.Kind)
End Sub
<Fact>
Public Sub Bug869260()
Dim tk = ScanOnce(ChrW(0))
Assert.Equal(SyntaxKind.BadToken, tk.Kind)
Assert.Equal(CInt(ERRID.ERR_IllegalChar), tk.GetSyntaxErrorsNoTree(0).Code)
End Sub
<Fact>
Public Sub Bug869081()
ParseAndVerify(<![CDATA[
<Obsolete()> _
_
_
_
_
<CLSCompliant(False)> Class Class1
End Class
]]>)
End Sub
<Fact>
Public Sub Bug658441()
ParseAndVerify(<![CDATA[
#If False Then
#If False Then
# _
#End If
# _
End If
#End If
]]>)
End Sub
<WorkItem(538747, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/538747")>
<Fact>
Public Sub OghamSpacemark()
ParseAndVerify(<![CDATA[
Module M
End Module
]]>)
End Sub
<WorkItem(531175, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531175")>
<Fact>
Public Sub Bug17703()
ParseAndVerify(<![CDATA[
Dim x = <
”'
]]>,
<errors>
<error id="31151" message="Element is missing an end tag." start="9" end="23"/>
<error id="31146" message="XML name expected." start="10" end="10"/>
<error id="31146" message="XML name expected." start="10" end="10"/>
<error id="30249" message="'=' expected." start="10" end="10"/>
<error id="31164" message="Expected matching closing double quote for XML attribute value." start="23" end="23"/>
<error id="31165" message="Expected beginning < for an XML tag." start="23" end="23"/>
<error id="30636" message="'>' expected." start="23" end="23"/>
</errors>)
End Sub
<WorkItem(530916, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530916")>
<Fact>
Public Sub Bug17189()
ParseAndVerify(<![CDATA[
a<
-'
-
]]>,
<errors>
<error id="30689" message="Statement cannot appear outside of a method body." start="1" end="17"/>
<error id="30800" message="Method arguments must be enclosed in parentheses." start="2" end="17"/>
<error id="31151" message="Element is missing an end tag." start="2" end="17"/>
<error id="31177" message="White space cannot appear here." start="3" end="4"/>
<error id="31169" message="Character '-' (&H2D) is not allowed at the beginning of an XML name." start="4" end="5"/>
<error id="31146" message="XML name expected." start="5" end="5"/>
<error id="30249" message="'=' expected." start="5" end="5"/>
<error id="31163" message="Expected matching closing single quote for XML attribute value." start="17" end="17"/>
<error id="31165" message="Expected beginning '<' for an XML tag." start="17" end="17"/>
<error id="30636" message="'>' expected." start="17" end="17"/>
</errors>)
End Sub
<WorkItem(530682, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530682")>
<Fact>
Public Sub Bug16698()
ParseAndVerify(<![CDATA[#Const x = <!--
]]>,
Diagnostic(ERRID.ERR_BadCCExpression, "<!--"))
End Sub
<WorkItem(865832, "DevDiv/Personal")>
<Fact>
Public Sub ParseSpecialKeywords()
ParseAndVerify(<![CDATA[
Module M1
Dim x As Integer
Sub Main
If True
End If
End Sub
End Module
]]>).
VerifyNoWhitespaceInKeywords()
End Sub
<WorkItem(547317, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547317")>
<Fact>
Public Sub ParseHugeNumber()
ParseAndVerify(<![CDATA[
Module M
Sub Main
Dim x = CompareDouble(-7.92281625142643E337593543950335D)
End Sub
EndModule
]]>,
<errors>
<error id="30625" message="'Module' statement must end with a matching 'End Module'." start="1" end="9"/>
<error id="30036" message="Overflow." start="52" end="85"/>
<error id="30188" message="Declaration expected." start="100" end="109"/>
</errors>).
VerifyNoWhitespaceInKeywords()
End Sub
<WorkItem(547317, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/547317")>
<Fact>
Public Sub ParseHugeNumberLabel()
ParseAndVerify(<![CDATA[
Module M
Sub Main
678901234567890123456789012345678901234567456789012345678901234567890123456789012345
End Sub
EndModule
]]>,
<errors>
<error id="30625" message="'Module' statement must end with a matching 'End Module'." start="1" end="9"/>
<error id="30801" message="Labels that are numbers must be followed by colons." start="30" end="114"/>
<error id="30036" message="Overflow." start="30" end="114"/>
<error id="30188" message="Declaration expected." start="128" end="137"/>
</errors>).
VerifyNoWhitespaceInKeywords()
End Sub
<WorkItem(926612, "DevDiv/Personal")>
<Fact>
Public Sub ScanMultilinesTriviaWithCRLFs()
ParseAndVerify(<![CDATA[Option Compare Text
Public Class Assembly001bDll
Sub main()
Dim Asb As System.Reflection.Assembly
Asb = System.Reflection.Assembly.GetExecutingAssembly()
apcompare(Left(CurDir(), 1) & ":\School\assembly001bdll.dll", Asb.Location, "location")
End Sub
End Class]]>)
End Sub
<Fact>
Public Sub IsWhiteSpace()
Assert.False(SyntaxFacts.IsWhitespace("A"c))
Assert.True(SyntaxFacts.IsWhitespace(" "c))
Assert.True(SyntaxFacts.IsWhitespace(ChrW(9)))
Assert.False(SyntaxFacts.IsWhitespace(ChrW(0)))
Assert.False(SyntaxFacts.IsWhitespace(ChrW(128)))
Assert.False(SyntaxFacts.IsWhitespace(ChrW(129)))
Assert.False(SyntaxFacts.IsWhitespace(ChrW(127)))
Assert.True(SyntaxFacts.IsWhitespace(ChrW(160)))
Assert.True(SyntaxFacts.IsWhitespace(ChrW(12288)))
Assert.True(SyntaxFacts.IsWhitespace(ChrW(8192)))
Assert.True(SyntaxFacts.IsWhitespace(ChrW(8203)))
End Sub
<Fact>
Public Sub IsNewline()
Assert.True(SyntaxFacts.IsNewLine(ChrW(13)))
Assert.True(SyntaxFacts.IsNewLine(ChrW(10)))
Assert.True(SyntaxFacts.IsNewLine(ChrW(133)))
Assert.True(SyntaxFacts.IsNewLine(ChrW(8232)))
Assert.True(SyntaxFacts.IsNewLine(ChrW(8233)))
Assert.False(SyntaxFacts.IsNewLine(ChrW(132)))
Assert.False(SyntaxFacts.IsNewLine(ChrW(160)))
Assert.False(SyntaxFacts.IsNewLine(" "c))
Assert.Equal(String.Empty, SyntaxFacts.MakeHalfWidthIdentifier(String.Empty))
Assert.Null(SyntaxFacts.MakeHalfWidthIdentifier(Nothing))
Assert.Equal("ABC", SyntaxFacts.MakeHalfWidthIdentifier("ABC"))
Assert.Equal(ChrW(65280), SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65280)))
Assert.NotEqual(ChrW(65281), SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65281)))
Assert.Equal(1, SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65281)).Length)
End Sub
<Fact>
Public Sub MakeHalfWidthIdentifier()
Assert.Equal(String.Empty, SyntaxFacts.MakeHalfWidthIdentifier(String.Empty))
Assert.Equal(Nothing, SyntaxFacts.MakeHalfWidthIdentifier(Nothing))
Assert.Equal("ABC", SyntaxFacts.MakeHalfWidthIdentifier("ABC"))
Assert.Equal(ChrW(65280), SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65280)))
Assert.NotEqual(ChrW(65281), SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65281)))
Assert.Equal(1, SyntaxFacts.MakeHalfWidthIdentifier(ChrW(65281)).Length)
End Sub
End Class
Module SyntaxDiagnosticInfoListExtensions
<Extension>
Public Function Count(list As SyntaxDiagnosticInfoList) As Integer
Dim result = 0
For Each v In list
result += 1
Next
Return result
End Function
<Extension>
Public Function First(list As SyntaxDiagnosticInfoList) As DiagnosticInfo
For Each v In list
Return v
Next
Throw New InvalidOperationException()
End Function
<Extension>
Public Function ElementAt(list As SyntaxDiagnosticInfoList, index As Integer) As DiagnosticInfo
Dim i = 0
For Each v In list
If i = index Then
Return v
End If
i += 1
Next
Throw New IndexOutOfRangeException()
End Function
End Module
|