Skip to content

Commit

Permalink
Merge pull request #41274 from allisonchou/AddParameterCrash
Browse files Browse the repository at this point in the history
Fix for Visual Studio crashes when adding a parameter to a function
  • Loading branch information
allisonchou authored Feb 3, 2020
2 parents e056778 + 4f4e75b commit 01b85bc
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1972,5 +1972,25 @@ End Class

Await TestAsync(markup, expectedOrderedItems)
End Function

<WorkItem(40451, "https://github.com/dotnet/roslyn/issues/40451")>
<Fact, Trait(Traits.Feature, Traits.Features.SignatureHelp)>
Public Async Function TestSigHelpIsVisibleWithDuplicateMethodNames() As Task
Dim markup = "
Class C
Shared Sub Test()
M(1, 2$$)
End Sub

Sub M(y As Integer)
End Sub

Shared Sub M(x As Integer, y As Integer)
End Sub
End Class
"

Await TestAsync(markup, {New SignatureHelpTestItem("C.M(x As Integer, y As Integer)")})
End Function
End Class
End Namespace
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,6 @@ protected async Task<List<Tuple<Document, IEnumerable<SignatureHelpItem>>>> GetI
foreach (var relatedDocumentId in relatedDocuments)
{
var relatedDocument = document.Project.Solution.GetDocument(relatedDocumentId);
var semanticModel = await relatedDocument.GetSemanticModelForSpanAsync(new TextSpan(position, 0), cancellationToken).ConfigureAwait(false);
var result = await GetItemsWorkerAsync(relatedDocument, position, triggerInfo, cancellationToken).ConfigureAwait(false);

supportedPlatforms.Add(Tuple.Create(relatedDocument, result != null ? result.Items : SpecializedCollections.EmptyEnumerable<SignatureHelpItem>()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,20 @@
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.

Imports System.Collections.Immutable
Imports System.Threading
Imports Microsoft.CodeAnalysis.DocumentationComments
Imports Microsoft.CodeAnalysis.LanguageServices
Imports Microsoft.CodeAnalysis.SignatureHelp
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax

Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp

Partial Friend Class InvocationExpressionSignatureHelpProvider

Private Function GetMemberGroupItems(document As Document,
invocationExpression As InvocationExpressionSyntax,
Private Function GetAccessibleMembers(invocationExpression As InvocationExpressionSyntax,
semanticModel As SemanticModel,
within As ISymbol,
memberGroup As IEnumerable(Of ISymbol),
cancellationToken As CancellationToken) As IEnumerable(Of SignatureHelpItem)
cancellationToken As CancellationToken) As ImmutableArray(Of ISymbol)
Dim throughType As ITypeSymbol = Nothing
Dim expression = TryCast(invocationExpression.Expression, MemberAccessExpressionSyntax).GetExpressionOfMemberAccessExpression()

Expand All @@ -34,8 +32,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp
memberGroup = memberGroup.Where(Function(m) m.IsStatic)
End If

Dim accessibleMembers = memberGroup.Where(Function(m) m.IsAccessibleWithin(within, throughType:=throughType)).ToList()
If accessibleMembers.Count = 0 Then
Return memberGroup.Where(Function(m) m.IsAccessibleWithin(within, throughType)).ToImmutableArray()
End Function

Private Function GetMemberGroupItems(accessibleMembers As ImmutableArray(Of ISymbol),
document As Document,
invocationExpression As InvocationExpressionSyntax,
semanticModel As SemanticModel,
cancellationToken As CancellationToken) As IEnumerable(Of SignatureHelpItem)
If accessibleMembers.Length = 0 Then
Return SpecializedCollections.EmptyEnumerable(Of SignatureHelpItem)()
End If

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp
Public Overrides Function GetCurrentArgumentState(root As SyntaxNode, position As Integer, syntaxFacts As ISyntaxFactsService, currentSpan As TextSpan, cancellationToken As CancellationToken) As SignatureHelpState
Dim expression As InvocationExpressionSyntax = Nothing
If TryGetInvocationExpression(root, position, syntaxFacts, SignatureHelpTriggerReason.InvokeSignatureHelpCommand, cancellationToken, expression) AndAlso
currentSpan.Start = SignatureHelpUtilities.GetSignatureHelpSpan(expression.ArgumentList).Start Then
currentSpan.Start = GetSignatureHelpSpan(expression.ArgumentList).Start Then

Return SignatureHelpUtilities.GetSignatureHelpState(expression.ArgumentList, position)
Return GetSignatureHelpState(expression.ArgumentList, position)
End If

Return Nothing
Expand Down Expand Up @@ -116,8 +116,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp
Dim documentationCommentFormattingService = document.GetLanguageService(Of IDocumentationCommentFormattingService)()

Dim items = New List(Of SignatureHelpItem)
Dim accessibleMembers = New ImmutableArray(Of ISymbol)
If memberGroup.Length > 0 Then
items.AddRange(GetMemberGroupItems(document, invocationExpression, semanticModel, within, memberGroup, cancellationToken))
accessibleMembers = GetAccessibleMembers(invocationExpression, semanticModel, within, memberGroup, cancellationToken)
items.AddRange(GetMemberGroupItems(accessibleMembers, document, invocationExpression, semanticModel, cancellationToken))
End If

If expressionType.IsDelegateType() Then
Expand All @@ -128,10 +130,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp
items.AddRange(GetElementAccessItems(targetExpression, semanticModel, symbolDisplayService, anonymousTypeDisplayService, documentationCommentFormattingService, within, defaultProperties, cancellationToken))
End If

Dim textSpan = SignatureHelpUtilities.GetSignatureHelpSpan(invocationExpression.ArgumentList)
Dim textSpan = GetSignatureHelpSpan(invocationExpression.ArgumentList)
Dim syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService)

Dim selectedItem = TryGetSelectedIndex(memberGroup, symbolInfo)
Dim selectedItem = TryGetSelectedIndex(accessibleMembers, symbolInfo)
Return CreateSignatureHelpItems(items, textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItem)
End Function
End Class
Expand Down

0 comments on commit 01b85bc

Please sign in to comment.