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