Private Function ParseStatementInMethodBodyCore()

in src/Compilers/VisualBasic/Portable/Parser/Parser.vb [924:1260]


        Private Function ParseStatementInMethodBodyCore() As StatementSyntax
            _cancellationToken.ThrowIfCancellationRequested()

            Select Case CurrentToken.Kind

                Case SyntaxKind.GoToKeyword
                    Return ParseGotoStatement()

                Case SyntaxKind.CaseKeyword
                    Return ParseCaseStatement()

                Case SyntaxKind.SelectKeyword
                    Return ParseSelectStatement()

                Case SyntaxKind.WithKeyword, SyntaxKind.WhileKeyword
                    Return ParseExpressionBlockStatement()

                Case SyntaxKind.UsingKeyword
                    Return ParseUsingStatement()

                Case SyntaxKind.SyncLockKeyword
                    Return ParseExpressionBlockStatement()

                Case SyntaxKind.TryKeyword
                    Return ParseTry()

                Case SyntaxKind.CatchKeyword
                    Return ParseCatch()

                Case SyntaxKind.FinallyKeyword
                    Return ParseFinally()

                Case SyntaxKind.IfKeyword
                    Return ParseIfStatement()

                

                Case SyntaxKind.ElseKeyword
                    If PeekToken(1).Kind = SyntaxKind.IfKeyword Then
                        Return ParseElseIfStatement()
                    Else
                        Return ParseElseStatement()
                    End If

                Case SyntaxKind.ElseIfKeyword
                    Return ParseElseIfStatement()

                Case SyntaxKind.DoKeyword
                    Return ParseDoStatement()

                Case SyntaxKind.LoopKeyword
                    Return ParseLoopStatement()

                Case SyntaxKind.ForKeyword
                    Return ParseForStatement()

                Case SyntaxKind.NextKeyword
                    Return ParseNextStatement()

                Case SyntaxKind.EndIfKeyword, SyntaxKind.WendKeyword
                    
                    
                    Return ParseAnachronisticStatement()

                Case SyntaxKind.EndKeyword
                    Return ParseEndStatement()

                Case SyntaxKind.ReturnKeyword
                    Return ParseReturnStatement()

                Case SyntaxKind.StopKeyword
                    Return ParseStopOrEndStatement()

                Case SyntaxKind.ContinueKeyword
                    Return ParseContinueStatement()

                Case SyntaxKind.ExitKeyword
                    Return ParseExitStatement()

                Case SyntaxKind.OnKeyword
                    Return ParseOnErrorStatement()

                Case SyntaxKind.ResumeKeyword
                    Return ParseResumeStatement()

                Case SyntaxKind.CallKeyword
                    Return ParseCallStatement()

                Case SyntaxKind.RaiseEventKeyword
                    Return ParseRaiseEventStatement()

                Case SyntaxKind.ReDimKeyword
                    Return ParseRedimStatement()

                Case SyntaxKind.AddHandlerKeyword, SyntaxKind.RemoveHandlerKeyword
                    Return ParseHandlerStatement()

                Case SyntaxKind.PartialKeyword,
                 SyntaxKind.PrivateKeyword,
                 SyntaxKind.ProtectedKeyword,
                 SyntaxKind.PublicKeyword,
                 SyntaxKind.FriendKeyword,
                 SyntaxKind.NotOverridableKeyword,
                 SyntaxKind.OverridableKeyword,
                 SyntaxKind.MustInheritKeyword,
                 SyntaxKind.MustOverrideKeyword,
                 SyntaxKind.StaticKeyword,
                 SyntaxKind.SharedKeyword,
                 SyntaxKind.ShadowsKeyword,
                 SyntaxKind.WithEventsKeyword,
                 SyntaxKind.OverloadsKeyword,
                 SyntaxKind.OverridesKeyword,
                 SyntaxKind.ConstKeyword,
                 SyntaxKind.DimKeyword,
                 SyntaxKind.WideningKeyword,
                 SyntaxKind.NarrowingKeyword,
                 SyntaxKind.DefaultKeyword,
                 SyntaxKind.ReadOnlyKeyword,
                 SyntaxKind.WriteOnlyKeyword,
                 SyntaxKind.LessThanToken
                    
                    

                    Dim attributes As CoreInternalSyntax.SyntaxList(Of AttributeListSyntax) = Nothing

                    If Me.CurrentToken.Kind = Global.Microsoft.CodeAnalysis.VisualBasic.SyntaxKind.LessThanToken Then
                        attributes = ParseAttributeLists(allowFileLevelAttributes:=False)
                    End If

                    Dim modifiers = ParseSpecifiers()

                    If Not modifiers.Any(SyntaxKind.DimKeyword, SyntaxKind.ConstKeyword) Then
                        
                        
                        
                        
                        
                        Select Case CurrentToken.Kind
                            Case SyntaxKind.SubKeyword,
                                SyntaxKind.ClassKeyword,
                                SyntaxKind.EnumKeyword,
                                SyntaxKind.StructureKeyword,
                                SyntaxKind.InterfaceKeyword,
                                SyntaxKind.FunctionKeyword,
                                SyntaxKind.OperatorKeyword,
                                SyntaxKind.PropertyKeyword,
                                SyntaxKind.EventKeyword
                                Return ParseSpecifierDeclaration(attributes, modifiers)

                            Case SyntaxKind.IdentifierToken
                                
                                Dim contextualKind As SyntaxKind = Nothing

                                If TryIdentifierAsContextualKeyword(CurrentToken, contextualKind) Then
                                    If contextualKind = SyntaxKind.CustomKeyword AndAlso PeekToken(1).Kind = SyntaxKind.EventKeyword Then
                                        Return ParseSpecifierDeclaration(attributes, modifiers)
                                    End If
                                End If
                        End Select
                    End If

                    Return ParseVarDeclStatement(attributes, modifiers)

                Case SyntaxKind.SetKeyword, SyntaxKind.LetKeyword
                    Return ParseAssignmentStatement()

                Case SyntaxKind.ErrorKeyword
                    Return ParseError()

                Case SyntaxKind.ThrowKeyword
                    Return ParseThrowStatement()

                Case SyntaxKind.IntegerLiteralToken
                    If IsFirstStatementOnLine(CurrentToken) Then
                        Return ParseLabel()
                    End If

                Case SyntaxKind.IdentifierToken
                    

                    If ShouldParseAsLabel() Then
                        Return ParseLabel()
                    End If

                    
                    
                    
                    Dim contextualKind As SyntaxKind = Nothing

                    If TryIdentifierAsContextualKeyword(CurrentToken, contextualKind) Then
                        If contextualKind = SyntaxKind.MidKeyword Then
                            
                            
                            
                            If PeekToken(1).Kind = SyntaxKind.OpenParenToken Then
                                Return ParseMid()
                            End If

                        ElseIf contextualKind = SyntaxKind.CustomKeyword AndAlso PeekToken(1).Kind = SyntaxKind.EventKeyword Then 
                            Return ParseSpecifierDeclaration()

                        ElseIf contextualKind = SyntaxKind.AsyncKeyword OrElse contextualKind = SyntaxKind.IteratorKeyword Then

                            Dim nextToken = PeekToken(1)

                            If SyntaxFacts.IsSpecifier(nextToken.Kind) OrElse SyntaxFacts.CanStartSpecifierDeclaration(nextToken.Kind) Then
                                Return ParseSpecifierDeclaration()
                            End If

                        ElseIf contextualKind = SyntaxKind.AwaitKeyword AndAlso
                               Context.IsWithinAsyncMethodOrLambda Then
                            Return ParseAwaitStatement()

                        ElseIf contextualKind = SyntaxKind.YieldKeyword AndAlso
                               Context.IsWithinIteratorMethodOrLambdaOrProperty Then
                            Return ParseYieldStatement()

                        End If
                    End If

                    Return ParseAssignmentOrInvocationStatement()

                Case SyntaxKind.DotToken,
                        SyntaxKind.ExclamationToken,
                        SyntaxKind.MyBaseKeyword,
                        SyntaxKind.MyClassKeyword,
                        SyntaxKind.MeKeyword,
                        SyntaxKind.GlobalKeyword,
                        SyntaxKind.ShortKeyword,
                        SyntaxKind.UShortKeyword,
                        SyntaxKind.IntegerKeyword,
                        SyntaxKind.UIntegerKeyword,
                        SyntaxKind.LongKeyword,
                        SyntaxKind.ULongKeyword,
                        SyntaxKind.DecimalKeyword,
                        SyntaxKind.SingleKeyword,
                        SyntaxKind.DoubleKeyword,
                        SyntaxKind.SByteKeyword,
                        SyntaxKind.ByteKeyword,
                        SyntaxKind.BooleanKeyword,
                        SyntaxKind.CharKeyword,
                        SyntaxKind.DateKeyword,
                        SyntaxKind.StringKeyword,
                        SyntaxKind.VariantKeyword,
                        SyntaxKind.ObjectKeyword,
                        SyntaxKind.DirectCastKeyword,
                        SyntaxKind.TryCastKeyword,
                        SyntaxKind.CTypeKeyword,
                        SyntaxKind.CBoolKeyword,
                        SyntaxKind.CDateKeyword,
                        SyntaxKind.CDblKeyword,
                        SyntaxKind.CSByteKeyword,
                        SyntaxKind.CByteKeyword,
                        SyntaxKind.CCharKeyword,
                        SyntaxKind.CShortKeyword,
                        SyntaxKind.CUShortKeyword,
                        SyntaxKind.CIntKeyword,
                        SyntaxKind.CUIntKeyword,
                        SyntaxKind.CLngKeyword,
                        SyntaxKind.CULngKeyword,
                        SyntaxKind.CSngKeyword,
                        SyntaxKind.CStrKeyword,
                        SyntaxKind.CDecKeyword,
                        SyntaxKind.CObjKeyword,
                        SyntaxKind.GetTypeKeyword,
                        SyntaxKind.GetXmlNamespaceKeyword
                    Return ParseAssignmentOrInvocationStatement()

                Case SyntaxKind.EmptyToken
                    Return ParseEmptyStatement()

                Case SyntaxKind.ColonToken,
                    SyntaxKind.StatementTerminatorToken
                    Debug.Assert(False, "Unexpected terminator: " & CurrentToken.Kind.ToString())

                Case SyntaxKind.EraseKeyword
                    Return ParseErase()

                Case SyntaxKind.GetKeyword
                    If (IsValidStatementTerminator(PeekToken(1)) OrElse PeekToken(1).Kind = SyntaxKind.OpenParenToken) AndAlso
                       Context.IsWithin(SyntaxKind.SetAccessorBlock, SyntaxKind.GetAccessorBlock) Then

                        Return ParsePropertyOrEventAccessor(SyntaxKind.GetAccessorStatement, Nothing, Nothing)
                    Else
                        Return ReportUnrecognizedStatementError(ERRID.ERR_ObsoleteGetStatement)
                    End If

                Case SyntaxKind.GosubKeyword
                    Return ParseAnachronisticStatement()

                

                Case SyntaxKind.InheritsKeyword,
                        SyntaxKind.ImplementsKeyword,
                        SyntaxKind.OptionKeyword,
                        SyntaxKind.ImportsKeyword,
                        SyntaxKind.DeclareKeyword,
                        SyntaxKind.DelegateKeyword,
                        SyntaxKind.InterfaceKeyword,
                        SyntaxKind.PropertyKeyword,
                        SyntaxKind.SubKeyword,
                        SyntaxKind.FunctionKeyword,
                        SyntaxKind.OperatorKeyword,
                        SyntaxKind.EventKeyword,
                        SyntaxKind.NamespaceKeyword,
                        SyntaxKind.ClassKeyword,
                        SyntaxKind.StructureKeyword,
                        SyntaxKind.EnumKeyword,
                        SyntaxKind.ModuleKeyword
                    
                    
                    Return ParseDeclarationStatementInternal()

                Case SyntaxKind.QuestionToken

                    If CanStartConsequenceExpression(Me.PeekToken(1).Kind, qualified:=False) Then
                        Return ParseAssignmentOrInvocationStatement()
                    Else
                        Return ParsePrintStatement()
                    End If

                Case Else
                    If CanFollowStatement(CurrentToken) Then
                        
                        
                        
                        
                        
                        
                        
                        Return InternalSyntaxFactory.EmptyStatement
                    End If
            End Select

            
            Return ReportUnrecognizedStatementError(ERRID.ERR_Syntax)
        End Function