/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/VisualBasic/Test/Syntax/Scanner/ScannerTests.vb
2 191 строка
86 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
' 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.Collections 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