From d3f2156a8cfb3d2696de2f289ffdb308a076bb73 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Tue, 22 Jul 2025 14:03:44 +0200 Subject: [PATCH] Allow captured primary constructor parameters to be still used in base-list --- .../CSharpCompletionCommandHandlerTests.vb | 21 +++++++++++++++++++ .../CSharpRecommendationServiceRunner.cs | 7 ++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb b/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb index 961a3ecc70c95..7e753857124d4 100644 --- a/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb +++ b/src/EditorFeatures/Test2/IntelliSense/CSharpCompletionCommandHandlerTests.vb @@ -11931,6 +11931,27 @@ public class C(int x) : Base(x) End Using End Function + + Public Async Function FilterPrimaryConstructorParameters_AllowInBaseTypeWhenCapturedAsMember() As Task + Using state = TestStateFactory.CreateCSharpTestState( + + , + languageVersion:=LanguageVersion.CSharp12) + + state.SendInvokeCompletionList() + Await state.AssertCompletionItemsContain("value", displayTextSuffix:="") + End Using + End Function + Public Async Function TestItemsSorted() As Task Using state = TestStateFactory.CreateCSharpTestState( diff --git a/src/Workspaces/CSharp/Portable/Recommendations/CSharpRecommendationServiceRunner.cs b/src/Workspaces/CSharp/Portable/Recommendations/CSharpRecommendationServiceRunner.cs index 58bccf1e2827e..b9519345df8ea 100644 --- a/src/Workspaces/CSharp/Portable/Recommendations/CSharpRecommendationServiceRunner.cs +++ b/src/Workspaces/CSharp/Portable/Recommendations/CSharpRecommendationServiceRunner.cs @@ -443,7 +443,7 @@ static bool IsCapturedPrimaryConstructorParameter( CancellationToken cancellationToken) { // Fine to offer primary constructor parameters in field/property initializers - var initializer = context.TargetToken.GetAncestors().FirstOrDefault(); + var initializer = context.TargetToken.GetAncestor(); if (initializer is { Parent: PropertyDeclarationSyntax or @@ -453,6 +453,11 @@ static bool IsCapturedPrimaryConstructorParameter( return false; } + // Also fine to offer primary constructor parameters in the base type list of that type. + var baseTypeSyntax = context.TargetToken.GetAncestor(); + if (baseTypeSyntax != null) + return false; + // We're not in an initializer. Filter out this primary constructor parameter if it's already been // captured by an existing field or property initializer.