File: Parser\ParseVerify.vb
Web Access
Project: src\roslyn\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic)
' 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 Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports InternalSyntaxFactory = Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax.SyntaxFactory

Namespace Microsoft.CodeAnalysis.VisualBasic.Syntax.InternalSyntax

    ' Deal with the case where a token is not what is expected.
    ' Produces an error unless the construct is already in error.
    ' Always returns false.

    Partial Friend Class Parser
        ' File: Parser.cpp
        ' Lines: 16764 - 16764
        ' bool .Parser::HandleUnexpectedToken( [ tokens TokenType ] [ _Inout_ bool& ErrorInConstruct ] )

        Private Shared Function HandleUnexpectedToken(kind As SyntaxKind) As SyntaxToken
            Dim errorId = GetUnexpectedTokenErrorId(kind)
            Dim t = InternalSyntaxFactory.MissingToken(kind)
            Return ReportSyntaxError(t, errorId)
        End Function

        Private Shared Function HandleUnexpectedKeyword(kind As SyntaxKind) As KeywordSyntax
            Dim errorId = GetUnexpectedTokenErrorId(kind)
            Dim t = InternalSyntaxFactory.MissingKeyword(kind)
            Return ReportSyntaxError(t, errorId)
        End Function

        Private Shared Function GetUnexpectedTokenErrorId(kind As SyntaxKind) As ERRID

            Select Case (kind)
                Case SyntaxKind.AsKeyword
                    Return ERRID.ERR_ExpectedAs

                Case SyntaxKind.ByKeyword
                    Return ERRID.ERR_ExpectedBy

                Case SyntaxKind.CloseBraceToken
                    Return ERRID.ERR_ExpectedRbrace

                Case SyntaxKind.CloseParenToken
                    Return ERRID.ERR_ExpectedRparen

                Case SyntaxKind.CommaToken
                    Return ERRID.ERR_ExpectedComma

                Case SyntaxKind.DoubleQuoteToken
                    Return ERRID.ERR_ExpectedQuote

                Case SyntaxKind.DotToken
                    Return ERRID.ERR_ExpectedDot

                Case SyntaxKind.EndCDataToken
                    Return ERRID.ERR_ExpectedXmlEndCData

                Case SyntaxKind.EqualsKeyword
                    Return ERRID.ERR_ExpectedEquals

                Case SyntaxKind.EqualsToken
                    Return ERRID.ERR_ExpectedEQ

                Case SyntaxKind.GreaterThanToken
                    Return ERRID.ERR_ExpectedGreater

                Case SyntaxKind.IdentifierToken
                    Return ERRID.ERR_ExpectedIdentifier

                Case SyntaxKind.IntegerLiteralToken
                    Return ERRID.ERR_ExpectedIntLiteral

                Case SyntaxKind.InKeyword
                    Return ERRID.ERR_ExpectedIn

                Case SyntaxKind.IntoKeyword
                    Return ERRID.ERR_ExpectedInto

                Case SyntaxKind.IsKeyword
                    Return ERRID.ERR_MissingIsInTypeOf

                Case SyntaxKind.JoinKeyword
                    Return ERRID.ERR_ExpectedJoin

                Case SyntaxKind.LessThanToken,
                    SyntaxKind.LessThanSlashToken
                    Return ERRID.ERR_ExpectedLT

                Case SyntaxKind.LessThanPercentEqualsToken
                    Return ERRID.ERR_ExpectedXmlBeginEmbedded

                Case SyntaxKind.LibKeyword
                    Return ERRID.ERR_MissingLibInDeclare

                Case SyntaxKind.MinusToken
                    Return ERRID.ERR_ExpectedMinus

                Case SyntaxKind.MinusMinusGreaterThanToken
                    Return ERRID.ERR_ExpectedXmlEndComment

                Case SyntaxKind.NextKeyword
                    Return ERRID.ERR_MissingNext

                Case SyntaxKind.OfKeyword
                    Return ERRID.ERR_OfExpected

                Case SyntaxKind.OnKeyword
                    Return ERRID.ERR_ExpectedOn

                Case SyntaxKind.OpenBraceToken
                    Return ERRID.ERR_ExpectedLbrace

                Case SyntaxKind.OpenParenToken
                    Return ERRID.ERR_ExpectedLparen

                Case SyntaxKind.PercentGreaterThanToken
                    Return ERRID.ERR_ExpectedXmlEndEmbedded

                Case SyntaxKind.QuestionGreaterThanToken
                    Return ERRID.ERR_ExpectedXmlEndPI

                Case SyntaxKind.SemicolonToken
                    Return ERRID.ERR_ExpectedSColon

                Case SyntaxKind.SingleQuoteToken
                    Return ERRID.ERR_ExpectedSQuote

                Case SyntaxKind.SlashToken
                    Return ERRID.ERR_ExpectedDiv

                Case SyntaxKind.StringLiteralToken
                    Return ERRID.ERR_ExpectedStringLiteral

                Case SyntaxKind.XmlNameToken
                    Return ERRID.ERR_ExpectedXmlName

                Case SyntaxKind.WarningKeyword
                    Return ERRID.ERR_ExpectedWarningKeyword

                Case Else
                    Return ERRID.ERR_Syntax
            End Select
        End Function

        ' Produce an error message if the current token is not the expected TokenType.

        ' File: Parser.cpp
        ' Lines: 1021 - 1021
        ' inline bool .Parser::VerifyExpectedToken( [ tokens TokenType ] [ _Inout_ bool& ErrorInConstruct ] )

        ''' <summary>
        ''' Check that the current token is the expected kind, the current node is consumed and optionally a new line
        ''' after the token.
        ''' </summary>
        ''' <param name="kind">The expected node kind.</param>
        ''' <returns>A token of the expected kind.  This node may be an empty token with an error attached to it</returns>
        ''' <remarks>Since nodes are immutable, the only way to create nodes with errors attached is to create a node without an error,
        ''' then add an error with this method to create another node.</remarks>
        Private Function VerifyExpectedToken(Of T As SyntaxToken)(
                kind As SyntaxKind,
                ByRef token As T,
                Optional state As ScannerState = ScannerState.VB
            ) As Boolean

            Dim current As SyntaxToken = CurrentToken

            If current.Kind = kind Then
                token = DirectCast(current, T)
                GetNextToken(state)
                Return True
            Else
                token = DirectCast(HandleUnexpectedToken(kind), T)
                Return False
            End If
        End Function

    End Class

End Namespace