From 4a320f648c90d7013d8c67532eabc9e6b920affe Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 11:17:20 +0200 Subject: [PATCH 01/19] Cleanup hierarchy --- ...icNameFullyWrittenSignatureHelpProvider.cs | 63 +++++++++++++++++++ ...mePartiallyWrittenSignatureHelpProvider.cs | 10 +-- .../GenericNameSignatureHelpProvider.cs | 53 ++-------------- ...GenericNameSignatureHelpProvider_Method.cs | 2 +- ...ericNameSignatureHelpProvider_NamedType.cs | 2 +- 5 files changed, 73 insertions(+), 57 deletions(-) create mode 100644 src/Features/CSharp/Portable/SignatureHelp/GenericNameFullyWrittenSignatureHelpProvider.cs diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameFullyWrittenSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNameFullyWrittenSignatureHelpProvider.cs new file mode 100644 index 0000000000000..f6a66e0567f48 --- /dev/null +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNameFullyWrittenSignatureHelpProvider.cs @@ -0,0 +1,63 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Composition; +using System.Threading; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Host.Mef; +using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.SignatureHelp; +using Microsoft.CodeAnalysis.Text; + +namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; + +[ExportSignatureHelpProvider(nameof(GenericNameFullyWrittenSignatureHelpProvider), LanguageNames.CSharp), Shared] +[method: ImportingConstructor] +[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] +internal sealed class GenericNameFullyWrittenSignatureHelpProvider() : AbstractGenericNameSignatureHelpProvider +{ + protected override bool TryGetGenericIdentifier( + SyntaxNode root, int position, + ISyntaxFactsService syntaxFacts, + SignatureHelpTriggerReason triggerReason, + CancellationToken cancellationToken, + out SyntaxToken genericIdentifier, + out SyntaxToken lessThanToken) + { + if (CommonSignatureHelpUtilities.TryGetSyntax( + root, position, syntaxFacts, triggerReason, IsTriggerToken, IsArgumentListToken, cancellationToken, out GenericNameSyntax? name)) + { + genericIdentifier = name.Identifier; + lessThanToken = name.TypeArgumentList.LessThanToken; + return true; + } + + genericIdentifier = default; + lessThanToken = default; + return false; + } + + private bool IsTriggerToken(SyntaxToken token) + { + return !token.IsKind(SyntaxKind.None) && + token.ValueText.Length == 1 && + TriggerCharacters.Contains(token.ValueText[0]) && + token.Parent is TypeArgumentListSyntax && + token.Parent.Parent is GenericNameSyntax; + } + + private bool IsArgumentListToken(GenericNameSyntax node, SyntaxToken token) + { + return node.TypeArgumentList != null && + node.TypeArgumentList.Span.Contains(token.SpanStart) && + token != node.TypeArgumentList.GreaterThanToken; + } + + protected override TextSpan GetTextSpan(SyntaxToken genericIdentifier, SyntaxToken lessThanToken) + { + Contract.ThrowIfFalse(lessThanToken.Parent is TypeArgumentListSyntax && lessThanToken.Parent.Parent is GenericNameSyntax); + return SignatureHelpUtilities.GetSignatureHelpSpan(((GenericNameSyntax)lessThanToken.Parent.Parent).TypeArgumentList); + } +} diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs index 6a73d1fe258da..dafba2cbdde12 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs @@ -14,14 +14,10 @@ namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; [ExportSignatureHelpProvider("GenericNamePartiallyWrittenSignatureHelpProvider", LanguageNames.CSharp), Shared] -internal sealed class GenericNamePartiallyWrittenSignatureHelpProvider : GenericNameSignatureHelpProvider +[method: ImportingConstructor] +[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] +internal sealed class GenericNamePartiallyWrittenSignatureHelpProvider() : AbstractGenericNameSignatureHelpProvider { - [ImportingConstructor] - [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] - public GenericNamePartiallyWrittenSignatureHelpProvider() - { - } - protected override bool TryGetGenericIdentifier(SyntaxNode root, int position, ISyntaxFactsService syntaxFacts, SignatureHelpTriggerReason triggerReason, CancellationToken cancellationToken, out SyntaxToken genericIdentifier, out SyntaxToken lessThanToken) => root.SyntaxTree.IsInPartiallyWrittenGeneric(position, cancellationToken, out genericIdentifier, out lessThanToken); diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs index 2a478ebc0578f..c16c8ba6049c1 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Composition; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -14,64 +13,28 @@ using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.DocumentationComments; -using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.LanguageService; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; using Microsoft.CodeAnalysis.Text; -using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; -[ExportSignatureHelpProvider("GenericNameSignatureHelpProvider", LanguageNames.CSharp), Shared] -internal partial class GenericNameSignatureHelpProvider : AbstractCSharpSignatureHelpProvider +internal abstract partial class AbstractGenericNameSignatureHelpProvider : AbstractCSharpSignatureHelpProvider { - [ImportingConstructor] - [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] - public GenericNameSignatureHelpProvider() - { - } - public override ImmutableArray TriggerCharacters => ['<', ',']; public override ImmutableArray RetriggerCharacters => ['>']; - protected virtual bool TryGetGenericIdentifier( + protected abstract TextSpan GetTextSpan(SyntaxToken genericIdentifier, SyntaxToken lessThanToken); + + protected abstract bool TryGetGenericIdentifier( SyntaxNode root, int position, ISyntaxFactsService syntaxFacts, SignatureHelpTriggerReason triggerReason, CancellationToken cancellationToken, out SyntaxToken genericIdentifier, - out SyntaxToken lessThanToken) - { - if (CommonSignatureHelpUtilities.TryGetSyntax( - root, position, syntaxFacts, triggerReason, IsTriggerToken, IsArgumentListToken, cancellationToken, out GenericNameSyntax? name)) - { - genericIdentifier = name.Identifier; - lessThanToken = name.TypeArgumentList.LessThanToken; - return true; - } - - genericIdentifier = default; - lessThanToken = default; - return false; - } - - private bool IsTriggerToken(SyntaxToken token) - { - return !token.IsKind(SyntaxKind.None) && - token.ValueText.Length == 1 && - TriggerCharacters.Contains(token.ValueText[0]) && - token.Parent is TypeArgumentListSyntax && - token.Parent.Parent is GenericNameSyntax; - } - - private bool IsArgumentListToken(GenericNameSyntax node, SyntaxToken token) - { - return node.TypeArgumentList != null && - node.TypeArgumentList.Span.Contains(token.SpanStart) && - token != node.TypeArgumentList.GreaterThanToken; - } + out SyntaxToken lessThanToken); protected override async Task GetItemsWorkerAsync(Document document, int position, SignatureHelpTriggerInfo triggerInfo, MemberDisplayOptions options, CancellationToken cancellationToken) { @@ -158,12 +121,6 @@ private bool IsArgumentListToken(GenericNameSyntax node, SyntaxToken token) return null; } - protected virtual TextSpan GetTextSpan(SyntaxToken genericIdentifier, SyntaxToken lessThanToken) - { - Contract.ThrowIfFalse(lessThanToken.Parent is TypeArgumentListSyntax && lessThanToken.Parent.Parent is GenericNameSyntax); - return SignatureHelpUtilities.GetSignatureHelpSpan(((GenericNameSyntax)lessThanToken.Parent.Parent).TypeArgumentList); - } - private static SignatureHelpItem Convert( ISymbol symbol, SyntaxToken lessThanToken, diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs index c1072cfa05d42..38690a5a7def4 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs @@ -7,7 +7,7 @@ namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; -internal partial class GenericNameSignatureHelpProvider +internal partial class AbstractGenericNameSignatureHelpProvider { private static IList GetPreambleParts( IMethodSymbol method, diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs index d3546f93092f4..834a77dd75536 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs @@ -6,7 +6,7 @@ namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; -internal partial class GenericNameSignatureHelpProvider +internal partial class AbstractGenericNameSignatureHelpProvider { private static IList GetPreambleParts( INamedTypeSymbol namedType, From e4319720fd5ba21e1c960dc0f562f709859b2699 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 11:40:29 +0200 Subject: [PATCH 02/19] Add tests --- ...bstractCSharpSignatureHelpProviderTests.cs | 13 ++++- ...FullyWrittenSignatureHelpProviderTests.cs} | 35 +++++++++++-- ...stractGenericNameSignatureHelpProvider.cs} | 51 ++++++++++++------- ...enericNameSignatureHelpProvider_Method.cs} | 0 ...ricNameSignatureHelpProvider_NamedType.cs} | 0 ...mePartiallyWrittenSignatureHelpProvider.cs | 2 +- .../Shared/Extensions/ISymbolExtensions_2.cs | 2 +- .../SignatureHelp/SignatureHelpParameter.cs | 4 +- 8 files changed, 81 insertions(+), 26 deletions(-) rename src/EditorFeatures/CSharpTest/SignatureHelp/{GenericNameSignatureHelpProviderTests.cs => GenericNameFullyWrittenSignatureHelpProviderTests.cs} (96%) rename src/Features/CSharp/Portable/SignatureHelp/{GenericNameSignatureHelpProvider.cs => AbstractGenericNameSignatureHelpProvider.cs} (86%) rename src/Features/CSharp/Portable/SignatureHelp/{GenericNameSignatureHelpProvider_Method.cs => AbstractGenericNameSignatureHelpProvider_Method.cs} (100%) rename src/Features/CSharp/Portable/SignatureHelp/{GenericNameSignatureHelpProvider_NamedType.cs => AbstractGenericNameSignatureHelpProvider_NamedType.cs} (100%) diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/AbstractCSharpSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/AbstractCSharpSignatureHelpProviderTests.cs index 0fee9ebb3303b..44247c09e6abc 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/AbstractCSharpSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/AbstractCSharpSignatureHelpProviderTests.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Editor.UnitTests.SignatureHelp; using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; @@ -11,7 +14,15 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.SignatureHelp; public abstract class AbstractCSharpSignatureHelpProviderTests : AbstractSignatureHelpProviderTests { protected override ParseOptions CreateExperimentalParseOptions() + => new CSharpParseOptions().WithFeatures([]); // no experimental features to enable + + protected override Task TestAsync( + [StringSyntax(PredefinedEmbeddedLanguageNames.CSharpTest)] string markup, + IEnumerable? expectedOrderedItemsOrNull = null, + bool usePreviousCharAsTrigger = false, + SourceCodeKind? sourceCodeKind = null, + bool experimental = false) { - return new CSharpParseOptions().WithFeatures([]); // no experimental features to enable + return base.TestAsync(markup, expectedOrderedItemsOrNull, usePreviousCharAsTrigger, sourceCodeKind, experimental); } } diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs similarity index 96% rename from src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameSignatureHelpProviderTests.cs rename to src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs index dedfddaf80d47..3f48441f2e27d 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs @@ -2,8 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -#nullable disable - using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -19,10 +17,10 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.SignatureHelp; [Trait(Traits.Feature, Traits.Features.SignatureHelp)] -public sealed class GenericNameSignatureHelpProviderTests : AbstractCSharpSignatureHelpProviderTests +public sealed class GenericNameFullyWrittenSignatureHelpProviderTests : AbstractCSharpSignatureHelpProviderTests { internal override Type GetSignatureHelpProviderType() - => typeof(GenericNameSignatureHelpProvider); + => typeof(GenericNameFullyWrittenSignatureHelpProvider); #region "Declaring generic type objects" @@ -952,4 +950,33 @@ void Goo() } """, expectedOrderedItems); } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/80233")] + public Task TestModernGenericExtensionMethodOnGenericType() + => TestAsync(""" + public class My + { + } + + public static class MyExtensions + { + extension(My self) + { + public void GenericMethod() + { + } + } + } + + class User + { + static void Main() + { + My target = new(); + target.GenericMethod<$$>(); + } + } + """, + [new("void MyExtensions.extension(My).GenericMethod()")], + sourceCodeKind: SourceCodeKind.Regular); } diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs similarity index 86% rename from src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs rename to src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs index c16c8ba6049c1..de6a1bb133478 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs @@ -79,16 +79,13 @@ protected abstract bool TryGetGenericIdentifier( return null; } - var accessibleSymbols = - symbols.WhereAsArray(s => s.GetArity() > 0) - .WhereAsArray(s => s is INamedTypeSymbol or IMethodSymbol) - .FilterToVisibleAndBrowsableSymbols(options.HideAdvancedMembers, semanticModel.Compilation, inclusionFilter: static s => true) - .Sort(semanticModel, genericIdentifier.SpanStart); + var accessibleSymbols = symbols + .WhereAsArray(s => s.GetArity() > 0) + .FilterToVisibleAndBrowsableSymbols(options.HideAdvancedMembers, semanticModel.Compilation, inclusionFilter: static s => true) + .Sort(semanticModel, genericIdentifier.SpanStart); if (!accessibleSymbols.Any()) - { return null; - } var structuralTypeDisplayService = document.GetRequiredLanguageService(); var documentationCommentFormattingService = document.GetRequiredLanguageService(); @@ -130,34 +127,54 @@ private static SignatureHelpItem Convert( { var position = lessThanToken.SpanStart; - SignatureHelpItem item; if (symbol is INamedTypeSymbol namedType) { - item = CreateItem( + return CreateItem( symbol, semanticModel, position, structuralTypeDisplayService, - false, + isVariadic: false, symbol.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), GetPreambleParts(namedType, semanticModel, position), GetSeparatorParts(), GetPostambleParts(), [.. namedType.TypeParameters.Select(p => Convert(p, semanticModel, position, documentationCommentFormattingService))]); } - else + else if (symbol is IMethodSymbol method) { - var method = (IMethodSymbol)symbol; - item = CreateItem( + return CreateItem( symbol, semanticModel, position, structuralTypeDisplayService, - false, - c => symbol.GetDocumentationParts(semanticModel, position, documentationCommentFormattingService, c), + isVariadic: false, + symbol.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), GetPreambleParts(method, semanticModel, position), GetSeparatorParts(), GetPostambleParts(method, semanticModel, position), - [.. method.TypeParameters.Select(p => Convert(p, semanticModel, position, documentationCommentFormattingService))]); + GetTypeArguments(method)); + } + else + { + throw ExceptionUtilities.UnexpectedValue(symbol); } - return item; + IList GetTypeArguments(IMethodSymbol method) + { + var result = new List(); + + // Signature help for generic modern extensions must include the generic type *arguments* for the containing + // extension as well. These are fixed given the receiver, and need to be repeated in the method type argument + // list. + if (method.ContainingType.IsExtension) + { + result.AddRange(method.ContainingType.TypeArguments.Select(t => new SignatureHelpSymbolParameter( + name: null, isOptional: false, + t.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), + t.ToMinimalDisplayParts(semanticModel, position)))); + } + + result.AddRange(method.TypeParameters.Select(p => Convert(p, semanticModel, position, documentationCommentFormattingService))); + + return result; + } } private static readonly SymbolDisplayFormat s_minimallyQualifiedFormat = diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs similarity index 100% rename from src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_Method.cs rename to src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs similarity index 100% rename from src/Features/CSharp/Portable/SignatureHelp/GenericNameSignatureHelpProvider_NamedType.cs rename to src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs diff --git a/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs index dafba2cbdde12..a20e59f15dc1b 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/GenericNamePartiallyWrittenSignatureHelpProvider.cs @@ -13,7 +13,7 @@ namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; -[ExportSignatureHelpProvider("GenericNamePartiallyWrittenSignatureHelpProvider", LanguageNames.CSharp), Shared] +[ExportSignatureHelpProvider(nameof(GenericNamePartiallyWrittenSignatureHelpProvider), LanguageNames.CSharp), Shared] [method: ImportingConstructor] [method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] internal sealed class GenericNamePartiallyWrittenSignatureHelpProvider() : AbstractGenericNameSignatureHelpProvider diff --git a/src/Features/Core/Portable/Shared/Extensions/ISymbolExtensions_2.cs b/src/Features/Core/Portable/Shared/Extensions/ISymbolExtensions_2.cs index b51083fab8f2c..76547cc878ef0 100644 --- a/src/Features/Core/Portable/Shared/Extensions/ISymbolExtensions_2.cs +++ b/src/Features/Core/Portable/Shared/Extensions/ISymbolExtensions_2.cs @@ -231,7 +231,7 @@ public static DocumentationComment GetAppropriateDocumentationComment(this ISymb public static Func> GetDocumentationPartsFactory( this ISymbol symbol, SemanticModel semanticModel, int position, IDocumentationCommentFormattingService formatter) - => c => symbol.GetDocumentationParts(semanticModel, position, formatter, cancellationToken: c); + => cancellationToken => symbol.GetDocumentationParts(semanticModel, position, formatter, cancellationToken); public static readonly SymbolDisplayFormat CrefFormat = new( diff --git a/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs b/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs index 94250b831e95f..408f15cf50de5 100644 --- a/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs +++ b/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs @@ -18,7 +18,7 @@ namespace Microsoft.CodeAnalysis.SignatureHelp; /// point to TaggedText parts. /// internal sealed class SignatureHelpSymbolParameter( - string name, + string? name, bool isOptional, Func>? documentationFactory, IEnumerable displayParts, @@ -86,7 +86,7 @@ public static explicit operator SignatureHelpParameter(SignatureHelpSymbolParame } internal sealed class SignatureHelpParameter( - string name, + string? name, bool isOptional, Func>? documentationFactory, IEnumerable displayParts, From 50538b6ec288ce70db2ba5acc38d2549a2d10a95 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 11:49:19 +0200 Subject: [PATCH 03/19] move to immutable types in signature help --- .../StructuralTypeDisplayInfo.cs | 46 +++++++------- .../AbstractSignatureHelpProvider.cs | 50 ++++++++-------- .../SignatureHelp/SignatureHelpItems.cs | 15 +++-- .../SignatureHelp/SignatureHelpParameter.cs | 60 ++++++++----------- 4 files changed, 80 insertions(+), 91 deletions(-) diff --git a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs index 813d2eff75a5c..1578bca06d20c 100644 --- a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs +++ b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs @@ -3,28 +3,23 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.LanguageService; -internal readonly struct StructuralTypeDisplayInfo +internal readonly struct StructuralTypeDisplayInfo( + IDictionary structuralTypeToName, + ImmutableArray typesParts) { - public IDictionary StructuralTypeToName { get; } - public IList TypesParts { get; } + public IDictionary StructuralTypeToName { get; } = structuralTypeToName; + public ImmutableArray TypesParts { get; } = typesParts; - public StructuralTypeDisplayInfo( - IDictionary structuralTypeToName, - IList typesParts) - : this() - { - StructuralTypeToName = structuralTypeToName; - TypesParts = typesParts; - } - - public IList ReplaceStructuralTypes(IList parts, SemanticModel semanticModel, int position) + public ImmutableArray ReplaceStructuralTypes(ImmutableArray parts, SemanticModel semanticModel, int position) => ReplaceStructuralTypes(parts, StructuralTypeToName, semanticModel, position); - public static IList ReplaceStructuralTypes( - IList parts, + public static ImmutableArray ReplaceStructuralTypes( + ImmutableArray parts, IDictionary structuralTypeToName, SemanticModel semanticModel, int position) @@ -37,14 +32,14 @@ public static IList ReplaceStructuralTypes( } public static bool ReplaceStructuralTypes( - IList parts, + ImmutableArray parts, IDictionary structuralTypeToName, SemanticModel semanticModel, int position, - out List newParts) + out ImmutableArray newParts) { var changed = false; - newParts = []; + using var _ = ArrayBuilder.GetInstance(out var newPartsBuilder); foreach (var part in parts) { @@ -53,7 +48,7 @@ public static bool ReplaceStructuralTypes( if (structuralTypeToName.TryGetValue(type, out var name) && part.ToString() != name) { - newParts.Add(new SymbolDisplayPart(part.Kind, symbol: null, name)); + newPartsBuilder.Add(new SymbolDisplayPart(part.Kind, symbol: null, name)); changed = true; continue; } @@ -62,15 +57,22 @@ public static bool ReplaceStructuralTypes( if (type.IsTupleType && part.ToString() == "") { var displayParts = type.ToMinimalDisplayParts(semanticModel, position); - newParts.AddRange(displayParts); + newPartsBuilder.AddRange(displayParts); changed = true; continue; } } - newParts.Add(part); + newPartsBuilder.Add(part); + } + + if (!changed) + { + newParts = []; + return false; } - return changed; + newParts = newPartsBuilder.ToImmutableAndClear(); + return true; } } diff --git a/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs b/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs index 21fa27cee0639..40ae38ee35061 100644 --- a/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs +++ b/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs @@ -38,9 +38,9 @@ protected AbstractSignatureHelpProvider() protected abstract Task GetItemsWorkerAsync(Document document, int position, SignatureHelpTriggerInfo triggerInfo, MemberDisplayOptions options, CancellationToken cancellationToken); protected static SignatureHelpItems? CreateSignatureHelpItems( - IList items, TextSpan applicableSpan, SignatureHelpState? state, int? selectedItemIndex, int parameterIndexOverride) + ImmutableArray items, TextSpan applicableSpan, SignatureHelpState? state, int? selectedItemIndex, int parameterIndexOverride) { - if (items is null || items.Count == 0 || state == null) + if (items.IsDefaultOrEmpty || state == null) return null; if (selectedItemIndex < 0) @@ -70,7 +70,7 @@ protected AbstractSignatureHelpProvider() } protected static SignatureHelpItems? CreateCollectionInitializerSignatureHelpItems( - IList items, TextSpan applicableSpan, SignatureHelpState? state) + ImmutableArray items, TextSpan applicableSpan, SignatureHelpState? state) { // We will have added all the accessible '.Add' methods that take at least one // arguments. However, in general the one-arg Add method is the least likely for the @@ -94,15 +94,15 @@ protected AbstractSignatureHelpProvider() items, applicableSpan, state, items.IndexOf(i => i.Parameters.Length >= 2), parameterIndexOverride: -1); } - private static (IList items, int? selectedItem) Filter(IList items, ImmutableArray parameterNames, int? selectedItem) + private static (ImmutableArray items, int? selectedItem) Filter(ImmutableArray items, ImmutableArray parameterNames, int? selectedItem) { if (parameterNames.IsDefault) - return (items.ToList(), selectedItem); + return (items, selectedItem); - var filteredList = items.Where(i => Include(i, parameterNames)).ToList(); - var isEmpty = filteredList.Count == 0; + var filteredList = items.WhereAsArray(i => Include(i, parameterNames)); + var isEmpty = filteredList.IsEmpty; if (!selectedItem.HasValue || isEmpty) - return (isEmpty ? [.. items] : filteredList, selectedItem); + return (isEmpty ? items : filteredList, selectedItem); // adjust the selected item var selection = items[selectedItem.Value]; @@ -138,11 +138,11 @@ protected SignatureHelpItem CreateItem( IStructuralTypeDisplayService structuralTypeDisplayService, bool isVariadic, Func> documentationFactory, - IList prefixParts, - IList separatorParts, - IList suffixParts, - IList parameters, - IList? descriptionParts = null) + ImmutableArray prefixParts, + ImmutableArray separatorParts, + ImmutableArray suffixParts, + ImmutableArray parameters, + ImmutableArray? descriptionParts = null) { return CreateItem(orderSymbol, semanticModel, position, structuralTypeDisplayService, isVariadic, documentationFactory, prefixParts, separatorParts, suffixParts, parameters, descriptionParts); @@ -155,11 +155,11 @@ protected static SignatureHelpItem CreateItem( IStructuralTypeDisplayService structuralTypeDisplayService, bool isVariadic, Func>? documentationFactory, - IList prefixParts, - IList separatorParts, - IList suffixParts, - IList parameters, - IList? descriptionParts = null) + ImmutableArray prefixParts, + ImmutableArray separatorParts, + ImmutableArray suffixParts, + ImmutableArray parameters, + ImmutableArray? descriptionParts = null) { return CreateItemImpl(orderSymbol, semanticModel, position, structuralTypeDisplayService, isVariadic, documentationFactory, prefixParts, separatorParts, suffixParts, parameters, descriptionParts); @@ -172,15 +172,13 @@ protected static SignatureHelpItem CreateItemImpl( IStructuralTypeDisplayService structuralTypeDisplayService, bool isVariadic, Func>? documentationFactory, - IList prefixParts, - IList separatorParts, - IList suffixParts, - IList parameters, - IList? descriptionParts) + ImmutableArray prefixParts, + ImmutableArray separatorParts, + ImmutableArray suffixParts, + ImmutableArray parameters, + ImmutableArray? descriptionParts) { - descriptionParts = descriptionParts == null - ? SpecializedCollections.EmptyList() - : descriptionParts; + descriptionParts ??= []; var allParts = prefixParts.Concat(separatorParts) .Concat(suffixParts) diff --git a/src/Features/Core/Portable/SignatureHelp/SignatureHelpItems.cs b/src/Features/Core/Portable/SignatureHelp/SignatureHelpItems.cs index 179ea67ea04f3..c135184eaba29 100644 --- a/src/Features/Core/Portable/SignatureHelp/SignatureHelpItems.cs +++ b/src/Features/Core/Portable/SignatureHelp/SignatureHelpItems.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using Microsoft.CodeAnalysis.Text; -using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.SignatureHelp; @@ -16,7 +16,7 @@ internal sealed class SignatureHelpItems /// /// The list of items to present to the user. /// - public IList Items { get; } + public ImmutableArray Items { get; } /// /// The span this session applies to. @@ -59,23 +59,22 @@ internal sealed class SignatureHelpItems public int? SelectedItemIndex { get; } public SignatureHelpItems( - IList items, + ImmutableArray items, TextSpan applicableSpan, int semanticParameterIndex, int syntacticArgumentCount, string? argumentName, int? selectedItem = null) { - Contract.ThrowIfNull(items); - Contract.ThrowIfTrue(items.IsEmpty()); - Contract.ThrowIfTrue(selectedItem.HasValue && selectedItem.Value >= items.Count); + Contract.ThrowIfTrue(items.IsDefaultOrEmpty); + Contract.ThrowIfTrue(selectedItem.HasValue && selectedItem.Value >= items.Length); if (semanticParameterIndex < 0) throw new ArgumentException($"{nameof(semanticParameterIndex)} < 0. {semanticParameterIndex} < 0", nameof(semanticParameterIndex)); // Adjust the `selectedItem` index if duplicates are able to be removed. - var distinctItems = items.Distinct().ToList(); - if (selectedItem.HasValue && items.Count != distinctItems.Count) + var distinctItems = items.Distinct(); + if (selectedItem.HasValue && items.Length != distinctItems.Length) { // `selectedItem` index has already been determined to be valid, it now needs to be adjusted to point // to the equivalent item in the reduced list to account for duplicates being removed diff --git a/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs b/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs index 408f15cf50de5..f4066e7a45c15 100644 --- a/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs +++ b/src/Features/Core/Portable/SignatureHelp/SignatureHelpParameter.cs @@ -4,10 +4,8 @@ using System; using System.Collections.Generic; -using System.Linq; +using System.Collections.Immutable; using System.Threading; -using Microsoft.CodeAnalysis; -using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.SignatureHelp; @@ -21,10 +19,10 @@ internal sealed class SignatureHelpSymbolParameter( string? name, bool isOptional, Func>? documentationFactory, - IEnumerable displayParts, - IEnumerable? prefixDisplayParts = null, - IEnumerable? suffixDisplayParts = null, - IEnumerable? selectedDisplayParts = null) + ImmutableArray displayParts, + ImmutableArray? prefixDisplayParts = null, + ImmutableArray? suffixDisplayParts = null, + ImmutableArray? selectedDisplayParts = null) { /// /// The name of this parameter. @@ -40,18 +38,18 @@ internal sealed class SignatureHelpSymbolParameter( /// /// Display parts to show before the normal display parts for the parameter. /// - public IList PrefixDisplayParts { get; } = prefixDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray PrefixDisplayParts { get; } = prefixDisplayParts.NullToEmpty(); /// /// Display parts to show after the normal display parts for the parameter. /// - public IList SuffixDisplayParts { get; } = suffixDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray SuffixDisplayParts { get; } = suffixDisplayParts ?? []; /// /// Display parts for this parameter. This should normally be presented to the user as part /// of the entire signature display. /// - public IList DisplayParts { get; } = displayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray DisplayParts { get; } = displayParts.NullToEmpty(); /// /// True if this parameter is optional or not. Optional parameters may be presented in a @@ -63,16 +61,12 @@ internal sealed class SignatureHelpSymbolParameter( /// Display parts for this parameter that should be presented to the user when this /// parameter is selected. /// - public IList SelectedDisplayParts { get; } = selectedDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray SelectedDisplayParts { get; } = selectedDisplayParts ?? []; private static readonly Func> s_emptyDocumentationFactory = _ => []; - internal IEnumerable GetAllParts() - { - return PrefixDisplayParts.Concat(DisplayParts) - .Concat(SuffixDisplayParts) - .Concat(SelectedDisplayParts); - } + internal ImmutableArray GetAllParts() + => [.. PrefixDisplayParts, .. DisplayParts, .. SuffixDisplayParts, .. SelectedDisplayParts]; public static explicit operator SignatureHelpParameter(SignatureHelpSymbolParameter parameter) { @@ -89,10 +83,10 @@ internal sealed class SignatureHelpParameter( string? name, bool isOptional, Func>? documentationFactory, - IEnumerable displayParts, - IEnumerable? prefixDisplayParts = null, - IEnumerable? suffixDisplayParts = null, - IEnumerable? selectedDisplayParts = null) + ImmutableArray displayParts, + ImmutableArray? prefixDisplayParts = null, + ImmutableArray? suffixDisplayParts = null, + ImmutableArray? selectedDisplayParts = null) { /// /// The name of this parameter. @@ -108,18 +102,18 @@ internal sealed class SignatureHelpParameter( /// /// Display parts to show before the normal display parts for the parameter. /// - public IList PrefixDisplayParts { get; } = prefixDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray PrefixDisplayParts { get; } = prefixDisplayParts ?? []; /// /// Display parts to show after the normal display parts for the parameter. /// - public IList SuffixDisplayParts { get; } = suffixDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray SuffixDisplayParts { get; } = suffixDisplayParts ?? []; /// /// Display parts for this parameter. This should normally be presented to the user as part /// of the entire signature display. /// - public IList DisplayParts { get; } = displayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray DisplayParts { get; } = displayParts.NullToEmpty(); /// /// True if this parameter is optional or not. Optional parameters may be presented in a @@ -131,7 +125,7 @@ internal sealed class SignatureHelpParameter( /// Display parts for this parameter that should be presented to the user when this /// parameter is selected. /// - public IList SelectedDisplayParts { get; } = selectedDisplayParts.ToImmutableArrayOrEmpty(); + public ImmutableArray SelectedDisplayParts { get; } = selectedDisplayParts ?? []; private static readonly Func> s_emptyDocumentationFactory = _ => []; @@ -140,10 +134,10 @@ public SignatureHelpParameter( string name, bool isOptional, Func>? documentationFactory, - IEnumerable displayParts, - IEnumerable? prefixDisplayParts = null, - IEnumerable? suffixDisplayParts = null, - IEnumerable? selectedDisplayParts = null) + ImmutableArray displayParts, + ImmutableArray? prefixDisplayParts = null, + ImmutableArray? suffixDisplayParts = null, + ImmutableArray? selectedDisplayParts = null) : this(name, isOptional, documentationFactory is null ? null : c => documentationFactory(c).ToTaggedText(), displayParts.ToTaggedText(), @@ -153,12 +147,8 @@ public SignatureHelpParameter( { } - internal IEnumerable GetAllParts() - { - return PrefixDisplayParts.Concat(DisplayParts) - .Concat(SuffixDisplayParts) - .Concat(SelectedDisplayParts); - } + internal ImmutableArray GetAllParts() + => [.. PrefixDisplayParts, .. DisplayParts, .. SuffixDisplayParts, .. SelectedDisplayParts]; public override string ToString() { From 4aafc8a543c54e0b0351461c482cbc845fe29878 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 11:52:48 +0200 Subject: [PATCH 04/19] move to immutable types in signature help --- .../AbstractStructuralTypeDisplayService.cs | 14 +++++--------- .../StructuralTypeDisplayInfo.cs | 7 +++++-- ...playService.AbstractSymbolDescriptionBuilder.cs | 2 +- .../AbstractSymbolDisplayService.AnonymousTypes.cs | 2 +- .../SignatureHelp/AbstractSignatureHelpProvider.cs | 8 ++++---- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/AbstractStructuralTypeDisplayService.cs b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/AbstractStructuralTypeDisplayService.cs index a8e57e9361cc9..20230877da842 100644 --- a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/AbstractStructuralTypeDisplayService.cs +++ b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/AbstractStructuralTypeDisplayService.cs @@ -66,16 +66,12 @@ public StructuralTypeDisplayInfo GetTypeDisplayInfo( int position) { if (directStructuralTypeReferences.Length == 0) - { - return new StructuralTypeDisplayInfo( - SpecializedCollections.EmptyDictionary(), - SpecializedCollections.EmptyList()); - } + return StructuralTypeDisplayInfo.Empty; var transitiveStructuralTypeReferences = GetTransitiveStructuralTypeReferences(directStructuralTypeReferences); transitiveStructuralTypeReferences = OrderStructuralTypes(transitiveStructuralTypeReferences, orderSymbol); - IList typeParts = []; + using var _ = ArrayBuilder.GetInstance(out var typeParts); if (transitiveStructuralTypeReferences.Length > 0) { @@ -112,10 +108,10 @@ public StructuralTypeDisplayInfo GetTypeDisplayInfo( // Finally, assign a name to all the anonymous types. var structuralTypeToName = GenerateStructuralTypeNames(transitiveStructuralTypeReferences); - typeParts = StructuralTypeDisplayInfo.ReplaceStructuralTypes( - typeParts, structuralTypeToName, semanticModel, position); + var typePartsArray = StructuralTypeDisplayInfo.ReplaceStructuralTypes( + typeParts.ToImmutableAndClear(), structuralTypeToName, semanticModel, position); - return new StructuralTypeDisplayInfo(structuralTypeToName, typeParts); + return new StructuralTypeDisplayInfo(structuralTypeToName, typePartsArray); } private static Dictionary GenerateStructuralTypeNames( diff --git a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs index 1578bca06d20c..9784d4e6333c4 100644 --- a/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs +++ b/src/Features/Core/Portable/LanguageServices/AnonymousTypeDisplayService/StructuralTypeDisplayInfo.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Collections.Immutable; +using Microsoft.CodeAnalysis.Collections; using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.LanguageService; @@ -12,8 +13,10 @@ internal readonly struct StructuralTypeDisplayInfo( IDictionary structuralTypeToName, ImmutableArray typesParts) { - public IDictionary StructuralTypeToName { get; } = structuralTypeToName; - public ImmutableArray TypesParts { get; } = typesParts; + public static readonly StructuralTypeDisplayInfo Empty = default; + + public IDictionary StructuralTypeToName => structuralTypeToName ?? SpecializedCollections.EmptyDictionary(); + public ImmutableArray TypesParts => typesParts.NullToEmpty(); public ImmutableArray ReplaceStructuralTypes(ImmutableArray parts, SemanticModel semanticModel, int position) => ReplaceStructuralTypes(parts, StructuralTypeToName, semanticModel, position); diff --git a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs index ce70ce3816c83..c6e5fe2b975b2 100644 --- a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs +++ b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs @@ -80,7 +80,7 @@ protected abstract partial class AbstractSymbolDescriptionBuilder private readonly SemanticModel _semanticModel; private readonly int _position; - private readonly Dictionary> _groupMap = []; + private readonly Dictionary> _groupMap = []; private readonly Dictionary> _documentationMap = []; private readonly Func _getNavigationHint; diff --git a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AnonymousTypes.cs b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AnonymousTypes.cs index 91405a4dc2354..64d8eae556699 100644 --- a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AnonymousTypes.cs +++ b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AnonymousTypes.cs @@ -33,7 +33,7 @@ where part.Symbol.IsAnonymousType() || part.Symbol.IsTupleType() var info = LanguageServices.GetRequiredService().GetTypeDisplayInfo( firstSymbol, directStructuralTypes.ToImmutableArrayOrEmpty(), _semanticModel, _position); - if (info.TypesParts.Count > 0) + if (info.TypesParts.Length > 0) AddToGroup(SymbolDescriptionGroups.StructuralTypes, info.TypesParts); foreach (var (group, parts) in _groupMap.ToArray()) diff --git a/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs b/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs index 40ae38ee35061..d12319bb6dd0b 100644 --- a/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs +++ b/src/Features/Core/Portable/SignatureHelp/AbstractSignatureHelpProvider.cs @@ -193,7 +193,7 @@ where part.Symbol.IsAnonymousType() || part.Symbol.IsTupleType() var info = structuralTypeDisplayService.GetTypeDisplayInfo( orderSymbol, [.. structuralTypes], semanticModel, position); - if (info.TypesParts.Count > 0) + if (info.TypesParts.Length > 0) { var structuralTypeParts = new List { @@ -258,7 +258,7 @@ private static SignatureHelpSymbolParameter ReplaceStructuralTypes( var semanticModel = await document.ReuseExistingSpeculativeModelAsync(position, cancellationToken).ConfigureAwait(false); var compilation = semanticModel.Compilation; - var finalItems = new List(); + using var _1 = ArrayBuilder.GetInstance(out var finalItems); foreach (var item in itemsForCurrentDocument.Items) { if (item is not SymbolKeySignatureHelpItem symbolKeyItem || @@ -276,7 +276,7 @@ symbolKeyItem.SymbolKey is not SymbolKey symbolKey || symbolKey = SymbolKey.Create(methodSymbol.OriginalDefinition, cancellationToken); } - using var _ = ArrayBuilder.GetInstance(out var invalidProjectsForCurrentSymbol); + using var _2 = ArrayBuilder.GetInstance(out var invalidProjectsForCurrentSymbol); foreach (var relatedDocument in relatedDocuments) { // Try to resolve symbolKey in each related compilation, @@ -293,7 +293,7 @@ symbolKeyItem.SymbolKey is not SymbolKey symbolKey || } return new SignatureHelpItems( - finalItems, + finalItems.ToImmutableAndClear(), itemsForCurrentDocument.ApplicableSpan, itemsForCurrentDocument.SemanticParameterIndex, itemsForCurrentDocument.SyntacticArgumentCount, From 2a08cb6cb06fea4adafae104f36cc8bddb083928 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:04:10 +0200 Subject: [PATCH 05/19] move to immutable types in signature help --- .../AbstractCSharpSignatureHelpProvider.cs | 5 ++- ...ractOrdinaryMethodSignatureHelpProvider.cs | 3 +- ...ractOrdinaryMethodSignatureHelpProvider.vb | 2 +- .../AttributeSignatureHelpProvider.vb | 11 +++-- ...lectionInitializerSignatureHelpProvider.vb | 2 +- ...unctionAggregationSignatureHelpProvider.vb | 7 +-- ...ericNameSignatureHelpProvider.NamedType.vb | 9 ++-- ...vocationExpressionSignatureHelpProvider.vb | 5 ++- ...ssionSignatureHelpProvider.DelegateType.vb | 5 ++- ...ressionSignatureHelpProvider.NormalType.vb | 2 +- ...aiseEventStatementSignatureHelpProvider.vb | 4 +- .../AbstractIntrinsicOperatorDocumentation.vb | 3 +- .../AddHandlerStatementDocumentation.vb | 18 +++----- ...inaryConditionalExpressionDocumentation.vb | 34 +++++---------- .../CTypeCastExpressionDocumentation.vb | 20 +++------ .../DirectCastExpressionDocumentation.vb | 20 +++------ .../GetTypeExpressionDocumentation.vb | 37 ++++------------ .../GetXmlNamespaceExpressionDocumentation.vb | 38 +++++----------- .../MidAssignmentDocumentation.vb | 29 ++++--------- .../NameOfExpressionDocumentation.vb | 43 ++++++------------- .../PredefinedCastExpressionDocumentation.vb | 23 +++------- .../RemoveHandlerStatementDocumentation.vb | 18 +++----- ...rnaryConditionalExpressionDocumentation.vb | 30 ++++--------- .../TryCastExpressionDocumentation.vb | 20 +++------ 24 files changed, 135 insertions(+), 253 deletions(-) diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractCSharpSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractCSharpSignatureHelpProvider.cs index 48a9e6f023864..d6ce004565d49 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractCSharpSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractCSharpSignatureHelpProvider.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; @@ -33,13 +34,13 @@ protected static SymbolDisplayPart Space() protected static SymbolDisplayPart NewLine() => new(SymbolDisplayPartKind.LineBreak, null, "\r\n"); - private static readonly IList _separatorParts = + private static readonly ImmutableArray _separatorParts = [ Punctuation(SyntaxKind.CommaToken), Space() ]; - protected static IList GetSeparatorParts() => _separatorParts; + protected static ImmutableArray GetSeparatorParts() => _separatorParts; protected static SignatureHelpSymbolParameter Convert( IParameterSymbol parameter, diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs index 290c2cc2d1d8b..f17ea175303d3 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.LanguageService; @@ -44,7 +45,7 @@ [.. method.Parameters.Select(p => Convert(p, semanticModel, position, documentat descriptionParts: descriptionParts); } - private static IList GetMethodGroupPreambleParts( + private static ImmutableArray GetMethodGroupPreambleParts( IMethodSymbol method, SemanticModel semanticModel, int position) diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb index 7ff272a7a8f25..726a78d437a7b 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb @@ -26,7 +26,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp GetMemberGroupPreambleParts(member, semanticModel, position), GetSeparatorParts(), GetMemberGroupPostambleParts(member, semanticModel, position), - member.GetParameters().Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + member.GetParameters().SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) End Function Private Shared Function GetMemberGroupPreambleParts(symbol As ISymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb index e5e5f91776863..68d40a55374ce 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb @@ -84,8 +84,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim symbolInfo = semanticModel.GetSymbolInfo(attribute, cancellationToken) Dim selectedItem = TryGetSelectedIndex(accessibleConstructors, symbolInfo.Symbol) - Return CreateSignatureHelpItems(accessibleConstructors.Select( - Function(c) Convert(c, within, attribute, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)).ToList(), + Return CreateSignatureHelpItems(accessibleConstructors.SelectAsArray( + Function(c) Convert(c, within, attribute, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItem, parameterIndexOverride:=-1) End Function @@ -163,13 +163,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return result End Function - Private Shared Function GetParameterPrefixDisplayParts(i As Integer) As List(Of SymbolDisplayPart) + Private Shared Function GetParameterPrefixDisplayParts(i As Integer) As ImmutableArray(Of SymbolDisplayPart) If i = 0 Then - Return New List(Of SymbolDisplayPart) From { + Return ImmutableArray.Create( New SymbolDisplayPart(SymbolDisplayPartKind.Text, Nothing, FeaturesResources.Properties), Punctuation(SyntaxKind.ColonToken), - Space() - } + Space()) End If Return Nothing diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/CollectionInitializerSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/CollectionInitializerSignatureHelpProvider.vb index 56acafe0aa155..1f79cf7cb1ec2 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/CollectionInitializerSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/CollectionInitializerSignatureHelpProvider.vb @@ -60,7 +60,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim semanticModel = Await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(False) Return CreateCollectionInitializerSignatureHelpItems( - addMethods.Select(Function(s) ConvertMemberGroupMember(document, s, collectionInitializer.OpenBraceToken.SpanStart, semanticModel)).ToList(), + addMethods.SelectAsArray(Function(s) ConvertMemberGroupMember(document, s, collectionInitializer.OpenBraceToken.SpanStart, semanticModel)), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken)) End Function diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb index f99edead13eef..4e409a378f264 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb @@ -9,6 +9,7 @@ Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -86,7 +87,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService) Return CreateSignatureHelpItems( - accessibleMethods.Select(Function(m) Convert(m, functionAggregation, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)).ToList(), + accessibleMethods.SelectAsArray(Function(m) Convert(m, functionAggregation, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItemIndex:=Nothing, parameterIndexOverride:=-1) End Function @@ -148,7 +149,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp delegateInvokeMethod.Parameters.Length = 1 AndAlso Not delegateInvokeMethod.ReturnsVoid Then - Dim parts = New List(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.Add(Text(VBWorkspaceResources.expression)) parts.Add(Space()) parts.Add(Keyword(SyntaxKind.AsKeyword)) @@ -159,7 +160,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp VBWorkspaceResources.expression, parameter.IsOptional, parameter.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), - parts) + parts.ToImmutableAndFree()) Return {sigHelpParameter} End If diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb index 48240e10b8756..dec48cb5978a2 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb @@ -2,12 +2,15 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable +Imports Microsoft.CodeAnalysis.PooledObjects + Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Partial Friend Class GenericNameSignatureHelpProvider - Private Shared Function GetPreambleParts(namedType As INamedTypeSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetPreambleParts(namedType As INamedTypeSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() Dim format = New SymbolDisplayFormat( memberOptions:=SymbolDisplayMemberOptions.IncludeContainingType, miscellaneousOptions:=SymbolDisplayMiscellaneousOptions.EscapeKeywordIdentifiers Or SymbolDisplayMiscellaneousOptions.UseSpecialTypes) @@ -15,7 +18,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp result.Add(Punctuation(SyntaxKind.OpenParenToken)) result.Add(Keyword(SyntaxKind.OfKeyword)) result.Add(Space()) - Return result + Return result.ToImmutableAndFree() End Function Private Shared Function GetPostambleParts() As IList(Of SymbolDisplayPart) diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb index 4d223d56bf7a3..77c85908c5349 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb @@ -9,6 +9,7 @@ Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -112,7 +113,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim structuralTypeDisplayService = document.GetLanguageService(Of IStructuralTypeDisplayService)() Dim documentationCommentFormattingService = document.GetLanguageService(Of IDocumentationCommentFormattingService)() - Dim items = New List(Of SignatureHelpItem) + Dim items = ArrayBuilder(Of SignatureHelpItem).GetInstance() Dim accessibleMembers = ImmutableArray(Of ISymbol).Empty If memberGroup.Length > 0 Then accessibleMembers = GetAccessibleMembers(invocationExpression, semanticModel, within, memberGroup, cancellationToken) @@ -132,7 +133,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim selectedItem = TryGetSelectedIndex(accessibleMembers, symbolInfo.Symbol) Return CreateSignatureHelpItems( - items, textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), + items.ToImmutableAndFree(), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItem, parameterIndexOverride:=-1) End Function End Class diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb index 8936e239cec80..839b21226247d 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb @@ -5,6 +5,7 @@ Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -46,7 +47,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Private Shared Function GetDelegateTypeParameters(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SignatureHelpSymbolParameter) Const TargetName As String = "target" - Dim parts = New List(Of SymbolDisplayPart)() + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() If invokeMethod.ReturnsVoid Then parts.Add(Keyword(SyntaxKind.SubKeyword)) @@ -81,7 +82,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp TargetName, isOptional:=False, documentationFactory:=Nothing, - displayParts:=parts)} + displayParts:=parts.ToImmutableAndFree())} End Function Private Shared Function GetDelegateTypePostambleParts() As IList(Of SymbolDisplayPart) diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb index f2b58e7f0026d..a070aa43c74ee 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb @@ -53,7 +53,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp constructor.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), GetNormalTypePreambleParts(constructor, semanticModel, position), GetSeparatorParts(), GetNormalTypePostambleParts(), - constructor.Parameters.Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + constructor.Parameters.SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) Return item End Function diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb index acfbe505a74ca..023f8a2b01410 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb @@ -93,7 +93,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService) Return CreateSignatureHelpItems( - allowedEvents.Select(Function(e) Convert(e, raiseEventStatement, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)).ToList(), + allowedEvents.SelectAsArray(Function(e) Convert(e, raiseEventStatement, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItemIndex:=Nothing, parameterIndexOverride:=-1) End Function @@ -117,7 +117,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp GetPreambleParts(eventSymbol, semanticModel, position), GetSeparatorParts(), GetPostambleParts(), - type.DelegateInvokeMethod.GetParameters().Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + type.DelegateInvokeMethod.GetParameters().SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) Return item End Function diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb index 07194defb4c6a..de7a0b8f81567 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb @@ -2,6 +2,7 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -19,7 +20,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Get End Property - Public MustOverride ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) + Public MustOverride ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) Public MustOverride Function GetParameterName(index As Integer) As String Public MustOverride Function GetParameterDocumentation(index As Integer) As String diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AddHandlerStatementDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AddHandlerStatementDocumentation.vb index bec3592ac4431..9ec15860e71af 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AddHandlerStatementDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AddHandlerStatementDocumentation.vb @@ -2,15 +2,14 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class AddHandlerStatementDocumentation Inherits AbstractAddRemoveHandlerStatementDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Associates_an_event_with_an_event_handler_delegate_or_lambda_expression_at_run_time - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Associates_an_event_with_an_event_handler_delegate_or_lambda_expression_at_run_time Public Overrides Function GetParameterDocumentation(index As Integer) As String Select Case index @@ -23,12 +22,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "AddHandler"), - New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " ")} - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "AddHandler"), + New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " ")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/BinaryConditionalExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/BinaryConditionalExpressionDocumentation.vb index afb48f4e935f7..89ea2262e8d8f 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/BinaryConditionalExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/BinaryConditionalExpressionDocumentation.vb @@ -2,15 +2,14 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class BinaryConditionalExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.If_expression_evaluates_to_a_reference_or_Nullable_value_that_is_not_Nothing_the_function_returns_that_value_Otherwise_it_calculates_and_returns_expressionIfNothing - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.If_expression_evaluates_to_a_reference_or_Nullable_value_that_is_not_Nothing_the_function_returns_that_value_Otherwise_it_calculates_and_returns_expressionIfNothing Public Overrides Function GetParameterDocumentation(index As Integer) As String Select Case index @@ -34,23 +33,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property - - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 2 - End Get - End Property - - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "If"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")} - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = True + + Public Overrides ReadOnly Property ParameterCount As Integer = 2 + + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "If"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/CTypeCastExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/CTypeCastExpressionDocumentation.vb index 0706915921c40..97a175782454e 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/CTypeCastExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/CTypeCastExpressionDocumentation.vb @@ -2,23 +2,17 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class CTypeCastExpressionDocumentation Inherits AbstractCastExpressionDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Returns_the_result_of_explicitly_converting_an_expression_to_a_specified_data_type - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Returns_the_result_of_explicitly_converting_an_expression_to_a_specified_data_type - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return { - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "CType"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(") - } - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "CType"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/DirectCastExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/DirectCastExpressionDocumentation.vb index 5233f539329f1..c036a33d36c04 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/DirectCastExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/DirectCastExpressionDocumentation.vb @@ -2,23 +2,17 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class DirectCastExpressionDocumentation Inherits AbstractCastExpressionDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Introduces_a_type_conversion_operation_similar_to_CType_The_difference_is_that_CType_succeeds_as_long_as_there_is_a_valid_conversion_whereas_DirectCast_requires_that_one_type_inherit_from_or_implement_the_other_type - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Introduces_a_type_conversion_operation_similar_to_CType_The_difference_is_that_CType_succeeds_as_long_as_there_is_a_valid_conversion_whereas_DirectCast_requires_that_one_type_inherit_from_or_implement_the_other_type - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return { - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "DirectCast"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(") - } - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "DirectCast"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetTypeExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetTypeExpressionDocumentation.vb index 333c15ae53834..41202eac35a56 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetTypeExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetTypeExpressionDocumentation.vb @@ -2,6 +2,7 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators @@ -26,32 +27,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 1 - End Get - End Property + Public Overrides ReadOnly Property ParameterCount As Integer = 1 - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Returns_a_System_Type_object_for_the_specified_type_name - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Returns_a_System_Type_object_for_the_specified_type_name - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return { - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "GetType"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(") - } - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "GetType"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = True Public Overrides Function TryGetTypeNameParameter(syntaxNode As SyntaxNode, index As Integer) As TypeSyntax Dim getTypeExpression = TryCast(syntaxNode, GetTypeExpressionSyntax) @@ -63,10 +48,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End If End Function - Public Overrides ReadOnly Property ReturnTypeMetadataName As String - Get - Return "System.Type" - End Get - End Property + Public Overrides ReadOnly Property ReturnTypeMetadataName As String = "System.Type" End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb index bca09bb0edfd8..949a3330af35a 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb @@ -2,6 +2,8 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class GetXmlNamespaceExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation @@ -37,37 +39,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 1 - End Get - End Property + Public Overrides ReadOnly Property ParameterCount As Integer = 1 - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Returns_the_System_Xml_Linq_XNamespace_object_corresponding_to_the_specified_XML_namespace_prefix - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Returns_the_System_Xml_Linq_XNamespace_object_corresponding_to_the_specified_XML_namespace_prefix - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return { - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "GetXmlNamespace"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(") - } - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "GetXmlNamespace"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = True - Public Overrides ReadOnly Property ReturnTypeMetadataName As String - Get - Return "System.Xml.Linq.XNamespace" - End Get - End Property + Public Overrides ReadOnly Property ReturnTypeMetadataName As String = "System.Xml.Linq.XNamespace" End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb index d3323a51a2272..9b92647f63d46 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb @@ -2,17 +2,15 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports System.Threading Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class MidAssignmentDocumentation Inherits AbstractIntrinsicOperatorDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Replaces_a_specified_number_of_characters_in_a_String_variable_with_characters_from_another_string - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Replaces_a_specified_number_of_characters_in_a_String_variable_with_characters_from_another_string Public Overrides Function GetParameterDocumentation(index As Integer) As String Select Case index @@ -48,17 +46,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End If End Function - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return False - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = False - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 3 - End Get - End Property + Public Overrides ReadOnly Property ParameterCount As Integer = 3 Public Overrides Function GetSuffix(semanticModel As SemanticModel, position As Integer, nodeToBind As SyntaxNode, cancellationToken As CancellationToken) As IList(Of SymbolDisplayPart) Return { @@ -70,11 +60,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators } End Function - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "Mid"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")} - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "Mid"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/NameOfExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/NameOfExpressionDocumentation.vb index 30f466aa2aeb2..40c585805afc1 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/NameOfExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/NameOfExpressionDocumentation.vb @@ -2,34 +2,22 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class NameOfExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Produces_a_string_for_the_name_of_the_specified_type_or_member - End Get - End Property - - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property - - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 1 - End Get - End Property - - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "NameOf"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")} - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Produces_a_string_for_the_name_of_the_specified_type_or_member + + Public Overrides ReadOnly Property IncludeAsType As Boolean = True + + Public Overrides ReadOnly Property ParameterCount As Integer = 1 + + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "NameOf"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) Public Overrides Function GetParameterDocumentation(index As Integer) As String Select Case index @@ -49,11 +37,6 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property ReturnTypeMetadataName As String - Get - Return "System.String" - End Get - End Property - + Public Overrides ReadOnly Property ReturnTypeMetadataName As String = "System.String" End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb index c558b64b8b5a3..c2e085146362f 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb @@ -2,6 +2,8 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class PredefinedCastExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation @@ -38,24 +40,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = True - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 1 - End Get - End Property + Public Overrides ReadOnly Property ParameterCount As Integer = 1 - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, _keywordText), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")} - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, _keywordText), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) Public Overrides ReadOnly Property ReturnTypeMetadataName As String Get diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/RemoveHandlerStatementDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/RemoveHandlerStatementDocumentation.vb index 17f497af4b0c0..57938fc18d09d 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/RemoveHandlerStatementDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/RemoveHandlerStatementDocumentation.vb @@ -2,15 +2,14 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class RemoveHandlerStatementDocumentation Inherits AbstractAddRemoveHandlerStatementDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Removes_the_association_between_an_event_and_an_event_handler_or_delegate_at_run_time - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Removes_the_association_between_an_event_and_an_event_handler_or_delegate_at_run_time Public Overrides Function GetParameterDocumentation(index As Integer) As String Select Case index @@ -23,11 +22,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "RemoveHandler"), - New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " ")} - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "RemoveHandler"), + New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " ")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb index bdcee3f9a58b6..660e32ca4d139 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb @@ -2,15 +2,14 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class TernaryConditionalExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.If_condition_returns_True_the_function_calculates_and_returns_expressionIfTrue_Otherwise_it_returns_expressionIfFalse - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.If_condition_returns_True_the_function_calculates_and_returns_expressionIfTrue_Otherwise_it_returns_expressionIfFalse Public Overrides Function GetParameterDisplayParts(index As Integer) As IList(Of SymbolDisplayPart) If index = 0 Then @@ -50,23 +49,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides ReadOnly Property IncludeAsType As Boolean - Get - Return True - End Get - End Property + Public Overrides ReadOnly Property IncludeAsType As Boolean = True - Public Overrides ReadOnly Property ParameterCount As Integer - Get - Return 3 - End Get - End Property + Public Overrides ReadOnly Property ParameterCount As Integer = 3 - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return {New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "If"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")} - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "If"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TryCastExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TryCastExpressionDocumentation.vb index 1465a18832bcd..154a906004fc4 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TryCastExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TryCastExpressionDocumentation.vb @@ -2,23 +2,17 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable + Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class TryCastExpressionDocumentation Inherits AbstractCastExpressionDocumentation - Public Overrides ReadOnly Property DocumentationText As String - Get - Return VBWorkspaceResources.Introduces_a_type_conversion_operation_that_does_not_throw_an_exception_If_an_attempted_conversion_fails_TryCast_returns_Nothing_which_your_program_can_test_for - End Get - End Property + Public Overrides ReadOnly Property DocumentationText As String = + VBWorkspaceResources.Introduces_a_type_conversion_operation_that_does_not_throw_an_exception_If_an_attempted_conversion_fails_TryCast_returns_Nothing_which_your_program_can_test_for - Public Overrides ReadOnly Property PrefixParts As IList(Of SymbolDisplayPart) - Get - Return { - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "TryCast"), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(") - } - End Get - End Property + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "TryCast"), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) End Class End Namespace From 8a2d3dfc90e868b6de0ec45fa6128425adfe3b27 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:18:51 +0200 Subject: [PATCH 06/19] move to immutable types in signature help --- .../AbstractSignatureHelpProviderTests.cs | 2 +- ...ractOrdinaryMethodSignatureHelpProvider.cs | 9 +++--- ...tIntrinsicOperatorSignatureHelpProvider.vb | 9 +++--- ...ractOrdinaryMethodSignatureHelpProvider.vb | 23 +++++++------ ...bstractVisualBasicSignatureHelpProvider.vb | 8 +++-- .../AttributeSignatureHelpProvider.vb | 30 +++++++++-------- ...unctionAggregationSignatureHelpProvider.vb | 30 +++++++++-------- ...GenericNameSignatureHelpProvider.Method.vb | 17 +++++----- ...ericNameSignatureHelpProvider.NamedType.vb | 4 +-- .../GenericNameSignatureHelpProvider.vb | 24 +++++++------- ...ionSignatureHelpProvider.DelegateInvoke.vb | 25 ++++++++------- ...sionSignatureHelpProvider.ElementAccess.vb | 22 +++++++------ ...ssionSignatureHelpProvider.DelegateType.vb | 32 +++++++++---------- ...ressionSignatureHelpProvider.NormalType.vb | 18 ++++++----- ...aiseEventStatementSignatureHelpProvider.vb | 16 +++++----- .../AbstractIntrinsicOperatorDocumentation.vb | 15 +++++---- .../MidAssignmentDocumentation.vb | 11 +++---- 17 files changed, 158 insertions(+), 137 deletions(-) diff --git a/src/EditorFeatures/TestUtilities/SignatureHelp/AbstractSignatureHelpProviderTests.cs b/src/EditorFeatures/TestUtilities/SignatureHelp/AbstractSignatureHelpProviderTests.cs index 9c3b93cf5bfc1..c4baf9342ce5e 100644 --- a/src/EditorFeatures/TestUtilities/SignatureHelp/AbstractSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/TestUtilities/SignatureHelp/AbstractSignatureHelpProviderTests.cs @@ -181,7 +181,7 @@ private async Task VerifyCurrentParameterNameWorkerAsync(string markup, string e private static void CompareAndAssertCollectionsAndCurrentParameter( IEnumerable expectedTestItems, SignatureHelpItems actualSignatureHelpItems) { - Assert.True(expectedTestItems.Count() == actualSignatureHelpItems.Items.Count, $"Expected {expectedTestItems.Count()} items, but got {actualSignatureHelpItems.Items.Count}"); + Assert.True(expectedTestItems.Count() == actualSignatureHelpItems.Items.Length, $"Expected {expectedTestItems.Count()} items, but got {actualSignatureHelpItems.Items.Length}"); for (var i = 0; i < expectedTestItems.Count(); i++) { diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs index f17ea175303d3..699ec5af70f32 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs @@ -7,6 +7,7 @@ using System.Linq; using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; @@ -28,7 +29,7 @@ internal static SignatureHelpItem ConvertMethodGroupMethod( IMethodSymbol method, int position, SemanticModel semanticModel, - IList? descriptionParts) + ImmutableArray? descriptionParts) { var structuralTypeDisplayService = document.GetRequiredLanguageService(); var documentationCommentFormattingService = document.GetRequiredLanguageService(); @@ -50,7 +51,7 @@ private static ImmutableArray GetMethodGroupPreambleParts( SemanticModel semanticModel, int position) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); var awaitable = method.GetOriginalUnreducedDefinition().IsAwaitableNonDynamic(semanticModel, position); var extension = method.GetOriginalUnreducedDefinition().IsExtensionMethod(); @@ -82,9 +83,9 @@ private static ImmutableArray GetMethodGroupPreambleParts( result.AddRange(method.ToMinimalDisplayParts(semanticModel, position, MinimallyQualifiedWithoutParametersFormat)); result.Add(Punctuation(SyntaxKind.OpenParenToken)); - return result; + return result.ToImmutableAndClear(); } - private static IList GetMethodGroupPostambleParts() + private static ImmutableArray GetMethodGroupPostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractIntrinsicOperatorSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractIntrinsicOperatorSignatureHelpProvider.vb index ed3d8826fd253..ca9c3bd2fa902 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractIntrinsicOperatorSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractIntrinsicOperatorSignatureHelpProvider.vb @@ -5,6 +5,7 @@ Imports System.Threading Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators @@ -37,7 +38,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return Nothing End If - Dim items As New List(Of SignatureHelpItem) + Dim items = ArrayBuilder(Of SignatureHelpItem).GetInstance() Dim semanticModel = Await document.ReuseExistingSpeculativeModelAsync(node, cancellationToken).ConfigureAwait(False) For Each documentation In Await GetIntrinsicOperatorDocumentationAsync(node, document, cancellationToken).ConfigureAwait(False) @@ -49,12 +50,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService) Return CreateSignatureHelpItems( - items, textSpan, + items.ToImmutableAndFree(), textSpan, GetCurrentArgumentState(root, position, syntaxFacts, textSpan, cancellationToken), selectedItemIndex:=Nothing, parameterIndexOverride:=-1) End Function Friend Shared Function GetSignatureHelpItemForIntrinsicOperator(document As Document, semanticModel As SemanticModel, position As Integer, documentation As AbstractIntrinsicOperatorDocumentation, cancellationToken As CancellationToken) As SignatureHelpItem - Dim parameters As New List(Of SignatureHelpSymbolParameter) + Dim parameters = ArrayBuilder(Of SignatureHelpSymbolParameter).GetInstance() For i = 0 To documentation.ParameterCount - 1 Dim capturedIndex = i @@ -78,7 +79,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp prefixParts:=documentation.PrefixParts, separatorParts:=GetSeparatorParts(), suffixParts:=suffixParts, - parameters:=parameters) + parameters:=parameters.ToImmutableAndFree()) End Function Protected Overridable Function GetCurrentArgumentStateWorker(node As SyntaxNode, position As Integer) As SignatureHelpState diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb index 726a78d437a7b..c2d65fab1d1c5 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.vb @@ -2,13 +2,15 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp - friend MustInherit class AbstractOrdinaryMethodSignatureHelpProvider - inherits AbstractVisualBasicSignatureHelpProvider + Friend MustInherit Class AbstractOrdinaryMethodSignatureHelpProvider + Inherits AbstractVisualBasicSignatureHelpProvider Protected Shared Function ConvertMemberGroupMember(document As Document, member As ISymbol, @@ -29,8 +31,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp member.GetParameters().SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) End Function - Private Shared Function GetMemberGroupPreambleParts(symbol As ISymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetMemberGroupPreambleParts(symbol As ISymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() AddExtensionPreamble(symbol, result) @@ -44,13 +46,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp result.AddRange(symbol.ToMinimalDisplayParts(semanticModel, position, format)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetMemberGroupPostambleParts(symbol As ISymbol, - semanticModel As SemanticModel, - position As Integer) As IList(Of SymbolDisplayPart) - Dim parts = New List(Of SymbolDisplayPart) + Private Shared Function GetMemberGroupPostambleParts( + symbol As ISymbol, + semanticModel As SemanticModel, + position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.Add(Punctuation(SyntaxKind.CloseParenToken)) If TypeOf symbol Is IMethodSymbol Then @@ -70,7 +73,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.AddRange([property].Type.ToMinimalDisplayParts(semanticModel, position)) End If - Return parts + Return parts.ToImmutableAndFree() End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractVisualBasicSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractVisualBasicSignatureHelpProvider.vb index 1421a16fd87ef..cce684ddaf9d5 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AbstractVisualBasicSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AbstractVisualBasicSignatureHelpProvider.vb @@ -2,7 +2,9 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.DocumentationComments +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp @@ -34,8 +36,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, vbCrLf) End Function - Protected Shared Function GetSeparatorParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CommaToken), Space()} + Protected Shared Function GetSeparatorParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CommaToken), Space()) End Function Protected Shared Function Convert(parameter As IParameterSymbol, @@ -48,7 +50,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parameter.ToMinimalDisplayParts(semanticModel, position)) End Function - Protected Shared Sub AddExtensionPreamble(symbol As ISymbol, result As IList(Of SymbolDisplayPart)) + Protected Shared Sub AddExtensionPreamble(symbol As ISymbol, result As ArrayBuilder(Of SymbolDisplayPart)) If symbol.GetOriginalUnreducedDefinition().IsExtensionMethod() Then result.Add(Punctuation(SyntaxKind.LessThanToken)) result.Add(Text(VBFeaturesResources.Extension)) diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb index 68d40a55374ce..0dbb3094b6f14 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb @@ -9,6 +9,7 @@ Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -126,12 +127,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return item End Function - Private Shared Function GetParameters(constructor As IMethodSymbol, - semanticModel As SemanticModel, - position As Integer, - namedParameters As List(Of ISymbol), - documentationCommentFormattingService As IDocumentationCommentFormattingService) As IList(Of SignatureHelpSymbolParameter) - Dim result = New List(Of SignatureHelpSymbolParameter) + Private Shared Function GetParameters( + constructor As IMethodSymbol, + semanticModel As SemanticModel, + position As Integer, + namedParameters As List(Of ISymbol), + documentationCommentFormattingService As IDocumentationCommentFormattingService) As ImmutableArray(Of SignatureHelpSymbolParameter) + Dim result = ArrayBuilder(Of SignatureHelpSymbolParameter).GetInstance() For Each parameter In constructor.Parameters result.Add(Convert(parameter, semanticModel, position, documentationCommentFormattingService)) @@ -144,7 +146,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp DirectCast(namedParameter, IFieldSymbol).Type, DirectCast(namedParameter, IPropertySymbol).Type) - Dim displayParts = New List(Of SymbolDisplayPart) + Dim displayParts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() displayParts.Add(New SymbolDisplayPart( If(TypeOf namedParameter Is IFieldSymbol, SymbolDisplayPartKind.FieldName, SymbolDisplayPartKind.PropertyName), @@ -156,11 +158,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp namedParameter.Name, isOptional:=True, documentationFactory:=namedParameter.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), - displayParts:=displayParts, + displayParts:=displayParts.ToImmutableAndFree(), prefixDisplayParts:=GetParameterPrefixDisplayParts(i))) Next - Return result + Return result.ToImmutableAndFree() End Function Private Shared Function GetParameterPrefixDisplayParts(i As Integer) As ImmutableArray(Of SymbolDisplayPart) @@ -174,15 +176,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return Nothing End Function - Private Shared Function GetPreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetPreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.AddRange(method.ContainingType.ToMinimalDisplayParts(semanticModel, position)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetPostambleParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CloseParenToken)} + Private Shared Function GetPostambleParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CloseParenToken)) End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb index 4e409a378f264..fe9493630613f 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/FunctionAggregationSignatureHelpProvider.vb @@ -109,18 +109,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return item End Function - Private Shared Function GetPreambleParts(method As IMethodSymbol) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetPreambleParts(method As IMethodSymbol) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() AddExtensionPreamble(method, result) result.AddMethodName(method.Name) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetPostambleParts(method As IMethodSymbol, - semanticModel As SemanticModel, - position As Integer) As IList(Of SymbolDisplayPart) - Dim parts = New List(Of SymbolDisplayPart) + Private Shared Function GetPostambleParts( + method As IMethodSymbol, + semanticModel As SemanticModel, + position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.Add(Punctuation(SyntaxKind.CloseParenToken)) If Not method.ReturnsVoid Then @@ -130,14 +131,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.AddRange(method.ReturnType.ToMinimalDisplayParts(semanticModel, position)) End If - Return parts + Return parts.ToImmutableAndFree() End Function - Private Shared Function GetParameterParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer, - documentationCommentFormattingService As IDocumentationCommentFormattingService) As IList(Of SignatureHelpSymbolParameter) + Private Shared Function GetParameterParts( + method As IMethodSymbol, + semanticModel As SemanticModel, + position As Integer, + documentationCommentFormattingService As IDocumentationCommentFormattingService) As ImmutableArray(Of SignatureHelpSymbolParameter) ' Function () As If method.Parameters.Length <> 1 Then - Return SpecializedCollections.EmptyList(Of SignatureHelpSymbolParameter)() + Return ImmutableArray(Of SignatureHelpSymbolParameter).Empty End If ' Function (selector as Func(Of T, R)) As R @@ -162,11 +166,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parameter.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), parts.ToImmutableAndFree()) - Return {sigHelpParameter} + Return ImmutableArray.Create(sigHelpParameter) End If End If - Return SpecializedCollections.EmptyList(Of SignatureHelpSymbolParameter)() + Return ImmutableArray(Of SignatureHelpSymbolParameter).Empty End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.Method.vb b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.Method.vb index 85fed14828d91..ee66f71255869 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.Method.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.Method.vb @@ -2,12 +2,13 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. -Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp +Imports System.Collections.Immutable +Imports Microsoft.CodeAnalysis.PooledObjects +Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Partial Friend Class GenericNameSignatureHelpProvider - - Private Shared Function GetPreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetPreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() AddExtensionPreamble(method, result) @@ -22,7 +23,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp result.Add(Punctuation(SyntaxKind.OpenParenToken)) result.Add(Keyword(SyntaxKind.OfKeyword)) result.Add(Space()) - Return result + Return result.ToImmutableAndFree() End Function Private Shared Function GetContainingType(method As IMethodSymbol) As ITypeSymbol @@ -35,8 +36,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp End If End Function - Private Shared Function GetPostambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetPostambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.Add(Punctuation(SyntaxKind.CloseParenToken)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) @@ -60,7 +61,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp result.AddRange(method.ReturnType.ToMinimalDisplayParts(semanticModel, position)) End If - Return result + Return result.ToImmutableAndFree() End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb index dec48cb5978a2..4dc0f506b400b 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.NamedType.vb @@ -21,8 +21,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return result.ToImmutableAndFree() End Function - Private Shared Function GetPostambleParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CloseParenToken)} + Private Shared Function GetPostambleParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CloseParenToken)) End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.vb index 1650b1b6f6865..ca768d60b3ed0 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/GenericNameSignatureHelpProvider.vb @@ -8,6 +8,7 @@ Imports System.Threading Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -107,7 +108,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim _syntaxFacts = document.GetLanguageService(Of ISyntaxFactsService) Return CreateSignatureHelpItems( - accessibleSymbols.Select(Function(s) Convert(s, genericName, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)).ToList(), + accessibleSymbols.SelectAsArray(Function(s) Convert(s, genericName, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)), textSpan, GetCurrentArgumentState(root, position, _syntaxFacts, textSpan, cancellationToken), selectedItemIndex:=Nothing, parameterIndexOverride:=-1) End Function @@ -124,7 +125,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp GetPreambleParts(namedType, semanticModel, position), GetSeparatorParts(), GetPostambleParts(), - namedType.TypeParameters.Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + namedType.TypeParameters.SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) Else Dim method = DirectCast(symbol, IMethodSymbol) item = CreateItem( @@ -135,7 +136,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp GetPreambleParts(method, semanticModel, position), GetSeparatorParts(), GetPostambleParts(method, semanticModel, position), - method.TypeParameters.Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + method.TypeParameters.SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) End If Return item @@ -144,7 +145,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Private Shared ReadOnly s_minimallyQualifiedFormat As SymbolDisplayFormat = SymbolDisplayFormat.MinimallyQualifiedFormat.WithGenericsOptions(SymbolDisplayFormat.MinimallyQualifiedFormat.GenericsOptions Or SymbolDisplayGenericsOptions.IncludeVariance) Private Overloads Shared Function Convert(parameter As ITypeParameterSymbol, semanticModel As SemanticModel, position As Integer, documentationCommentFormattingService As IDocumentationCommentFormattingService) As SignatureHelpSymbolParameter - Dim parts = New List(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.AddRange(parameter.ToMinimalDisplayParts(semanticModel, position, s_minimallyQualifiedFormat)) AddConstraints(parameter, parts, semanticModel, position) @@ -152,13 +153,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parameter.Name, isOptional:=False, documentationFactory:=parameter.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), - displayParts:=parts) + displayParts:=parts.ToImmutableAndFree()) End Function - Private Shared Function AddConstraints(typeParam As ITypeParameterSymbol, - parts As List(Of SymbolDisplayPart), - semanticModel As SemanticModel, - position As Integer) As IList(Of SymbolDisplayPart) + Private Shared Sub AddConstraints( + typeParam As ITypeParameterSymbol, + parts As ArrayBuilder(Of SymbolDisplayPart), + semanticModel As SemanticModel, + position As Integer) Dim constraintTypes = typeParam.ConstraintTypes Dim constraintCount = TypeParameterSpecialConstraintCount(typeParam) + constraintTypes.Length @@ -203,9 +205,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.Add(Punctuation(SyntaxKind.CloseBraceToken)) End If End If - - Return parts - End Function + End Sub Private Shared Function TypeParameterSpecialConstraintCount(typeParam As ITypeParameterSymbol) As Integer Return If(typeParam.HasReferenceTypeConstraint, 1, 0) + diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.DelegateInvoke.vb b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.DelegateInvoke.vb index bb409778cc4fd..3452cd42c4323 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.DelegateInvoke.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.DelegateInvoke.vb @@ -2,10 +2,12 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -37,8 +39,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return SpecializedCollections.SingletonEnumerable(item) End Function - Private Shared Function GetDelegateInvokePreambleParts(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim displayParts = New List(Of SymbolDisplayPart)() + Private Shared Function GetDelegateInvokePreambleParts(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim displayParts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() If invokeMethod.ContainingType.IsAnonymousType Then displayParts.Add(New SymbolDisplayPart(SymbolDisplayPartKind.MethodName, invokeMethod, invokeMethod.Name)) @@ -47,11 +49,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp End If displayParts.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return displayParts + Return displayParts.ToImmutableAndFree() End Function - Private Shared Function GetDelegateInvokeParameters(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer, documentationCommentFormattingService As IDocumentationCommentFormattingService, cancellationToken As CancellationToken) As IList(Of SignatureHelpSymbolParameter) - Dim parameters = New List(Of SignatureHelpSymbolParameter) + Private Shared Function GetDelegateInvokeParameters(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer, documentationCommentFormattingService As IDocumentationCommentFormattingService, cancellationToken As CancellationToken) As ImmutableArray(Of SignatureHelpSymbolParameter) + Dim parameters = ArrayBuilder(Of SignatureHelpSymbolParameter).GetInstance() For Each parameter In invokeMethod.Parameters cancellationToken.ThrowIfCancellationRequested() parameters.Add(New SignatureHelpSymbolParameter( @@ -61,13 +63,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp displayParts:=parameter.ToMinimalDisplayParts(semanticModel, position))) Next - Return parameters + Return parameters.ToImmutableAndFree() End Function - Private Shared Function GetDelegateInvokePostambleParts(invokeMethod As IMethodSymbol, - semanticModel As SemanticModel, - position As Integer) As IList(Of SymbolDisplayPart) - Dim parts = New List(Of SymbolDisplayPart) + Private Shared Function GetDelegateInvokePostambleParts( + invokeMethod As IMethodSymbol, + semanticModel As SemanticModel, + position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.Add(Punctuation(SyntaxKind.CloseParenToken)) @@ -78,7 +81,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position)) End If - Return parts + Return parts.ToImmutableAndFree() End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb index 3fc0bbf04f980..ce7ab7f9949b4 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb @@ -2,10 +2,12 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -47,21 +49,22 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp GetIndexerPreambleParts(indexer, semanticModel, position), GetSeparatorParts(), GetIndexerPostambleParts(indexer, semanticModel, position), - indexer.Parameters.Select(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService)).ToList()) + indexer.Parameters.SelectAsArray(Function(p) Convert(p, semanticModel, position, documentationCommentFormattingService))) Return item End Function - Private Shared Function GetIndexerPreambleParts(symbol As IPropertySymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetIndexerPreambleParts(symbol As IPropertySymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.AddRange(symbol.ContainingType.ToMinimalDisplayParts(semanticModel, position)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetIndexerPostambleParts(symbol As IPropertySymbol, - semanticModel As SemanticModel, - position As Integer) As IList(Of SymbolDisplayPart) - Dim parts = New List(Of SymbolDisplayPart) + Private Shared Function GetIndexerPostambleParts( + symbol As IPropertySymbol, + semanticModel As SemanticModel, + position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() parts.Add(Punctuation(SyntaxKind.CloseParenToken)) Dim [property] = DirectCast(symbol, IPropertySymbol) @@ -71,8 +74,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.Add(Space()) parts.AddRange([property].Type.ToMinimalDisplayParts(semanticModel, position)) - Return parts + Return parts.ToImmutableAndFree() End Function - End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb index 839b21226247d..dadbe719e489a 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.DelegateType.vb @@ -2,6 +2,7 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.Collections Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService @@ -10,14 +11,13 @@ Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp - Partial Friend Class ObjectCreationExpressionSignatureHelpProvider - - Private Shared Function GetDelegateTypeConstructors(objectCreationExpression As ObjectCreationExpressionSyntax, - semanticModel As SemanticModel, - structuralTypeDisplayService As IStructuralTypeDisplayService, - documentationCommentFormattingService As IDocumentationCommentFormattingService, - delegateType As INamedTypeSymbol) As (items As IList(Of SignatureHelpItem), selectedItem As Integer?) + Private Shared Function GetDelegateTypeConstructors( + objectCreationExpression As ObjectCreationExpressionSyntax, + semanticModel As SemanticModel, + structuralTypeDisplayService As IStructuralTypeDisplayService, + documentationCommentFormattingService As IDocumentationCommentFormattingService, + delegateType As INamedTypeSymbol) As (items As ImmutableArray(Of SignatureHelpItem), selectedItem As Integer?) Dim invokeMethod = delegateType.DelegateInvokeMethod If invokeMethod Is Nothing Then Return (Nothing, Nothing) @@ -34,17 +34,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp suffixParts:=GetDelegateTypePostambleParts(), parameters:=GetDelegateTypeParameters(invokeMethod, semanticModel, position)) - Return (SpecializedCollections.SingletonList(item), 0) + Return (ImmutableArray.Create(item), 0) End Function - Private Shared Function GetDelegateTypePreambleParts(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetDelegateTypePreambleParts(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.AddRange(invokeMethod.ContainingType.ToMinimalDisplayParts(semanticModel, position)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetDelegateTypeParameters(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SignatureHelpSymbolParameter) + Private Shared Function GetDelegateTypeParameters(invokeMethod As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SignatureHelpSymbolParameter) Const TargetName As String = "target" Dim parts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() @@ -78,15 +78,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp parts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position)) End If - Return {New SignatureHelpSymbolParameter( + Return ImmutableArray.Create(New SignatureHelpSymbolParameter( TargetName, isOptional:=False, documentationFactory:=Nothing, - displayParts:=parts.ToImmutableAndFree())} + displayParts:=parts.ToImmutableAndFree())) End Function - Private Shared Function GetDelegateTypePostambleParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CloseParenToken)} + Private Shared Function GetDelegateTypePostambleParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CloseParenToken)) End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb index a070aa43c74ee..c1be3d8a9637c 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider.NormalType.vb @@ -2,10 +2,12 @@ ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. +Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -20,7 +22,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp structuralTypeDisplayService As IStructuralTypeDisplayService, normalType As INamedTypeSymbol, within As ISymbol, - options As MemberDisplayOptions, cancellationToken As CancellationToken) As (items As IList(Of SignatureHelpItem), selectedItem As Integer?) + options As MemberDisplayOptions, cancellationToken As CancellationToken) As (items As ImmutableArray(Of SignatureHelpItem), selectedItem As Integer?) Dim accessibleConstructors = normalType.InstanceConstructors. WhereAsArray(Function(c) c.IsAccessibleWithin(within)). @@ -33,8 +35,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim documentationCommentFormattingService = document.GetLanguageService(Of IDocumentationCommentFormattingService)() - Dim items = accessibleConstructors.Select( - Function(c) ConvertNormalTypeConstructor(c, objectCreationExpression, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)).ToList() + Dim items = accessibleConstructors.SelectAsArray( + Function(c) ConvertNormalTypeConstructor(c, objectCreationExpression, semanticModel, structuralTypeDisplayService, documentationCommentFormattingService)) Dim currentConstructor = semanticModel.GetSymbolInfo(objectCreationExpression, cancellationToken) Dim selectedItem = TryGetSelectedIndex(accessibleConstructors, currentConstructor.Symbol) @@ -57,15 +59,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Return item End Function - Private Shared Function GetNormalTypePreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As IList(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Private Shared Function GetNormalTypePreambleParts(method As IMethodSymbol, semanticModel As SemanticModel, position As Integer) As ImmutableArray(Of SymbolDisplayPart) + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.AddRange(method.ContainingType.ToMinimalDisplayParts(semanticModel, position)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetNormalTypePostambleParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CloseParenToken)} + Private Shared Function GetNormalTypePostambleParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CloseParenToken)) End Function End Class End Namespace diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb index 023f8a2b01410..d76944bac93c4 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/RaiseEventStatementSignatureHelpProvider.vb @@ -8,6 +8,7 @@ Imports System.Threading Imports Microsoft.CodeAnalysis.DocumentationComments Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.LanguageService +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.SignatureHelp Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax @@ -123,12 +124,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp End Function Private Shared Function GetPreambleParts( - eventSymbol As IEventSymbol, - semanticModel As SemanticModel, - position As Integer - ) As IList(Of SymbolDisplayPart) + eventSymbol As IEventSymbol, + semanticModel As SemanticModel, + position As Integer) As ImmutableArray(Of SymbolDisplayPart) - Dim result = New List(Of SymbolDisplayPart)() + Dim result = ArrayBuilder(Of SymbolDisplayPart).GetInstance() result.AddRange(eventSymbol.ContainingType.ToMinimalDisplayParts(semanticModel, position)) result.Add(Punctuation(SyntaxKind.DotToken)) @@ -140,11 +140,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp result.AddRange(eventSymbol.ToMinimalDisplayParts(semanticModel, position, format)) result.Add(Punctuation(SyntaxKind.OpenParenToken)) - Return result + Return result.ToImmutableAndFree() End Function - Private Shared Function GetPostambleParts() As IList(Of SymbolDisplayPart) - Return {Punctuation(SyntaxKind.CloseParenToken)} + Private Shared Function GetPostambleParts() As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(Punctuation(SyntaxKind.CloseParenToken)) End Function End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb index de7a0b8f81567..0cce47cbe7700 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/AbstractIntrinsicOperatorDocumentation.vb @@ -5,6 +5,7 @@ Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis +Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators @@ -24,16 +25,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Public MustOverride Function GetParameterName(index As Integer) As String Public MustOverride Function GetParameterDocumentation(index As Integer) As String - Public Overridable Function GetParameterDisplayParts(index As Integer) As IList(Of SymbolDisplayPart) - Return {New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index))} + Public Overridable Function GetParameterDisplayParts(index As Integer) As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create(New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index))) End Function Public Overridable Function TryGetTypeNameParameter(syntaxNode As SyntaxNode, index As Integer) As TypeSyntax Return Nothing End Function - Public Overridable Function GetSuffix(semanticModel As SemanticModel, position As Integer, nodeToBind As SyntaxNode, cancellationToken As CancellationToken) As IList(Of SymbolDisplayPart) - Dim suffixParts As New List(Of SymbolDisplayPart) + Public Overridable Function GetSuffix(semanticModel As SemanticModel, position As Integer, nodeToBind As SyntaxNode, cancellationToken As CancellationToken) As ImmutableArray(Of SymbolDisplayPart) + Dim suffixParts = ArrayBuilder(Of SymbolDisplayPart).GetInstance() If IncludeAsType Then suffixParts.Add(New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, ")")) @@ -45,7 +46,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Dim typeInfo = semanticModel.GetTypeInfo(nodeToBind, cancellationToken) If typeInfo.Type IsNot Nothing Then suffixParts.AddRange(typeInfo.Type.ToMinimalDisplayParts(semanticModel, position)) - Return suffixParts + Return suffixParts.ToImmutableAndFree() End If End If @@ -59,13 +60,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators suffixParts.Add(New SymbolDisplayPart(SymbolDisplayPartKind.Text, Nothing, ReturnTypeMetadataName)) End If - Return suffixParts + Return suffixParts.ToImmutableAndFree() End If suffixParts.Add(New SymbolDisplayPart(SymbolDisplayPartKind.Text, Nothing, VBWorkspaceResources.result)) End If - Return suffixParts + Return suffixParts.ToImmutableAndFree() End Function End Class End Namespace diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb index 9b92647f63d46..48d1960c0c21b 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/MidAssignmentDocumentation.vb @@ -38,9 +38,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators End Select End Function - Public Overrides Function GetParameterDisplayParts(index As Integer) As IList(Of SymbolDisplayPart) + Public Overrides Function GetParameterDisplayParts(index As Integer) As ImmutableArray(Of SymbolDisplayPart) If index = 2 Then - Return {New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, "[" + GetParameterName(2) + "]")} + Return ImmutableArray.Create(New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, "[" + GetParameterName(2) + "]")) Else Return MyBase.GetParameterDisplayParts(index) End If @@ -50,14 +50,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Public Overrides ReadOnly Property ParameterCount As Integer = 3 - Public Overrides Function GetSuffix(semanticModel As SemanticModel, position As Integer, nodeToBind As SyntaxNode, cancellationToken As CancellationToken) As IList(Of SymbolDisplayPart) - Return { + Public Overrides Function GetSuffix(semanticModel As SemanticModel, position As Integer, nodeToBind As SyntaxNode, cancellationToken As CancellationToken) As ImmutableArray(Of SymbolDisplayPart) + Return ImmutableArray.Create( New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, ")"), New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), New SymbolDisplayPart(SymbolDisplayPartKind.Operator, Nothing, "="), New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), - New SymbolDisplayPart(SymbolDisplayPartKind.Text, Nothing, VBWorkspaceResources.stringExpression) - } + New SymbolDisplayPart(SymbolDisplayPartKind.Text, Nothing, VBWorkspaceResources.stringExpression)) End Function Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( From 19a9f5ca3c0d16eef2f168761df4807fc086eef1 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:20:28 +0200 Subject: [PATCH 07/19] move to immutable types in signature help --- .../Extensions/SymbolDisplayPartExtensions.cs | 3 ++- .../GetXmlNamespaceExpressionDocumentation.vb | 7 +++---- .../TernaryConditionalExpressionDocumentation.vb | 15 ++++++++------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/Extensions/SymbolDisplayPartExtensions.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/Extensions/SymbolDisplayPartExtensions.cs index b52deb8b4fcdc..17060dc98905f 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/Extensions/SymbolDisplayPartExtensions.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/Extensions/SymbolDisplayPartExtensions.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.CodeAnalysis.PooledObjects; namespace Microsoft.CodeAnalysis.Shared.Extensions; @@ -15,7 +16,7 @@ public static string GetFullText(this IEnumerable parts) public static void AddLineBreak(this IList parts, string text = "\r\n") => parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.LineBreak, null, text)); - public static void AddMethodName(this IList parts, string text) + public static void AddMethodName(this ArrayBuilder parts, string text) => parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.MethodName, null, text)); public static void AddPunctuation(this IList parts, string text) diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb index 949a3330af35a..f4637306c4b54 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/GetXmlNamespaceExpressionDocumentation.vb @@ -8,14 +8,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Friend NotInheritable Class GetXmlNamespaceExpressionDocumentation Inherits AbstractIntrinsicOperatorDocumentation - Public Overrides Function GetParameterDisplayParts(index As Integer) As IList(Of SymbolDisplayPart) + Public Overrides Function GetParameterDisplayParts(index As Integer) As ImmutableArray(Of SymbolDisplayPart) Select Case index Case 0 - Return { + Return ImmutableArray.Create( New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "["), New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index)), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "]") - } + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "]")) Case Else Throw New ArgumentException(NameOf(index)) End Select diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb index 660e32ca4d139..307e7c1dd5e67 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/TernaryConditionalExpressionDocumentation.vb @@ -11,15 +11,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Public Overrides ReadOnly Property DocumentationText As String = VBWorkspaceResources.If_condition_returns_True_the_function_calculates_and_returns_expressionIfTrue_Otherwise_it_returns_expressionIfFalse - Public Overrides Function GetParameterDisplayParts(index As Integer) As IList(Of SymbolDisplayPart) + Public Overrides Function GetParameterDisplayParts(index As Integer) As ImmutableArray(Of SymbolDisplayPart) If index = 0 Then - Return {New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index)), - New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "As"), - New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "Boolean")} + Return ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index)), + New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "As"), + New SymbolDisplayPart(SymbolDisplayPartKind.Space, Nothing, " "), + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, "Boolean")) Else - Return {New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index))} + Return ImmutableArray.Create(New SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, Nothing, GetParameterName(index))) End If End Function From 975b9eebbf9638d866c2b7f4ba110f933f0ee9e5 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:27:22 +0200 Subject: [PATCH 08/19] move to immutable types in signature help --- .../Api/PythiaSignatureHelpItemWrapper.cs | 2 +- ...bstractGenericNameSignatureHelpProvider.cs | 13 ++++--- ...GenericNameSignatureHelpProvider_Method.cs | 20 +++++----- ...ericNameSignatureHelpProvider_NamedType.cs | 5 ++- .../AttributeSignatureHelpProvider.cs | 39 ++++++++----------- ...onstructorBaseTypeSignatureHelpProvider.cs | 18 ++------- .../TupleConstructionSignatureHelpProvider.cs | 7 ++-- 7 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/Features/CSharp/Portable/ExternalAccess/Pythia/Api/PythiaSignatureHelpItemWrapper.cs b/src/Features/CSharp/Portable/ExternalAccess/Pythia/Api/PythiaSignatureHelpItemWrapper.cs index 5fbac117c5f38..cc50e0915d45e 100644 --- a/src/Features/CSharp/Portable/ExternalAccess/Pythia/Api/PythiaSignatureHelpItemWrapper.cs +++ b/src/Features/CSharp/Portable/ExternalAccess/Pythia/Api/PythiaSignatureHelpItemWrapper.cs @@ -21,5 +21,5 @@ public static PythiaSignatureHelpItemWrapper CreateFromMethodGroupMethod( int position, SemanticModel semanticModel, IList descriptionParts) - => new(AbstractOrdinaryMethodSignatureHelpProvider.ConvertMethodGroupMethod(document, method, position, semanticModel, descriptionParts)); + => new(AbstractOrdinaryMethodSignatureHelpProvider.ConvertMethodGroupMethod(document, method, position, semanticModel, [.. descriptionParts])); } diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs index de6a1bb133478..7ca4997995a58 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs @@ -14,6 +14,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; using Microsoft.CodeAnalysis.Text; @@ -156,9 +157,9 @@ private static SignatureHelpItem Convert( throw ExceptionUtilities.UnexpectedValue(symbol); } - IList GetTypeArguments(IMethodSymbol method) + ImmutableArray GetTypeArguments(IMethodSymbol method) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); // Signature help for generic modern extensions must include the generic type *arguments* for the containing // extension as well. These are fixed given the receiver, and need to be repeated in the method type argument @@ -173,7 +174,7 @@ IList GetTypeArguments(IMethodSymbol method) result.AddRange(method.TypeParameters.Select(p => Convert(p, semanticModel, position, documentationCommentFormattingService))); - return result; + return result.ToImmutableAndClear(); } } @@ -195,12 +196,12 @@ private static SignatureHelpSymbolParameter Convert( selectedDisplayParts: GetSelectedDisplayParts(parameter, semanticModel, position)); } - private static IList GetSelectedDisplayParts( + private static ImmutableArray GetSelectedDisplayParts( ITypeParameterSymbol typeParam, SemanticModel semanticModel, int position) { - var parts = new List(); + using var _ = ArrayBuilder.GetInstance(out var parts); if (TypeParameterHasConstraints(typeParam)) { @@ -276,7 +277,7 @@ private static IList GetSelectedDisplayParts( } } - return parts; + return parts.ToImmutableAndClear(); } private static bool TypeParameterHasConstraints(ITypeParameterSymbol typeParam) diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs index 38690a5a7def4..d8ec57f3e7367 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs @@ -3,18 +3,20 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; internal partial class AbstractGenericNameSignatureHelpProvider { - private static IList GetPreambleParts( + private static ImmutableArray GetPreambleParts( IMethodSymbol method, SemanticModel semanticModel, int position) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); var awaitable = method.GetOriginalUnreducedDefinition().IsAwaitableNonDynamic(semanticModel, position); var extension = method.GetOriginalUnreducedDefinition().IsExtensionMethod(); @@ -55,7 +57,7 @@ private static IList GetPreambleParts( result.Add(new SymbolDisplayPart(SymbolDisplayPartKind.MethodName, method, method.Name)); result.Add(Punctuation(SyntaxKind.LessThanToken)); - return result; + return result.ToImmutableAndClear(); } private static ITypeSymbol? GetContainingType(IMethodSymbol method) @@ -71,13 +73,11 @@ private static IList GetPreambleParts( } } - private static IList GetPostambleParts(IMethodSymbol method, SemanticModel semanticModel, int position) + private static ImmutableArray GetPostambleParts(IMethodSymbol method, SemanticModel semanticModel, int position) { - var result = new List - { - Punctuation(SyntaxKind.GreaterThanToken), - Punctuation(SyntaxKind.OpenParenToken) - }; + using var _ = ArrayBuilder.GetInstance(out var result); + result.Add(Punctuation(SyntaxKind.GreaterThanToken)); + result.Add(Punctuation(SyntaxKind.OpenParenToken)); var first = true; foreach (var parameter in method.Parameters) @@ -93,6 +93,6 @@ private static IList GetPostambleParts(IMethodSymbol method, } result.Add(Punctuation(SyntaxKind.CloseParenToken)); - return result; + return result.ToImmutableAndClear(); } } diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs index 834a77dd75536..47d45335be810 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs @@ -3,12 +3,13 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; internal partial class AbstractGenericNameSignatureHelpProvider { - private static IList GetPreambleParts( + private static ImmutableArray GetPreambleParts( INamedTypeSymbol namedType, SemanticModel semanticModel, int position) @@ -16,6 +17,6 @@ private static IList GetPreambleParts( return [.. namedType.ToMinimalDisplayParts(semanticModel, position, MinimallyQualifiedWithoutTypeParametersFormat), Punctuation(SyntaxKind.LessThanToken)]; } - private static IList GetPostambleParts() + private static ImmutableArray GetPostambleParts() => [Punctuation(SyntaxKind.GreaterThanToken)]; } diff --git a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs index bb27965b2b009..99ede74dbc264 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs @@ -16,6 +16,7 @@ using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; using Microsoft.CodeAnalysis.Text; @@ -152,7 +153,7 @@ private static SignatureHelpItem Convert( return item; } - private static IList GetParameters( + private static ImmutableArray GetParameters( IMethodSymbol constructor, SemanticModel semanticModel, int position, @@ -160,11 +161,9 @@ private static IList GetParameters( IDocumentationCommentFormattingService documentationCommentFormatter, CancellationToken cancellationToken) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); foreach (var parameter in constructor.Parameters) - { result.Add(Convert(parameter, semanticModel, position, documentationCommentFormatter)); - } for (var i = 0; i < namedParameters.Count; i++) { @@ -172,31 +171,27 @@ private static IList GetParameters( var namedParameter = namedParameters[i]; - var type = namedParameter is IFieldSymbol ? ((IFieldSymbol)namedParameter).Type : ((IPropertySymbol)namedParameter).Type; - - var displayParts = new List - { - new( - namedParameter is IFieldSymbol ? SymbolDisplayPartKind.FieldName : SymbolDisplayPartKind.PropertyName, - namedParameter, namedParameter.Name.ToIdentifierToken().ToString()), - Space(), - Punctuation(SyntaxKind.EqualsToken), - Space() - }; - displayParts.AddRange(type.ToMinimalDisplayParts(semanticModel, position)); - + var type = namedParameter is IFieldSymbol field ? field.Type : ((IPropertySymbol)namedParameter).Type; result.Add(new SignatureHelpSymbolParameter( namedParameter.Name, isOptional: true, documentationFactory: namedParameter.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormatter), - displayParts: displayParts, + displayParts: + [ + new(namedParameter is IFieldSymbol ? SymbolDisplayPartKind.FieldName : SymbolDisplayPartKind.PropertyName, + namedParameter, namedParameter.Name.ToIdentifierToken().ToString()), + Space(), + Punctuation(SyntaxKind.EqualsToken), + Space(), + .. type.ToMinimalDisplayParts(semanticModel, position), + ], prefixDisplayParts: GetParameterPrefixDisplayParts(i))); } - return result; + return result.ToImmutableAndClear(); } - private static List? GetParameterPrefixDisplayParts(int i) + private static ImmutableArray? GetParameterPrefixDisplayParts(int i) { if (i == 0) { @@ -211,7 +206,7 @@ private static IList GetParameters( return null; } - private static IList GetPreambleParts( + private static ImmutableArray GetPreambleParts( IMethodSymbol method, SemanticModel semanticModel, int position) @@ -219,6 +214,6 @@ private static IList GetPreambleParts( return [.. method.ContainingType.ToMinimalDisplayParts(semanticModel, position), Punctuation(SyntaxKind.OpenParenToken)]; } - private static IList GetPostambleParts() + private static ImmutableArray GetPostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs index a836df057d065..bca9b624b5a7f 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs @@ -128,26 +128,16 @@ private static SignatureHelpItem Convert( structuralTypeDisplayService, constructor.IsParams(), constructor.GetDocumentationPartsFactory(semanticModel, position, documentationCommentFormattingService), - GetPreambleParts(constructor, semanticModel, position), + GetPreambleParts(), GetSeparatorParts(), GetPostambleParts(), [.. constructor.Parameters.Select(p => Convert(p, semanticModel, position, documentationCommentFormattingService))]); return item; - static IList GetPreambleParts( - IMethodSymbol method, - SemanticModel semanticModel, - int position) - { - var result = new List(); - - result.AddRange(method.ContainingType.ToMinimalDisplayParts(semanticModel, position)); - result.Add(Punctuation(SyntaxKind.OpenParenToken)); - - return result; - } + ImmutableArray GetPreambleParts() + => [.. constructor.ContainingType.ToMinimalDisplayParts(semanticModel, position), Punctuation(SyntaxKind.OpenParenToken)]; - static IList GetPostambleParts() + static ImmutableArray GetPostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } } diff --git a/src/Features/CSharp/Portable/SignatureHelp/TupleConstructionSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/TupleConstructionSignatureHelpProvider.cs index 9b63703f76e2b..f5aef35c99ccc 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/TupleConstructionSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/TupleConstructionSignatureHelpProvider.cs @@ -153,9 +153,8 @@ private bool GetOuterMostParenthesizedExpressionInSpan(SyntaxNode root, int posi var suffixParts = SpecializedCollections.SingletonEnumerable(new SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, null, ")")).ToTaggedText(); var separatorParts = GetSeparatorParts().ToTaggedText(); - var items = tupleTypes.Select(tupleType => Convert( - tupleType, prefixParts, suffixParts, separatorParts, semanticModel, position)) - .ToList(); + var items = tupleTypes.SelectAsArray(tupleType => Convert( + tupleType, prefixParts, suffixParts, separatorParts, semanticModel, position)); var state = GetCurrentArgumentState(root, position, syntaxFacts, targetExpression.FullSpan, cancellationToken); return CreateSignatureHelpItems(items, targetExpression.Span, state, selectedItemIndex: null, parameterIndexOverride: -1); @@ -192,7 +191,7 @@ private static IEnumerable ConvertTupleMembers(INamedTyp typeParts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.PropertyName, null, elementName)); } - result.Add(new SignatureHelpParameter(name: string.Empty, isOptional: false, documentationFactory: null, displayParts: typeParts)); + result.Add(new SignatureHelpParameter(name: string.Empty, isOptional: false, documentationFactory: null, displayParts: [.. typeParts])); } return result; From 6f86cbbcbf5093d30bb522c5d2a689488970c5c3 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:31:50 +0200 Subject: [PATCH 09/19] move to immutable types in signature help --- .../AttributeSignatureHelpProvider.cs | 6 +++--- ...ConstructorInitializerSignatureHelpProvider.cs | 4 ++-- ...lementAccessExpressionSignatureHelpProvider.cs | 4 ++-- ...oviderBase_DelegateAndFunctionPointerInvoke.cs | 9 +++++---- ...xpressionSignatureHelpProvider_DelegateType.cs | 6 +++--- ...nExpressionSignatureHelpProvider_NormalType.cs | 5 +++-- .../AttributeSignatureHelpProvider.vb | 4 ++-- ...pressionSignatureHelpProvider.ElementAccess.vb | 15 ++++++++------- .../InvocationExpressionSignatureHelpProvider.vb | 14 +++++++------- .../SignatureHelp/SignatureHelpUtilities.vb | 1 - 10 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs index 99ede74dbc264..9ef318ca815d1 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs @@ -136,10 +136,10 @@ private static SignatureHelpItem Convert( var position = attribute.SpanStart; var namedParameters = constructor.ContainingType.GetAttributeNamedParameters(semanticModel.Compilation, within) .OrderBy(s => s.Name) - .ToList(); + .ToImmutableArray(); var isVariadic = - constructor.Parameters is [.., { IsParams: true }] && namedParameters.Count == 0; + constructor.Parameters is [.., { IsParams: true }] && namedParameters.IsEmpty; var item = CreateItem( constructor, semanticModel, position, @@ -157,7 +157,7 @@ private static ImmutableArray GetParameters( IMethodSymbol constructor, SemanticModel semanticModel, int position, - IList namedParameters, + ImmutableArray namedParameters, IDocumentationCommentFormattingService documentationCommentFormatter, CancellationToken cancellationToken) { diff --git a/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs index 9e87eba563fbb..02a8425f47cf3 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs @@ -148,7 +148,7 @@ private static SignatureHelpItem Convert( return item; } - private static IList GetPreambleParts( + private static ImmutableArray GetPreambleParts( IMethodSymbol method, SemanticModel semanticModel, int position) @@ -156,6 +156,6 @@ private static IList GetPreambleParts( return [.. method.ContainingType.ToMinimalDisplayParts(semanticModel, position), Punctuation(SyntaxKind.OpenParenToken)]; } - private static IList GetPostambleParts() + private static ImmutableArray GetPostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs index 16b7815d93d4c..f3a637887aedb 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs @@ -234,7 +234,7 @@ private static SignatureHelpItem Convert( return item; } - private static IList GetPreambleParts( + private static ImmutableArray GetPreambleParts( IPropertySymbol indexer, int position, SemanticModel semanticModel) @@ -269,7 +269,7 @@ private static IList GetPreambleParts( return result; } - private static IList GetPostambleParts() + private static ImmutableArray GetPostambleParts() => [Punctuation(SyntaxKind.CloseBracketToken)]; private static class CompleteElementAccessExpression diff --git a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs index 5b6dcce2a531f..a57a798a8d1d4 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -36,7 +37,7 @@ internal abstract partial class InvocationExpressionSignatureHelpProviderBase return invokeMethod; } - private static IList GetDelegateOrFunctionPointerInvokeItems(InvocationExpressionSyntax invocationExpression, IMethodSymbol invokeMethod, SemanticModel semanticModel, IStructuralTypeDisplayService structuralTypeDisplayService, IDocumentationCommentFormattingService documentationCommentFormattingService, out int? selectedItem, CancellationToken cancellationToken) + private static ImmutableArray GetDelegateOrFunctionPointerInvokeItems(InvocationExpressionSyntax invocationExpression, IMethodSymbol invokeMethod, SemanticModel semanticModel, IStructuralTypeDisplayService structuralTypeDisplayService, IDocumentationCommentFormattingService documentationCommentFormattingService, out int? selectedItem, CancellationToken cancellationToken) { var position = invocationExpression.SpanStart; var item = CreateItem( @@ -55,7 +56,7 @@ private static IList GetDelegateOrFunctionPointerInvokeItems( return [item]; } - private static IList GetDelegateOrFunctionPointerInvokePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) + private static ImmutableArray GetDelegateOrFunctionPointerInvokePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) { var displayParts = new List(); displayParts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position)); @@ -76,7 +77,7 @@ private static IList GetDelegateOrFunctionPointerInvokePreamb return displayParts; } - private static IList GetDelegateOrFunctionPointerInvokeParameters( + private static ImmutableArray GetDelegateOrFunctionPointerInvokeParameters( IMethodSymbol invokeMethod, SemanticModel semanticModel, int position, IDocumentationCommentFormattingService formattingService, CancellationToken cancellationToken) { var result = new List(); @@ -94,6 +95,6 @@ private static IList GetDelegateOrFunctionPointerI return result; } - private static IList GetDelegateOrFunctionPointerInvokePostambleParts() + private static ImmutableArray GetDelegateOrFunctionPointerInvokePostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs index b25747835e5af..9dcac56c97187 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs @@ -33,7 +33,7 @@ private static ImmutableArray ConvertDelegateTypeConstructor( return [item]; } - private static IList GetDelegateTypePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) + private static ImmutableArray GetDelegateTypePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) { var result = new List(); @@ -43,7 +43,7 @@ private static IList GetDelegateTypePreambleParts(IMethodSymb return result; } - private static IList GetDelegateTypeParameters(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) + private static ImmutableArray GetDelegateTypeParameters(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) { const string TargetName = "target"; @@ -76,6 +76,6 @@ private static IList GetDelegateTypeParameters(IMe displayParts: parts)]; } - private static IList GetDelegateTypePostambleParts() + private static ImmutableArray GetDelegateTypePostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs index 01e6979432a4e..17c6457c4c299 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -36,7 +37,7 @@ private static SignatureHelpItem ConvertNormalTypeConstructor( return item; } - private static IList GetNormalTypePreambleParts( + private static ImmutableArray GetNormalTypePreambleParts( IMethodSymbol method, SemanticModel semanticModel, int position) @@ -49,6 +50,6 @@ private static IList GetNormalTypePreambleParts( return result; } - private static IList GetNormalTypePostambleParts() + private static ImmutableArray GetNormalTypePostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; } diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb index 0dbb3094b6f14..5e9c39a25533e 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/AttributeSignatureHelpProvider.vb @@ -110,7 +110,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim position = attribute.SpanStart Dim namedParameters = constructor.ContainingType.GetAttributeNamedParameters(semanticModel.Compilation, within). OrderBy(Function(s) s.Name). - ToList() + ToImmutableArray() Dim isVariadic = constructor.Parameters.Length > 0 AndAlso constructor.Parameters.Last().IsParams AndAlso namedParameters.Count = 0 @@ -131,7 +131,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp constructor As IMethodSymbol, semanticModel As SemanticModel, position As Integer, - namedParameters As List(Of ISymbol), + namedParameters As ImmutableArray(Of ISymbol), documentationCommentFormattingService As IDocumentationCommentFormattingService) As ImmutableArray(Of SignatureHelpSymbolParameter) Dim result = ArrayBuilder(Of SignatureHelpSymbolParameter).GetInstance() diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb index ce7ab7f9949b4..e0a4a95021851 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.ElementAccess.vb @@ -15,13 +15,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Partial Friend Class InvocationExpressionSignatureHelpProvider - Private Shared Function GetElementAccessItems(leftExpression As ExpressionSyntax, - semanticModel As SemanticModel, - structuralTypeDisplayService As IStructuralTypeDisplayService, - documentationCommentFormattingService As IDocumentationCommentFormattingService, - within As ISymbol, - defaultProperties As IList(Of IPropertySymbol), - cancellationToken As CancellationToken) As IEnumerable(Of SignatureHelpItem) + Private Shared Function GetElementAccessItems( + leftExpression As ExpressionSyntax, + semanticModel As SemanticModel, + structuralTypeDisplayService As IStructuralTypeDisplayService, + documentationCommentFormattingService As IDocumentationCommentFormattingService, + within As ISymbol, + defaultProperties As ImmutableArray(Of IPropertySymbol), + cancellationToken As CancellationToken) As IEnumerable(Of SignatureHelpItem) Dim throughType As ITypeSymbol = Nothing If leftExpression IsNot Nothing Then throughType = semanticModel.GetTypeInfo(leftExpression, cancellationToken).Type diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb index 77c85908c5349..1d97feed90612 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/InvocationExpressionSignatureHelpProvider.vb @@ -102,13 +102,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp Dim expressionType = If(typeInfo.Type, typeInfo.ConvertedType) Dim defaultProperties = If(expressionType Is Nothing, - SpecializedCollections.EmptyList(Of IPropertySymbol), - semanticModel.LookupSymbols(position, expressionType, includeReducedExtensionMethods:=True). - OfType(Of IPropertySymbol). - ToImmutableArrayOrEmpty(). - WhereAsArray(Function(p) p.IsIndexer). - FilterToVisibleAndBrowsableSymbolsAndNotUnsafeSymbols(options.HideAdvancedMembers, semanticModel.Compilation). - Sort(semanticModel, invocationExpression.SpanStart)) + ImmutableArray(Of IPropertySymbol).Empty, + semanticModel.LookupSymbols(position, expressionType, includeReducedExtensionMethods:=True). + OfType(Of IPropertySymbol). + ToImmutableArrayOrEmpty(). + WhereAsArray(Function(p) p.IsIndexer). + FilterToVisibleAndBrowsableSymbolsAndNotUnsafeSymbols(options.HideAdvancedMembers, semanticModel.Compilation). + Sort(semanticModel, invocationExpression.SpanStart)) Dim structuralTypeDisplayService = document.GetLanguageService(Of IStructuralTypeDisplayService)() Dim documentationCommentFormattingService = document.GetLanguageService(Of IDocumentationCommentFormattingService)() diff --git a/src/Features/VisualBasic/Portable/SignatureHelp/SignatureHelpUtilities.vb b/src/Features/VisualBasic/Portable/SignatureHelp/SignatureHelpUtilities.vb index 816a7fcb4e0b6..584acf78a4887 100644 --- a/src/Features/VisualBasic/Portable/SignatureHelp/SignatureHelpUtilities.vb +++ b/src/Features/VisualBasic/Portable/SignatureHelp/SignatureHelpUtilities.vb @@ -7,7 +7,6 @@ Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.SignatureHelp - Friend Module SignatureHelpUtilities Private ReadOnly s_getArgumentListOpenToken As Func(Of ArgumentListSyntax, SyntaxToken) = Function(list) list.OpenParenToken Private ReadOnly s_getTypeArgumentListOpenToken As Func(Of TypeArgumentListSyntax, SyntaxToken) = Function(list) list.OpenParenToken From 416da2bf9e5b46f3667013829197c5767c7b336d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:34:33 +0200 Subject: [PATCH 10/19] move to immutable types in signature help --- .../AttributeSignatureHelpProvider.cs | 2 +- ...mentAccessExpressionSignatureHelpProvider.cs | 5 +++-- ...iderBase_DelegateAndFunctionPointerInvoke.cs | 9 +++++---- ...ressionSignatureHelpProvider_DelegateType.cs | 17 +++++++---------- ...xpressionSignatureHelpProvider_NormalType.cs | 16 +++++----------- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs index 9ef318ca815d1..19fbae5cd22f0 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs @@ -165,7 +165,7 @@ private static ImmutableArray GetParameters( foreach (var parameter in constructor.Parameters) result.Add(Convert(parameter, semanticModel, position, documentationCommentFormatter)); - for (var i = 0; i < namedParameters.Count; i++) + for (var i = 0; i < namedParameters.Length; i++) { cancellationToken.ThrowIfCancellationRequested(); diff --git a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs index f3a637887aedb..f8c690484a44a 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs @@ -16,6 +16,7 @@ using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; using Microsoft.CodeAnalysis.Text; @@ -239,7 +240,7 @@ private static ImmutableArray GetPreambleParts( int position, SemanticModel semanticModel) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); if (indexer.ReturnsByRef) { @@ -266,7 +267,7 @@ private static ImmutableArray GetPreambleParts( result.Add(Punctuation(SyntaxKind.OpenBracketToken)); - return result; + return result.ToImmutableAndClear(); } private static ImmutableArray GetPostambleParts() diff --git a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs index a57a798a8d1d4..6027376cf68c6 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs @@ -9,6 +9,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.DocumentationComments; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.SignatureHelp; @@ -58,7 +59,7 @@ private static ImmutableArray GetDelegateOrFunctionPointerInv private static ImmutableArray GetDelegateOrFunctionPointerInvokePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) { - var displayParts = new List(); + using var _ = ArrayBuilder.GetInstance(out var displayParts); displayParts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position)); displayParts.Add(Space()); @@ -74,13 +75,13 @@ private static ImmutableArray GetDelegateOrFunctionPointerInv displayParts.Add(Punctuation(SyntaxKind.OpenParenToken)); - return displayParts; + return displayParts.ToImmutableAndClear(); } private static ImmutableArray GetDelegateOrFunctionPointerInvokeParameters( IMethodSymbol invokeMethod, SemanticModel semanticModel, int position, IDocumentationCommentFormattingService formattingService, CancellationToken cancellationToken) { - var result = new List(); + using var _ = ArrayBuilder.GetInstance(out var result); foreach (var parameter in invokeMethod.Parameters) { @@ -92,7 +93,7 @@ private static ImmutableArray GetDelegateOrFunctio parameter.ToMinimalDisplayParts(semanticModel, position))); } - return result; + return result.ToImmutableAndClear(); } private static ImmutableArray GetDelegateOrFunctionPointerInvokePostambleParts() diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs index 9dcac56c97187..566ad2f2751a5 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs @@ -6,6 +6,7 @@ using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.LanguageService; +using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.SignatureHelp; namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; @@ -34,20 +35,16 @@ private static ImmutableArray ConvertDelegateTypeConstructor( } private static ImmutableArray GetDelegateTypePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) - { - var result = new List(); - - result.AddRange(invokeMethod.ContainingType.ToMinimalDisplayParts(semanticModel, position)); - result.Add(Punctuation(SyntaxKind.OpenParenToken)); - - return result; - } + => [ + .. invokeMethod.ContainingType.ToMinimalDisplayParts(semanticModel, position), + Punctuation(SyntaxKind.OpenParenToken), + ]; private static ImmutableArray GetDelegateTypeParameters(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position) { const string TargetName = "target"; - var parts = new List(); + using var _ = ArrayBuilder.GetInstance(out var parts); parts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position)); parts.Add(Space()); parts.Add(Punctuation(SyntaxKind.OpenParenToken)); @@ -73,7 +70,7 @@ private static ImmutableArray GetDelegateTypeParam TargetName, isOptional: false, documentationFactory: null, - displayParts: parts)]; + displayParts: parts.ToImmutableAndClear())]; } private static ImmutableArray GetDelegateTypePostambleParts() diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs index 17c6457c4c299..8811dfa43731f 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs @@ -38,17 +38,11 @@ private static SignatureHelpItem ConvertNormalTypeConstructor( } private static ImmutableArray GetNormalTypePreambleParts( - IMethodSymbol method, - SemanticModel semanticModel, - int position) - { - var result = new List(); - - result.AddRange(method.ContainingType.ToMinimalDisplayParts(semanticModel, position)); - result.Add(Punctuation(SyntaxKind.OpenParenToken)); - - return result; - } + IMethodSymbol method, SemanticModel semanticModel, int position) + => [ + .. method.ContainingType.ToMinimalDisplayParts(semanticModel, position), + Punctuation(SyntaxKind.OpenParenToken), + ]; private static ImmutableArray GetNormalTypePostambleParts() => [Punctuation(SyntaxKind.CloseParenToken)]; From f576b13392e1560c85cb972976eae71b0e13d581 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:36:24 +0200 Subject: [PATCH 11/19] move to immutable types in signature help --- .../SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs | 1 - .../AbstractGenericNameSignatureHelpProvider_Method.cs | 1 - .../AbstractGenericNameSignatureHelpProvider_NamedType.cs | 1 - .../SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs | 1 - .../Portable/SignatureHelp/AttributeSignatureHelpProvider.cs | 1 - .../SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs | 1 - .../ElementAccessExpressionSignatureHelpProvider.cs | 1 - ...SignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs | 1 - ...ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs | 1 - .../ObjectCreationExpressionSignatureHelpProvider_NormalType.cs | 1 - .../PrimaryConstructorBaseTypeSignatureHelpProvider.cs | 1 - 11 files changed, 11 deletions(-) diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs index 7ca4997995a58..095d961810442 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs index d8ec57f3e7367..79fce86ad22d1 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_Method.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Shared.Extensions; diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs index 47d45335be810..d90fa2f98c200 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractGenericNameSignatureHelpProvider_NamedType.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp; diff --git a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs index 699ec5af70f32..de801fca0b063 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AbstractOrdinaryMethodSignatureHelpProvider.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis.DocumentationComments; diff --git a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs index 19fbae5cd22f0..30c34711fd57b 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/AttributeSignatureHelpProvider.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; using System.Diagnostics.CodeAnalysis; diff --git a/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs index 02a8425f47cf3..06576d60e5db8 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ConstructorInitializerSignatureHelpProvider.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; using System.Linq; diff --git a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs index f8c690484a44a..4480f8fcad5fe 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ElementAccessExpressionSignatureHelpProvider.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; using System.Diagnostics.CodeAnalysis; diff --git a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs index 6027376cf68c6..9b2b5143924f0 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/InvocationExpressionSignatureHelpProviderBase_DelegateAndFunctionPointerInvoke.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Extensions; diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs index 566ad2f2751a5..e46a14aafe5d4 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.LanguageService; diff --git a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs index 8811dfa43731f..c93262a9f2264 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/ObjectCreationExpressionSignatureHelpProvider_NormalType.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Microsoft.CodeAnalysis.CSharp.Symbols; diff --git a/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs b/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs index bca9b624b5a7f..3e61af4945b5b 100644 --- a/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs +++ b/src/Features/CSharp/Portable/SignatureHelp/PrimaryConstructorBaseTypeSignatureHelpProvider.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System; -using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; using System.Diagnostics.CodeAnalysis; From 3e7aa9c6e10c49b59a5e02c5fcd834143175fdd5 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:37:59 +0200 Subject: [PATCH 12/19] move to immutable types in signature help --- .../SignatureHelp/FSharpSignatureHelpProvider.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs b/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs index 6c4fd7505e3c2..4acd228b2417a 100644 --- a/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs +++ b/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs @@ -11,6 +11,7 @@ using Microsoft.CodeAnalysis.ExternalAccess.FSharp.SignatureHelp; using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.SignatureHelp; +using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.ExternalAccess.FSharp.Internal.SignatureHelp; @@ -61,23 +62,23 @@ public FSharpSignatureHelpProvider( if (mappedSignatureHelpItems != null) { return new SignatureHelpItems( - mappedSignatureHelpItems.Items.Select(x => + mappedSignatureHelpItems.Items.SelectAsArray(x => new SignatureHelpItem( x.IsVariadic, x.DocumentationFactory, x.PrefixDisplayParts, x.SeparatorDisplayParts, x.SuffixDisplayParts, - x.Parameters.Select(y => + x.Parameters.SelectAsArray(y => new SignatureHelpParameter( y.Name, y.IsOptional, y.DocumentationFactory, - y.DisplayParts, - y.PrefixDisplayParts, - y.SuffixDisplayParts, - y.SelectedDisplayParts)).ToList(), - x.DescriptionParts)).ToList(), + y.DisplayParts.ToImmutableArrayOrEmpty(), + y.PrefixDisplayParts.ToImmutableArrayOrEmpty(), + y.SuffixDisplayParts.ToImmutableArrayOrEmpty(), + y.SelectedDisplayParts.ToImmutableArrayOrEmpty())), + x.DescriptionParts)), mappedSignatureHelpItems.ApplicableSpan, mappedSignatureHelpItems.ArgumentIndex, mappedSignatureHelpItems.ArgumentCount, From a985f75439b254ff4444972b21ae8103d5ea40f7 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:38:08 +0200 Subject: [PATCH 13/19] move to immutable types in signature help --- .../FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs b/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs index 4acd228b2417a..c6a503f7769c9 100644 --- a/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs +++ b/src/VisualStudio/ExternalAccess/FSharp/Internal/SignatureHelp/FSharpSignatureHelpProvider.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Immutable; using System.Composition; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.ExternalAccess.FSharp.SignatureHelp; From dac6a4f7e7b6c7a3029e678c1da51840d6a4adaf Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:43:48 +0200 Subject: [PATCH 14/19] Simplify tests --- ...eFullyWrittenSignatureHelpProviderTests.cs | 244 +++++------------- 1 file changed, 68 insertions(+), 176 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs index 3f48441f2e27d..dbef426582d89 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/GenericNameFullyWrittenSignatureHelpProviderTests.cs @@ -27,11 +27,6 @@ internal override Type GetSignatureHelpProviderType() [Fact] public async Task NestedGenericTerminated() { - var expectedOrderedItems = new List - { - new("G", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G { }; @@ -42,17 +37,13 @@ void Goo() G$$> } } - """, expectedOrderedItems); + """, + [new("G", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWith1ParameterTerminated() { - var expectedOrderedItems = new List - { - new("G", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G { }; @@ -63,17 +54,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWith2ParametersOn1() { - var expectedOrderedItems = new List - { - new("G", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G { }; @@ -84,17 +71,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWith2ParametersOn2() { - var expectedOrderedItems = new List - { - new("G", string.Empty, string.Empty, currentParameterIndex: 1) - }; - await TestAsync(""" class G { }; @@ -105,20 +88,13 @@ void Goo() [|G } } - """, expectedOrderedItems); + """, + [new("G", string.Empty, string.Empty, currentParameterIndex: 1)]); } [Fact] public async Task DeclaringGenericTypeWith2ParametersOn1XmlDoc() { - var expectedOrderedItems = new List - { - new("G", - "Summary for G", - "TypeParamS. Also see T", - currentParameterIndex: 0) - }; - await TestAsync(""" /// /// Summary for G @@ -134,17 +110,16 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G", + "Summary for G", + "TypeParamS. Also see T", + currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWith2ParametersOn2XmlDoc() { - var expectedOrderedItems = new List - { - new("G", "Summary for G", "TypeParamT. Also see S", currentParameterIndex: 1) - }; - await TestAsync(""" /// /// Summary for G @@ -160,7 +135,8 @@ void Goo() [|G } } - """, expectedOrderedItems); + """, + [new("G", "Summary for G", "TypeParamT. Also see S", currentParameterIndex: 1)]); } #endregion @@ -170,11 +146,6 @@ void Goo() [Fact] public async Task DeclaringGenericTypeWithConstraintsStruct() { - var expectedOrderedItems = new List - { - new("G where S : struct", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G where S : struct { }; @@ -186,17 +157,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : struct", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsClass() { - var expectedOrderedItems = new List - { - new("G where S : class", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G where S : class { }; @@ -208,17 +175,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : class", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsNew() { - var expectedOrderedItems = new List - { - new("G where S : new()", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G where S : new() { }; @@ -230,17 +193,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : new()", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsBase() { - var expectedOrderedItems = new List - { - new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class Base { } @@ -254,17 +213,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsBaseGenericWithGeneric() { - var expectedOrderedItems = new List - { - new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class Base { } @@ -278,17 +233,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsBaseGenericWithNonGeneric() { - var expectedOrderedItems = new List - { - new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class Base { } @@ -302,17 +253,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : Base", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsBaseGenericNested() { - var expectedOrderedItems = new List - { - new("G where S : Base>", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class Base { } @@ -326,17 +273,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : Base>", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsDeriveFromAnotherGenericParameter() { - var expectedOrderedItems = new List - { - new("G where S : T", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G where S : T { }; @@ -348,17 +291,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : T", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsMixed1() { - var expectedOrderedItems = new List - { - new("G where S : Base, new()", "Summary1", "SummaryS", currentParameterIndex: 0) - }; - await TestAsync(""" /// /// Summary1 @@ -381,17 +320,13 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : Base, new()", "Summary1", "SummaryS", currentParameterIndex: 0)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsMixed2() { - var expectedOrderedItems = new List - { - new("G where T : class, S, IGoo, new()", "Summary1", "SummaryT", currentParameterIndex: 1) - }; - await TestAsync(""" /// /// Summary1 @@ -414,17 +349,13 @@ void Goo() [|G } } - """, expectedOrderedItems); + """, + [new("G where T : class, S, IGoo, new()", "Summary1", "SummaryT", currentParameterIndex: 1)]); } [Fact] public async Task DeclaringGenericTypeWithConstraintsAllowRefStruct() { - var expectedOrderedItems = new List - { - new("G where S : allows ref struct", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class G where S : allows ref struct { }; @@ -436,7 +367,8 @@ void Goo() [|G<$$|]> } } - """, expectedOrderedItems); + """, + [new("G where S : allows ref struct", string.Empty, string.Empty, currentParameterIndex: 0)]); } #endregion @@ -446,11 +378,6 @@ void Goo() [Fact] public async Task InvokingGenericMethodWith1ParameterTerminated() { - var expectedOrderedItems = new List - { - new("void C.Goo()", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class C { @@ -461,18 +388,13 @@ void Bar() [|Goo<$$|]> } } - """, expectedOrderedItems); + """, + [new("void C.Goo()", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWith2ParametersOn1() { - var expectedOrderedItems = new List - { - new("void C.Goo(S s, T t)", - "Method summary", "type param S. see T", currentParameterIndex: 0) - }; - await TestAsync(""" class C { @@ -490,17 +412,14 @@ void Bar() [|Goo<$$|]> } } - """, expectedOrderedItems); + """, + [new("void C.Goo(S s, T t)", + "Method summary", "type param S. see T", currentParameterIndex: 0)]); } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWith2ParametersOn2() { - var expectedOrderedItems = new List - { - new("void C.Goo(S s, T t)", string.Empty, string.Empty, currentParameterIndex: 1) - }; - await TestAsync(""" class C { @@ -511,17 +430,13 @@ void Bar() [|Goo } } - """, expectedOrderedItems); + """, + [new("void C.Goo(S s, T t)", string.Empty, string.Empty, currentParameterIndex: 1)]); } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWith2ParametersOn1XmlDoc() { - var expectedOrderedItems = new List - { - new("void C.Goo(S s, T t)", "SummaryForGoo", "SummaryForS", currentParameterIndex: 0) - }; - await TestAsync(""" class C { @@ -537,17 +452,13 @@ void Bar() [|Goo<$$|]> } } - """, expectedOrderedItems); + """, + [new("void C.Goo(S s, T t)", "SummaryForGoo", "SummaryForS", currentParameterIndex: 0)]); } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWith2ParametersOn2XmlDoc() { - var expectedOrderedItems = new List - { - new("void C.Goo(S s, T t)", "SummaryForGoo", "SummaryForT", currentParameterIndex: 1) - }; - await TestAsync(""" class C { @@ -563,17 +474,13 @@ void Bar() [|Goo } } - """, expectedOrderedItems); + """, + [new("void C.Goo(S s, T t)", "SummaryForGoo", "SummaryForT", currentParameterIndex: 1)]); } [Fact] public async Task CallingGenericExtensionMethod() { - var expectedOrderedItems = new List - { - new($"({CSharpFeaturesResources.extension}) void G.Goo()", string.Empty, string.Empty, currentParameterIndex: 0) - }; - // TODO: Enable the script case when we have support for extension methods in scripts await TestAsync(""" class G @@ -592,7 +499,9 @@ static class GooClass { public static void Goo(this G g) { } } - """, expectedOrderedItems, usePreviousCharAsTrigger: false, sourceCodeKind: Microsoft.CodeAnalysis.SourceCodeKind.Regular); + """, + [new($"({CSharpFeaturesResources.extension}) void G.Goo()", string.Empty, string.Empty, currentParameterIndex: 0)], + usePreviousCharAsTrigger: false, sourceCodeKind: SourceCodeKind.Regular); } #endregion @@ -602,11 +511,6 @@ public static void Goo(this G g) { } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWithConstraintsMixed1() { - var expectedOrderedItems = new List - { - new("S C.Goo(S s, T t) where S : Base, new()", "GooSummary", "ParamS", currentParameterIndex: 0) - }; - await TestAsync(""" class Base { } interface IGoo { } @@ -628,17 +532,12 @@ void Bar() [|Goo<$$|]> } } - """, expectedOrderedItems); + """, [new("S C.Goo(S s, T t) where S : Base, new()", "GooSummary", "ParamS", currentParameterIndex: 0)]); } [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/544091")] public async Task InvokingGenericMethodWithConstraintsMixed2() { - var expectedOrderedItems = new List - { - new("S C.Goo(S s, T t) where T : class, S, IGoo, new()", "GooSummary", "ParamT", currentParameterIndex: 1) - }; - await TestAsync(""" class Base { } interface IGoo { } @@ -660,7 +559,7 @@ void Bar() [|Goo } } - """, expectedOrderedItems); + """, [new("S C.Goo(S s, T t) where T : class, S, IGoo, new()", "GooSummary", "ParamT", currentParameterIndex: 1)]); } [Fact] @@ -682,9 +581,7 @@ void Bar() } } """, - [ - new SignatureHelpTestItem("void C.M(T arg) where T : unmanaged", "summary headline", "T documentation", currentParameterIndex: 0) - ]); + [new SignatureHelpTestItem("void C.M(T arg) where T : unmanaged", "summary headline", "T documentation", currentParameterIndex: 0)]); #endregion @@ -895,7 +792,6 @@ await TestSignatureHelpInEditorBrowsableContextsAsync(markup: markup, [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1083601")] public async Task DeclaringGenericTypeWithBadTypeArgumentList() { - var expectedOrderedItems = new List(); await TestAsync(""" class G { }; @@ -906,28 +802,12 @@ void Goo() G{$$> } } - """, expectedOrderedItems); + """, []); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/50114")] public async Task DeclaringGenericTypeWithDocCommentList() { - var expectedOrderedItems = new List - { - new("G", """ - List: - - Item 1. - """, - classificationTypeNames: ImmutableArray.Create( - ClassificationTypeNames.Text, - ClassificationTypeNames.WhiteSpace, - ClassificationTypeNames.WhiteSpace, - ClassificationTypeNames.WhiteSpace, - ClassificationTypeNames.Text, - ClassificationTypeNames.WhiteSpace)) - }; - await TestAsync(""" /// /// List: @@ -948,7 +828,19 @@ void Goo() [|G } } - """, expectedOrderedItems); + """, + [new("G", """ + List: + + Item 1. + """, + classificationTypeNames: ImmutableArray.Create( + ClassificationTypeNames.Text, + ClassificationTypeNames.WhiteSpace, + ClassificationTypeNames.WhiteSpace, + ClassificationTypeNames.WhiteSpace, + ClassificationTypeNames.Text, + ClassificationTypeNames.WhiteSpace))]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/80233")] From 1d94bb92c671b8a73fe0cff27ed101af81bd3048 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:46:24 +0200 Subject: [PATCH 15/19] Simplify tests --- .../AttributeSignatureHelpProviderTests.cs | 79 +++++-------------- 1 file changed, 21 insertions(+), 58 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/AttributeSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/AttributeSignatureHelpProviderTests.cs index 916e5470af372..6b8ccee8cad0e 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/AttributeSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/AttributeSignatureHelpProviderTests.cs @@ -26,11 +26,6 @@ internal override Type GetSignatureHelpProviderType() [Fact] public async Task TestInvocationWithoutParameters() { - var expectedOrderedItems = new List - { - new("SomethingAttribute()", string.Empty, null, currentParameterIndex: 0) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -40,17 +35,13 @@ class SomethingAttribute : System.Attribute class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute()", string.Empty, null, currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithoutParametersMethodXmlComments() { - var expectedOrderedItems = new List - { - new("SomethingAttribute()", "Summary For Attribute", null, currentParameterIndex: 0) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -62,18 +53,13 @@ public SomethingAttribute() { } class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute()", "Summary For Attribute", null, currentParameterIndex: 0)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/25830")] public async Task PickCorrectOverload_PickInt() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int i)", currentParameterIndex: 0, isSelected: true), - new("SomethingAttribute(string i)", currentParameterIndex: 0), - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -83,18 +69,14 @@ class SomethingAttribute : System.Attribute } [[|Something(i: 1$$|])] class D { } - """, expectedOrderedItems); + """, [ + new("SomethingAttribute(int i)", currentParameterIndex: 0, isSelected: true), + new("SomethingAttribute(string i)", currentParameterIndex: 0)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/25830")] public async Task PickCorrectOverload_PickString() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int i)", currentParameterIndex: 0), - new("SomethingAttribute(string i)", currentParameterIndex: 0, isSelected: true), - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -104,17 +86,14 @@ class SomethingAttribute : System.Attribute } [[|Something(i: null$$|])] class D { } - """, expectedOrderedItems); + """, [ + new("SomethingAttribute(int i)", currentParameterIndex: 0), + new("SomethingAttribute(string i)", currentParameterIndex: 0, isSelected: true)]); } [Fact] public async Task TestInvocationWithParametersOn1() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int someInteger, string someString)", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -125,17 +104,13 @@ public SomethingAttribute(int someInteger, string someString) { } class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute(int someInteger, string someString)", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithParametersXmlCommentsOn1() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int someInteger, string someString)", "Summary For Attribute", "Param someInteger", currentParameterIndex: 0) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -151,17 +126,13 @@ public SomethingAttribute(int someInteger, string someString) { } |]class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute(int someInteger, string someString)", "Summary For Attribute", "Param someInteger", currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithParametersOn2() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int someInteger, string someString)", string.Empty, string.Empty, currentParameterIndex: 1) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -172,17 +143,13 @@ public SomethingAttribute(int someInteger, string someString) { } class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute(int someInteger, string someString)", string.Empty, string.Empty, currentParameterIndex: 1)]); } [Fact] public async Task TestInvocationWithParametersXmlComentsOn2() { - var expectedOrderedItems = new List - { - new("SomethingAttribute(int someInteger, string someString)", "Summary For Attribute", "Param someString", currentParameterIndex: 1) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -198,17 +165,13 @@ public SomethingAttribute(int someInteger, string someString) { } |]class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute(int someInteger, string someString)", "Summary For Attribute", "Param someString", currentParameterIndex: 1)]); } [Fact] public async Task TestInvocationWithClosingParen() { - var expectedOrderedItems = new List - { - new("SomethingAttribute()", string.Empty, null, currentParameterIndex: 0) - }; - await TestAsync(""" class SomethingAttribute : System.Attribute { } @@ -217,7 +180,8 @@ class SomethingAttribute : System.Attribute class D { } - """, expectedOrderedItems); + """, + [new("SomethingAttribute()", string.Empty, null, currentParameterIndex: 0)]); } [Fact] @@ -997,7 +961,6 @@ public Task InvokedWithNoToken() [Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1081535")] public async Task TestInvocationWithBadParameterList() { - var expectedOrderedItems = new List(); await TestAsync(""" class SomethingAttribute : System.Attribute { @@ -1007,6 +970,6 @@ class SomethingAttribute : System.Attribute class D { } - """, expectedOrderedItems); + """, []); } } From 818811c80e5b720d896f0f4dfda00fc06fa9f67c Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:50:32 +0200 Subject: [PATCH 16/19] Revert --- .../PredefinedCastExpressionDocumentation.vb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb index c2e085146362f..52189120ce26e 100644 --- a/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb +++ b/src/Workspaces/VisualBasic/Portable/Utilities/IntrinsicOperators/PredefinedCastExpressionDocumentation.vb @@ -44,9 +44,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Utilities.IntrinsicOperators Public Overrides ReadOnly Property ParameterCount As Integer = 1 - Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) = ImmutableArray.Create( - New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, _keywordText), - New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) + Public Overrides ReadOnly Property PrefixParts As ImmutableArray(Of SymbolDisplayPart) + Get + Return ImmutableArray.Create( + New SymbolDisplayPart(SymbolDisplayPartKind.Keyword, Nothing, _keywordText), + New SymbolDisplayPart(SymbolDisplayPartKind.Punctuation, Nothing, "(")) + End Get + End Property Public Overrides ReadOnly Property ReturnTypeMetadataName As String Get From 9d9f14ccfd8e72613c0300d056d2427f7d3a6c95 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 12:58:19 +0200 Subject: [PATCH 17/19] Update tests --- .../IntelliSense/SignatureHelpControllerTests.vb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/EditorFeatures/Test2/IntelliSense/SignatureHelpControllerTests.vb b/src/EditorFeatures/Test2/IntelliSense/SignatureHelpControllerTests.vb index 9af6ff6690eab..7ab56ceb38b9b 100644 --- a/src/EditorFeatures/Test2/IntelliSense/SignatureHelpControllerTests.vb +++ b/src/EditorFeatures/Test2/IntelliSense/SignatureHelpControllerTests.vb @@ -21,6 +21,7 @@ Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Editor.Commanding.Commands Imports Microsoft.VisualStudio.Text.Projection Imports Moq +Imports Roslyn.Utilities Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense @@ -151,7 +152,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense If provider Is Nothing Then items = If(items, CreateItems(1)) - provider = New MockSignatureHelpProvider(items) + provider = New MockSignatureHelpProvider(items.ToImmutableArray()) End If Dim presenter = New Mock(Of IIntelliSensePresenter(Of ISignatureHelpPresenterSession, ISignatureHelpSession))(MockBehavior.Strict) With {.DefaultValue = DefaultValue.Mock} @@ -194,16 +195,16 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Return controller End Function - Private Shared Function CreateItems(count As Integer) As IList(Of SignatureHelpItem) - Return Enumerable.Range(0, count).Select(Function(i) New SignatureHelpItem(isVariadic:=False, documentationFactory:=Nothing, prefixParts:=New List(Of TaggedText), separatorParts:={}, suffixParts:={}, parameters:={}, descriptionParts:={})).ToList() + Private Shared Function CreateItems(count As Integer) As ImmutableArray(Of SignatureHelpItem) + Return Enumerable.Range(0, count).SelectAsArray(Function(i) New SignatureHelpItem(isVariadic:=False, documentationFactory:=Nothing, prefixParts:=New List(Of TaggedText), separatorParts:={}, suffixParts:={}, parameters:={}, descriptionParts:={})) End Function Friend Class MockSignatureHelpProvider Implements ISignatureHelpProvider - Private ReadOnly _items As IList(Of SignatureHelpItem) + Private ReadOnly _items As ImmutableArray(Of SignatureHelpItem) - Public Sub New(items As IList(Of SignatureHelpItem)) + Public Sub New(items As ImmutableArray(Of SignatureHelpItem)) Me._items = items End Sub @@ -212,8 +213,8 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense Public Function GetItemsAsync(document As Document, position As Integer, triggerInfo As SignatureHelpTriggerInfo, options As MemberDisplayOptions, cancellationToken As CancellationToken) As Task(Of SignatureHelpItems) Implements ISignatureHelpProvider.GetItemsAsync GetItemsCount += 1 Return Task.FromResult(If(_items.Any(), - New SignatureHelpItems(_items, TextSpan.FromBounds(position, position), selectedItem:=0, semanticParameterIndex:=0, syntacticArgumentCount:=0, argumentName:=Nothing), - Nothing)) + New SignatureHelpItems(_items, TextSpan.FromBounds(position, position), selectedItem:=0, semanticParameterIndex:=0, syntacticArgumentCount:=0, argumentName:=Nothing), + Nothing)) End Function Public ReadOnly Property TriggerCharacters As ImmutableArray(Of Char) Implements ISignatureHelpProvider.TriggerCharacters From d8e28ca55bc40aac95a0765b4a57e02bca7af1ee Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 13:01:01 +0200 Subject: [PATCH 18/19] Update tests --- ...orInitializerSignatureHelpProviderTests.cs | 100 +++++------------- 1 file changed, 26 insertions(+), 74 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/SignatureHelp/ConstructorInitializerSignatureHelpProviderTests.cs b/src/EditorFeatures/CSharpTest/SignatureHelp/ConstructorInitializerSignatureHelpProviderTests.cs index ccb177b567b21..9a458567c7dae 100644 --- a/src/EditorFeatures/CSharpTest/SignatureHelp/ConstructorInitializerSignatureHelpProviderTests.cs +++ b/src/EditorFeatures/CSharpTest/SignatureHelp/ConstructorInitializerSignatureHelpProviderTests.cs @@ -26,11 +26,6 @@ internal override Type GetSignatureHelpProviderType() [Fact] public async Task TestInvocationWithoutParameters() { - var expectedOrderedItems = new List - { - new("BaseClass()", string.Empty, null, currentParameterIndex: 0) - }; - await TestAsync(""" class BaseClass { @@ -42,17 +37,13 @@ class Derived : BaseClass public Derived() [|: base($$|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass()", string.Empty, null, currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithoutParametersMethodXmlComments() { - var expectedOrderedItems = new List - { - new("BaseClass()", "Summary for BaseClass", null, currentParameterIndex: 0) - }; - await TestAsync(""" class BaseClass { @@ -65,17 +56,13 @@ class Derived : BaseClass public Derived() [|: base($$|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass()", "Summary for BaseClass", null, currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithParametersOn1() { - var expectedOrderedItems = new List - { - new("BaseClass(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 0) - }; - await TestAsync(""" class BaseClass { @@ -87,17 +74,13 @@ class Derived : BaseClass public Derived() [|: base($$2, 3|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithParametersXmlCommentsOn1() { - var expectedOrderedItems = new List - { - new("BaseClass(int a, int b)", "Summary for BaseClass", "Param a", currentParameterIndex: 0) - }; - await TestAsync(""" class BaseClass { @@ -112,17 +95,13 @@ class Derived : BaseClass public Derived() [|: base($$2, 3|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass(int a, int b)", "Summary for BaseClass", "Param a", currentParameterIndex: 0)]); } [Fact] public async Task TestInvocationWithParametersOn2() { - var expectedOrderedItems = new List - { - new("BaseClass(int a, int b)", "Summary for BaseClass", "Param b", currentParameterIndex: 1) - }; - await TestAsync(""" class BaseClass { @@ -138,17 +117,13 @@ class Derived : BaseClass public Derived() [|: base(2, $$3|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass(int a, int b)", "Summary for BaseClass", "Param b", currentParameterIndex: 1)]); } [Fact] public async Task TestInvocationWithParametersXmlComentsOn2() { - var expectedOrderedItems = new List - { - new("BaseClass(int a, int b)", "Summary for BaseClass", "Param b", currentParameterIndex: 1) - }; - await TestAsync(""" class BaseClass { @@ -163,86 +138,65 @@ class Derived : BaseClass public Derived() [|: base(2, $$3|]) { } } - """, expectedOrderedItems); + """, + [new("BaseClass(int a, int b)", "Summary for BaseClass", "Param b", currentParameterIndex: 1)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/2579")] public async Task TestThisInvocation() { - var expectedOrderedItems = new List - { - new("Goo(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 1) - }; - await TestAsync(""" class Goo { public Goo(int a, int b) { } public Goo() [|: this(2, $$3|]) { } } - """, expectedOrderedItems); + """, + [new("Goo(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 1)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/2579")] public async Task TestThisInvocationWithNonEmptyArgumentList() { - var expectedOrderedItems = new List - { - new("Foo()", string.Empty, null, currentParameterIndex: 0), - }; - await TestAsync(""" class Foo { public Foo(int a, int b) [|: this($$|]) { } public Foo() { } } - """, expectedOrderedItems); + """, + [new("Foo()", string.Empty, null, currentParameterIndex: 0)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/2579")] public async Task TestInvocationWithoutClosingParen() { - var expectedOrderedItems = new List - { - new("Goo(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 1) - }; - await TestAsync(""" class Goo { public Goo(int a, int b) { } public Goo() [|: this(2, $$ |]} - """, expectedOrderedItems); + """, + [new("Goo(int a, int b)", string.Empty, string.Empty, currentParameterIndex: 1)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/2579")] public async Task TestThisInvocationWithoutClosingParenWithNonEmptyArgumentList() { - var expectedOrderedItems = new List - { - new("Foo()", string.Empty, null, currentParameterIndex: 0), - }; - await TestAsync(""" class Foo { public Foo() { } public Foo(int a, int b) [|: this($$ |]} - """, expectedOrderedItems); + """, + [new("Foo()", string.Empty, null, currentParameterIndex: 0)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/25830")] public async Task PickCorrectOverload_PickInt() { - var expectedOrderedItems = new List - { - new("D(int i)", currentParameterIndex: 0, isSelected: true), - new("D(string i)", currentParameterIndex: 0), - }; - await TestAsync(""" class D { @@ -252,18 +206,14 @@ class D D(string i) => throw null; D(int i) => throw null; } - """, expectedOrderedItems); + """, [ + new("D(int i)", currentParameterIndex: 0, isSelected: true), + new("D(string i)", currentParameterIndex: 0)]); } [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/25830")] public async Task PickCorrectOverload_PickString() { - var expectedOrderedItems = new List - { - new("D(int i)", currentParameterIndex: 0), - new("D(string i)", currentParameterIndex: 0, isSelected: true), - }; - await TestAsync(""" class D { @@ -273,7 +223,9 @@ class D D(string i) => throw null; D(int i) => throw null; } - """, expectedOrderedItems); + """, [ + new("D(int i)", currentParameterIndex: 0), + new("D(string i)", currentParameterIndex: 0, isSelected: true)]); } #endregion From af767e179740a7494822e625d16f098a86be921d Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 17 Sep 2025 14:16:39 +0200 Subject: [PATCH 19/19] Fix --- ...ervice.AbstractSymbolDescriptionBuilder.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs index c6e5fe2b975b2..8f9c1c2549e6f 100644 --- a/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs +++ b/src/Features/Core/Portable/LanguageServices/SymbolDisplayService/AbstractSymbolDisplayService.AbstractSymbolDescriptionBuilder.cs @@ -450,7 +450,7 @@ private async Task AddDescriptionPartAsync(ISymbol symbol) private ImmutableArray BuildDescription(SymbolDescriptionGroups groups) { - var finalParts = new List(); + using var _ = ArrayBuilder.GetInstance(out var finalParts); var orderedGroups = _groupMap.Keys.OrderBy((g1, g2) => g1 - g2); foreach (var group in orderedGroups) @@ -460,14 +460,13 @@ private ImmutableArray BuildDescription(SymbolDescriptionGrou continue; } - if (!finalParts.IsEmpty()) + if (!finalParts.IsEmpty) { var newLines = GetPrecedingNewLineCount(group); finalParts.AddRange(LineBreak(newLines)); } - var parts = _groupMap[group]; - finalParts.AddRange(parts); + finalParts.AddRange(_groupMap[group]); } return finalParts.AsImmutable(); @@ -833,16 +832,12 @@ protected void AddToGroup(SymbolDescriptionGroups group, params SymbolDisplayPar protected void AddToGroup(SymbolDescriptionGroups group, params IEnumerable[] partsArray) { - var partsList = partsArray.Flatten().ToList(); - if (partsList.Count > 0) + var partsList = partsArray.Flatten().ToImmutableArray(); + if (partsList.Length > 0) { - if (!_groupMap.TryGetValue(group, out var existingParts)) - { - existingParts = []; - _groupMap.Add(group, existingParts); - } - - existingParts.AddRange(partsList); + var existingParts = _groupMap.TryGetValue(group, out var temp) ? temp : []; + existingParts = existingParts.AddRange(partsList); + _groupMap[group] = existingParts; } }