diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/ElementAccessExpressionSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/ElementAccessExpressionSignatureHelpProviderTests.cs index a555cf5f608cc1f01ab0e7bcc848fbe38ab4aed6..61565eeea1ace9ab20bd78c13ab864428a3b9ef8 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/ElementAccessExpressionSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/ElementAccessExpressionSignatureHelpProviderTests.cs @@ -898,6 +898,48 @@ public void Method(TestClass tc) "; await TestAsync(markup, new[] { new SignatureHelpTestItem("int WithIndexer[int index]") }, usePreviousCharAsTrigger: true); } + + [WorkItem(20507, "https://github.com/dotnet/roslyn/issues/20507")] + [Fact, Trait(Traits.Feature, Traits.Features.SignatureHelp)] + public async Task InConditionalIndexingFollowedByMemberAccess() + { + var markup = @" +class Indexable +{ + public Indexable this[int x] { get => null; } + + Indexable Count; + + static void Main(string[] args) + { + Indexable x; + x?[$$].Count; + } +} +"; + await TestAsync(markup, new[] { new SignatureHelpTestItem("Indexable Indexable[int x]") }, usePreviousCharAsTrigger: false); + } + + [WorkItem(20507, "https://github.com/dotnet/roslyn/issues/20507")] + [Fact, Trait(Traits.Feature, Traits.Features.SignatureHelp)] + public async Task InConditionalIndexingFollowedByConditionalAcesss() + { + var markup = @" +class Indexable +{ + public Indexable this[int x] { get => null; } + + Indexable Count; + + static void Main(string[] args) + { + Indexable x; + x?[$$].Count?.Count; + } +} +"; + await TestAsync(markup, new[] { new SignatureHelpTestItem("Indexable Indexable[int x]") }, usePreviousCharAsTrigger: false); + } } } } diff --git a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs index 8bf986033a2c717416d8fc1c6a54b22c77883358..933fd32875e3fc44d143241583446e68138cfe42 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs @@ -372,7 +372,11 @@ internal static bool TryGetSyntax(SyntaxNode root, int position, ISyntaxFactsSer { if (CommonSignatureHelpUtilities.TryGetSyntax(root, position, syntaxFacts, triggerReason, IsTriggerToken, IsArgumentListToken, cancellationToken, out ElementBindingExpressionSyntax elementBindingExpression)) { - identifier = ((ConditionalAccessExpressionSyntax)elementBindingExpression.Parent).Expression; + // Find the first conditional access expression that starts left of our open bracket + var conditionalAccess = elementBindingExpression.FirstAncestorOrSelf( + c => c.SpanStart < elementBindingExpression.SpanStart); + + identifier = conditionalAccess.Expression; openBrace = elementBindingExpression.ArgumentList.OpenBracketToken; return true;