diff --git a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/XmlDocumentationCommentCompletionProviderTests.cs b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/XmlDocumentationCommentCompletionProviderTests.cs index fa28226d52a67..a0f9ffcc2ef86 100644 --- a/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/XmlDocumentationCommentCompletionProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/Completion/CompletionProviders/XmlDocumentationCommentCompletionProviderTests.cs @@ -1129,4 +1129,52 @@ await VerifyItemIsAbsentAsync(""" "see", deletedCharTrigger: 'b'); } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/78770")] + public Task ExtensionBlock_01() + => VerifyItemsExistAsync(""" + public static class E + { + /// $$ + extension(int i) { } + } + """, """ + typeparam name="T" + """, """ + param name="i" + """, + "summary"); + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/78770")] + public Task ExtensionBlock_02() + => VerifyItemsExistAsync(""" + public static class E + { + /// $$ + extension(int i) + { + } + } + """, """ + paramref name="i" + """, """ + typeparamref name="T" + """); + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/78770")] + public Task ExtensionBlock_03() + => VerifyItemsExistAsync(""" + public static class E + { + extension(int i) + { + /// $$ + void M() { } + } + } + """, """ + paramref name="i" + """, """ + typeparamref name="T" + """); } diff --git a/src/EditorFeatures/CSharpTest/DocumentationComments/DocumentationCommentTests.cs b/src/EditorFeatures/CSharpTest/DocumentationComments/DocumentationCommentTests.cs index c1bc718da97c8..f2c3352d79543 100644 --- a/src/EditorFeatures/CSharpTest/DocumentationComments/DocumentationCommentTests.cs +++ b/src/EditorFeatures/CSharpTest/DocumentationComments/DocumentationCommentTests.cs @@ -33,6 +33,26 @@ class C } """); + [WpfFact, WorkItem("https://github.com/dotnet/roslyn/issues/78770")] + public void TypingCharacter_Extension() + => VerifyTypingCharacter(""" + static class C + { + //$$ + extension(int i) { } + } + """, """ + static class C + { + /// + /// $$ + /// + /// + /// + extension(int i) { } + } + """); + [WpfFact] public void TypingCharacter_Record() => VerifyTypingCharacter(""" diff --git a/src/Features/CSharp/Portable/Completion/CompletionProviders/XmlDocCommentCompletionProvider.cs b/src/Features/CSharp/Portable/Completion/CompletionProviders/XmlDocCommentCompletionProvider.cs index d79ea9c581d9a..bffd65f4db6de 100644 --- a/src/Features/CSharp/Portable/Completion/CompletionProviders/XmlDocCommentCompletionProvider.cs +++ b/src/Features/CSharp/Portable/Completion/CompletionProviders/XmlDocCommentCompletionProvider.cs @@ -399,6 +399,10 @@ protected override ImmutableArray GetParameters(ISymbol declar { declaredParameters = delegateInvokeParameters; } + else if (namedTypeSymbol.IsExtension && namedTypeSymbol.ExtensionParameter is { } extensionParameter) + { + declaredParameters = [extensionParameter]; + } } return declaredParameters; diff --git a/src/Features/CSharp/Portable/DocumentationComments/CSharpDocumentationCommentSnippetService.cs b/src/Features/CSharp/Portable/DocumentationComments/CSharpDocumentationCommentSnippetService.cs index 6be0be8316eb1..08e7ac0e35785 100644 --- a/src/Features/CSharp/Portable/DocumentationComments/CSharpDocumentationCommentSnippetService.cs +++ b/src/Features/CSharp/Portable/DocumentationComments/CSharpDocumentationCommentSnippetService.cs @@ -56,6 +56,7 @@ protected override bool SupportsDocumentationComments(MemberDeclarationSyntax me case SyntaxKind.EventFieldDeclaration: case SyntaxKind.OperatorDeclaration: case SyntaxKind.ConversionOperatorDeclaration: + case SyntaxKind.ExtensionBlockDeclaration: return true; default: diff --git a/src/Features/Core/Portable/Completion/Providers/AbstractDocCommentCompletionProvider.cs b/src/Features/Core/Portable/Completion/Providers/AbstractDocCommentCompletionProvider.cs index 8070c23907574..8f11b191069bf 100644 --- a/src/Features/Core/Portable/Completion/Providers/AbstractDocCommentCompletionProvider.cs +++ b/src/Features/Core/Portable/Completion/Providers/AbstractDocCommentCompletionProvider.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.Text; @@ -150,6 +151,11 @@ protected IEnumerable GetNestedItems(ISymbol? symbol, bool inclu .Concat(GetTypeParamRefItems(symbol)); } + if (symbol is { ContainingSymbol: INamedTypeSymbol { IsExtension: true } extension }) + { + items = items.Concat(GetParamRefItems(extension)); + } + if (includeKeywords) { items = items.Concat(GetKeywordNames().Select(CreateLangwordCompletionItem));