diff --git a/Src/Workspaces/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs b/Src/Workspaces/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs index 19382ddf491ba169fb54d5620deeff2493998f55..55776a191be365ab73214dadd5e7d6253ff8ac99 100644 --- a/Src/Workspaces/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs +++ b/Src/Workspaces/CSharp/Formatting/Rules/TokenBasedFormattingRule.cs @@ -354,6 +354,11 @@ public override AdjustSpacesOperation GetAdjustSpacesOperation(SyntaxToken previ return CreateAdjustSpacesOperation(0, AdjustSpacesOption.ForceSpacesIfOnSingleLine); } + if (previousToken.CSharpKind() == SyntaxKind.IdentifierToken && currentToken.CSharpKind() == SyntaxKind.QuestionToken && currentToken.Parent.IsKind(SyntaxKind.ConditionalAccessExpression)) + { + return CreateAdjustSpacesOperation(0, AdjustSpacesOption.ForceSpacesIfOnSingleLine); + } + return nextOperation.Invoke(); } } diff --git a/Src/Workspaces/CSharp/Recommendations/CSharpRecommendationService.cs b/Src/Workspaces/CSharp/Recommendations/CSharpRecommendationService.cs index 559e8c65b51606c5283a0d27521c8bfc82b6d602..a69199b9ebec0b9a9f99107f47ce3f37342eb16c 100644 --- a/Src/Workspaces/CSharp/Recommendations/CSharpRecommendationService.cs +++ b/Src/Workspaces/CSharp/Recommendations/CSharpRecommendationService.cs @@ -121,6 +121,11 @@ internal class CSharpRecommendationService : AbstractRecommendationService { return GetSymbolsOffOffAlias(context, ((AliasQualifiedNameSyntax)node).Alias, cancellationToken); } + else if (node.CSharpKind() == SyntaxKind.MemberBindingExpression) + { + var parentConditionalAccess = node.GetAncestor(); + return GetSymbolsOffOfExpression(context, parentConditionalAccess.Expression, cancellationToken); + } else { return SpecializedCollections.EmptyEnumerable(); diff --git a/Src/Workspaces/CSharpTest/Formatting/FormattingTests.cs b/Src/Workspaces/CSharpTest/Formatting/FormattingTests.cs index 274fe2bf9d1be3e05b605b975e3e1ce4a076ab70..4a7b5c37f8e4462c25e4f1a5b1b3471dd3913bb5 100644 --- a/Src/Workspaces/CSharpTest/Formatting/FormattingTests.cs +++ b/Src/Workspaces/CSharpTest/Formatting/FormattingTests.cs @@ -5281,5 +5281,40 @@ public void Method() AssertFormat(expected, code, changedOptionSet: options); } + + public void ConditionalMemberAccess() + { + var code = @" +class A +{ + public A a; +} + +class Program +{ + static void Main() + { + A a = null; + A ?.a = null; + } +}"; + + var expected = @" +class A +{ + public A a; +} + +class Program +{ + static void Main() + { + A a = null; + A?.a = null; + } +}"; + + AssertFormat(expected, code); + } } }