|
' 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.VisualBasic.Syntax
Namespace Microsoft.CodeAnalysis.VisualBasic.Simplification
Friend Module VisualBasicInferredMemberNameSimplifier
Friend Function CanSimplifyTupleName(node As SimpleArgumentSyntax, parseOptions As VisualBasicParseOptions) As Boolean
' Tuple elements are arguments in a tuple expression
If node.NameColonEquals Is Nothing OrElse Not node.IsParentKind(SyntaxKind.TupleExpression) Then
Return False
End If
If parseOptions.LanguageVersion < LanguageVersion.VisualBasic15_3 Then
Return False
End If
If RemovalCausesAmbiguity(DirectCast(node.Parent, TupleExpressionSyntax).Arguments, node) Then
Return False
End If
Dim inferredName = node.Expression.TryGetInferredMemberName()
If inferredName Is Nothing OrElse
Not CaseInsensitiveComparison.Equals(inferredName, node.NameColonEquals.Name.Identifier.ValueText) Then
Return False
End If
Return True
End Function
Friend Function CanSimplifyNamedFieldInitializer(node As NamedFieldInitializerSyntax) As Boolean
Dim parentMemberInitializer As ObjectMemberInitializerSyntax = DirectCast(node.Parent, ObjectMemberInitializerSyntax)
' Spec requires explicit names for object creation expressions (unlike anonymous objects and tuples which can infer them)
Dim requiresExplicitNames = parentMemberInitializer.IsParentKind(SyntaxKind.ObjectCreationExpression)
If requiresExplicitNames OrElse RemovalCausesAmbiguity(parentMemberInitializer.Initializers, node) Then
Return False
End If
Dim inferredName = node.Expression.TryGetInferredMemberName()
If inferredName Is Nothing OrElse
Not CaseInsensitiveComparison.Equals(inferredName, node.Name.Identifier.ValueText) Then
Return False
End If
Return True
End Function
' An explicit name cannot be removed if some other position would produce it as inferred name
Private Function RemovalCausesAmbiguity(arguments As SeparatedSyntaxList(Of SimpleArgumentSyntax), toRemove As SimpleArgumentSyntax) As Boolean
Dim name = toRemove.NameColonEquals.Name.Identifier.ValueText
For Each argument In arguments
If argument Is toRemove Then
Continue For
End If
If argument.NameColonEquals Is Nothing AndAlso CaseInsensitiveComparison.Equals(argument.Expression.TryGetInferredMemberName(), name) Then
Return True
End If
Next
Return False
End Function
' An explicit name cannot be removed if some other position would produce it as inferred name
Private Function RemovalCausesAmbiguity(initializers As SeparatedSyntaxList(Of FieldInitializerSyntax), toRemove As NamedFieldInitializerSyntax) As Boolean
Dim name = toRemove.Name.Identifier.ValueText
For Each initializer In initializers
If initializer Is toRemove Then
Continue For
End If
Dim inferredInitializer = TryCast(initializer, InferredFieldInitializerSyntax)
If inferredInitializer IsNot Nothing AndAlso CaseInsensitiveComparison.Equals(inferredInitializer.Expression.TryGetInferredMemberName(), name) Then
Return True
End If
Next
Return False
End Function
End Module
End Namespace
|