File: SignatureHelp\ObjectCreationExpressionSignatureHelpProvider_DelegateType.cs
Web Access
Project: src\src\Features\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.Features.csproj (Microsoft.CodeAnalysis.CSharp.Features)
// 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.Collections.Generic;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.LanguageService;
using Microsoft.CodeAnalysis.SignatureHelp;
 
namespace Microsoft.CodeAnalysis.CSharp.SignatureHelp;
 
internal sealed partial class ObjectCreationExpressionSignatureHelpProvider
{
    private static ImmutableArray<SignatureHelpItem> ConvertDelegateTypeConstructor(
        BaseObjectCreationExpressionSyntax objectCreationExpression,
        IMethodSymbol invokeMethod,
        SemanticModel semanticModel,
        IStructuralTypeDisplayService structuralTypeDisplayService,
        int position)
    {
        var item = CreateItem(
            invokeMethod, semanticModel,
            objectCreationExpression.SpanStart,
            structuralTypeDisplayService,
            isVariadic: false,
            documentationFactory: null,
            prefixParts: GetDelegateTypePreambleParts(invokeMethod, semanticModel, position),
            separatorParts: GetSeparatorParts(),
            suffixParts: GetDelegateTypePostambleParts(),
            parameters: GetDelegateTypeParameters(invokeMethod, semanticModel, position));
 
        return [item];
    }
 
    private static IList<SymbolDisplayPart> GetDelegateTypePreambleParts(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position)
    {
        var result = new List<SymbolDisplayPart>();
 
        result.AddRange(invokeMethod.ContainingType.ToMinimalDisplayParts(semanticModel, position));
        result.Add(Punctuation(SyntaxKind.OpenParenToken));
 
        return result;
    }
 
    private static IList<SignatureHelpSymbolParameter> GetDelegateTypeParameters(IMethodSymbol invokeMethod, SemanticModel semanticModel, int position)
    {
        const string TargetName = "target";
 
        var parts = new List<SymbolDisplayPart>();
        parts.AddRange(invokeMethod.ReturnType.ToMinimalDisplayParts(semanticModel, position));
        parts.Add(Space());
        parts.Add(Punctuation(SyntaxKind.OpenParenToken));
 
        var first = true;
        foreach (var parameter in invokeMethod.Parameters)
        {
            if (!first)
            {
                parts.Add(Punctuation(SyntaxKind.CommaToken));
                parts.Add(Space());
            }
 
            first = false;
            parts.AddRange(parameter.Type.ToMinimalDisplayParts(semanticModel, position));
        }
 
        parts.Add(Punctuation(SyntaxKind.CloseParenToken));
        parts.Add(Space());
        parts.Add(new SymbolDisplayPart(SymbolDisplayPartKind.ParameterName, null, TargetName));
 
        return [new SignatureHelpSymbolParameter(
            TargetName,
            isOptional: false,
            documentationFactory: null,
            displayParts: parts)];
    }
 
    private static IList<SymbolDisplayPart> GetDelegateTypePostambleParts()
        => [Punctuation(SyntaxKind.CloseParenToken)];
}