From 3b7b24f9c78296bd6caf3faaa53e3ac8640abca0 Mon Sep 17 00:00:00 2001 From: Orachor Date: Thu, 17 Oct 2024 09:38:17 +0200 Subject: [PATCH] Speculative changes to PrimaryConstructorBaseTypeSyntax --- .../SimplifyTypeNamesTests.cs | 28 +++++++++++++++++++ .../CSharp/Utilities/SpeculationAnalyzer.cs | 20 ++++++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/Features/CSharpTest/SimplifyTypeNames/SimplifyTypeNamesTests.cs b/src/Features/CSharpTest/SimplifyTypeNames/SimplifyTypeNamesTests.cs index e507f937454dc..cb909b0776ac3 100644 --- a/src/Features/CSharpTest/SimplifyTypeNames/SimplifyTypeNamesTests.cs +++ b/src/Features/CSharpTest/SimplifyTypeNames/SimplifyTypeNamesTests.cs @@ -2251,6 +2251,34 @@ class C """); } + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/75026")] + public async Task SimplifyUnmentionableTypeParameter3() + { + await TestMissingInRegularAndScriptAsync( + """ + public class C; + + public class D : C<[|D.E|]> + { + public class E; + } + """); + } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/75026")] + public async Task SimplifyUnmentionableTypeParameter3_PrimaryCtor() + { + await TestMissingInRegularAndScriptAsync( + """ + public class C; + + public class D() : C<[|D.E|]>() + { + public class E; + } + """); + } + [Fact] public async Task TestGlobalAlias() { diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Utilities/SpeculationAnalyzer.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Utilities/SpeculationAnalyzer.cs index cd36ada0d4bf2..bfc64ac68efb1 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Utilities/SpeculationAnalyzer.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Utilities/SpeculationAnalyzer.cs @@ -72,10 +72,22 @@ protected override SyntaxNode GetSemanticRootForSpeculation(ExpressionSyntax exp { Debug.Assert(expression != null); - var parentNodeToSpeculate = expression - .AncestorsAndSelf(ascendOutOfTrivia: false) - .Where(CanSpeculateOnNode) - .LastOrDefault(); + SyntaxNode previousNode = null; + SyntaxNode parentNodeToSpeculate = null; + foreach (var node in expression.AncestorsAndSelf(ascendOutOfTrivia: false)) + { + if (CanSpeculateOnNode(node)) + { + // Only speculate on PrimaryConstructorBaseTypeSyntax if we are inside the argument list + if (node.Kind() is not SyntaxKind.PrimaryConstructorBaseType || + previousNode.Kind() is SyntaxKind.ArgumentList) + { + parentNodeToSpeculate = node; + } + } + + previousNode = node; + } return parentNodeToSpeculate ?? expression; }