) As Boolean

in src/Workspaces/VisualBasic/Portable/Extensions/ParenthesizedExpressionSyntaxExtensions.vb [41:515]


        ) As Boolean

            Dim expression = node.Expression

            
            
            If expression.IsKind(SyntaxKind.ParenthesizedExpression) Then
                Return True
            End If

            
            If expression.IsKind(SyntaxKind.TupleExpression) Then
                Return True
            End If

            
            
            
            
            
            
            
            
            If expression.IsKind(SyntaxKind.CharacterLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.DateLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.FalseLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.NothingLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.NumericLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.StringLiteralExpression) OrElse
               expression.IsKind(SyntaxKind.TrueLiteralExpression) Then

                Return True
            End If

            
            
            If expression.IsKind(SyntaxKind.InterpolatedStringExpression) Then
                Return True
            End If

            
            
            
            
            If expression.IsKind(SyntaxKind.MeExpression) OrElse
               expression.IsKind(SyntaxKind.MyBaseExpression) OrElse
               expression.IsKind(SyntaxKind.MyClassExpression) Then

                Return True
            End If

            
            
            
            
            
            If expression.IsKind(SyntaxKind.DirectCastExpression) OrElse
               expression.IsKind(SyntaxKind.TryCastExpression) OrElse
               expression.IsKind(SyntaxKind.CTypeExpression) OrElse
               TypeOf expression Is PredefinedCastExpressionSyntax Then

                Return True
            End If

            
            
            
            
            
            
            If expression.IsKind(SyntaxKind.AddressOfExpression) OrElse
               expression.IsKind(SyntaxKind.AnonymousObjectCreationExpression) OrElse
               expression.IsKind(SyntaxKind.TernaryConditionalExpression) OrElse
               expression.IsKind(SyntaxKind.BinaryConditionalExpression) OrElse
               expression.IsKind(SyntaxKind.NameOfExpression) Then

                Return True
            End If

            
            
            
            
            
            
            If expression.IsKind(SyntaxKind.CollectionInitializer) Then

                If node.IsParentKind(SyntaxKind.Interpolation) Then
                    Dim interpolation = DirectCast(node.Parent, InterpolationSyntax)

                    If interpolation.OpenBraceToken.Span.End = node.OpenParenToken.Span.Start AndAlso
                       node.OpenParenToken.Span.End = expression.Span.Start Then

                        
                        

                        Return False
                    End If
                End If

                If Not node.IsParentKind(SyntaxKind.CollectionInitializer) Then
                    
                    
                    
                    Return True
                End If

                If node.Parent.IsParentKind(SyntaxKind.ObjectCollectionInitializer) AndAlso
                   DirectCast(node.Parent.Parent, ObjectCollectionInitializerSyntax).Initializer Is node.Parent Then
                    
                    
                    
                    Return False
                End If

                If node.Parent.IsParentKind(SyntaxKind.CollectionInitializer) AndAlso
                   node.Parent.Parent.IsParentKind(SyntaxKind.ObjectCollectionInitializer) AndAlso
                   DirectCast(node.Parent.Parent.Parent, ObjectCollectionInitializerSyntax).Initializer Is node.Parent.Parent Then
                    
                    
                    
                    Return True
                End If

                
                
                Return False
            End If

            Dim firstToken = expression.GetFirstToken()
            Dim previousToken = node.OpenParenToken.GetPreviousToken()

            
            
            
            If firstToken.IsKind(SyntaxKind.LessThanToken) AndAlso
               previousToken.IsKind(SyntaxKind.LessThanToken, SyntaxKind.GreaterThanToken) Then

                Return False
            End If

            
            
            
            
            
            
            If expression.IsKind(SyntaxKind.XmlEmptyElement) OrElse
               expression.IsKind(SyntaxKind.XmlElement) OrElse
               expression.IsKind(SyntaxKind.XmlAttributeAccessExpression) OrElse
               expression.IsKind(SyntaxKind.XmlDescendantAccessExpression) OrElse
               expression.IsKind(SyntaxKind.XmlElementAccessExpression) Then
                Return True
            End If

            Dim lastToken = expression.GetLastToken()
            Dim nextToken = node.CloseParenToken.GetNextToken()

            
            
            If node.IsParentKind(SyntaxKind.EqualsValue) AndAlso
               Not EndsQuery(lastToken, semanticModel, cancellationToken) AndAlso
               Not EndsLambda(lastToken) AndAlso
               Not nextToken.IsKindOrHasMatchingText(SyntaxKind.CommaToken) Then
                Return True
            End If

            
            
            
            If expression.IsKind(SyntaxKind.ObjectCreationExpression) Then
                Dim objectCreation = DirectCast(expression, ObjectCreationExpressionSyntax)

                If nextToken.IsKindOrHasMatchingText(SyntaxKind.DotToken) Then
                    If objectCreation.ArgumentList Is Nothing Then
                        
                        
                        
                        
                        
                        
                        
                        
                        

                        Return TypeOf objectCreation.Type Is PredefinedTypeSyntax
                    End If
                End If

                If nextToken.IsKindOrHasMatchingText(SyntaxKind.OpenParenToken) Then
                    Return False
                End If

                Return True
            End If

            
            
            
            
            
            If expression.IsKind(SyntaxKind.InvocationExpression) Then
                Dim invocationExpression = DirectCast(expression, InvocationExpressionSyntax)

                If invocationExpression.Expression.IsKind(SyntaxKind.SimpleMemberAccessExpression) Then
                    Dim memberAccess = DirectCast(invocationExpression.Expression, MemberAccessExpressionSyntax)
                    If (TypeOf memberAccess.Expression Is XmlNodeSyntax AndAlso
                        (previousToken.IsKindOrHasMatchingText(SyntaxKind.LessThanToken) OrElse
                        previousToken.IsKindOrHasMatchingText(SyntaxKind.GreaterThanToken))) Then

                        Return False
                    End If
                End If

                If invocationExpression.ArgumentList Is Nothing Then
                    Return Not nextToken.IsKindOrHasMatchingText(SyntaxKind.OpenParenToken)
                End If

                Return True
            End If

            
            
            
            If expression.IsKind(SyntaxKind.IdentifierName) OrElse
               expression.IsKind(SyntaxKind.SimpleMemberAccessExpression) Then

                
                
                If TypeOf node.Parent Is ArgumentSyntax Then
                    Dim symbol = semanticModel.GetSymbolInfo(expression, cancellationToken).Symbol
                    If symbol IsNot Nothing Then
                        If symbol.MatchesKind(SymbolKind.Local, SymbolKind.Field, SymbolKind.Property) Then
                            Dim argument = DirectCast(node.Parent, ArgumentSyntax)
                            Dim parameter = argument.DetermineParameter(semanticModel, cancellationToken:=cancellationToken)

                            If parameter IsNot Nothing AndAlso
                               parameter.RefKind <> RefKind.None Then

                                Return False
                            End If
                        End If
                    End If
                End If

                
                
                
                If nextToken.IsKindOrHasMatchingText(SyntaxKind.OpenParenToken) Then
                    If node.IsParentKind(SyntaxKind.InvocationExpression) Then
                        Dim parentInvocation = DirectCast(node.Parent, InvocationExpressionSyntax)
                        If parentInvocation.Expression Is node AndAlso
                           parentInvocation.ArgumentList IsNot Nothing AndAlso
                           parentInvocation.ArgumentList.OpenParenToken = nextToken Then

                            Return True
                        End If
                    End If

                    Return False
                End If

                Return True
            End If

            
            
            If expression.IsKind(SyntaxKind.GenericName) Then
                If Not nextToken.IsKindOrHasMatchingText(SyntaxKind.OpenParenToken) Then
                    Return True
                End If
            End If

            Dim isNodeCloseParenLastTokenOfStatement = node.CloseParenToken.IsLastTokenOfStatement(checkColonTrivia:=True)
            Dim nextNextToken = nextToken.GetNextToken()

            
            
            
            
            If isNodeCloseParenLastTokenOfStatement AndAlso
                EndsQuery(lastToken, semanticModel, cancellationToken) AndAlso
                nextToken.Kind = SyntaxKind.SelectKeyword AndAlso
                nextNextToken.Kind <> SyntaxKind.CaseKeyword Then
                Return False
            End If

            
            
            If node.Expression.IsKind(SyntaxKind.AwaitExpression) AndAlso
                (isNodeCloseParenLastTokenOfStatement OrElse
                nextToken.Kind = SyntaxKind.CommaToken) Then
                Return True
            End If

            
            
            
            If TypeOf expression Is BinaryExpressionSyntax OrElse
               TypeOf expression Is UnaryExpressionSyntax Then

                Dim parentExpression = TryCast(node.Parent, ExpressionSyntax)
                If parentExpression IsNot Nothing Then
                    If parentExpression.IsKind(SyntaxKind.SimpleMemberAccessExpression) Then
                        Return False
                    End If

                    Dim precedence = expression.GetOperatorPrecedence()
                    Dim parentPrecedence = parentExpression.GetOperatorPrecedence()

                    
                    If parentPrecedence <> OperatorPrecedence.PrecedenceNone AndAlso
                       precedence < parentPrecedence Then

                        Return False
                    End If

                    
                    
                    If precedence <> OperatorPrecedence.PrecedenceNone AndAlso precedence = parentPrecedence Then
                        Dim binaryExpression = TryCast(expression, BinaryExpressionSyntax)
                        Dim parentBinaryExpression = TryCast(parentExpression, BinaryExpressionSyntax)

                        If binaryExpression IsNot Nothing AndAlso parentBinaryExpression IsNot Nothing Then
                            
                            
                            If parentBinaryExpression.Left Is node Then
                                Return True
                            End If

                            
                            
                            If parentBinaryExpression.IsKind(SyntaxKind.AddExpression, SyntaxKind.MultiplyExpression) AndAlso
                               expression.Kind = parentExpression.Kind Then

                                Return True
                            End If
                        End If

                        Return False
                    End If
                End If

                Return True
            End If

            
            
            
            
            
            
            If TypeOf expression Is SingleLineLambdaExpressionSyntax Then
                If node.CloseParenToken.IsLastTokenOfStatementWithEndOfLine() AndAlso
                    lastToken.Kind = SyntaxKind.ThenKeyword Then
                    Return False
                End If

                If nextToken.IsKindOrHasMatchingText(SyntaxKind.CommaToken) Then
                    Dim lastStatement = lastToken.Parent.GetFirstEnclosingStatement()
                    If EndsQuery(lastToken, semanticModel, cancellationToken) OrElse EndsVariableDeclarator(lastToken) OrElse
                            (EndsLambda(lastToken) AndAlso
                            Not previousToken.IsKindOrHasMatchingText(SyntaxKind.OpenParenToken) AndAlso
                            lastStatement IsNot Nothing AndAlso lastStatement.Kind = SyntaxKind.ReDimStatement) Then
                        Return False
                    End If

                    Return True
                End If

                
                
                
                If nextToken.IsKindOrHasMatchingText(SyntaxKind.DotToken) AndAlso
                       nextToken.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression) Then
                    Return False
                End If

                
                
                
                
                
                
                
                
                
                If (node.Parent.Kind = SyntaxKind.InvocationExpression OrElse
                        node.Parent.Kind = SyntaxKind.IsExpression OrElse
                        node.Parent.Kind = SyntaxKind.TypeOfIsExpression OrElse
                        node.Parent.Kind = SyntaxKind.TypeOfIsNotExpression) Then
                    Return False
                End If

                
                
                
                If nextToken.IsKindOrHasMatchingText(SyntaxKind.CloseParenToken) OrElse
                       nextToken.IsKindOrHasMatchingText(SyntaxKind.CloseBraceToken) OrElse
                       lastToken.IsLastTokenOfStatement(checkColonTrivia:=True) OrElse
                       node.Parent.Kind = SyntaxKind.XmlEmbeddedExpression Then
                    Return True
                End If

                
                
                
                
                If isNodeCloseParenLastTokenOfStatement AndAlso
                    EndsQuery(lastToken, semanticModel, cancellationToken) AndAlso
                  nextToken.IsKeyword Then
                    Return True
                End If

                If isNodeCloseParenLastTokenOfStatement AndAlso
                    Not EndsQuery(lastToken, semanticModel, cancellationToken) Then
                    Return True
                End If

                Return False
            End If

            If TypeOf expression Is MultiLineLambdaExpressionSyntax Then
                Return True
            End If

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            If EndsQuery(lastToken, semanticModel, cancellationToken) Then
                If nextToken.IsKindOrHasMatchingText(SyntaxKind.CloseParenToken) OrElse
                   nextToken.IsKindOrHasMatchingText(SyntaxKind.CloseBraceToken) OrElse
                   node.CloseParenToken.IsLastTokenOfStatement() Then

                    If Not (nextToken.IsKindOrHasMatchingText(SyntaxKind.DotToken) AndAlso
                            nextToken.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression)) AndAlso
                       Not (nextToken.IsKindOrHasMatchingText(SyntaxKind.SelectKeyword) AndAlso
                            nextToken.Parent.IsKind(SyntaxKind.SelectStatement)) AndAlso
                        Not (nextToken.IsKindOrHasMatchingText(SyntaxKind.ExclamationToken) AndAlso
                             lastToken.IsKeyword AndAlso
                             nextToken.Parent.IsKind(SyntaxKind.DictionaryAccessExpression)) Then

                        Return True
                    End If
                End If

                Return False
            End If

            
            
            If expression.IsKind(SyntaxKind.GetTypeExpression) Then
                Return True
            End If

            
            
            If expression.Kind = SyntaxKind.DictionaryAccessExpression AndAlso
                node.CloseParenToken.IsLastTokenOfStatement() Then
                Return True
            End If

            Return False
        End Function